Często niedocenianym przez wielu programistów .NET typem danych są struktury. Ich stosowanie zalecane jest wszędzie, gdzie mamy do czynienia z lekkimi, często stosowanymi obiektami, jak na przykład współrzędne, figura geometryczna, pole na szachownicy itd. Korzystanie z dużych kolekcji obiektów definiowanych jako klasy powoduje o wiele większe zużycie pamięci, niż gdybyśmy zdefiniowali te obiekty jako struktury. Poniżej kilka faktów z życia struktur w świecie .NET
- może zawierać pola, metody, konstruktory
- nie może dziedziczyć żadnego typu (poza ValueType, z którego dziedziczą niejawnie), może implementować interfejsy
- w MSIL dodawane jest słowo kluczowe sealed, przez co nie można ze struktur dziedziczyć
- nie mogą zawierać jawnego bezparametrowego konstruktora
- nie muszą być inicjowane operatore new, np.
public struct MyStruct
{
public int x;
public int y;
}
MyStruct b;
b.x = 3;
b.y = 2;
Console.WriteLine(b.x);
Console.WriteLine(b.y);
- pól nie można inicjalizować w ciele struktury, a jedynie w konstruktorze zawierającym parametry, lub indywidualnie można nadawać wartość każdemu polu w kodzie proceduralnym
- aby korzystać ze struktur jako typów referencyjnych należy przeprowadzić operację boxing, aby powrócić do ValueType, należy przeprowadzić unboxing
//boxing
object o = b;
//unboxing
b = (MyStruct) o;
- boxing zachodzi również podczas rzutowania do interfejsów, z których dziedziczy dana struktura
- obiekty klas powstają na stercie (w pamięci wolnej), przez co sprzątane są przez Garbage Collector w sposób niederministyczny, struktury natomiast tworzone są na stosie, przez co sprzątane są zaraz po wyjściu z bloku kodu, np po wykonaniu funkcji, w której je deklarujemy
- inicjowanie instancji struktur operatorem new nie powoduje przeniesienia ich na stertę
- jako argumenty funkcji możemy przekazywać struktury za pomocą sowa kluczowego ref
Brak komentarzy:
Prześlij komentarz