引言
我曾經參與一個有趣的討論,主體是關於“C#版本更新太頻繁,以至於教開發人員精通每一個版本的技術變的越來越困難”。
我想這個是我們的過錯。
作為領導者和有經驗的發人員,對於新手,我們經常對他們傳授從我們的經驗看:從C#1.0入門,2.0學習語言新特征,然後3.0中,學習LINQ和其他的新加語法。現在,我們正在准備學習C#4.0新特性到我們技術體系。我們就是這樣認為的,也是這樣學的。
然而我們不是他們.
對於一些人來說,這是中效率低下的學習C#語言方式。相反,我們應當根據他們的基礎傳達新的理念他們如何學習,而不是我們是如何學習的。我多麼想以擁有這樣驚人的洞察力為榮,可以我得以Bjarne Stroustrup為榮。早在1999年,他為《C++ Users Journal back》雜志寫過的一篇文章中提成:"C++社區必須改變他們教授C+ +的方式"; 過去,每個人對C++新手進行教學的時候,都假定他是經驗豐富的C程序員。然後才是如何去教。相反,Stroustrup指出“C++程序員應該學習C++中最重要的特性,而不是先去教C,然後再轉移到C++”;
Lambda表達式的例子
拿Lambda表達式作為例子解釋C#是什麼,我認為是個很好的例子。當我向一個C#新手解釋Lambda表達試時,我用這個例子:
var someNumbers = new List<int>(Enumerable.Range(-20, 200));
someNumbers.RemoveAll(n => n > 30);
bool assertion = someNumbers.TrueForAll(n => n < 40);
第一行代碼用一堆數字創建一個集合。
第二行導入到Lambda表達式。它刪除集合中所有大於30的數字。在Lambda表達式中“n => n > 30”描述是從中刪除的所有元素符合的條件。Lambda表達式是一個方法的簡單寫法: n是參數。該表達式返回一個布爾值,例子結果是“n > 30’。
在這一點上,我會經常被問道幾個問題:
參數‘n’的類型是什麼?
這個容易回答:編譯器為Lambda表達式推斷參數類型,編譯器推斷他一定為整型,因為集合中已經有一部分整型數據。
為什麼這而沒有返回值
是,我知道這算不上什麼問題,但是這確實反映了他們的困惑,這個也是他們經常問起的原因。我這樣解釋,編譯器推斷返回類型。List.RemoveAll() 把 Predicate
同樣的方法,我來解釋TrueForAll();
不錯,但是關於委托,匿名委托和表達式數那?
如果您是經驗豐富的C #中開發者可能會注意到:我沒有提到lambdas和匿名委托相像,也沒有進一步反復強調匿名委托就是委托。
總之,我沒有把Lambda表達式用C#中1.0語法中去作解釋。特別強調一點:除非你有過C#的從頭學習的經驗,否則這個概念對你一點也沒有用。一些人學習C#並沒有先前C# 1.0,2.0的基礎。
看了我一上的說明,他們並沒給出編譯器如何解釋lambda表示式的砸碎的細節。相反,如何使用lambda表達式寫代碼,給出了很好的說明並且對lambda表達式能做什麼給出了闡述。
我沒有說錯什麼,但很多細節被忽略。That’s ok,隱藏細節能讓新手更好入門。如果這些C#新手想更全面深入的了解時候,我們可以來彌補這些漏洞。
在那時,他們樂意接受不同的解釋。
在此之前,我們最好地利用幫助他們的解釋來解釋概念,即使這些解釋不同於我們是如何學的經驗。