C#有太多的语言功能吗?

Ste*_*ger 35 c# language-features language-design

这是我们团队中不时出现的讨论.虽然有一些人很快学会了C#3.0的功能,但其他人坚持使用经典技术.

有些人从不使用Linq,认为lambda表达式令人困惑,而且收益率是"可怕的".有时他们很难理解使用所有新功能的人编写的代码.我们可以说他们不掌握语言并且应该学习它.

但是,学习现代编程语言有多难?每个人都可以解决问题,每个人每天都要解决许多其他问题,而不是关心实施它的更好方法.培训人员不是免费的.另一方面,语言功能可以提高人们的工作效率,使代码更易于维护.

可能不完整的C#功能列表

  • 类,结构,基本类型,数组,装箱,接口,继承(抽象,虚拟,新,密封),属性,nullables
  • 例外
  • 仿制药
  • 多线程,锁
  • 反射
  • 代表,活动,匿名代表
  • 迭代器
  • lambda表达式
  • 扩展方法
  • LINQ

版本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#团队设置了标准(包含)非常高; 新的东西对于使它成为语言非常有用.

  • 现在在代码设计的上下文中定义"正确"和"错误"......让开发人员同意就像放牧猫. (6认同)
  • 做某事有多难? - 理想情况下,做正确的事情应该很容易,并且很难做错事...... YMMV (4认同)
  • @Yoooder - 就个人而言,我不确定更加口头的语法是否会产生巨大的影响,但我们...... (3认同)

Ore*_*ost 7

在我看来,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#并没有真正拥有这么多功能.

  • "VB guy"是一个程序员,用于在VB中开发,因此并不真正用于编写大括号语言,如C,C++或C#.但是他很快就拿到了所有新功能的C#,尽管来自一个非常不同的语言背景,这就是为什么他作为一个例子,C#中的功能不是太多. (4认同)
  • "即使是VB家伙"...伙计,你想解释一下吗? (2认同)

Qwe*_*tie 5

当我用C#编码时,我几乎使用它的每个功能.请注意,并非一下子,但C#的每个功能都有它的位置.很多人不知道C#有一个"::"运算符,从来没有听说过" extern别名 ",但我今天不得不用它来解决两个DLL之间的命名冲突.

"收益率回报"是我最喜欢的功能之一.我不是每天都使用它,但我曾经在C#1.0中手动编写IEnumerator接口,这是一个巨大的痛苦,我宁愿不重复.此外,它对于编写协同程序非常有用,甚至协同程序也不会产生任何输出(yield return null=暂停操作).

C#有内部函数和闭包.当我用C++编写代码时,他们非常想念.

C#有很多不同的编写内部函数的方式似乎很愚蠢,

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (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,访问数据库的各种方式等等.