1. 程式人生 > >C#利用lambda在函式中建立內部函式

C#利用lambda在函式中建立內部函式

有使用過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的型別可以靈活的定義,可以極大的簡化大碼,提高重用率。