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

时间:2009-04-28 09:31:42

标签: c# language-features language-design

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

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

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

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

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

第4版即将推出,包括许多其他功能。

就我个人而言,我几乎喜欢C#的所有功能,并喜欢用这种语言编写的简短代码。但我不必从头学习它。

我对您的意见以及您在学习或教授C#方面的经验感兴趣。是否已有太多功能?还缺少重要的功能吗?语言功能是否使语言更易于使用或更难学习?

请:没有答案像“语言A比语言B更好,因为......”。

13 个答案:

答案 0 :(得分:25)

是的,这是一种风险 - 它会被讨论 lot 。它已经达到了非常很难从头开始接收C#的程度。幸运的是,事情已经稳定了一些,C#3.0和C#4.0之间的语言变化相对较小。

实际上,我最近在尝试修复CF generics problem时做了很多工作,并且作为修复的一部分,实际上可能会发生代码恢复到C#1.2技术(不,或者很少) ,仿制药)。因此,使用更简单的语言结构可以解决大多数问题 。重点是:做某事有多难?

例如 - 匿名方法为相对较小的复杂性添加了 LOT 的好处。 dynamic(4.0)为COM互操作方案添加了更多内容。迭代器块对于LINQ风格的代码非常有用......

我看到很多关于C#的非平凡部分的问题,我认为我很难从头开始教一个初学者所有的C#。像Jon的C#深度书这样的书对于已经了解基础知识的人来说是好的(至少是C#1.2;理想情况下是C#2.0) - 但它并不是真正为新手设计的(我知道Jon不会反对)。

确实很棘手。幸运的是,C#团队设置了标准(包含)非常高; 非常有用的东西可以使它成为语言。

答案 1 :(得分: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#并没有真正拥有这么多功能。

答案 2 :(得分:5)

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

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

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

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

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (int x) => { return x*x; }
  4. 但#1只是出于历史原因而且表格2和3各有其位置。

    是扩展方法,运算符重载,泛型,泛型约束,默认参数,空合并,三元运算符,静态构造函数,选中/未选中,自动属性,预处理程序指令,值类型......作为全职程序员我至少偶尔使用所有这些,并且消除这些功能中的任何一个都会为我创造额外的工作和恶化(foo(x) ?? bar(y)现在必须写{ var temp = foo(x); if (temp == null) temp = bar(y) }),或者要求我写更胖/更慢代码(例如,如果用类替换值类型,我的一些代码会变慢,内存使用会急剧增加。)

    除了功能太多之外,我认为它还不够。任何时候我不得不一遍又一遍地编写类似的代码,我诅咒语言没有任何捷径。

    诀窍是让那些没有全职工作的程序员能够理解。 (对于那些在C#中全时编程并且仍然无法学习语言的人 - 嗯,解雇他们?)如果微软的功能更加“Googlable”或至少“F1-able”,它可能会有所帮助。例如,当我把光标放在“??”上时或“=>”按F1键,我应该为这些操作员提供帮助页面。或者考虑静态构造函数:如果代码说“静态构造函数()”而不是“静态MyClassName()”那么它将更容易进行网络搜索。

    IMO,比语言膨胀更大的问题是框架膨胀。 .NET框架是巨大的,微软重复重复实现相同的东西,每次都会产生臃肿,有缺陷的设计:WinForms和WPF,访问数据库的各种方式等等。

答案 3 :(得分:2)

你可能应该阅读Eric Gunnerson的this blog post,他是Microsoft的C#编译团队的成员。

他解释了新功能如何影响语言。基本上他们在开始时得到“-100分”,这意味着它必须对整体包装产生显着的净积极影响才能使其成为语言。“

答案 4 :(得分:2)

关于C#应如何发展,实际上存在很多争论。实际上,有些人认为通过添加许多新功能,语言变得难以学习,但大多数人认为C#是一种多范式编程语言。它首先是一种强类型的全功能面向对象语言,但它确实具有直到最近才被限制为功能和动态编程语言的概念。这些功能虽然对于初学者来说可能看起来令人困惑,但却提供了很大的灵活性和强大功能,有时它们可​​能足以让您在应用程序中使用特定于域的语言并处理所有集成问题。您可以随时谈论应该在语言本身中实现什么以及应该在框架中应该包含哪些内容,但请记住,您提到并认为多余的功能实际上是开发人员请求的结果,他们这样做提供将C#与其他语言区分开来的功能(Java会浮现在脑海中)。一旦程序员使用这些功能,他就会发现自己的优势。

你提到了Linq,我不得不承认我起初有点怀疑,因为我一直认为SQL是一种非常自然的语言来处理数据,但现在我真的很喜欢并且我确实看到了在编译时评估的查询。 Lambda表达式总是很好,实际上如果过度使用它们会使代码难以阅读,但有时它们实际上会简化它。我不是'var'关键字的忠实粉丝,但有时它确实派上用场了,老实说,在编写Linq时,不使用它会使代码难以阅读。我自己是初学程序员,我认为学习这些概念并不困难。我在学校也经常使用Java,我真的很想念C#的一些功能(我不是说Java是一种糟糕的语言,相反,在某些方面我觉得它比C#更好 - 代码合同,特别是学术目的)。

答案 5 :(得分:2)

我不认为学习新语言功能是需要担心的部分:学习应用它们的正确情况需要几十年的时间。

  

有时他们很难理解   由人们使用的代码   所有新功能。

这是您需要解决的真正问题。代码库分裂成不同的样式而不是每个人都可维护的代码库是一个昂贵的维护代码库。使用新颖的功能编写“简短代码”可能无法最大限度地发挥组织对该代码的实用性。

你的情况的根本原因是什么?是吗:

  • 有些程序员不了解新功能
  • 新功能使用不当
  • 新功能已被用于破解设计缺陷(通常是反射的情况)

我敢打赌,它将是上述的混合物。

答案 6 :(得分:1)

学习现代编程语言难吗?

因为:理想情况下,您希望使用最强大的语言,让您正确表达事物。

反对:你想要考虑手头的问题,而不是语言的运作方式。

总体而言:即使它们更难,我也会使用更强大的语言。当我不能让语言做我需要的时候,我发现自己很恼火,所以我必须解决它或者把它变成另一种愚蠢的模式。我并不特别介意使用一些奇怪的新语法,因为互联网只需点击一下即可。

编辑额外的想法:我在为语言添加功能时尝试保持一致/逻辑语法,但这不适合进行lisp讨论。

是否应该摆脱C#的功能?

我充分利用了LINQ,扩展方法,var(我刚刚写出类型,我为什么要再写它?)和匿名函数等新功能。我发现他们可以提供一些相当大的生产力优势。我建议那些没有掌握LINQ但是他们需要花一些时间来学习Linq-to-Objects的人,因为只要你设置逻辑来处理它就非常方便。

我并不特别喜欢类似SQL的特殊LINQ语法。我觉得它在C#代码中间有点刺耳 - 在我看来它与调用语法风格的对象方法发生冲突。我会 更常见的列表理解语法更为快乐,例如用于例如蟒。

是否有C#需要的新功能?

我真的想要一些更好的语法来快速初始化数组(或者IEnumerables?)和字典。 C#在这方面有点笨拙 - 我最终不得不打出这么多大括号。与此相关,我真的很想念收益! (产生此集合中的每个项目)语法。

我还希望C#借用F#改进的类型推断,也许还有它的元组和多重赋值。也许我应该去使用F#。

答案 7 :(得分:0)

尽管我只是一个休闲的C#用户;具有Delphi,C ++和Python的强大背景;我可以很容易地掌握C#特征概念。在我看来,C#是一种适当平衡的语言。唯一令人烦恼的是我几乎无法记住足够的语法(尤其是与Linq相关的)在我的头脑中以像Python一样的方式生成触摸打字速度的代码。我对pascal语法的偏好也可能阻碍我。但是,在全能的Visual Studio.NET Express的帮助下,这根本不是问题。

只要他们免费提供这样一个神奇的工具,我相信带有VS.NET的C#是最好的编码环境之一。

答案 8 :(得分:0)

我也喜欢大多数新功能,老实说,不想丢失扩展方法和linq。

就易学性而言,我认为问题对于新手来说更是一个问题 - 而且从经验来看,让他们加快速度绝对是选择最大的胜利并在他们绊倒时帮助他们的情况到其他东西。除了多线程之外,理解泛型似乎是获得其他功能的关键。

每个附加功能确实带来额外的好处。最终会出现新的语言,使这些功能更容易使用,但这绝不意味着我们不应该尝试改进现有的语言。

答案 9 :(得分:0)

是的C#有很多功能,但这就是我们使用它的原因!任何进入程序员职业生涯的人都应该在职业生涯中学习/学习新事物并参加考试!作为喜欢学习新事物的人,这就是为什么我们喜欢它!

就个人而言,我发现lambda表达式和扩展方法是非常有用的。为了创建更大规模的分布式应用程序,我想要分离数据和逻辑,我发现LINQ不是那么有用。但我期待c#4功能,如可选参数。

正如@Alex所提到的,我认为学习何时恰当地使用功能是最具挑战性的方面。对于我们这些从早期开始使用C#的人来说,Horrah就已经开始了!

答案 10 :(得分:0)

我认为问题在于那些只需要在任何地方使用最新语法的人。他们制作了一个简单的“Hello World”计划,看起来像意大利面条工厂的爆炸。

想象一下,你是一名作家,而且你一直坚持使用最复杂,最模糊,很少需要或理解的单词。

没有多少人会读你的书。

这种语言让一些人制造如此混乱的事实拖累了其他人,因为他们必须弄清楚到底发生了什么。我的经验是,编写这样的代码的人不会编写运行良好且需要大量维护的代码。我的意思是他们已经将KISS原则扔进了垃圾桶。恕我直言,艺术或编程使复杂的事情简单,反之亦然。这种情况可能为一种简单的语言创造一个市场,这种语言可以完成你需要做的一切,但只能用可读的人类语法。

答案 11 :(得分:-1)

这些功能是我们使用C#的原因,也是C#'现代'的原因。如果C#没有提供例如类 - 或者多线程,那么有人会使用它吗?汇编是一种真正没有特征的语言的例子。学习语言很容易,但没有人愿意使用它。

小域特定语言在这方面确实是极端的。以经典正则表达式为例。它有一个仅用于字符串操作的HEAP功能。如果它没有这些,谁会使用它?这些功能使其如此强大和富有表现力。与更通用的语言相同。

编写C#并不需要所有这些功能。了解C#代码是出现问题的地方。但如果这些不是C#中的功能,那么每个人都会以自己的方式实现多线程,而不是学习处理多线程的一种方法,你需要根据你正在阅读的代码学习几种。

答案 12 :(得分:-1)

是的,C#确实有很多功能,而且我不认为,这是事实,这是一个丰富的平台。如果有人想争论这个并声称这种语言没有很多功能,请告诉我一种语言,它有很多功能,并解释为什么它有比C#更多的功能。

无论如何,我认为没有任何问题。 您始终可以选择适合您的功能子集并使用它们。一个功能丰富的语言没有任何问题,只要这些功能被正确使用而不仅仅因为它们存在而强制执行。