簡體   English   中英

這個C#對象初始化程序代碼發生了什么?

[英]What is happening with this C# object initializer code?

這個C#代碼發生了什么? 我甚至不確定它為什么編譯。 具體來說,它在設置Class1Prop嘗試使用對象初始化器語法的地方發生了什么? 它似乎是無效的語法,但它在運行時編譯並產生空引用錯誤。

void Main()
{    
    var foo = new Class1
    {
        Class1Prop = 
        {
            Class2Prop = "one"
        }
    };
}

public class Class1
{
    public Class2 Class1Prop { get; set; }
}

public class Class2
{
    public string Class2Prop { get; set; }
}

這是C#規范中的對象初始化器語法所允許的,它被稱為嵌套對象初始化器 它相當於:

var _foo = new Class1();
_foo.Class1Prop.Class2Prop = "one"
var foo = _foo;

為什么拋出空引用異常應該更明顯一些。 Class1Prop從未在Class1的構造函數中初始化。

這種語法的好處是調用者可以使用方便的對象初始化器語法,即使屬性是getter-only,也只能在嵌套對象上設置可變屬性。 例如,如果Class1Prop是getter-only屬性,則該示例仍然有效。

請注意,創建了一個無法訪問的臨時變量,以防止在完全初始化運行之前訪問字段或數組插槽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM