Junior
Na czym polega różnica między klasami a strukturami w C#?
sobes.tech AI
Odpowiedź od AI
Klasy to typy referencyjne, struktury to typy wartości.
- Lokalizacja w pamięci: Instancje klas są umieszczane na zarządzanym stercie (Heap), struktury na stosie (Stack) lub wewnątrz obiektu, do którego należą.
- Dziedziczenie: Klasy obsługują dziedziczenie, struktury nie. Struktury mogą implementować interfejsy.
- Wartość domyślna: Dla klas
nulljest wartością domyślną. Dla struktur jest to zestaw zer dla pól. - Przekazywanie do metod: Instancje klas są przekazywane przez referencję (przekazywana jest referencja do obiektu). Struktury są przekazywane przez wartość (tworzona jest kopia).
- Wydajność: Struktury mogą być szybsze od klas dla małych obiektów, ponieważ unika się kosztów zarządzania stertą i zbierania śmieci. Jednak przekazywanie dużych struktur przez wartość może być mniej wydajne.
- Tworzenie: Dla struktur, domyślny konstruktor bez parametrów inicjuje pola zerami. Dla klas, jeśli zdefiniowano inne konstruktory, wymaga się jawnego konstruktora bez parametrów.
| Cecha | Klasa (Class) | Struktura (Struct) |
|---|---|---|
| Typ | Referencyjny | Wartościowy |
| Lokalizacja w pamięci | Zarządzany sterta | Stos / Wbudowany |
| Dziedziczenie | Obsługuje | Nie obsługuje (ale implementuje interfejsy) |
| Wartość domyślna | null |
Zestaw zer |
| Przekazywanie | Przez referencję | Przez wartość |
| Wydajność | Może być wolniejsza dla małych obiektów | Może być szybsza dla małych obiektów |
| Konstruktor domyślny | Nie (jeśli są inne) | Tak (inicjalizacja zerami) |
// Przykład klasy
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Przykład struktury
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Demonstracja przekazywania
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Zmieni oryginalny PointClass
ps.X = 100; // Zmieni tylko kopię PointStruct
}
// Użycie
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X będzie 100
// pointStruct1.X będzie 1 (ponieważ zmieniono tylko kopię)