物件和集合初始設定式 (C# 程式設計手冊)
更新:2010 年 10 月
物件初始設定式可讓您在建立期間將值指派給物件的任何可存取的欄位或屬性,而不用明確叫用建構函式。 下列範例會示範如何使用有具名型別 Cat 的物件初始設定式。 使用 Cat 類別中的自動實作屬性時請注意。 如需詳細資訊,請參閱自動實作的屬性 (C# 程式設計手冊)。
private class Cat
{
// Auto-implemented properties.
public int Age { get; set; }
public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
具有匿名型別的物件初始設定式
雖然物件初始設定式可以用於任何內容,但是在 LINQ 查詢運算式中特別有用。 查詢運算式經常使用匿名型別,此型別只能使用物件初始化設定式初始化,如下列宣告所示。
var pet = new { Age = 10, Name = "Fluffy" };
匿名型別可讓 LINQ 查詢運算式中的 select 子句將原始序列的物件轉換為其值和圖形可以與原始物件不同的物件。 這在您只要儲存序列中每個物件的部分資訊時相當有用。 在下列範例中,假設產品物件 (p) 包含許多欄位和方法,而您只對建立包含產品名稱和單價之物件的序列有興趣。
var productInfos =
from p in products
select new { p.ProductName, p.UnitPrice };
執行此查詢時,productInfos 變數會包含物件序列,可以在 foreach 陳述式中存取,如下列範例所示:
foreach(var p in productInfos){...}
新匿名型別中的每個物件都有兩個公用屬性,會接收與原始物件中屬性或欄位相同的名稱。 您也可以在建立匿名型別時重新命名欄位,下列範例將 UnitPrice 欄位重新命名為 Price。
select new {p.ProductName, Price = p.UnitPrice};
具有可為 Null 型別的物件初始設定式
這是編譯時期錯誤,用以使用具有可為 Null 型別的集合初始設定式。
集合初始設定式
集合初始設定式可讓您在初始化集合類別時 (該類別實作 IEnumerable),指定一個或多個項目初始設定式。 項目初始設定式可以是簡單的值、運算式或物件初始設定式。 藉由使用集合初始設定式,您就不需要對來源程式碼中類別的 Add 方法指定多個呼叫,編譯器就會加入呼叫。
下列範例顯示兩個簡單的集合初始設定式:
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };
下列集合初始設定式使用物件初始設定式,來初始化之前範例中定義之 Cat 類別的物件。 請注意,每個物件初始設定式會以括號括住並以逗號分隔。
List<Cat> cats = new List<Cat>
{
new Cat(){ Name = "Sylvester", Age=8 },
new Cat(){ Name = "Whiskers", Age=2 },
new Cat(){ Name = "Sasha", Age=14 }
};
如果集合的 Add 方法允許,您可以將 null 指定為集合初始設定式中的項目。
List<Cat> moreCats = new List<Cat>
{
new Cat(){ Name = "Furrytail", Age=5 },
new Cat(){ Name = "Peaches", Age=4 },
null
};
範例
// The following code consolidates examples from the topic.
class ObjInitializers
{
private class Cat
{
// Auto-implemented properties.
public int Age { get; set; }
public string Name { get; set; }
}
static void Main()
{
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
List<Cat> cats = new List<Cat>
{
new Cat(){ Name = "Sylvester", Age=8 },
new Cat(){ Name = "Whiskers", Age=2 },
new Cat(){ Name = "Sasha", Age=14 }
};
List<Cat> moreCats = new List<Cat>
{
new Cat(){ Name = "Furrytail", Age=5 },
new Cat(){ Name = "Peaches", Age=4 },
null
};
// Display results.
System.Console.WriteLine(cat.Name);
foreach (Cat c in cats)
System.Console.WriteLine(c.Name);
foreach (Cat c in moreCats)
if (c != null)
System.Console.WriteLine(c.Name);
else
System.Console.WriteLine("List element has null value.");
}
// Output:
//Fluffy
//Sylvester
//Whiskers
//Sasha
//Furrytail
//Peaches
//List element has null value.
}
請參閱
參考
概念
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2010 年 10 月 |
新增不屬於 LINQ 查詢的匿名型別宣告範例。 新增主題的連結,此主題有更多關於匿名類型的資訊。 |
客戶回函。 |