C#|使用另一个实例的属性初始化新对象的语法

时间:2016-12-09 18:12:13

标签: c# syntax object-initializers

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)只是一个Object-Literal而(C)是一个对象实例吗?

很想知道。

THX

1 个答案:

答案 0 :(得分:4)

  

不是(B)只是一个Object-Literal而(C)是一个对象实例吗?

简短的回答?不,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;

当您尝试使用model之类的var newRestaurant = new Restaurant() model;时,编译器不知道model中的哪些属性或者您对它们的意图;你想加入一个清单吗?你想复制所有的属性吗?如果model中的所有属性都不匹配,该怎么办?

进一步阅读

C#的后续版本将有一个名为 Records 的东西,它将具有与您所描述的相似的功能(将字段从一个东西复制到另一个东西)。如果您有兴趣,可以阅读它们on the compiler's github page,但它非常技术性。