物件和集合初始設定式 (C# 程式設計手冊)
物件初始設定式可讓您在建立期間將值指派給物件的任何可存取欄位或屬性,而不用叫用後面接著幾行指派陳述式的建構函式。 物件初始設定式語法可讓您為建構函式指定引數或省略引數 (以及括號語法)。下列範例將示範如何使用有具名類型 Cat 的物件初始設定式,以及如何叫用預設建構函式。 請注意 Cat 類別中自動實作屬性的用法。 如需詳細資訊,請參閱自動實作的屬性 (C# 程式設計手冊)。
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
{
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.
}