Różnice między klasą a strukturą:
- klasa to reference type, a struktura to value type (więcej o różnicy między dwoma rodzajami typów mozna poczytać tutaj)
- struktury nie mogą dziedziczyć z klas lub innych struktur. Mogą jednak implementować interfejsy. Zatem struktury zachowują się jakby były sealed. Dodanie wprost modyfikatora sealed do struktury powoduje błąd kompilacji. Także z tego powodu pola struct nie mogą być zadeklarowane jako protected - modyfikator ten nie ma sensu jeśli nie możemy zastosować dziedziczenia
- przypisanie wartości do struktury tworzy kopię obiektu. W przypadku klas kopiowana jest referencja. Jest to oczywiście bezpośrednio związane z faktem, że struktura to value type, a klasa - reference type
- struktura nie może posiadać bezparametrowego konstruktora domyślnego
- struktura nie może posiadać destruktora
Jak ustaliliśmy, struktury nie mogą dziedziczyć, ale mogą implementować interfejsy:
public struct ChildStructExample : StructExample //błąd kompilacji { } public struct InterfaceImplementingStructExample : IDisposable //ok { public void Dispose() { } }
Dodanie modyfikatora sealed powoduje błąd kompilacji:
public sealed struct StructExample //błąd kompilacji { }
Przypisanie wartości do instancji struktury tworzy kopię obiektu, zaś do instancji klasy - kopię referencji:
public class ClassExample { public int ClassField; } public struct StructExample { public int StructField; } class Program { static void Main(string[] args) { var classInstance = new ClassExample(); classInstance.ClassField = 1; var otherClassInstance = classInstance; otherClassInstance.ClassField = 2; Console.WriteLine(classInstance.ClassField); //wypisze sie "2" gdyż otherClassInstance odnosi się do tego samego obiektu - skopiowana została referencja var structInstance = new StructExample(); structInstance.StructField = 1; var otherStructInstance = structInstance; otherStructInstance.StructField = 2; Console.WriteLine(structInstance.StructField); //wypisze sie "1" gdyż otherStructInstance odnosi się do innego obiektu - skopiowana została cała instacja struktury Console.ReadKey(); } }
Struktura nie może posiadać bezparametrowego konstruktora domyślnego:
public struct StructExample { public StructExample() //błąd kompilacji { } public StructExample(int value) //ok { } }
Struktura nie może posiadać destruktora:
public struct StructExample { ~StructExample() //błąd kompilacji { } }
Komentarze
Prześlij komentarz