Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Jótanács
Új szoftverfejlesztés? Először az Első lépések oktatóanyagokkal kezdje. Az osztályokkal akkor találkozik, amikor viselkedéssel és állapottal kell modellezni az objektumokat.
Tapasztalt egy másik nyelven? A C#-osztályok a Java vagy a C++ osztályaihoz hasonlóak. Tekintse át a objektum-inicializálók szakaszát C#-specifikus mintákhoz, és keresse az adatközpontú alternatívát a Rekordok szakaszban.
Az osztály egy referenciatípus, amely meghatározza az objektumok tervét. Osztálytípusú változó létrehozásakor a változó a felügyelt halom egy objektumára mutató hivatkozást tartalmaz. A változó nem tárolja magát az objektumadatokat. Egy osztályváltozó egy másik változóhoz rendelése a hivatkozást másolja, így mindkét változó ugyanarra az objektumpéldányra mutat. A C#-ban az egyéni típusok definiálásának leggyakoribb módja az osztályok. Akkor használja őket, ha összetett viselkedésre, öröklésre vagy megosztott identitásra van szüksége a hivatkozások között.
Mikor érdemes osztályokat használni?
Használjon osztályt a következő esetekben:
- A típus összetett viselkedéssel rendelkezik, vagy mutable állapotot kezel.
- Öröklésre van szükség egy származtatott specializációkkal rendelkező alaposztály létrehozásához, vagy egy meglévő osztályt kiterjesztő származtatott típus létrehozásához.
- A példányok egy megosztott identitást képviselnek, nem pedig objektumokat, amelyek egyenlő értékeket tartalmaznak. Az ugyanarra az objektumra mutató két hivatkozásnak szinkronban kell maradnia.
- A típus nagy vagy hosszú élettartamú, és kihasználja a halom kiosztását és a referencia szemantikáját.
Egy osztály deklarálása
Adjon meg egy osztályt a class kulcsszóval és a típusnévvel. Az opcionális hozzáférés-módosító szabályozza a láthatóságot. Az alapértelmezett érték a internal. Adja meg public, hogy más szerelvények hívói használhassák az Ön típusait.
public class Customer
{
public string Name { get; set; }
public Customer(string name) => Name = name;
}
Az osztály törzse mezőket, tulajdonságokat, metódusokat és eseményeket tartalmaz, együttesen osztálytagokat. A névnek érvényes C# azonosítónévnek kell lennie.
Objektumok létrehozása
Az osztály definiál egy típust, de nem maga az objektum. Létrehoz egy objektumot (az osztály egy példányát ) a new következő kulcsszóval:
var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison
A változó customer az objektumra mutató hivatkozást tartalmaz, nem magát az objektumot. Több változót is hozzárendelhet ugyanahhoz az objektumhoz. Az egyik hivatkozáson keresztüli módosítások a másikon keresztül láthatók:
var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object
c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2
Ez a referenciamegosztási viselkedés az osztályok és a szerkezetek közötti egyik különbség. A szerkezetekkel a hozzárendelés átmásolja az adatokat. Ami még fontosabb, az osztályok támogatják az öröklést. Létrehozhat olyan hierarchiákat, amelyekben a származtatott típusok újra felhasználhatók, és egy alaposztály viselkedését specializálhatja. A szerkezetek nem vehetnek részt az öröklési hierarchiákban. A megkülönböztetésről további információt az Értéktípusok és a referenciatípusok című témakörben talál.
Konstruktorok és inicializálás
Amikor létrehoz egy példányt, a mezőket és a tulajdonságokat hasznos értékekre szeretné inicializálni. A C# számos megközelítést kínál: mező inicializálókat, konstruktorparamétereket, elsődleges konstruktorokat és szükséges tulajdonságokat.
A mező inicializálói beállítanak egy alapértelmezett értéket közvetlenül a meződeklaráción:
public class Container
{
private int _capacity = 10;
}
A mező inicializálói ésszerű alapértelmezett értéket rendelnek egy mezőhöz vagy tulajdonsághoz. Ez megkülönbözteti a következő megközelítésektől, ahol a hívók meg tudják adni a kezdeti értéket.
A konstruktor paraméterei megkövetelik , hogy a hívók értékeket adjanak meg:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
Az elsődleges konstruktorok (C# 12+) közvetlenül hozzáadnak paramétereket az osztálydeklarációhoz. Ezek a paraméterek az osztály törzsében érhetők el:
public class Container(int capacity)
{
private int _capacity = capacity;
}
Az elsődleges konstruktorok és a mező inicializálói együttműködhetnek: a mező inicializálója _capacity = capacity az elsődleges-konstruktor paramétert használja értékként. Ez a minta lehetővé teszi konstruktorargumentumok rögzítését egyetlen, tömör deklarációval rendelkező mezőkben.
A szükséges tulajdonságok kényszerítik, hogy a hívók meghatározott tulajdonságokat állítsanak be egy objektum-inicializálón keresztül:
public class Person
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper
A konstruktorminták részletesebb megismeréséhez, beleértve a paraméterérvényesítést és a konstruktorláncolást, tekintse meg a konstruktorokat.
Statikus osztályok
Az static osztály nem hozható létre példányosítva, és csak statikus tagokat tartalmaz. Statikus osztályok használatával rendszerezheti a példányadatokon nem működő segédprogram-metódusokat:
static class MathHelpers
{
public static double CircleCircumference(double radius) =>
2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42
A .NET osztálytár számos statikus osztályt tartalmaz, például Math és Console. A statikus osztály implicit módon van lezárva. Nem lehet leszármaztatni belőle, és nem lehet példányosítani sem.
Objektum-inicializálók
Az objektum inicializálói lehetővé teszik a tulajdonságok beállítását egy objektum létrehozásakor anélkül, hogy konstruktort írnál az értékek minden kombinációjához:
class ConnectionOptions
{
public string Host { get; init; } = "localhost";
public int Port { get; init; } = 80;
public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
Host = "db.example.com",
Port = 5432,
UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)
Az objektum-inicializálók minden olyan hozzáférhető tulajdonsággal működnek, amelynek set vagyinit hozzáférési módja van. Természetes módon kombinálják a required tulajdonságokat és a konstruktorokat, amelyek bizonyos paramétereket fogadnak el, miközben lehetővé teszik a hívónak, hogy másokat állítson be.
Ha a tulajdonság gyűjtemény, a Gyűjtemény kifejezések (C# hivatkozás) használatával inicializálhatja az objektumot.
Örökség
Az osztályok támogatják az öröklést. Definiálhat egy új osztályt, amely újra felhasználja, kibővíti vagy módosítja egy meglévő osztály viselkedését. Az örökölt osztály az alaposztály, az új osztály pedig a származtatott osztály:
var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering
Egy osztály örökölhet egy alaposztályt, és több interfészt implementálhat. A származtatott osztályok a konstruktorok kivételével öröklik az alaposztály összes tagját. További információ: Öröklés és felületek.