为什么要使用初始化器呢?(.净)

Dan*_*dor 5 .net c# visual-studio-2008

我有这个:

AudioPlayer player = new AudioPlayer();
player.Directory = vc.Directory;
player.StartTime = vc.StarTime;
player.EndTime = vc.EndTime;
Run Code Online (Sandbox Code Playgroud)

但我可以这样:

AudioPlayer player = new AudioPlayer
{
    Directory = vc.Directory,
    StartTime = vc.StarTime,
    EndTime = vc.EndTime
};
Run Code Online (Sandbox Code Playgroud)

如果我转换为"新的写作方式",除了不可读之外我还能获得什么?它会让我更接近lambda函数(=>)吗?

它与RAII有关吗?

加成:

有人回答说,正常的初始化可能会使对象处于"无效"状态,例如只设置一个Directory属性 - 我在这里观察的是设计对象的人可能是设计它的方式,只有那些必须真正输入的值才是通过真正的构造函数输入,所有其他可以在以后自由修改.

Ste*_*ven 10

有了这么简单的例子,你的确得不到多少.但是,当你有这个时,它会有所不同:

var player = new AudioPlayer
{
    Car = new Car()
    {
        WheelSize = new Inch(21),
        Driver = new Person()
        {
            Age = 53,
            Type = LicenseType.B,
            Family =
            {
                new Person("Jane"),
                new Person("Pieter"),
                new Person("Anny")
            }
        }
    }
    Directory = vc.Directory,
    StartTime = vc.StarTime,
    EndTime = vc.EndTime
};
Run Code Online (Sandbox Code Playgroud)

尝试用旧方法做到这一点.它变得非常难看.


svi*_*ick 2

考虑您想要将新创建的对象传递给某个方法(而不用它做任何其他事情)。您可以按照旧的方式编写它:

\n\n
AudioPlayer player = new AudioPlayer();\nplayer.Directory = vc.Directory;\nplayer.StartTime = vc.StarTime;\nplayer.EndTime = vc.EndTime;\nsome.Method(player);\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您可以使用对象初始值设定项:

\n\n
some.Method(\n  new AudioPlayer\n  {\n      Directory = vc.Directory,\n      StartTime = vc.StarTime,\n      EndTime = vc.EndTime\n  });\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用对象初始化程序,您可以清楚地看到代码的作用以及稍后不会使用该对象。

\n\n

另外,我认为可读性(和 \xe2\x80\x9cwritability\xe2\x80\x9d)更好:你不必无休止地重复变量名称。

\n