首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0對象初始化器進階(二):嵌套屬性初始化、語法細節陷阱與構造函數要求

     編輯:關於C語言

嵌套對象初始化器

當屬性本身為引用類型,可繼續使用對象初始化器:


// 嵌套類型定義
public class OClass
{
    public string Addr { get; set; }
    public string Zip { get; set; }
    public OClass() { }
    public OClass(string addr, string zip) { Addr = addr; Zip = zip; }
}

public class MyClass
{
    public string Name { get; set; }
    public string Number { get; set; }
    public OClass OClassMember { get; set; }
}

// 使用嵌套初始化器
MyClass nestObj = new MyClass
{
    Name = "yy",
    Number = "1111",
    OClassMember = new OClass
    {
        Addr = "neijiang",
        Zip = "404045"
    }
};

語法細節對比表

場景分隔符結束符本質
自動屬性定義get/set後分號花括號無分號屬性聲明語法
對象初始化器屬性賦值間逗號花括號後分號表達式語句
嵌套初始化器(非末尾)內層花括號後逗號外層花括號後分號表達式列表元素
嵌套初始化器(末尾)內層花括號無分隔外層花括號後分號表達式列表最後元素

關鍵限制:必須有無參構造函數


public class NoDefaultCtor
{
    public NoDefaultCtor(int x) { } // 僅有帶參構造函數
}

// 編譯錯誤:'NoDefaultCtor' 不包含接受 0 個參數的構造函數
var obj = new NoDefaultCtor { Prop = "value" }; 

原因:編譯器先生成new NoDefaultCtor(),再逐屬性賦值。

屬性賦值順序不影響結果


MyClass obj = new MyClass
{
    Name = "yy",
    OClassMember = new OClass { Addr = "neijiang", Zip = "404045" },
    Number = "1111" // 最後賦值,完全合法
};

編譯器保證按聲明順序生成賦值代碼,但語義上順序無關。

避坑指南

  • 區分定義時(自動屬性)與使用時(初始化器)的語法差異。
  • 嵌套層級較深時,格式化縮進至關重要,防止漏逗號/分號。
  • 所有參與初始化的類型必須提供public無參構造函數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved