2017-06-20 27 views
1

假设我构成一个对象,其属性,需要从在方法确定的其它值,例如转换:(其中,此在C#中,类的属性是并行还是按顺序初始化?

var var1; 
var var2; 

//do stuff with var1 and var2 

MyClass myClass = new MyClass 
{ 
    Property1 = var1, 
    Property2 = var2 
}; 

如果MyClass属性都评估,并设置在同一时间是可能的),我认为这可能是更有效的下放是设置var1var2分离方法的操作,就像这样:

MyClass myClass = new MyClass 
{ 
    Property1 = SetProperty1(), 
    Property2 = SetProperty2() 
} 

private static object SetProperty1() 
{ 
    //do stuff 
} 

private static object SetProperty2() 
{ 
    //do stuff 
} 

但是,如果每个属性是为了评估(如一个步进时看到通过这样的代码),任何这样的好处从爆发出新的方法就失去了。

编辑对象的属性是否同时初始化,或按顺序?

+0

他们的顺序初始化指定的任务。 –

+2

计算机并不擅长处理事务,除非您希望您的对象由多个线程设置。 – Enigmativity

+0

@Enigmativity计算机*非常善于同时处理事务。即使只有一个线程,它也可能花费很少的时间只能一次执行单个操作。它所做的就是努力确保同时运行各种操作的行为无法与完全按顺序运行时会发生的情况明显区分开来,从而允许程序员编写代码*就像程序依次运行所有内容一样,因为编写并发代码非常困难*对于程序员来说*(正确),即使它对计算机来说非常简单*。 – Servy

回答

14

了解这里发生的事情很重要。

本声明:

MyClass myClass = new MyClass 
{ 
    Property1 = var1, 
    Property2 = var2 
}; 

实际上编译成这样:

MyClass temp = new MyClass(); 
temp.Property1 = var1; 
temp.Property2 = var2; 
MyClass myClass = temp; 

其原因临时变量是,如果你的而不是分配到一个局部变量,分配给属性,该属性将不包含中途初始化的对象。一旦初始化完成,它将只接收对象实例。

因此,要回答你的问题,对象初始化将分配属性值的顺序,而且在你写的顺序,而不是在为了相应属性在类型定义,如果这是不同的。这是因为它可能是重要的,分配属性的副作用可能有,但我会建议反对创建具有这种副作用的对象,因为它们可能非常脆弱。

然而,任何代码检查myClass变量(或字段或属性)要么看到旧值(可能null),或完全(根据你的分配)分配的对象。


截至如果你没有使用这个临时变量会发生什么一个例子:

MyClass myClass = new MyClass(); 
// what if some other code can access myClass here, because you're really 
// assigning to a property or to a field? 
myClass.Property1 = var1; 
// then this assignment above wouldn't be done yet 
... 
+0

这是一个非常彻底和有益的回应! Tusen takk! – JAF

0

只是像其他人说:性质在您指定的任务的顺序初始化。

你可以试试这个:

class MyClass 
{ 
    private object _property1; 
    private object _property2; 

    public object Property1 
    { 
     get 
     { 
      return _property1; 
     } 

     set 
     { 
      Console.WriteLine("Property1 set"); 
      _property1 = value; 
     } 
    } 

    public object Property2 
    { 
     get 
     { 
      return _property2; 
     } 

     set 
     { 
      Console.WriteLine("Property2 set"); 
      _property2 = value; 
     } 
    } 
} 

这是产生大约什么,当你使用public object Property { get; set; }语法。除Console.WriteLine

当你使用这个类是这样的:

MyClass myClass = new MyClass 
{ 
    Property2 = 1, 
    Property1 = "a" 
}; 

输出将是:

Property2 set 
Property1 set