24 Ağustos 2015

Erişim Tanımlayıcılar(Access Modifiers)

Bir tip veya bir tipin üyelerinin erişimindi diğer tipler veya assembliler için  erişimin seviyesini sağlayabileceğimiz 5 tanımlayıcı vardır. Bunlara access modifiers denir.

Public: Tam erişim sağlar.
Internal :Sadece bulunduğu assembly veya yakın assemblilerin erişimini sağlar.
Private: Sadece bulunduğu tipin içerisinde erişime açıktır. Class ve structlar için varsayılan (default) erişim özelliği budur.
Protected: Sadece bulunduğu tip yada alt clasın erişimi vardır.
Protected Internal : protected ve internal in birleşimidir. Eric Liper bunu şu şekilde açıklar:
"Herşey varsayılan(default) olarak mümkün olduğunca private seçilmeye çalışılır. Ve her modifier bir şeyi daha çok erişilebilir (accessible) yapmaya çalışır. Bu yüzden protected internal olan şeyler her iki yol içinde daha erişilebilir olmasını sağlar.

Örnekler.
namespace AccessibleModifier
{
    class Program
    {
        //Class1 e dışarıdan erişilebilir. Class2 ye erişilemez.
        class Class1{}//Class1 internal(default)
        public class Class2{}

        //ClassB içiersinde x' e aynı assembly deki tipler erişebiliri ClassA da erişemez.
        class ClassA{int x;}//x is private(default)
        class ClassB{internal int x;}

        class BaseClass
        {
            void Foo(){}//Foo is private(default)
            protected void Bar(){}
        }
        class Subclass : BaseClass
        {
            //void Test1() { Foo(); } // Hata Foo ya erişemez.
            void Test2() { Bar(); } // protected olduğu için alt class ta erişebilir.

        }
        static void Main(string[] args)
        {
            ClassA a=new ClassA();
            //a.x=10;//Hata aynı assembide değil.Eişim yok.
            ClassB b=new ClassB();
            b.x=10;//Aynu Assembli içerisinde olduğu için x'e erişebildik.

        }
    }
}