Bevezetés az osztályok használatába
Referenciatípusok
Az a típus, amely referenciatípusként class
van definiálva. Futtatáskor, amikor egy referencia típusú változót deklarál, a változó addig tartalmazza az értéket null
, amíg explicit módon nem hozza létre az osztály egy példányát az new
operátor használatával, vagy máshol létrehozott kompatibilis típusú objektumot rendel hozzá, ahogyan az az alábbi példában látható:
//Declaring an object of type MyClass.
MyClass mc = new MyClass();
//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;
Az objektum létrehozásakor elegendő memória van lefoglalva az adott objektum felügyelt halomán, és a változó csak az adott objektum helyére mutató hivatkozást tartalmaz. Az objektum által használt memóriát a CLR automatikus memóriakezelési funkciója, az úgynevezett szemétgyűjtés visszanyeri. További információ a szemétgyűjtésről: Automatikus memóriakezelés és szemétgyűjtés.
Osztályok deklarálása
Az osztályok deklarálása a class
kulcsszóval, majd egy egyedi azonosítóval történik, ahogyan az alábbi példában látható:
//[access modifier] - [class] - [identifier]
public class Customer
{
// Fields, properties, methods and events go here...
}
Egy választható hozzáférés-módosító megelőzi a kulcsszót class
. Egy típus alapértelmezett class
hozzáférése a következő internal
: . Mivel public
ebben az esetben használják, bárki létrehozhatja az osztály példányait. Az osztály neve a kulcsszót class
követi. Az osztály nevének érvényes C# azonosítónévnek kell lennie. A definíció fennmaradó része az osztály törzse, ahol a viselkedés és az adatok definiálva vannak. Az osztály mezői, tulajdonságai, metódusai és eseményei együttesen osztálytagok.
Objektumok létrehozása
Bár néha felcserélhetően használják őket, egy osztály és egy objektum más dolog. Az osztály definiál egy objektumtípust, de nem maga az objektum. Az objektum egy osztályon alapuló konkrét entitás, amelyet néha osztálypéldánynak is neveznek.
Az objektumok a kulcsszóval new
, majd az osztály nevével hozhatók létre, a következőképpen:
Customer object1 = new Customer();
Osztálypéldány létrehozásakor a program visszaadja az objektumra mutató hivatkozást a programozónak. Az előző példában egy olyan objektumra mutató hivatkozás látható, object1
amely a következőn Customer
alapul: Ez a hivatkozás az új objektumra hivatkozik, de nem tartalmazza magát az objektumadatokat. Valójában objektumhivatkozást is létrehozhat objektum létrehozása nélkül:
Customer object2;
Nem javasoljuk, hogy olyan objektumhivatkozásokat hozzon létre, amelyek nem hivatkoznak objektumra, mert egy objektum ilyen hivatkozással való elérése futás közben meghiúsul. A hivatkozások hivatkozhatnak egy objektumra egy új objektum létrehozásával, vagy egy meglévő objektum hozzárendelésével, például a következővel:
Customer object3 = new Customer();
Customer object4 = object3;
Ez a kód két objektumhivatkozást hoz létre, amelyek mindkettő ugyanarra az objektumra hivatkoznak. Ezért az objektumon végzett object3
módosítások a későbbi használatban object4
is megjelennek. Mivel az osztályokon alapuló objektumokra hivatkozás hivatkozik, az osztályokat referenciatípusoknak nevezzük.
Konstruktorok és inicializálás
Az előző szakaszok bevezették az osztálytípus deklarálásához és egy ilyen típusú példány létrehozásához használt szintaxist. Egy típuspéldány létrehozásakor gondoskodnia kell arról, hogy a mezők és a tulajdonságok inicializálva legyenek a hasznos értékekre. Az értékek inicializálásának több módja is van:
- Alapértelmezett értékek elfogadása
- Mező inicializálói
- Konstruktorparaméterek
- Objektum-inicializálók
Minden .NET-típusnak van alapértelmezett értéke. Ez az érték általában 0 a számtípusok null
és az összes referenciatípus esetében. Erre az alapértelmezett értékre támaszkodhat, ha az ésszerű az alkalmazásban.
Ha a .NET alapértelmezett értéke nem a megfelelő érték, a kezdeti értéket mező inicializálóval állíthatja be:
public class Container
{
// Initialize capacity field to a default value of 10:
private int _capacity = 10;
}
Megkövetelheti a hívóktól, hogy adjanak meg egy kezdeti értéket egy olyan konstruktor definiálásával, amely felelős a kezdeti érték beállításáért:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
A C# 12-től kezdődően az osztálydeklaráció részeként meghatározhat egy elsődleges konstruktort :
public class Container(int capacity)
{
private int _capacity = capacity;
}
Ha paramétereket ad hozzá az osztálynévhez, az határozza meg az elsődleges konstruktort. Ezek a paraméterek az osztály törzsében érhetők el, beleértve a tagjait is. Ezekkel inicializálhatja a mezőket, vagy bárhol máshol, ahol szükség van rájuk.
A módosítót egy tulajdonságon is használhatjarequired
, és engedélyezheti, hogy a hívók objektum-inicializálót használhassanak a tulajdonság kezdeti értékének beállításához:
public class Person
{
public required string LastName { get; set; }
public required string FirstName { get; set; }
}
A hívók által megadott kulcsszó-meghatalmazások hozzáadása required
a kifejezés részeként new
:
var p1 = new Person(); // Error! Required properties not set
var p2 = new Person() { FirstName = "Grace", LastName = "Hopper" };
Osztályöröklés
Az osztályok teljes mértékben támogatják az öröklést, ami az objektumorientált programozás alapvető jellemzője. Amikor létrehoz egy osztályt, örökölhet bármely más, nem definiált sealed
osztálytól. Más osztályok örökölhetnek az osztálytól, és felülbírálhatják az osztály virtuális metódusait. Emellett egy vagy több interfészt is implementálhat.
Az öröklés származtatással történik, ami azt jelenti, hogy az osztályt egy alaposztály használatával deklarálják, amelyből örökli az adatokat és a viselkedést. Az alaposztályt egy kettőspont és az alaposztály neve hozzáfűzésével adhatók meg a származtatott osztály neve alapján, a következőképpen:
public class Manager : Employee
{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}
Ha egy osztálydeklaráció tartalmaz egy alaposztályt, az a konstruktorok kivételével örökli az alaposztály összes tagját. További információ: Öröklés.
A C# osztályai csak közvetlenül örökölhetnek egy alaposztályt. Mivel azonban egy alaposztály maga is örökölhet egy másik osztálytól, egy osztály közvetetten több alaposztályt is örökölhet. Az osztály emellett közvetlenül is implementálhat egy vagy több interfészt. További információ: Interfészek.
Az osztály deklarálható .abstract
Az absztrakt osztályok olyan absztrakt metódusokat tartalmaznak, amelyek aláírásdefinícióval rendelkeznek, de implementálásuk nincs. Az absztrakt osztályok nem hozhatók létre. Ezek csak olyan származtatott osztályokon keresztül használhatók, amelyek implementálják az absztrakt metódusokat. Ezzel szemben a lezárt osztályok nem teszik lehetővé, hogy más osztályok is származhassanak belőle. További információ: Absztrakt és lezárt osztályok és osztálytagok.
Az osztálydefiníciók különböző forrásfájlok között oszthatók fel. További információ: Részleges osztályok és metódusok.
C# nyelvi specifiká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.