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árainit
szolgál. - A tulajdonságok lehetnek írásvédettek (tartozékuk és
set
tartozékuk isget
), írásvédett (tartozékuk vanget
, de nincsset
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 init
is, 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 Name
Price
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 SaleItem
mind a tulajdonságokat, mind a Price
Name
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}");
Kapcsolódó szakaszok
- Tulajdonságok használata
- Felület tulajdonságai
- Tulajdonságok és indexelők összehasonlítása
- A tartozék akadálymentességének korlátozása
- Automatikusan implementált tulajdonságok
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: