Przejdź do głównej zawartości

[C#] Jakie są rożnice między klasą a strukturą?


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
Przyjrzyjmy się dokładniej tym różnicom:

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