Ste*_*ger 35 c# language-features language-design
这是我们团队中不时出现的讨论.虽然有一些人很快学会了C#3.0的功能,但其他人坚持使用经典技术.
有些人从不使用Linq,认为lambda表达式令人困惑,而且收益率是"可怕的".有时他们很难理解使用所有新功能的人编写的代码.我们可以说他们不掌握语言并且应该学习它.
但是,学习现代编程语言有多难?每个人都可以解决问题,每个人每天都要解决许多其他问题,而不是关心实施它的更好方法.培训人员不是免费的.另一方面,语言功能可以提高人们的工作效率,使代码更易于维护.
可能不完整的C#功能列表
版本4即将推出,包括许多其他功能.
就个人而言,我几乎喜欢C#的所有功能,并喜欢用这种语言编写的简短代码.但我不必从头学习它.
我对您的意见以及您在学习或教授C#方面的经验感兴趣.是否有太多功能?还缺少重要的功能吗?语言功能是否使语言更易于使用或更难学?
请:没有答案像"语言A比语言B更好,因为......".
Mar*_*ell 25
是的,这是一种风险 - 它会得到很多讨论.它让一个点,它是非常难从头拾起C#.幸运的是,事情已经稳定了一些,C#3.0和C#4.0之间的语言变化相对较小.
事实上,我最近做了很多工作,试图解决一个CF仿制药的问题,并作为修正的一部分它实际上可能发生的代码几乎恢复到C#1.2技术(没有或很少,仿制药).因此,大多数问题都可以通过更简单的语言结构来解决.重点是:做某事有多难?
例如-匿名方法添加LOT的好处相对较少的复杂性.dynamic(4.0)为COM互操作方案添加了更多内容.迭代器块对于LINQ风格的代码非常有用......
我看到很多关于C#中的非平凡的部分问题,我想我会努力教初学者一切从头开始的C#.像乔恩的C#的深度书籍是好谁已经掌握了基础知识的人(至少在C#1.2;理想一些C#2.0) -但它不是真正专为新手(我知道乔恩会不同意).
确实很棘手.幸运的是,C#团队设置了标准(包含)非常高; 新的东西对于使它成为语言非常有用.
在我看来,C#没有太多的功能.几乎任何来自2.0和3.0的新功能对我和我的同事来说都是日常使用的,甚至VB人也很快就把它们全部拿走了.一些新的功能,使学习语言更容易,就像使用内嵌的lambda表达式,而不是代表和var关键字和对象初始化,仅举从C#3.0中的一些(没有C#3.5,顺便说一句,你混淆用.NET 3.5).
C#在大多数情况下变得简单,强大的功能都很容易使用,不像C++,设计师说你可以用C++完成所有事情,但是他们从来没有提到很多东西都会成为真正的痛苦,这种情况会发生因为C++可以做所有事情,包括大多数程序员很少(如果有的话)使用的很多东西.支持一切意味着许多事情比必要的更复杂,使得学习更难.这是功能使其难以学习但功能非常强大的语言之间的差异,以及功能使其更易于使用和提高生产力的语言,即使在理论上不那么强大.
而且,在纯粹的功能中,C#远离C++,特别是如果你在这张图片中包含C++ 0x,尽管某些人拥有"太多功能",但它更容易学习.我对C++的观点是,如果你愿意,C#并没有真正拥有这么多功能.
当我用C#编码时,我几乎使用它的每个功能.请注意,并非一下子,但C#的每个功能都有它的位置.很多人不知道C#有一个"::"运算符,从来没有听说过" extern别名 ",但我今天不得不用它来解决两个DLL之间的命名冲突.
"收益率回报"是我最喜欢的功能之一.我不是每天都使用它,但我曾经在C#1.0中手动编写IEnumerator接口,这是一个巨大的痛苦,我宁愿不重复.此外,它对于编写协同程序非常有用,甚至协同程序也不会产生任何输出(yield return null=暂停操作).
C#有内部函数和闭包.当我用C++编写代码时,他们非常想念.
C#有很多不同的编写内部函数的方式似乎很愚蠢,
delegate(int x) { return x*x; }x => x*x(int x) => { return x*x; }但#1只是出于历史原因而且形式2和3各有其位置.
无论是扩展方法,运算符重载,泛型,泛型约束,默认参数,空合并,三元运算符,静态构造函数,已检查/未检查,自动属性,预处理程序指令,值类型......作为全职程序员,我使用全部至少偶尔会出现这些问题,并且消除这些功能中的任何一个或者为我创建额外的工作和加重(foo(x) ?? bar(y)现在必须编写{ var temp = foo(x); if (temp == null) temp = bar(y) }),或者要求我编写更胖/更慢的代码(例如,如果用类替换值类型,一些我的代码会变慢,内存使用会急剧增加).
我认为它没有足够的功能,而不是有太多的功能.任何时候我不得不一遍又一遍地编写类似的代码,我诅咒语言没有任何捷径.
诀窍是让那些没有全职工作的程序员能够理解.(对于那些在C#中全时编程并且仍然无法学习语言的人 - 嗯,解雇他们?)如果微软的功能更加"Googlable"或至少"F1-able",它可能会有所帮助.例如,当我把光标放在"??"上时 或者"=>"并按F1,我应该为这些运营商提供帮助页面.或者考虑静态构造函数:如果代码说"静态构造函数()"而不是"静态MyClassName()"那么它将更容易进行Web搜索.
IMO,比语言膨胀更大的问题是框架膨胀..NET框架是巨大的,微软重复重复实现相同的东西,每次都会产生臃肿,有缺陷的设计:WinForms和WPF,访问数据库的各种方式等等.