2012-10-11 31 views
1

當我們分配這樣的值時,是否有任何性能下降?C#級聯分配

Dropdown1.Enable = dropdown2.Enable = dropdown3.Enable = false; 

在此先感謝。

+0

不知道爲什麼這個問題被標記爲過於本地化。這是相當實用的,而不是'本地化'海事組織。 –

回答

4

答案是沒有影響 - 它相當於三個賦值語句。

有甚至沒有任何get操作叫,如下證明:

控制檯應用程序項目:

using System; 
using System.Diagnostics; 

namespace ConsoleApplication5 
{ 
    public class X 

    { 
     private int _a; 
     private int _b; 

     public int A 
     { 
      get 
      { 
       Console.WriteLine("get A"); 
       return _a + 1; 
      } 
      set 
      { 
       Console.WriteLine("set A"); 
       _a = value; 
      } 
     } 

     public int B 
     { 
      get 
      { 
       Console.WriteLine("get B"); 
       return _b + 2; 
      } 
      set 
      { 
       Console.WriteLine("set B"); 
       _b = value; 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = new X(); 

      Console.WriteLine("Assign"); 
      int y = x.B = x.A = 125; 

      Console.WriteLine("Read"); 
      Console.WriteLine("y " + y + " x.B " + x.B + " x.A " + x.A); 

      Console.ReadLine(); 
     } 
    } 
} 

生成:

Assign 
set A 
set B 
Read 
get B 
get A 
y 125 x.B 127 x.A 126 

注意,在分配階段,沒有'get'ers被調用,並且儘管A和B的getter返回的值不同於它們設置的值,但最終分配給的值是表達式RHS的源值。

+0

只是檢查,並沒有看到這種行爲記錄的C#規範。我想知道嗎? –

0

你會usualy做這樣的:

variable1 = varaible2 = variable3 = 123 

但由於Enable屬性是一個getter,它是不可能的。 內部,一個getter看起來是這樣的:

public bool Enabled 
{ 
    get 
    { 
     return something; 
    } 
    set 
    { 
     something = value; 
    } 
} 
1

我可以從其他兩個答案被誤解的東西,但我不認爲任何getters被解僱。在所有三種情況下,這是針對這些房產開火的二傳手。此外,我非常確定IL只是將三次推到堆棧上的false值,並且每次都向setter發射一次。

對於下面的類:

public class Test 
{ 
    public bool Prop { get; set; } 
} 

t1.Prop = t2.Prop = t3.Prop = false;對於該IL是:

IL_0013: ldloc.0  //t1 
IL_0014: ldloc.1  //t2 
IL_0015: ldloc.2  //t2 
IL_0016: ldc.i4.0 //false 
IL_0017: dup   //dup the false on the stack 
IL_0018: stloc.3  
IL_0019: callvirt UserQuery+Test.set_Prop //set value 
IL_001E: nop   
IL_001F: ldloc.3  
IL_0020: dup   //dup the false on the stack 
IL_0021: stloc.3  
IL_0022: callvirt UserQuery+Test.set_Prop //set value 
IL_0027: nop   
IL_0028: ldloc.3  
IL_0029: callvirt UserQuery+Test.set_Prop //set value 

對於:

t1.Prop = false; 
t2.Prop = false; 
t3.Prop = false; 

的IL是:

IL_0012: stloc.2  
IL_0013: ldloc.0  
IL_0014: ldc.i4.0 //false 
IL_0015: callvirt UserQuery+Test.set_Prop //set value 
IL_001A: nop   
IL_001B: ldloc.1  
IL_001C: ldc.i4.0 //false 
IL_001D: callvirt UserQuery+Test.set_Prop //set value 
IL_0022: nop   
IL_0023: ldloc.2  
IL_0024: ldc.i4.0 //false 
IL_0025: callvirt UserQuery+Test.set_Prop //set value 

所以IL非常接近,真正唯一的區別是三次打到ldc.i4.0,或者打一次並在堆棧上重複兩次。性能是無足輕重的。然而,如果獲得的是false值是一個不平凡的操作,這將需要更長的時間把它放在三線,但是你可以很容易地寫:

bool value = SomeLongOperation(); 
t1.Prop = value; 
t2.Prop = value; 
t3.Prop = value; 

所以做什麼是最好的可讀性和/或你的標準在你的公司內部。編輯:其實,如果編譯器/ JIT會優化單獨的行條目到基本上第一種情況(或者更快的情況)或其他優化狀態,我不會感到驚訝。真的,唯一需要關注的是最後一個代碼示例;如果你需要做SomeLongOperation()來獲得價值,只做一次。之後,做任何可讀的。