Mezők (C# programozási útmutató)
A mező bármilyen típusú változó, amely közvetlenül egy osztályban vagy szerkezetben deklarálva van. A mezők a bennük található típus tagjai.
Egy osztálynak vagy szerkezetnek lehetnek példánymezői, statikus mezői vagy mindkettői. A példánymezők egy adott típusú példányra vonatkoznak. Ha van egy osztálya T
egy példánymezővel F
, létrehozhat két típusú T
objektumot, és módosíthatja F
az egyes objektumok értékét anélkül, hogy az hatással lenne a másik objektum értékére. Ezzel szemben a statikus mező maga a típushoz tartozik, és az adott típus összes példánya között meg van osztva. A statikus mezőt csak a típusnév használatával érheti el. Ha egy példánynév alapján éri el a statikus mezőt, CS0176 fordítási idő hibát fog kapni.
Általában a mezők deklarálása private
vagy protected
akadálymentesítése javasolt. Azokat az adatokat, amelyeket a típus elérhetővé tesz az ügyfélkód számára, metódusokkal, tulajdonságokkal és indexelőkkel kell megadni. Ha ezeket a szerkezeteket használja a belső mezőkhöz való közvetett hozzáféréshez, védheti az érvénytelen bemeneti értékeket. A nyilvános tulajdonság által közzétett adatokat tároló magánmezőt háttértárnak vagy háttérmezőnek nevezzük. Deklarálhat public
mezőket, de nem akadályozhatja meg, hogy a típust használó kód érvénytelen értékre állítsa a mezőt, vagy más módon módosítsa egy objektum adatait.
A mezők általában azokat az adatokat tárolják, amelyeknek egynél több típusú metódushoz kell hozzáférni, és amelyeket egy metódus élettartamánál hosszabb ideig kell tárolni. Egy naptárdátumot képviselő típusnak például három egész mezője lehet: egy a hónapra, egy a napra és egy az évre. Az egyetlen metódus hatókörén kívül nem használt változókat helyi változóként kell deklarálni a metódus törzsén belül.
A mezők deklarálása az osztályban vagy a szerkezetblokkban a hozzáférési szint megadásával, majd a típus, majd a mező neve után következik. Példa:
public class CalendarEntry
{
// private field (Located near wrapping "Date" property).
private DateTime _date;
// Public property exposes _date field safely.
public DateTime Date
{
get
{
return _date;
}
set
{
// Set some reasonable boundaries for likely birth dates.
if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
{
_date = value;
}
else
{
throw new ArgumentOutOfRangeException("Date");
}
}
}
// public field (Generally not recommended).
public string? Day;
// Public method also exposes _date field safely.
// Example call: birthday.SetDate("1975, 6, 30");
public void SetDate(string dateString)
{
DateTime dt = Convert.ToDateTime(dateString);
// Set some reasonable boundaries for likely birth dates.
if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
{
_date = dt;
}
else
{
throw new ArgumentOutOfRangeException("dateString");
}
}
public TimeSpan GetTimeSpan(string dateString)
{
DateTime dt = Convert.ToDateTime(dateString);
if (dt.Ticks < _date.Ticks)
{
return _date - dt;
}
else
{
throw new ArgumentOutOfRangeException("dateString");
}
}
}
Egy példány mezőinek eléréséhez adjon hozzá egy pontot a példány neve után, majd a mező nevét, ahogyan az a példában is szerepel instancename._fieldName
. Példa:
CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";
A mező kezdeti értékként a hozzárendelési operátor használatával adható meg a mező deklarálásakor. Ha például automatikusan hozzá szeretné rendelni a Day
mezőt "Monday"
, deklarálhatja Day
az alábbi példában látható módon:
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
A mezők inicializálása közvetlenül az objektumpéldány konstruktorának meghívása előtt történik. Ha a konstruktor hozzárendeli egy mező értékét, felülírja a meződeklaráció során megadott értékeket. További információ: Konstruktorok használata.
Feljegyzés
A mező inicializálója nem hivatkozhat más példánymezőkre.
A mezők megjelölhetők public
, private
, protected
, internal
protected internal
vagy private protected
. Ezek a hozzáférési módosítók határozzák meg, hogy az adott típusú felhasználók hogyan férhetnek hozzá a mezőkhöz. További információ: Access Modifiers.
A mezők opcionálisan deklarálhatók static
. A statikus mezők bármikor elérhetők a hívók számára, még akkor is, ha nincs ilyen típusú példány. További információ: Statikus osztályok és statikus osztálytagok.
Egy mező deklarálható readonly
. Egy írásvédett mező csak inicializáláskor vagy konstruktorban rendelhető hozzá értékhez. A static readonly
mezők hasonlóak az állandókhoz, azzal a kivételrel, hogy a C#-fordító nem rendelkezik hozzáféréssel a statikus írásvédett mező értékéhez fordításkor, csak futásidőben. További információ: Állandók.
Egy mező deklarálható required
. A kötelező mezőt a konstruktornak vagy egy objektum inicializálójának kell inicializálnia egy objektum létrehozásakor. Adja hozzá az System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute attribútumot minden olyan konstruktor-deklarációhoz, amely inicializálja az összes szükséges tagot.
A required
módosító nem kombinálható ugyanazon a readonly
mező módosítójával. A tulajdonság azonban lehet required
és init
csak.
A C# 12-től kezdődően az elsődleges konstruktorparaméterek a mezők deklarálásának alternatívái. Ha a típus olyan függőségekkel rendelkezik, amelyeket az inicializáláskor kell megadni, létrehozhat egy elsődleges konstruktort, amely biztosítja ezeket a függőségeket. Ezek a paraméterek rögzíthetők és használhatók a típusok deklarált mezői helyett. Típusok esetén record
az elsődleges konstruktorparaméterek nyilvános tulajdonságokként jelennek meg.
C# nyelvspecifikáció
További információkért lásd a C# nyelvi specifikációját. 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: