Dan*_*don 60 .net c# new-operator
鉴于下面的代码,position0初始化方式和初始化方式之间有什么区别position1?它们是等价的吗?如果没有,有什么区别?
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;
}
Jon*_*eet 59
它们并不完全相同 - 至少在一般情况下并非如此.使用对象初始值设定项的代码更接近于此:
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 第一,你最终以0两个p1.x和p1.y.而这实际上相当于:
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;
编辑:我刚刚意识到你使用的是结构而不是类.这可能会产生一些微妙的差异......但你几乎肯定不应该使用一个可变的结构来开始:)
Jos*_*ers 46
对象和集合初始值设定项,用于初始化对象上的字段.
http://msdn.microsoft.com/en-us/library/bb384062.aspx
它们产生几乎相等的IL.Jon Skeet对正在发生的事情有了答案.
这是一个对象初始化器,只是允许您在单个表达式中指定值.最重要的是,这也适用于LINQ和匿名类型(否则是不可变的).对于新集合,addi项目也有类似的集合初始化语法.
请注意,有一个微妙的时间问题是有用的; 对于初始化者,分配/添加都在分配变量之前发生,这可以帮助阻止其他线程看到不完整的对象.否则,您将需要一个额外的变量来实现相同的结果.
| 归档时间: | 
 | 
| 查看次数: | 26650 次 | 
| 最近记录: |