سطح دسترسی  Internal (داخلی) در سی شارپ

تیم تحریریه 1403/12/14 0 70
لینک کوتاه https://zoheirsoftware.com/z/aeff774de |
سطح دسترسی  Internal (داخلی) در سی شارپ,استفاده از دسترسی Internal در پروژه‌های مختلف,کاربردهای رایج دسترسی Internal

سطح دسترسی Internal در سی شارپ

در سی‌شارپ، سطح دسترسی internal به این معنی است که اعضای کلاس فقط در همان اسمبلی (Assembly) یا پروژه قابل دسترسی هستند، اما از خارج آن قابل مشاهده نیستند.

این سطح دسترسی معمولاً برای مدیریت ماژول‌ها و کلاس‌های داخلی یک پروژه استفاده می‌شود تا سایر پروژه‌ها یا کتابخانه‌ها نتوانند مستقیماً به آن‌ها دسترسی داشته باشند.

برخلاف public که در همه جا قابل دسترسی است و private که فقط درون کلاس معتبر است، internal یک تعادل بین این دو ایجاد می‌کند.

استفاده از internal به توسعه‌دهندگان کمک می‌کند تا APIهای داخلی یک پروژه را مخفی نگه دارند و فقط کلاس‌ها و متدهای موردنیاز را در سطح عمومی منتشر کنند.

به‌عنوان مثال

 

internal class Logger {
    internal void Log(string message) {
        Console.WriteLine(message);
    }
}


در این مثال، کلاس Logger و متد Log فقط در همان اسمبلی قابل استفاده هستند و پروژه‌های دیگر نمی‌توانند مستقیماً به آن دسترسی داشته باشند. 

سطح دسترسی Internal در سی شارپ

 

مثال ابتدایی از دسترسی Internal

فرض کنید یک کلاس به نام MyClass داریم که در آن یک متد با دسترسی Internal تعریف شده است. به کد زیر توجه کنید:

// فایل Assembly1.dll

namespace MyNamespace

{

    public class MyClass

    {

        internal void MyInternalMethod()

        {

            Console.WriteLine("این متد فقط در داخل همین اسمبلی قابل دسترسی است.");

        }

    }

}

در این کد، متد MyInternalMethod فقط در داخل اسمبلی که کلاس MyClass در آن تعریف شده است قابل دسترسی خواهد بود.

حالا، اگر بخواهیم در اسمبلی دیگری به این متد دسترسی پیدا کنیم، خطای دسترسی خواهیم داشت.

استفاده از دسترسی Internal در پروژه‌های مختلف

برای مثال، فرض کنید شما دو پروژه به نام‌های ProjectA و ProjectB دارید.

اگر در ProjectA کلاس‌هایی با دسترسی Internal داشته باشید، این کلاس‌ها فقط در ProjectA قابل دسترسی خواهند بود و در ProjectB قابل استفاده نخواهند بود.

// پروژه A

namespace ProjectA

{

    public class ClassA

    {

        internal void MyInternalMethod()

        {

            Console.WriteLine("این متد در داخل ProjectA قابل دسترسی است.");

        }

    }

}

حالا اگر بخواهیم در ProjectB به این متد دسترسی پیدا کنیم:

// پروژه B

using ProjectA;




namespace ProjectB

{

    public class ClassB

    {

        public void CallInternalMethod()

        {

            ClassA classA = new ClassA();

            // خطا: دسترسی به MyInternalMethod مجاز نیست

            classA.MyInternalMethod();  // اینجا خطا می‌دهد

        }

    }

}

در کد بالا، در ProjectB نمی‌توان به MyInternalMethod دسترسی پیدا کرد، زیرا این متد فقط در ProjectA قابل دسترسی است.

 

کاربردهای رایج دسترسی Internal

  • محافظت از اطلاعات داخلی

    وقتی می‌خواهید برخی از اطلاعات و ویژگی‌های کلاس‌ها فقط برای استفاده داخلی در همان اسمبلی قابل دسترسی باشند و از دسترسی خارجی محافظت شوند.
  • پنهان‌سازی جزئیات پیاده‌سازی

    برای پنهان کردن جزئیات پیاده‌سازی در اسمبلی‌ها و استفاده فقط از رابط‌های عمومی (public) و متدهای داخلی (internal).
  • تست داخلی

    در صورت نیاز به ایجاد تست‌های داخلی که فقط در داخل پروژه قابل دسترسی باشند، از دسترسی Internal استفاده می‌شود.

 

