我想知道人们在C#中使用属性作为对象初始化器的想法。由于某种原因,它似乎打破了构造函数的基本原理。
一个例子......
public class Person
{
string firstName;
string lastName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName= value; }
}
}
然后使用.....
进行对象初始化Person p = new Person{ FirstName = "Joe", LastName = "Smith" };
Person p = new Person{ FirstName = "Joe" };
答案 0 :(得分:10)
您在这里看到的是编译器提供的一些合成糖。在幕后,它真正做的是:
人p =新人(FirstName =“Joe”,LastName =“Smith”);
Person _p$1 = new Person();
_p$1.FirstName = "Joe";
_p$1.LastName = "Smith";
Person p = _p$1;
所以恕我直言,你并没有真正破坏任何构造函数的基础知识,而是使用一个很好的语言工件来提高可读性和可维护性。
答案 1 :(得分:6)
对象初始化器绝不会替换构造函数。构造函数定义了您必须遵守的合同,以便创建类的实例。
C#语言中对象初始值设定项的主要动机是支持Anonymous Types。
var v = new { Foo = 1, Bar = "Hi" };
Console.WriteLine(v.Bar);
答案 2 :(得分:4)
答案 3 :(得分:2)
由于您已经在使用新的C#语法,因此也可以使用自动属性,只是为了让您的代码更加甜蜜:
而不是:
string firstName;
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
使用它:
public string FirstName { get; set; }
答案 4 :(得分:2)
构造函数应该只有 required 构造对象的参数。对象初始化器只是为属性赋值的便捷方式。我尽可能使用对象初始化器,因为我认为它是一种更整洁的语法。
答案 5 :(得分:1)
我认为总体而言它非常有用,尤其是在与自动属性一起使用时。 当属性不仅仅是获取/设置时,它可能会令人困惑。 希望这将导致更多的方法,并减少滥用属性。
答案 6 :(得分:1)
不是你原来的问题,但仍然......
您的班级声明可以写成:
public class Person
{
public string FirstName { get; set; }
public string LastName {get; set; }
}
如果是我的代码,我可能会有一个Name的对象,其中包含字段First和Last。
答案 7 :(得分:0)
从语言集成查询(linq)
返回的预测类也非常必要var qry = from something in listofsomething
select new {
Firstname = something.FirstName,
Lastname = something.Surname
}
答案 8 :(得分:0)
对象初始化器有助于降低编码复杂性,因为您无需创建六个不同的构造函数即可为属性提供初始值。在我的书中,任何减少冗余代码的东西都是积极的。
我认为该功能添加到该语言的主要原因是支持LINQ的anonymous types。
答案 9 :(得分:0)
添加到Nescio的想法 - 我建议在代码审查中积极寻找属性访问者中昂贵的透明操作,例如DB圆形跳闸。
答案 10 :(得分:0)
如果要强制使用构造函数,可以将对象的默认无参数构造函数设置为private,并仅公开一些强制构造函数:
public class SomeObject
{
private SomeObject()
{}
public SomeObject(string someString) //enforced constructor
{}
public string MyProperty { get; set; }
}
使用上面的定义会引发错误:
var myObject = new SomeObject { MyProperty = "foo" } //no method accepts zero arguments for constructor
当然,对于所有情况都无法做到这一点。例如,序列化要求您具有非私有的默认构造函数。
答案 11 :(得分:0)
我对他们不满意。我不认为他们在构造函数中占有一席之地,或者MS应该回过头来重构它们以允许你在私有的时候使用它们。如果我构造一个对象,我想传递一些私有数据。我希望它从外部世界设置一次,就是这样。使用Object Initializers,您可以允许传递给构造函数的值可修改。
将来他们可能会改变这一点。