Erişimci Erişilebilirliğini Kısıtlama (C# Programlama Kılavuzu)

Bir özelliğin veya dizin oluşturucunun get ve set bölümlerine erişimci adı verilir. Varsayılan olarak bu erişimciler ait oldukları özelliğin veya dizin oluşturucunun aynı görünürlüğüne veya erişim düzeyine sahiptir. Daha fazla bilgi için bkz . erişilebilirlik düzeyleri. Ancak, bazen bu erişimcilerden birine erişimi kısıtlamak yararlı olabilir. Genellikle erişimcinin erişilebilirliğini set kısıtlar ve erişimciyi get genel olarak erişilebilir tutarsınız. Örneğin:

private string _name = "Hello";

public string Name
{
    get
    {
        return _name;
    }
    protected set
    {
        _name = value;
    }
}

Bu örnekte, adlı Name bir özellik ve getset erişimcisini tanımlar. Erişimciget, public bu durumda özelliğin erişilebilirlik düzeyini alır, erişimci ise erişimcinin set kendisine korumalı erişim değiştiricisi uygulanarak açıkça kısıtlanır.

Not

Bu makaledeki örnekler otomatik olarak uygulanan özellikleri kullanmaz. Otomatik uygulanan özellikler , özel bir yedekleme alanı gerekli olmadığında özellikleri bildirmek için kısa bir söz dizimi sağlar.

Erişimcilerde Erişim Değiştiricileri kısıtlamaları

Özelliklerde veya dizin oluşturucularda erişimci değiştiricileri kullanmak şu koşullara tabidir:

  • Erişimci değiştiricilerini bir arabirimde veya açık arabirim üyesi uygulamasında kullanamazsınız.
  • Erişimci değiştiricilerini yalnızca özelliğin veya dizin oluşturucunun hem hem de setget erişimcileri varsa kullanabilirsiniz. Bu durumda değiştiriciye iki erişimciden yalnızca birinde izin verilir.
  • Özelliğin veya dizin oluşturucunun geçersiz kılma değiştiricisi varsa, erişimci değiştiricinin geçersiz kılınan erişimcinin erişimciyle eşleşmesi gerekir.
  • Erişimcideki erişilebilirlik düzeyi, özellik veya dizin oluşturucunun kendisinde erişilebilirlik düzeyinden daha kısıtlayıcı olmalıdır.

ErişimCileri Geçersiz Kılmada Erişim Değiştiricileri

Bir özelliği veya dizin oluşturucuyu geçersiz kıldığınızda geçersiz kılınan erişimcilere geçersiz kılınan kod tarafından erişilebilir olmalıdır. Ayrıca hem özellik/dizin oluşturucunun hem de erişimcilerinin erişilebilirliği, karşılık gelen geçersiz kılınan özellik/dizin oluşturucu ve erişimcileriyle eşleşmelidir. Örneğin:

public class Parent
{
    public virtual int TestProperty
    {
        // Notice the accessor accessibility level.
        protected set { }

        // No access modifier is used here.
        get { return 0; }
    }
}
public class Kid : Parent
{
    public override int TestProperty
    {
        // Use the same accessibility level as in the overridden accessor.
        protected set { }

        // Cannot use access modifier here.
        get { return 0; }
    }
}

Arabirimleri Uygulama

Arabirim uygulamak için erişimci kullandığınızda erişimcinin erişim değiştiricisi olmayabilir. Ancak, arabirimini gibi bir erişimci kullanarak uygularsanız, aşağıdaki örnekte olduğu gibi getdiğer erişimcinin bir erişim değiştiricisi olabilir:

public interface ISomeInterface
{
    int TestProperty
    {
        // No access modifier allowed here
        // because this is an interface.
        get;
    }
}

public class TestClass : ISomeInterface
{
    public int TestProperty
    {
        // Cannot use access modifier here because
        // this is an interface implementation.
        get { return 10; }

        // Interface property does not have set accessor,
        // so access modifier is allowed.
        protected set { }
    }
}

Erişimci Erişilebilirlik Etki Alanı

Erişimcide bir erişim değiştirici kullanıyorsanız erişimcinin erişilebilirlik etki alanı bu değiştirici tarafından belirlenir.

Erişimcide erişim değiştirici kullanmadıysanız erişimcinin erişilebilirlik etki alanı özelliğin veya dizin oluşturucunun erişilebilirlik düzeyine göre belirlenir.

Örnek

Aşağıdaki örnek, , DerivedClassve MainClassadlı üç sınıf BaseClassiçerir. üzerinde ve Id her iki sınıfta da iki özellik BaseClassName vardır. Örnek, korumalı veya özel gibi kısıtlayıcı bir erişim değiştirici kullandığınızda üzerindeki DerivedClass özelliğinin Id özelliği IdBaseClass tarafından nasıl gizlenebileceğini gösterir. Bu nedenle, bu özelliğe değer atadığınızda, bunun yerine sınıfındaki BaseClass özelliği çağrılır. Erişim değiştiricisini genel olarak değiştirmek özelliğin erişilebilir olmasını sağlar.

Örnek ayrıca içindeki özelliğinin DerivedClass erişimcisindeki set veya protectedgibi private kısıtlayıcı bir erişim değiştiricinin Name türetilmiş sınıftaki erişimciye erişimi engellediğini gösterir. Buna atadığınızda bir hata oluşturur veya erişilebilirse aynı ada sahip temel sınıf özelliğine erişir.

public class BaseClass
{
    private string _name = "Name-BaseClass";
    private string _id = "ID-BaseClass";

    public string Name
    {
        get { return _name; }
        set { }
    }

    public string Id
    {
        get { return _id; }
        set { }
    }
}

public class DerivedClass : BaseClass
{
    private string _name = "Name-DerivedClass";
    private string _id = "ID-DerivedClass";

    new public string Name
    {
        get
        {
            return _name;
        }

        // Using "protected" would make the set accessor not accessible.
        set
        {
            _name = value;
        }
    }

    // Using private on the following property hides it in the Main Class.
    // Any assignment to the property will use Id in BaseClass.
    new private string Id
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        BaseClass b1 = new BaseClass();
        DerivedClass d1 = new DerivedClass();

        b1.Name = "Mary";
        d1.Name = "John";

        b1.Id = "Mary123";
        d1.Id = "John123";  // The BaseClass.Id property is called.

        System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
        System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    Base: Name-BaseClass, ID-BaseClass
    Derived: John, ID-BaseClass
*/

Açıklamalar

bildirimini new private string Id ile new public string Iddeğiştirirseniz çıkışını aldığınıza dikkat edin:

Name and ID in the base class: Name-BaseClass, ID-BaseClass Name and ID in the derived class: John, John123

Ayrıca bkz.