C#級聯分配
回答
答案是沒有影響 - 它相當於三個賦值語句。
有甚至沒有任何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的源值。
只是檢查,並沒有看到這種行爲記錄的C#規範。我想知道嗎? –
你會usualy做這樣的:
variable1 = varaible2 = variable3 = 123
但由於Enable
屬性是一個getter,它是不可能的。 內部,一個getter看起來是這樣的:
public bool Enabled
{
get
{
return something;
}
set
{
something = value;
}
}
我可以從其他兩個答案被誤解的東西,但我不認爲任何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()
來獲得價值,只做一次。之後,做任何可讀的。
- 1. 高級C內存分配
- 2. C# - 級聯和
- 3. 級聯使用C
- 4. 使用級聯C#
- 5. 配置級聯刪除
- 6. Symfony定製配置級聯
- 7. C++函數分配等級計算器
- 8. OpenCV 2.3.0級聯分類器
- 9. 查找,分割和級聯
- 10. 級聯分類器方法
- 11. 列車級聯分類
- 12. Unity中級聯分辨率
- 13. 數組c級聯問題
- 14. 方法級聯和C#
- 15. C++級聯類型轉換
- 16. 級聯C++模板用法
- 17. 級聯拆分多個分隔符?
- 18. 爲兩個級聯字符串分配內存
- 19. 級聯日期和時間列和分配的索引
- 20. 內存分配 - 如何關聯程序級別和物理級別?
- 21. scikit-learn中的多級分類問題的級聯分類器
- 22. OpenCV 2.4.3與Visual C++ Express級聯分類器圖像查詢
- 23. 如何寫級聯的RSpec匹配器
- 24. 配置動態級聯參數
- 25. 分配聯盟的字段
- 26. 強制first_or_initialize分配關聯?
- 27. VB.Net等級分配練習
- 28. 指針引用級分配
- 29. 分配attr到頂級uls
- 30. 級聯
不知道爲什麼這個問題被標記爲過於本地化。這是相當實用的,而不是'本地化'海事組織。 –