کاربردهای رایج دسترسی Internal

تفاوت بین Internal و Private

ممکن است این سؤال پیش بیاید که چرا باید از دسترسی Internal به جای Private استفاده کنیم.

تفاوت اصلی در این است که اعضای Private فقط در داخل همان کلاس قابل دسترسی هستند، در حالی که اعضای Internal می‌توانند در داخل اسمبلی قابل دسترسی باشند.

بنابراین اگر می‌خواهید اعضای یک کلاس در داخل اسمبلی قابل دسترسی باشند ولی نه از بیرون آن، از Internal استفاده می‌کنید.

 

مثال تفاوت Internal و Private

namespace MyNamespace

{

    public class MyClass

    {

        private int privateValue;  // فقط در داخل کلاس قابل دسترسی است

        internal int internalValue;  // در داخل اسمبلی قابل دسترسی است




        public void SetValues(int value)

        {

            privateValue = value;  // می‌توان به privateValue دسترسی پیدا کرد

            internalValue = value;  // می‌توان به internalValue دسترسی پیدا کرد

        }

    }

}

در اینجا، privateValue فقط در داخل کلاس MyClass قابل دسترسی است، در حالی که internalValue در داخل اسمبلی می‌تواند در هر کجا از آن اسمبلی قابل دسترسی باشد.

 

محدودیت‌های دسترسی Internal

  • عدم دسترسی از اسمبلی‌های دیگر

    بزرگترین محدودیت دسترسی Internal این است که اعضای آن از اسمبلی‌های دیگر قابل دسترسی نیستند.
    اگر بخواهید اعضای یک کلاس در اسمبلی‌های دیگر قابل استفاده باشند، باید از دسترسی‌های عمومی (مثل Public) استفاده کنید.
  • قابلیت تست داخلی

    یکی از کاربردهای Internal، ایجاد کدهایی است که تنها در محیط‌های خاص (مثل محیط تست یا پیاده‌سازی داخلی) قابل دسترسی هستند، که در این صورت از دسترسی‌های عمومی جلوگیری می‌شود.

محدودیت‌های دسترسی Internal

دسترسی Internal و بسته‌های تست

در سی شارپ، می‌توانید از InternalsVisibleTo برای اجازه دسترسی به اعضای Internal از طریق بسته‌های تست استفاده کنید.

این ویژگی به شما این امکان را می‌دهد که اعضای با دسترسی Internal را در پروژه‌های تست (که در اسمبلی‌های جداگانه هستند) تست کنید.

 

استفاده از InternalsVisibleTo

برای استفاده از این ویژگی، کافی است که در فایل AssemblyInfo.cs یک اسمبلی تست، آن را به صورت زیر تعریف کنید:

[assembly: InternalsVisibleTo("TestProject")]

این خط به پروژه تست اجازه می‌دهد که به اعضای Internal در پروژه اصلی دسترسی پیدا کند.

 

 

 

آیا به دنبال یک فرصت عالی برای یادگیری برنامه‌نویسی هستید؟ 🚀

با دوره آموزشی سی‌شارپ ما، شما می‌توانید مهارت‌های خود را به سطح جدیدی ارتقا دهید! این دوره به‌طور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامه‌نویسی سی‌شارپ پیش بروید.

👨‍🏫 چرا دوره ما را انتخاب کنید؟

  • محتوای جامع و عملی: با پروژه‌های واقعی و تمرینات عملی، یادگیری را به تجربه‌ای جذاب تبدیل کنید.
  • مدرس مجرب: از تجربه و دانش مدرس حرفه‌ای بهره‌مند شوید که شما را در هر مرحله از یادگیری راهنمایی می‌کنند.
  • پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
  • دسترسی مادام‌العمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، می‌توانید به آن مراجعه کنید.

💡 فرصت را از دست ندهید!

