您如何看待在C#中使用属性作为对象初始值设定项;

时间:2008-09-17 23:57:36

标签: c#

我想知道人们在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" };

12 个答案:

答案 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,您可以允许传递给构造函数的值可修改。

将来他们可能会改变这一点。