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

本文关键字:对象 常规 实例化 初始化 我应该 语法 | 更新日期: 2023-09-27 18:30:31

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

我读到它可以调用任何构造函数,但如果参数表示相同的值类型,那么它就毫无意义。我可能说得不正确,所以让我举个例子。

//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 };

但是,当使用两种不同的类型时,例如,如果构造函数表示颜色,OIS 表示 X 和 Y 值,则它最出色。

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

现在我的问题是,假设我没有使用任何参数,使用对象初始化语法是否有逻辑上的好处?在书中它说OIS允许您初始化任何可访问的字段,但是这些不能在构造函数中完成吗?如果你们中的一个人能举一个示例来说明何时无法在构造函数中初始化,我将不胜感激。他没有过去用颜色给出例子,除了颜色之外,它没有给出一个有用的例子。

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

对象初始化语法使使用类时的生活更轻松。 以下面为例。 想象一下必须定义的所有构造函数来处理以下情况。 使用 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" };

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

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

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

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

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

这:

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

只是对此的简写:

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

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

至于构造函数,使用对象初始值设定项的能力不应说服任何开发人员设计其构造函数不佳。问题不应该是,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).其余的取决于该类用户的个人喜好。