C# |使用另一个实例的属性初始化新对象的语法
C# | Syntax to Initialize New Object With Properties of Another Instance
C# 使用另一个实例的属性初始化对象
(A)我能做到...
var newRestaurant = new Restaurant();
newRestaurant.Cuisine = model.Cuisine;
newRestaurant.Name = model.Name;
(B) 我可以这样写...
var newRestaurant = new Restaurant() { Name = model.Name };
(C)可是我怎么写不出来...
var newRestaurant = new Restaurant() model;
(Q) (B) 不就是一个对象字面量而 (C) 是一个对象实例吗?
很想知道。
感谢
Isn't (B) just an Object-Literal while (C) is an object instance?
简短的回答?不。C# 不使用大括号来表示对象字面量,例如 JavaScript 或类似的语言; C#使用花括号引用块.
在代码中
var newRestaurant = new Restaurant() { Name = model.Name };
{ Name = model.Name }
部分不是对象字面量,它是一个 初始化程序块 。您可以使用类似的语法来初始化列表和字典等集合:
var myString = "string3";
var myList = new List<string>() { "string1", "string2", myString };
var myDictionary = new Dictionary<string, int>()
{
{ "string1", 1 },
{ "string2", 2 },
{ myString, 3 },
};
如您所见,这些块的语法根据它们前面的对象类型而有所不同。这段代码被编译器转化为
var myString = "string3";
var myList = new List<string>();
myList.Add("string1");
myList.Add("string2");
myList.Add(myString);
var myDictionary = new Dictionary<string, int>();
myDictionary.Add("string1", 1);
myDictionary.Add("string2", 2);
myDictionary.Add(myString, 3);
在您的示例中,它被转换为:
var newRestaurant = new Restaurant();
newRestaurant.Name = model.Name;
当您尝试像 var newRestaurant = new Restaurant() model;
一样使用 model
时,编译器不知道 model
中有哪些属性或您打算如何处理它们;你想添加到列表中吗?您是否要复制所有属性?如果 model
中的所有属性都不匹配怎么办?
进一步阅读
更高版本的 C# 将有一个名为 Records 的东西,它将具有与您所描述的类似的功能(将字段从一个事物复制到另一个事物)。如果您有兴趣,可以阅读它们 on the compiler's github page,但它非常技术性。
C# 使用另一个实例的属性初始化对象
(A)我能做到...
var newRestaurant = new Restaurant();
newRestaurant.Cuisine = model.Cuisine;
newRestaurant.Name = model.Name;
(B) 我可以这样写...
var newRestaurant = new Restaurant() { Name = model.Name };
(C)可是我怎么写不出来...
var newRestaurant = new Restaurant() model;
(Q) (B) 不就是一个对象字面量而 (C) 是一个对象实例吗?
很想知道。
感谢
Isn't (B) just an Object-Literal while (C) is an object instance?
简短的回答?不。C# 不使用大括号来表示对象字面量,例如 JavaScript 或类似的语言; C#使用花括号引用块.
在代码中
var newRestaurant = new Restaurant() { Name = model.Name };
{ Name = model.Name }
部分不是对象字面量,它是一个 初始化程序块 。您可以使用类似的语法来初始化列表和字典等集合:
var myString = "string3";
var myList = new List<string>() { "string1", "string2", myString };
var myDictionary = new Dictionary<string, int>()
{
{ "string1", 1 },
{ "string2", 2 },
{ myString, 3 },
};
如您所见,这些块的语法根据它们前面的对象类型而有所不同。这段代码被编译器转化为
var myString = "string3";
var myList = new List<string>();
myList.Add("string1");
myList.Add("string2");
myList.Add(myString);
var myDictionary = new Dictionary<string, int>();
myDictionary.Add("string1", 1);
myDictionary.Add("string2", 2);
myDictionary.Add(myString, 3);
在您的示例中,它被转换为:
var newRestaurant = new Restaurant();
newRestaurant.Name = model.Name;
当您尝试像 var newRestaurant = new Restaurant() model;
一样使用 model
时,编译器不知道 model
中有哪些属性或您打算如何处理它们;你想添加到列表中吗?您是否要复制所有属性?如果 model
中的所有属性都不匹配怎么办?
进一步阅读
更高版本的 C# 将有一个名为 Records 的东西,它将具有与您所描述的类似的功能(将字段从一个事物复制到另一个事物)。如果您有兴趣,可以阅读它们 on the compiler's github page,但它非常技术性。