有使用過JS的朋友,相信都知道function。JS中的function是可以在裡面在定義一個作為內部使用的。有時為了控製作用域,或者這種小函數只在這個函數體內會使用,所以就不希望在外部在作額外的定義。那C#中有沒有這樣類似的方式呢?答案是有的。
在C#中要實現,需要用到的是委託和lambda運算式。對於lambda運算式,是可以實現匿名函數定義和掛接委託事件的。具體的可參見該文C#利用lambda實現委託事件的掛接。
要實現函數內建立內建函式,至少有兩種方式可以用。
第一種:Func<>.
第二種:Action<>
Func和Action本質上都是委託,所不同的是Func可以輸出傳回值,而Action是沒有傳回值。下面給出實現的代碼。
private void outputInfo(string info) { Func<int,string, string> format = (count,message) => { return message + " count:" + count.ToString(); }; Action<string> showMessage = (message) => { Console.WriteLine(message); }; string formatInfo = format(1, info); showMessage(formatInfo); }
在outputInfo函數中又定義了兩個函數format和showMessage。
其中format的前兩個參數是輸入參數,第三個參數是輸出參數,即傳回值。對於Func是必須要有傳回值的,所以Func至少也要有一個輸出參數(可以在IDE中對Func看看重載)。緊接在format等號後面的是lambda運算式。需要特別注意的是,lambda運算式中的參數是輸入參數,而且是與Func所指定的參數類型是一一對應的,也就是說count對應的是Func中的int類型,而message對應的是Func中的string類型,而lambda後在的內容(大括弧內的)是具體的實現,其中的return的傳回值所對應的類型是Func的最後一個參數類型,即string類型。
showMessage的參數只有輸入參數,沒有傳回值的。這裡只有一個string類型的輸入參數。
在實際運用中時,對於Func和Action的類型可以靈活的定義,可以極大的簡化大碼,提高重用率。