Junior
Wat is het verschil tussen klassen en structuren in C#?
sobes.tech AI
Antwoord van AI
Klassen zijn referentietypes, structuren zijn waardetypes.
- Locatie in geheugen: Klasseninstanties worden geplaatst in de beheerde heap, structuren in de stack of binnen het object waartoe ze behoren.
- Erfelijkheid: Klassen ondersteunen erfelijkheid, structuren niet. Structuren kunnen interfaces implementeren.
- Standaardwaarde: Voor klassen is
nullde standaardwaarde. Voor structuren is het een set nullen voor de velden. - Doorgeven aan methoden: Klasseninstanties worden door referentie doorgegeven (er wordt een verwijzing naar het object doorgegeven). Structuren worden door waarde doorgegeven (er wordt een kopie gemaakt).
- Prestaties: Structuren kunnen sneller zijn dan klassen voor kleine objecten, omdat de kosten van geheugenbeheer en garbage collection worden vermeden. Het doorgeven van grote structuren door waarde kan echter minder efficiënt zijn.
- Aanmaak: Voor structuren initialiseert een impliciete parameterloze constructor de velden met nullen. Voor klassen is een expliciete parameterloze constructor vereist als andere constructors zijn gedefinieerd.
| Kenmerk | Klasse (Class) | Struct (Struct) |
|---|---|---|
| Type | Referentietype | Waardetype |
| Locatie in geheugen | Beheerde heap | Stack / Intern |
| Erfelijkheid | Ondersteunt | Ondersteunt niet (maar implementeert interfaces) |
| Standaardwaarde | null |
Set nullen |
| Doorgeven | Per referentie | Per waarde |
| Prestaties | Kan langzamer zijn voor kleine objecten | Kan sneller zijn voor kleine objecten |
| Impliciete constructor | Nee (als er andere zijn) | Ja (initialisatie met nullen) |
// Voorbeeld van klasse
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Voorbeeld van structuur
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Demonstratie van doorgeven
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Wijzigt de originele PointClass
ps.X = 100; // Wijzigt alleen de kopie van PointStruct
}
// Gebruik
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X zal 100 zijn
// pointStruct1.X zal 1 zijn (alleen de kopie is gewijzigd)