Różnica w przypisaniu wartości do zmiennej

0

Cześć,
chciałem się zapytać jaka jest różnica między przypisaniem wartości do zmiennej/właściwości od razu od przypisaniem wartości w konstruktorze - jak poniżej:

class Klasa
    {
    public bool zmienna { get; set; } = true;   //czym to się różni od tego niżej?
    public Klasa()
        {
        zmienna = true; //czym to się różnicy od tego wyżej?
        }
}
5

Jedyna różnica jest w momencie w którym nastąpi przypisanie.

using System;
class A
{
    public A()
    {
        PrintFields();
    }
    public virtual void PrintFields() { }
}
class B : A
{
    int x { get; set; } = 1;
    int y { get; set; }
    public B()
    {
        y = -1;
    }
    public override void PrintFields()
    {
        Console.WriteLine("x = {0}, y = {1}", x, y);
    }
}

public class Test
{
    public static void Main()
    {
        var b = new B();
    }
}

Wynik : x = 1, y = 0

Ze specyfikacji języka:

Variable initializers are transformed into assignment statements, and these assignment statements are executed before the invocation of the base class instance constructor. This ordering ensures that all instance fields are initialized by their variable initializers before any statements that have access to that instance are executed.

1

Przeanalizuj kod IL . Najpierw konstruktor inicializuje pole właściwości , Potem uruchamiany jest konstruktor kalsy bazowej , a następnie zawartość konstrukotra klasy .

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       24 (0x18)
  .maxstack  8 // maksymalny rozmiar stosu 8 argumetów
  IL_0000:  ldarg.0 // ładuje na stos referencję obiektu
  IL_0001:  ldc.i4.1 // ładuje na stos 1 - true
  IL_0002:  stfld      bool ConsoleApp.Klasa::'<zmienna>k__BackingField'  // zapisuje w polu właściwości wartość 1 - true
  IL_0007:  ldarg.0  // ładuje na stos referencję obiektu
  IL_0008:  call       instance void [mscorlib]System.Object::.ctor()  // wywołuje konstruktor klasy bazowej
  IL_000d:  nop // pusta instrukcja
  IL_000e:  nop
  IL_000f:  ldarg.0  // ładuje na stos referencję obiektu
  IL_0010:  ldc.i4.1 // ładuje na stos wartość 1 - true
  IL_0011:  call       instance void ConsoleApp.Klasa::set_zmienna(bool) // wywołuje metodę set - właściwości
  IL_0016:  nop
  IL_0017:  ret  // return void  - konstruktor niczego nie zwraca 
} // end of method Klasa::.ctor

1 użytkowników online, w tym zalogowanych: 0, gości: 1