2013-03-24 57 views
0

我如何轉換if語句爲開關/箱我如何轉換以下if語句到開關/箱

private void Click(object sender, EventArgs e) 
{ 
    if (Object.ReferenceEquals(sender, c0)) { spotClick(0); } 
    if (Object.ReferenceEquals(sender, c1)) { spotClick(1); } 
    if (Object.ReferenceEquals(sender, c2)) { spotClick(2); } 
    if (Object.ReferenceEquals(sender, c3)) { spotClick(3); } 
} 
+6

1.你不能,2.你爲什麼要這麼做? – darthmaim 2013-03-24 22:26:38

+0

爲什麼你覺得需要轉換它?如果您正在尋找幫助改進工作代碼,請使用codereview.stackexchange.com – 2013-03-24 22:32:06

+0

'var dict = new Dictionary {{c0,0},{c1,1},{c2,2},{c3,3}}; foreach(var kvp in dict){if(ReferenceEquals(kvp.Key,sender)){spotClick(kvp.Value); }}' – Corak 2013-03-24 22:36:07

回答

1

你怎麼樣的變量映射到的值,然後調用值以下?像這樣:

Dictionary map = new Dictionary(); 
map.add(c0, 0); 
map.add(c1, 1); 
map.add(c2, 2); 
map.add(c3, 3); 

spotClick(map[sender]); 
+0

我想知道爲什麼SO認爲地圖是一個類? – 2013-03-24 23:14:26

-2

轉換爲開關不是最優化的方式,因爲它們對於每個「if」是不同的值。你可以做一個for循環。

for(var i = 0; i < 4; i++){ 
    if (Object.ReferenceEquals(sender, "c" + i)) { spotClick(i); } 
} 

我估計串接在C# 「C」 + I將像

的String.Format( 「C {0}」,i)的;

+1

你不能使用'c + i'來建立C#中的變量名稱 – darthmaim 2013-03-24 22:37:14

+0

@darthmaim,是的我的壞,我認爲我們在這裏談論Javascript。 – Ignacio 2013-03-24 22:38:10

+0

甚至在js它不會那樣工作。 – 2013-03-24 22:41:15

1

如果我們仔細檢查你的代碼,我們看到你正在比較兩個對象的引用。由於一個對象的引用不能等於某些其他對象的引用隨後便出現,在該代碼可用於if-else if組合,以便它可以是這樣的:

private void Click(object sender, EventArgs e) 
{ 
    if (Object.ReferenceEquals(sender, c0)) { spotClick(0); } 
    else if (Object.ReferenceEquals(sender, c1)) { spotClick(1); } 
    else if (Object.ReferenceEquals(sender, c2)) { spotClick(2); } 
    else if (Object.ReferenceEquals(sender, c3)) { spotClick(3); } 
} 

ReferenceEquals方法也返回,如果兩個對象真是空的(檢查here)這可能會產生多個比較是真實的(多個sporClick調用執行),但在正常情況下,我們不能指望sendernull因爲Click事件觸發,因此這是一個合法的代碼, 。如果c0,c1,c2和c3是常量表達式,但是我們可以看到,這些代碼可以轉換爲使用switch語句,但是它們是引用從Control類派生的類型的對象的變量,因此不能在case(檢查here)。因此你不能將此代碼轉換爲switch/case