我应该使用对象初始化语法还是常规对象实例化?

时间:2014-11-16 17:53:40

标签: c# initialization instance

我目前正在阅读 Pro C#5.0和.NET 4.5 Framework 并且偶然发现了#34;对象初始化语法。"

我读过它可以调用任何构造函数,但如果参数表示相同的值类型,那么它是没有意义的。我可能没有正确地说这个,所以让我举个例子。

//Assume that the custom constructor for Point() takes int X and int Y.
//The X and Y value would still be 100, regardless of what the constructor says.
Point pt = new Point(10, 18) { X = 100, Y = 100 };

但是,当使用两种不同的类型时,它会发光最好,例如构造函数表示Color,OIS表示X和Y值。

Point redPoint = new Point(PointColor.Red) { X = 90, Y = 20 };

现在我的问题是,说我没有采用任何参数,使用对象初始化语法是否有合理的益处?在书中它说OIS允许你初始化任何可访问的字段,但是不能在构造函数中完成所有操作吗? 如果你们中的一个人可以举例说明何时无法在构造函数中初始化,我将不胜感激。 他没有过去用颜色给出这个例子,并没有给出一个例子而不是它有用的颜色。

4 个答案:

答案 0 :(得分:1)

对象初始化语法在使用类时使生活更轻松。以下面为例。想象一下,必须定义所有构造函数来处理下面的情况。使用OIS,消费者具有灵活的能力,并且仍然可以在一行中初始化。

public class MyClass
{
    public string Property1 { get; set; }
    public int Property2 { get; set; }
    public string Property3 { get; set; }
}

var myClass1 = new MyClass() { Property1 = "a" };
var myClass2 = new MyClass() { Property1 = "a", Property2 = 1 };
var myClass3 = new MyClass() { Property1 = "a", Property2 = 1, Property3 = "b" };
var myClass4 = new MyClass() { Property1 = "a", Property3 = "b" };

答案 1 :(得分:0)

只要它是你的类,继续创建有意义的构造函数。但是,您可能拥有无法影响的类,因为它们来自第三方库或.NET Framework本身。然后,对象初始化语法使其变得更容易。

此:

Point redPoint = new Point(PointColor.Red) { X = 90, Y = 20 };

只是简写:

Point redPoint = new Point(PointColor.Red);

redPoint.X = 90;
redPoint.Y = 20;

答案 2 :(得分:0)

对象初始化语法是纯粹的语法糖...它的唯一目的是使代码更容易编写和读取。如果你想使用或不使用它,这取决于你。在封面下,如果此编译器功能不存在,生成的代码看起来与手动编写代码完全相同。

对于构造函数,使用对象初始化程序的能力不应该说服任何开发人员设计他们的构造函数。问题应该if all of it can be done in constructor。问题应始终是what set of constructors make most sense for a given class (imagining object initialization didn't exist).,其余的取决于该类用户的个人偏好。

答案 3 :(得分:0)

我自己的偏好是否使用构造函数的变量是这样的:

  • 如果只有在初始化变量时类才有意义,我总是在构造函数参数中初始化变量。这可以确保您无法初始化一个没有意义的类。
  • 如果有一些变量可以初始化或未初始化,我几乎从不将它们放到构造函数参数中并使用对象初始化器初始化它们。

对于Point类,没有一个没有初始化值的类是没有意义的,因此值XY应该传递给构造函数中的类。但是,颜色不是强制性的,所以在这种情况下我会像这样初始化它:

Point redPoint = new Point(90, 20) { PointColor = Color.Red};