建構函式和屬性初始化

屬性值的賦值應該在類的建構函式之前還是之後執行?

public class TestClass 
{
    public int TestProperty { get; set; } = 2;
    
    public TestClass() 
    {
        if (TestProperty == 1) 
        {
            Console.WriteLine("Shall this be executed?");
        }

        if (TestProperty == 2) 
        {
            Console.WriteLine("Or shall this be executed");
        }
    }
}

var testInstance = new TestClass() { TestProperty = 1 };

在上面的例子中,TestProperty 值應該是類’建構函式中的 1 還是類建構函式之後?

在例項建立中分配屬性值,如下所示:

var testInstance = new TestClass() {TestProperty = 1};

將在建構函式執行執行。但是,在 C#6.0 的類’屬性中初始化屬性值,如下所示:

public class TestClass 
{
    public int TestProperty { get; set; } = 2;

    public TestClass() 
    {
    }
}

將在建構函式執行之前完成。

將上述兩個概念結合在一個示例中:

public class TestClass 
{
    public int TestProperty { get; set; } = 2;
    
    public TestClass() 
    {
        if (TestProperty == 1) 
        {
            Console.WriteLine("Shall this be executed?");
        }

        if (TestProperty == 2) 
        {
            Console.WriteLine("Or shall this be executed");
        }
    }
}

static void Main(string[] args) 
{
    var testInstance = new TestClass() { TestProperty = 1 };
    Console.WriteLine(testInstance.TestProperty); //resulting in 1
}

最後結果:

"Or shall this be executed"
"1"

說明:

首先將 TestProperty 值指定為 2,然後執行 TestClass 建構函式,從而列印出

"Or shall this be executed"

由於 new TestClass() { TestProperty = 1 }TestProperty 將被指定為 1,使 Console.WriteLine(testInstance.TestProperty) 列印的 TestProperty 的最終值為

"1"