بایادگیری سی‌شارپ، می‌توانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژه‌های جذاب و چالش‌برانگیز شرکت کنید.

همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده‌ای روشن‌تر بردارید!

شرکت در دوره آموزش برنامه نویسی سی شارپ

 

 

مثال پروژه محور از سطح دسترسی  Internal 

پروژه: سیستم مدیریت انبار

مرحله 1: ایجاد پروژه اصلی (WarehouseSystem)

در پروژه اصلی، کلاس‌هایی برای مدیریت انبار داریم که برخی از ویژگی‌ها و متدها فقط باید در داخل پروژه قابل دسترسی باشند (مثل متدهایی که موجودی کالا را به‌روزرسانی می‌کنند).

// WarehouseSystem - InventoryManager.cs

namespace WarehouseSystem

{

    public class InventoryManager

    {

        // این متد فقط در داخل همین اسمبلی (WarehouseSystem) قابل دسترسی است.

        internal void UpdateStock(string productCode, int quantity)

        {

            Console.WriteLine($"موجودی {productCode} به {quantity} تغییر کرد.");

            // کد به‌روزرسانی موجودی کالا در دیتابیس

        }

        // این متد public است و در پروژه‌های دیگر هم قابل دسترسی است.

        public void AddProduct(string productCode, string productName)

        {

            Console.WriteLine($"کالا با کد {productCode} و نام {productName} به انبار اضافه شد.");

        }

    }

}

در اینجا، متد UpdateStock با دسترسی Internal تعریف شده است تا فقط در داخل پروژه WarehouseSystem قابل دسترسی باشد و نتوان از پروژه‌های دیگر به آن دسترسی پیدا کرد.

این متد برای به‌روزرسانی موجودی کالا استفاده می‌شود و باید از دسترسی غیرمجاز محافظت شود.

در عوض، متد AddProduct به صورت public است که می‌تواند از هر پروژه دیگری قابل دسترسی باشد.

 

مرحله 2: ایجاد پروژه تست (WarehouseSystem.Tests)

در پروژه تست، می‌خواهیم فقط متد UpdateStock را تست کنیم. برای این کار، از ویژگی InternalsVisibleTo استفاده می‌کنیم تا دسترسی به متدهای Internal در پروژه تست ممکن شود.

اول، در پروژه WarehouseSystem، ویژگی InternalsVisibleTo را در فایل AssemblyInfo.cs اضافه می‌کنیم:

// WarehouseSystem - AssemblyInfo.cs

[assembly: InternalsVisibleTo("WarehouseSystem.Tests")]

این ویژگی اجازه می‌دهد که پروژه تست به متدهای Internal در پروژه اصلی دسترسی پیدا کند.

مرحله 3: نوشتن تست در پروژه تست

در پروژه تست، متد UpdateStock را فراخوانی کرده و خروجی آن را تست می‌کنیم.

// WarehouseSystem.Tests - InventoryManagerTests.cs

using WarehouseSystem;

using NUnit.Framework;

namespace WarehouseSystem.Tests

{

    [TestFixture]

    public class InventoryManagerTests

    {

        [Test]

        public void TestUpdateStock()

        {

            // ایجاد یک نمونه از InventoryManager

            InventoryManager manager = new InventoryManager();

            // فراخوانی متد Internal در پروژه اصلی

            manager.UpdateStock("P001", 50);


            // برای تست می‌توانیم بررسی کنیم که آیا پیامی در کنسول نمایش داده شده است

            // که به طور ساده می‌توانیم با استفاده از دستورات متدهای تستی در اینجا مقایسه کنیم

        }

    }

}

در اینجا، پروژه تست به متد UpdateStock که Internal است دسترسی پیدا کرده و آن را تست می‌کند.

دوره های مرتبط
آموزش برنامه نویسی سی شارپ,آموزش پروژه محور سی شارپ,آموزش مقدماتی تا پیشرفته سی شارپ,طراحی نرم افزار تحت ویندوز

آموزش برنامه نویسی سی شارپ

زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.

999,000 تومان

2.5k بازدید

ارسال دیدگاه

برای ارسال نظر لطفا ورود یا ثبت نام کنید.