Erişimci Erişilebilirliğini Kısıtlama (C# Programlama Kılavuzu)Restricting Accessor Accessibility (C# Programming Guide)

Bir özelliğin veya dizin oluşturucunun Get ve set bölümlerine erişimcilerdenir.The get and set portions of a property or indexer are called accessors. Varsayılan olarak, bu erişimciler ait oldukları özelliğin veya dizin oluşturucunun aynı görünürlük veya erişim düzeyine sahiptir.By default these accessors have the same visibility or access level of the property or indexer to which they belong. Daha fazla bilgi için bkz. Erişilebilirlik düzeyleri.For more information, see accessibility levels. Ancak, bu Erişimcilerde erişimi kısıtlamak bazen yararlı olur.However, it is sometimes useful to restrict access to one of these accessors. Genellikle bu, erişimcinin erişilebilirliğini kısıtlamadan set , get erişimcinin genel olarak erişilebilir tutulması ile ilgilidir.Typically, this involves restricting the accessibility of the set accessor, while keeping the get accessor publicly accessible. Örnek:For example:

private string _name = "Hello";

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

Bu örnekte, adlı bir özellik Name bir get ve erişimcisi tanımlar set .In this example, a property called Name defines a get and set accessor. Erişimci, get özelliğin kendi erişilebilirlik düzeyini alır, public Bu durumda set erişimci kendisine korumalı erişim değiştiricisi uygulanarak açıkça kısıtlanır.The get accessor receives the accessibility level of the property itself, public in this case, while the set accessor is explicitly restricted by applying the protected access modifier to the accessor itself.

Erişimcilerde erişim değiştiricilerine yönelik kısıtlamalarRestrictions on Access Modifiers on Accessors

Özelliklerde veya dizin oluşturucularda erişimci değiştiricilerin kullanılması şu koşullara tabidir:Using the accessor modifiers on properties or indexers is subject to these conditions:

  • Bir arabirimde veya açık arabirim üyesi uygulamasında erişimci değiştiricileri kullanamazsınız.You cannot use accessor modifiers on an interface or an explicit interface member implementation.

  • Erişimci değiştiricileri yalnızca özellik veya dizin oluşturucunun hem hem de erişimcileri varsa kullanabilirsiniz set get .You can use accessor modifiers only if the property or indexer has both set and get accessors. Bu durumda, değiştiriciye yalnızca iki erişimcinin yalnızca birinde izin verilir.In this case, the modifier is permitted on only one of the two accessors.

  • Özelliğin veya dizin oluşturucunun bir geçersiz kılma değiştiricisi varsa, erişimci değiştiricisi, varsa geçersiz kılınan erişimcinin erişimcisi ile eşleşmelidir.If the property or indexer has an override modifier, the accessor modifier must match the accessor of the overridden accessor, if any.

  • Erişimcinin erişilebilirlik düzeyi, özelliğin veya dizin oluşturucunun kendi erişilebilirlik düzeyinden daha kısıtlayıcı olmalıdır.The accessibility level on the accessor must be more restrictive than the accessibility level on the property or indexer itself.

Geçersiz kılma erişimcileri üzerindeki erişim değiştiricileriAccess Modifiers on Overriding Accessors

Bir özelliği veya dizin oluşturucuyu geçersiz kıldığınızda geçersiz kılınan erişimcilere geçersiz kılma kodu tarafından erişilebilir olması gerekir.When you override a property or indexer, the overridden accessors must be accessible to the overriding code. Ayrıca, hem Property/Indexer hem de erişimcilerinin erişilebilirliği karşılık gelen geçersiz kılınan Özellik/Dizin Oluşturucu ve erişimcileri ile eşleşmelidir.Also, the accessibility of both the property/indexer and its accessors must match the corresponding overridden property/indexer and its accessors. Örnek:For example:

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 uygulamaImplementing Interfaces

Bir arabirim uygulamak için erişimci kullandığınızda, erişimci bir erişim değiştiricisine sahip olmayabilir.When you use an accessor to implement an interface, the accessor may not have an access modifier. Ancak, gibi bir erişimci kullanarak arabirimi uygularsanız, get diğer erişimci aşağıdaki örnekte olduğu gibi bir erişim değiştiricisine sahip olabilir:However, if you implement the interface using one accessor, such as get, the other accessor can have an access modifier, as in the following example:

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ıAccessor Accessibility Domain

Erişimci üzerinde bir erişim değiştiricisi kullanırsanız, erişimcinin erişilebilirlik etki alanı bu değiştiriciye göre belirlenir.If you use an access modifier on the accessor, the accessibility domain of the accessor is determined by this modifier.

Erişimci üzerinde bir erişim değiştiricisi kullanmıyorsanız, erişimcinin erişilebilirlik etki alanı, özelliğin veya dizin oluşturucunun erişilebilirlik düzeyine göre belirlenir.If you did not use an access modifier on the accessor, the accessibility domain of the accessor is determined by the accessibility level of the property or indexer.

ÖrnekExample

Aşağıdaki örnek üç sınıf içerir,, BaseClass DerivedClass ve MainClass .The following example contains three classes, BaseClass, DerivedClass, and MainClass. Üzerinde BaseClass Name ve Id her iki sınıfta iki özelliği vardır.There are two properties on the BaseClass, Name and Id on both classes. Örnek, Id DerivedClass Id BaseClass korumalı veya özelgibi kısıtlayıcı bir erişim değiştiricisi kullandığınızda üzerinde özelliğinin nasıl gizlendiğini gösterir.The example demonstrates how the property Id on DerivedClass can be hidden by the property Id on BaseClass when you use a restrictive access modifier such as protected or private. Bu nedenle, bu özelliğe değer atadığınızda, BaseClass sınıfındaki özelliği yerine çağırılır.Therefore, when you assign values to this property, the property on the BaseClass class is called instead. Erişim değiştiricisinin genel olarak değiştirilmesi, özelliği erişilebilir hale getirir.Replacing the access modifier by public will make the property accessible.

Örnek ayrıca, private içindeki özelliğinin erişimcisinde bulunan veya gibi kısıtlayıcı bir erişim protected set Name DerivedClass değiştiricisinin erişimciye erişimi önlediği ve kendisine atarken bir hata oluşturduğu bir hata üretdiğini gösterir.The example also demonstrates that a restrictive access modifier, such as private or protected, on the set accessor of the Name property in DerivedClass prevents access to the accessor and generates an error when you assign to it.

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
*/

YorumlarComments

Bildirimini ile değiştirmeniz durumunda new private string Id new public string Id çıktıyı alırsınız:Notice that if you replace the declaration new private string Id by new public string Id, you get the output:

Name and ID in the base class: Name-BaseClass, ID-BaseClass

Name and ID in the derived class: John, John123

Ayrıca bkz.See also