我正在研究一種需要在不同位置重複小操作的方法,但要重複的代碼應該是該方法的私有方法。顯而易見的解決方案是嵌套功能。無論我嘗試的是什麼,C#編譯器barfs在我身上。如何使一個方法的私有功能?
東西大致等於該Perl的片段:
my $method = sub {
$helper_func = sub { code to encapsulate };
# more code
&$helper(called whenever needed);
# more code
}
就是我說的,和我想要在C#來完成。
該類中沒有其他方法應該能夠訪問此上下文中的幫助函數。寫這個結構在C#中,因爲在我看來,最合理的辦法是這樣的:
var helper = (/* parameter names */) => { /* code to encapsulate */ };
,實際上使編譯器物盡其。
由於這樣的分配是禁止,由於是使用較舊的代表(){}語法代替拉姆達的等效,因此是一種方法—什麼CSC實際上允許我寫內聲明一個委託類型然而,就是這樣的:
private delegate /* return type */ Helper(/* parameters */);
private /* return type */ method(/* parameters */) {
Helper helper = (/* parameter names */) => {
/* code to encapsulate */
};
// more code
helper(/* called whenever needed */);
// more code
}
這是所有罰款和花花公子不拷貝和粘貼一段代碼,並手工編輯的參數,但是它泄漏私人委託類型的類的其餘部分,而不是保持它私有的方法。這首先破壞了目的。使用goto語句和局部變量參數可以在不犧牲代碼重用的情況下,更好地封裝「helper」。如果我想通過通過寄存器傳遞參數來模擬函數調用,我認爲寧願使用匯編器。我還沒有找到一種可以接受的重構代碼的方法來完全避免這個問題。
那麼,是否可以強制這Common Object Oriented Language服從?
「Action」或通用版本呢? – 2010-08-01 16:01:47
看起來我從來沒有聽說過System.Action和System.Func的道歉!看看MSDN,似乎我一定錯過了C#3.5中的一些新功能:-)。 – TerryP 2010-08-01 16:34:38
NET3.5或C#3.0(可能只是爲了混淆每一個) – 2010-08-01 18:41:32