2016-03-29 17 views
-2

我遇到了一個我當前的infastructure無法處理並且變得太長的程序變化:我不得不停止使用這樣的絕對代碼,並轉向面向對象。代表無法正常工作

重複問題:

List<string[]> logos = new List<string[]>(); 
string[] tempLogo = new string[2]; 
tempLogo[0] = "FRONT EMB"; 
tempLogo[1] = front_emb; 
logos.Add(tempLogo); 
tempLogo[0] = "back EMB"; 
tempLogo[1] = back_emb; 
logos.Add(tempLogo); 

變成了:

delegate string addLogo(string x); // Namespace area 

public static void IntergrateLogo(string toAdd, string name) // Inside Class 
{ 
    string[] tempLogo = new string[2]; 
    tempLogo[0] = name; 
    tempLogo[1] = toAdd; 
    logos.Add(tempLogo); 
} 

// Main method 
addLogo adl = new addLogo(IntegrateLogo); 
List<string[]> logos = new List<string[]>(); 
adl(front_emb,"FRONT EMB"); 
adl(back_emb,"BACK EMB"); 

問題:

1.名稱 '標誌' 不存在於當前上下文

2.否過載關於 'IntergrateLogo' 匹配委託 'addLogo'

3存在。嵌入式聲明不能是聲明或標記語句

問:

從我的,非常低的,在代表知識,他們應該「模仿」的主要方法的環境;因此,我的列表 - logos,應該能夠在IntergrateLogo方法中看到和使用。

那麼,當我無法得到這個工作時,理解就出現了。

我並不是要求在這裏修復,我只是想更好地理解代表,因爲無論我在哪裏搜索,它都表示它允許在方法中訪問上下文環境範圍,但顯然這不適用於此。

有沒有一種方法可以在IntergrateLogo方法中使用委託可以看到logos

+2

正確,1 ..logos在您調用主要方法的任何地方定義 - 它在該方法之外不可用。 2. IntergrateLogo對於AddLogo有不同的參數,所以沒有它不匹配,3 ...不確定這是從哪裏來的,但可能是上面的結果 – BugFinder

+0

方法的簽名必須與你想要的代理相同用於調用該方法。 –

回答

3

有沒有一種方法可以通過使用委託在IntergrateLogo方法中看到徽標?

不是當它是一個局部變量,沒有。

這不是很清楚爲什麼你會盡可能地使用代表。我甚至不會使用的方法,而是寫:

List<string[]> logos = new List<string[]> 
{ 
    // TODO: Rename front_emb and back_emb to follow .NET naming conventions 
    new[] { front_emb, "FRONT EMB" }, 
    new[] { back_emb, "BACK EMB" }, 
}; 

我還考慮創建一個Logo類,而不是使用字符串數組,在這一點上,你就必須:

List<Logo> logos = new List<Logo> 
{ 
    new Logo(front_emb, "FRONT EMB"), 
    new Logo(back_emb, "BACK EMB"), 
} 

這看起來相當 tidier,國際海事組織。

+0

我從來沒有想過班級的想法,是一個長達4天的週末,甚至咖啡都沒有改變我的大腦。讚賞這個!這應該解決我的問題,我會更多地查看沒有局部變量的代表。 &只是爲了快速回答我爲什麼選擇委託方法是因爲我認爲可以通過方法訪問'logos'列表,而不是像我們在常規方法中一樣傳遞參數 - 假設我只是懶惰。 – KDOT