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


Tulajdonságok (C# programozási útmutató)

A tulajdonság olyan tag, amely rugalmas mechanizmust biztosít a magánmezők értékének olvasására, írására vagy kiszámítására. A tulajdonságok úgy használhatók, mintha nyilvános adatok tagjai lennének, de speciális, kiegészítőnek nevezett módszerek. Ez a funkció lehetővé teszi az adatok egyszerű elérését, és továbbra is elősegíti a módszerek biztonságát és rugalmasságát.

Tulajdonságok áttekintése

  • A tulajdonságok lehetővé teszik az osztály számára, hogy nyilvánosan megjelenítse az értékek lekérésének és beállításának módját, miközben elrejti a megvalósítási vagy ellenőrzési kódot.
  • A beolvasási tulajdonság tartozéka a tulajdonságérték visszaadására szolgál, a megadott tulajdonság-tartozék pedig egy új érték hozzárendelésére szolgál. Az inicializálási tulajdonság tartozékai csak az objektumépítés során rendelhetők hozzá új értékekhez. Ezek a tartozékok különböző hozzáférési szintekkel rendelkezhetnek. További információ: A kiegészítő akadálymentesség korlátozása.
  • Az érték kulcsszó a hozzárendelt érték set meghatározására init szolgál.
  • A tulajdonságok lehetnek írásvédettek (tartozékuk és set tartozékuk isget), írásvédett (tartozékuk vanget, de nincs set tartozékuk), vagy írásvédett (tartozékuk vanset, de tartozékuk nincsget). A csak írási tulajdonságok ritkák, és leggyakrabban a bizalmas adatokhoz való hozzáférés korlátozására használatosak.
  • Az egyéni kiegészítő kódot nem igénylő egyszerű tulajdonságok kifejezéstörzs-definíciókként vagy automatikusan implementált tulajdonságokként implementálhatók.

Tulajdonságok háttérmezőkkel

A tulajdonságok implementálásának egyik alapvető mintája egy privát háttérmező használata a tulajdonságérték beállításához és lekéréséhez. A get tartozék visszaadja a privát mező értékét, és a set kiegészítő adatérvényesítést hajthat végre, mielőtt értéket rendel a privát mezőhöz. Mindkét tartozék a tárolás vagy visszaadás előtt némi átalakítást vagy számítást is végezhet az adatokon.

Az alábbi példa ezt a mintát szemlélteti. Ebben a példában az TimePeriod osztály egy időintervallumot jelöl. Az osztály belsőleg másodpercekben tárolja az időintervallumot egy magánmezőben._seconds A névvel ellátott Hours írási-olvasási tulajdonság lehetővé teszi, hogy az ügyfél órákban adja meg az időintervallumot. Mind a get tartozék, mind a set tartozék elvégzi a szükséges átalakítást órák és másodpercek között. Emellett a set tartozék ellenőrzi az adatokat, és érvénytelen órák számát adja meg ArgumentOutOfRangeException .

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

A tulajdonságok eléréséhez lekérheti és beállíthatja az értéket az alábbi példában látható módon:

TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;

// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
//    Time in hours: 24

Kifejezéstörzs-definíciók

A tulajdonságkiegészítők gyakran egysoros utasításokból állnak, amelyek csak egy kifejezés eredményét rendelik hozzá vagy adják vissza. Ezeket a tulajdonságokat kifejezéssel rendelkező tagokként implementálhatja. A kifejezés törzsdefiníciói a => szimbólumból, majd a tulajdonsághoz hozzárendelni vagy lekérni kívánt kifejezésből állnak.

Az írásvédett tulajdonságok kifejezés-testes tagként implementálhatják a get tartozékot. Ebben az esetben sem a get kiegészítő kulcsszót, sem a kulcsszót return nem használja a rendszer. Az alábbi példa az írásvédett Name tulajdonságot kifejezésre alkalmas tagként valósítja meg.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

Mind a get kiegészítő, mind a set kiegészítő kifejezési testű tagként implementálható. Ebben az esetben a kulcsszavaknak és set a get kulcsszavaknak jelen kell lenniük. Az alábbi példa a kifejezéstörzs-definíciók használatát mutatja be mindkét tartozék esetében. A return kulcsszót nem használja a get tartozék.

public class SaleItem
{
    string _name;
    decimal _cost;

    public SaleItem(string name, decimal cost)
    {
        _name = name;
        _cost = cost;
    }

    public string Name
    {
        get => _name;
        set => _name = value;
    }

    public decimal Price
    {
        get => _cost;
        set => _cost = value;
    }
}

Automatikusan implementált tulajdonságok

Bizonyos esetekben a tulajdonság get és set a tartozék csak hozzárendel egy értéket egy háttérmezőhöz, vagy lekér egy értéket anélkül, hogy további logikát alkalmaz. Az automatikusan implementált tulajdonságok használatával egyszerűsítheti a kódot, miközben a C# fordító transzparens módon adja meg a háttérmezőt.

Ha egy tulajdonság rendelkezik egy get és set egy (vagy egy get ) tartozéksal initis, mindkettőt automatikusan végre kell hajtani. Az automatikusan implementált tulajdonságot úgy határozhatja meg, hogy azokat és set kulcsszavakat get használ anélkül, hogy implementációt biztosítanának. Az alábbi példa megismétli az előzőt, kivéve az NamePrice automatikusan implementált tulajdonságokat. A példa eltávolítja a paraméteres konstruktort is, így SaleItem az objektumok inicializálva lesznek a paraméter nélküli konstruktorhoz és egy objektum inicializálóhoz való hívással.

public class SaleItem
{
    public string Name
    { get; set; }

    public decimal Price
    { get; set; }
}

Az automatikusan implementált tulajdonságok különböző hozzáférési képességeket deklarálhatnak a tartozékokhoz és set a get tartozékokhoz. Gyakran deklarál egy nyilvános get tartozékot és egy privát set tartozékot. A kiegészítő akadálymentesség korlátozásáról a cikkben olvashat bővebben.

Szükséges tulajdonságok

A C# 11-től kezdődően hozzáadhatja a tagot, hogy kényszerítse az required ügyfélkódot bármely tulajdonság vagy mező inicializálására:

public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

A létrehozáshoz SaleItemmind a tulajdonságokat, mind a PriceName tulajdonságokat objektum-inicializálókkal kell beállítania, ahogyan az a következő kódban is látható:

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

C# nyelvi specifikáció

További információ: Tulajdonságok a C# nyelvi specifikációjában. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még