如果要在類別建立時確保屬性資料有被賦值/初始化,那就需要寫在建構子中要求傳入參數:
這樣在實例化物件時就需要帶入這些參數才可以建立物件:
但是當有多個建構子時每個都需要帶入這個兩個參數,非常麻煩,並且也沒有辦法調整建構子傳入參數的順序。
在 C# 11 中新增了必須成員(required members),在類別(class)或是結構(struct)中只要加上 required 關鍵字就會強制要求在建立時給定初始值:
在實例化物件時如果沒有將標記為 required 的屬性設定初始值時就會顯示錯誤訊息,無法執行:
可以使用下面的方式在實例化物件時指定初始值:
並且相比於一開始示範的使用建構子處理的方式,我們可以使用不同的順序賦值:
參考資料:
Microsoft.Learn - Required Members
Microsoft.Learn - required modifier (C# Reference)
Microsoft.Learn - What's new in the .NET 8 runtime
JetBrains Blog - Required Keyword, Checked Operators, nameof Operator Scope – Using C# 11 in Rider and ReSharper
JetBrains Guide - C# 11 - Required Keyword
public class User
{
public User(int id, string name)
{
Id = id;
Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
這樣在實例化物件時就需要帶入這些參數才可以建立物件:
var user = new User(1, "Ruyut");
但是當有多個建構子時每個都需要帶入這個兩個參數,非常麻煩,並且也沒有辦法調整建構子傳入參數的順序。
在 C# 11 中新增了必須成員(required members),在類別(class)或是結構(struct)中只要加上 required 關鍵字就會強制要求在建立時給定初始值:
public class User
{
public required int Id { get; set; }
public required string Name { get; set; }
}
在實例化物件時如果沒有將標記為 required 的屬性設定初始值時就會顯示錯誤訊息,無法執行:
var user = new User();
// Required member 'User.Id' must be set in the object initializer
// Required member 'User.Name' must be set in the object initializer
可以使用下面的方式在實例化物件時指定初始值:
var user = new User()
{
Id = 1,
Name = "Ruyut",
};
並且相比於一開始示範的使用建構子處理的方式,我們可以使用不同的順序賦值:
var user2 = new User()
{
Name = "小明",
Id = 2,
};
參考資料:
Microsoft.Learn - Required Members
Microsoft.Learn - required modifier (C# Reference)
Microsoft.Learn - What's new in the .NET 8 runtime
JetBrains Blog - Required Keyword, Checked Operators, nameof Operator Scope – Using C# 11 in Rider and ReSharper
JetBrains Guide - C# 11 - Required Keyword
感謝教學~
回覆刪除