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,但它非常技术性。