Megosztás a következőn keresztül:


Kisegítő lehetőségek korlátozása (C# programozási útmutató)

A tulajdonság vagy indexelő lekérési és beállítási részeit tartozéknak nevezzük. Alapértelmezés szerint ezek a tartozékok ugyanolyan láthatósági vagy hozzáférési szinttel rendelkeznek annak a tulajdonságnak vagy indexelőnek, amelyhez tartoznak. További információ: akadálymentességi szintek. Néha azonban hasznos lehet korlátozni az egyik tartozékhoz való hozzáférést. Általában korlátozza a tartozék akadálymentességét set , miközben a get tartozék nyilvánosan elérhető marad. Példa:

private string _name = "Hello";

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

Ebben a példában egy úgynevezett Name tulajdonság definiál egy és set egy kiegészítőtget. Ebben get az esetben a tartozék maga public a tulajdonság akadálymentességi szintjét kapja meg, míg a set tartozék kifejezetten korlátozott, ha a védett hozzáférési módosító magára a tartozékra van alkalmazva.

Feljegyzés

A cikkben szereplő példák nem használnak automatikusan implementált tulajdonságokat. Az automatikusan implementált tulajdonságok tömör szintaxist biztosítanak a tulajdonságok deklarálásához, ha nincs szükség egyéni háttérmezőre.

A tartozékokkal kapcsolatos hozzáférési módosítók korlátozásai

A tartozékmódosítók tulajdonságokon vagy indexelőkön való használatára a következő feltételek vonatkoznak:

  • Nem használhat kiegészítő módosítókat sem interfészen, sem explicit felülettag-implementáción .
  • A kiegészítő módosítókat csak akkor használhatja, ha a tulajdonság vagy az indexelő mindkettővel set és get tartozékokkal is rendelkezik. Ebben az esetben a módosító csak a két tartozék egyikén engedélyezett.
  • Ha a tulajdonság vagy indexelő rendelkezik felülbírálási módosítóval, a kiegészítő módosítónak meg kell egyeznie a felülbírált tartozék tartozékával, ha van ilyen.
  • A tartozék akadálymentességi szintjének szigorúbbnak kell lennie, mint magának a tulajdonságnak vagy indexelőnek az akadálymentességi szintje.

Hozzáférés módosítókhoz a felülíró tartozékokon

Tulajdonság vagy indexelő felülbírálása esetén a felülbírált tartozékoknak elérhetőnek kell lenniük a felülbíráló kódhoz. Emellett a tulajdonság/indexelő és tartozékai akadálymentességének meg kell egyeznie a megfelelő felülbírált tulajdonságnak/indexelőnek és tartozékainak. Példa:

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; }
    }
}

Implementálási felületek

Ha egy tartozékot használ egy interfész implementálásához, előfordulhat, hogy a tartozék nem rendelkezik hozzáférési módosítóval. Ha azonban az interfészt egy tartozék használatával valósítja meg, például geta másik tartozék rendelkezhet hozzáférési módosítóval, ahogyan az alábbi példában is látható:

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 { }
    }
}

Tartozék akadálymentességi tartománya

Ha hozzáférési módosítót használ a tartozékon, a tartozék akadálymentességi tartományát ez a módosító határozza meg.

Ha nem használt hozzáférési módosítót a tartozékon, a tartozék akadálymentességi tartományát a tulajdonság vagy az indexelő akadálymentességi szintje határozza meg.

Példa

Az alábbi példa három osztályt tartalmaz, BaseClassDerivedClassés MainClass. A két osztály két tulajdonsággal BaseClassName Id rendelkezik. A példa bemutatja, hogy a tulajdonság hogyan rejtheti el a tulajdonságot BaseClass Id DerivedClass Id olyan korlátozó hozzáférés-módosító használatakor, mint a védett vagy a privát. Ezért ha értékeket rendel ehhez a tulajdonsághoz, a rendszer az osztály tulajdonságát BaseClass hívja meg helyette. A hozzáférés-módosító nyilvánosra cserélése akadálymentessé teszi a tulajdonságot.

A példa azt is szemlélteti, private protectedhogy a tulajdonság tartozékán set Name található korlátozó hozzáférés-módosító megakadályozza a tartozékhoz való hozzáférést a származtatott osztályban DerivedClass . Hiba keletkezik, amikor hozzá van rendelve, vagy hozzáfér az azonos nevű alaposztálytulajdonsághoz, ha az elérhető.

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

Megjegyzések

Figyelje meg, hogy ha lecseréli a deklarációt new private string Id new public string Id, a kimenet a következő lesz:

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

Lásd még