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


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 Tegy példánymezővel F, létrehozhat két típusú Tobjektumot, é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, internalprotected internalvagy 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