C#‘ta kullanabildiğimiz erişim belirleyicileri (Access Modifiers) daha önce C# Erişim Belirleyiciler - Access Modifiers isimli makalede ele almıştım.
C# kurallarına göre, bir proje diğer projeyi referans olarak görüyorsa public erişim belirleyicili (access modifier) olan class‘lara erişebilir. internal access modifier olan class‘lara ise referans olarak gören projeden erişilemez, sadece tanımlandığı projeden erişilebilir.
Göstermesi, anlatmasından kolay olacak sanırım.
Hemen Visual Studio 2015 açalım ve yeni bir Console Application projesi oluşturalım;
Solution‘a sağ tuşla tıklayalım ve Add Project menüsünden bir tane Class Library ekleyelim ve Class1.cs dosyasının ismini VeritabaniErisimi.cs olacak şekilde değiştirelim;
Yeni oluşturduğumuz Class Library projesini Console Application projesinin referans‘larına ekleyelim;
Böylece solution‘ımız aşağıdaki gibi gözükmeli;
VeritabaniErisimi.cs dosyasını açalım ve VeritabaniErisimi class‘ının erişim belirleyicisini (Access Modifier) internal yapalım.
Console Application projesindeki Program.cs dosyasını açar ve içerisinden VeritabaniErisimi isimli class‘a erişmek istersek, internal access modifier‘ına sahip olduğu için erişemeyeceğiz.
Bu noktada proje derlenemez ve ‘VeritabaniErisimi’ is inaccessible due to its protection level hatası verir.
Çünkü; internal access modifier‘ına sahip class‘lar sadece kendi projelerinde kullanılabilir, erişebilirlerdir. Kendi projelerinin dışından erişilemezler.
Eğer istersek, Kutuphane isimli Class Library‘deki internal access modifier‘ına sahip sınıfların başka projelerden de erişilebilir olmasını sağlayabiliriz.
Bunun için namespace üstünde InternalsVisibleTo Attribute‘ünü kullanmamız lazım.
Öncelikle VeritabaniErisimi.cs dosyasını açalım (aslında Kutuphane projesindeki herhangi bir csharp dosyasını açsak olur) ve using kısmına System.Runtime.CompilerServices ekleyelim, namespace üzerine de [assembly: InternalsVisibleTo(“PROJEADI”)] yazalım.
InternalsVisibelTo attribute‘ünün parametresi olan PROJEADI, internal access modifier‘ına sahip class‘ların görünür olmasını istediğimiz projelerin adı olmalı. Örneğin;
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484