.net-C#新语句后的花括号做什么?

给定下面的代码,position0的初始化方式与25614375758525900900的初始化方式有什么区别? 它们相等吗? 如果没有,有什么区别?

class Program
{
    static void Main(string[] args)
    {
        Position position0 = new Position() { x=3, y=4 };

        Position position1 = new Position();
        position1.x = 3;
        position1.y = 4;
    }
}

struct Position
{
    public int x, y;
}
Daniel Allen Langdon asked 2019-10-09T08:54:46Z
7个解决方案
58 votes

它们并不完全相等-至少在一般情况下不是这样。 使用对象初始化程序的代码更接近于此:

Position tmp = new Position();
tmp.x = 3;
tmp.y = 4;
Position position1 = tmp;

换句话说,仅在设置属性后才对变量赋值。 现在,在您声明一个新的局部变量的情况下,这实际上并不重要,并且编译器很可能会优化为您的第一种形式。 但从逻辑上讲,这确实很重要。 考虑:

Position p1 = new Position { x = 10, y = 20 };

p1 = new Position { x = p1.y, y = p1.x };

如果首先将其分配给p1,则p1.xp1.y最终都将为0,而实际上等于:

Position tmp = new Position();
tmp.x = 10;
tmp.y = 20;
Position p1 = tmp;

tmp = new Position();
tmp.x = p1.y; // 20
tmp.y = p1.x; // 10
p1 = tmp;

编辑:我刚刚意识到您正在使用一个结构而不是一个类。 这可能会产生一些细微的差异...但是您几乎可以肯定不应该使用可变结构开头:)

Jon Skeet answered 2019-10-09T08:55:56Z
44 votes

对象和集合初始化程序,用于初始化对象上的字段。

[http://msdn.microsoft.com/en-us/library/bb384062.aspx]

它们产生几乎相等的IL。 乔恩·斯凯特(Jon Skeet)对真正发生的事情有答案。

Joshua Rodgers answered 2019-10-09T08:55:10Z
7 votes

这是一个对象初始化程序,仅允许您在单个表达式中分配值。 最重要的是,这在LINQ内部也适用于匿名类型(否则为不可变的)。 对于将addi项添加到新集合,也有类似的集合初始化程序语法。

注意,有一个细微的计时问题可能会有用。 使用初始化程序,分配/添加都发生在分配变量之前,这可以帮助阻止其他线程看到不完整的对象。 否则,您将需要其他变量才能获得相同的结果。

Marc Gravell answered 2019-10-09T08:56:29Z
2 votes

您的两个代码示例将生成相同的IL。 (至少在发布版本中)

SLaks answered 2019-10-09T08:56:53Z
2 votes

忘掉所有IL的东西,这只是速记符号。 您正在执行的操作是这样的:

一种。 在一种情况下,您将显式使用默认构造函数,然后设置两个属性。

b。 在另一种情况下,您正在使用新的初始化程序语法,该语法隐式地使编译器执行情况a的操作。

尽管有IL子公司,它们也会为您实现相同的目标。

awrigley answered 2019-10-09T08:57:37Z
1 votes

这些完全等效。 编译器实际上只是将第一个版本转换为第二个版本。

两者之间的唯一区别是,与第一个相比,您可以做得很好,如将初始化版本传递给方法:

DoSomethingWithPoint(new Position() { x=3, y=4 });

比第二个初始化示例多了很多行代码。

Pieter van Ginkel answered 2019-10-09T08:58:15Z
1 votes

它们是等效的,除了一个比另一个更容易阅读。

还要考虑将新对象传递到其他地方的情况:

var aList = new List<Position>();
aList.Add( new Position() { x=3, y=4 } );
Dan Byström answered 2019-10-09T08:58:47Z
translate from https://stackoverflow.com:/questions/4034719/what-do-braces-after-c-sharp-new-statement-do