代码改变世界

C#如何有效讲授学习

2009-05-15 14:58  宗哥  阅读(3442)  评论(11编辑  收藏  举报

C#如何有效讲授学习

译者注:

       回顾C#发展的历史,回顾C#发展的历史,版本变换的之快对于正在/准备使用C#的开发者来说,目不暇接,无力应付。 当前版本还没有深入,新版本新特性有出来了。   

    
图为译者加

    如何进行有效的C#学习和讲授?也许Bill wagner的话对你有点启发。原博客《Explain from the Questioner’s perspective, not your own》

       关于Bill wagner:

    Billwagner是世界知名的.NET专家,微软C#领域的MVP,并荣获微软RegionalDirector称号。 他是著名软件咨询公司SRTSolutions的创始人,有20多年软件开发经验,曾经领导了众多成功的Windows平台产品的开发。 他是微软开发社区的活跃人物,长期担任MSDNMagazine、ASP.NETPro、VisualStudioMagazine等技术杂志的专栏作者。 他的blog是http://www.srtsolutions.com/public/blog/20574。

引言

      我曾经参与一个有趣的讨论,主体是关于“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(-20200));
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 作为他的参数, Predicate返回bool类型。因此表达式‘n > 30’ 必须是个bool类型的表达式。为了说明这一点,我会修改代码显示编译器如何检查类型。Lambda 表达式 ‘n => n.ToString()’ 就不能编译通过,因为n.ToString()是n的string表示的计算,不是bool表达式。 然后,我开始讲这个概念:Lambda 表达式是允许你通过传递代码(术语:Lambda)到另外一个函数进行晚期执行的一个途径。在编译器内部,List.RemoveAll()用Lambda表达式参数对集合中的每个元素进行计算判断,移出符合条件的元素。
      同样的方法,我来解释TrueForAll();

不错,但是关于委托,匿名委托和表达式数那?

      如果您是经验丰富的C #中开发者可能会注意到:我没有提到lambdas和匿名委托相像,也没有进一步反复强调匿名委托就是委托。
      总之,我没有把Lambda表达式用C#中1.0语法中去作解释。特别强调一点:除非你有过C#的从头学习的经验,否则这个概念对你一点也没有用。一些人学习C#并没有先前C# 1.0,2.0的基础。
      看了我一上的说明,他们并没给出编译器如何解释lambda表示式的砸碎的细节。 相反,如何使用lambda表达式写代码,给出了很好的说明并且对lambda表达式能做什么给出了阐述。
      我没有说错什么,但很多细节被忽略。That’s ok,隐藏细节能让新手更好入门。如果这些C#新手想更全面深入的了解时候,我们可以来弥补这些漏洞。
在那时,他们乐意接受不同的解释。
      在此之前,我们最好地利用帮助他们的解释来解释概念,即使这些解释不同于我们是如何学的经验。
;