C#有太多的语言function吗?
这是一个在我们的团队中不时出现的讨论。 虽然有几个很快就学会了C#3.0的function,但是其他的经典技巧还是坚持的
有些人从来不使用Linq,认为lambdaexpression式是混淆的,yield是“可怕的”。 有时他们很难理解使用所有新function的人编写的代码。 我们可以说,他们不掌握语言,应该学习。
但是学习现代编程语言有多难? 每个人都可以解决问题,每个人每天都有很多其他问题需要解决,而不是关心更好的方法来实施。 培训人员不是免费的。 另一方面,语言function可以使人们更有效率,代码更易于维护。
可能不完整的C#function列表
- 类,结构体,原始types,数组,装箱,接口,inheritance(抽象,虚拟,新,密封),属性,可空
- 例外
- 仿制药
- multithreading,锁
- reflection
- 代表,活动,匿名代表
- 迭代器
- lambdaexpression式
- 扩展方法
- LINQ
第4版即将推出,包括许多附加function。
就我个人而言,我喜欢C#的几乎所有function,就像我可以用这种语言编写的简短而漂亮的代码一样。 但是我不必从头开始学习。
我感兴趣的是您的意见和您的学习或教学C#的经验。 有没有太多的function? 仍然缺less重要的function? 语言function是使语言更容易使用还是更难以学习?
请:没有答案像“语言A比语言B好,因为…”。
是的,这是一个风险 – 它会得到很多讨论。 它正在变得很难从头开始拿起C#。 幸运的是,事情已经稳定了一点,C#3.0和C#4.0之间的语言变化相对较小。
实际上,我最近一直在做很多工作来解决CFgenerics问题 ,作为修复的一部分,实际上可能会发生代码几乎恢复到C#1.2技术(不,或者非常less的generics)。 所以大多数问题都可以用简单的语言结构来解决。 关键是要做点什么 ?
例如 – 匿名方法在复杂度相对较低的情况下增加了很多好处。 dynamic
(4.0)为COM互操作场景添加了更多内容。 迭代器块对于LINQ风格的代码是无价的…
我看到很多关于C#的非平凡部分的问题,我想我会努力从头开始教给初学C#的所有人 。 像Jon C#深入的书对那些已经了解基础知识(至less是C#1.2;理想情况下是C#2.0)的人来说是好的,但它并不是真正为新手devise的(我知道Jon不会不同意)。
确实是一个棘手的问题。 幸运的是,C#团队设置的栏(包含)非常高, 新的东西对于把它变成语言是非常有用的。
在我看来,C#没有太多的function。 几乎所有2.0和3.0版本的新function对我和我的同事来说都是天天使用的,连VB的人也很快把它们全部用完了。 一些新特性使得学习语言更容易,就像使用内联lambdas而不是委托和var关键字和对象初始化器一样,仅仅从C#3.0中提出了一些(没有C#3.5,顺便说一句,你混淆了与.NET 3.5)。
在大多数情况下,C#已经变得很简单,并且强大的function都很容易使用,与C ++不同的是,devise者说C ++可以完成所有的事情,但是他们从来没有提到很多事情会变成真正的痛苦,因为C ++可以做所有事情,包括许多程序员很less使用的东西。 支持一切意味着许多事情比必要的更复杂,使得学习更难。 这就是语言之间的区别,语言中的特性使其难以学习,但却非常强大,语言中的特性使得使用起来更容易,并且提高了生产力,尽pipe在理论上不那么强大。
而且,在许多特性中,C#离C ++还很远,特别是如果在这张图片中包含C ++ 0x,那么尽pipe对某些人来说“特性太多”,但学习起来更容易。 我用C ++的观点是,如果你愿意的话,C#并不是真的有这么多的特性。
当我在C#中编写代码时,我实际上使用了它的每个function。 不是一下子,请注意,但C#的每个function都有它的位置。 很多人不知道C#有一个“::”运算符,从来没有听说过“ extern别名 ”,但我今天不得不用它来解决两个DLL之间的命名冲突。
“收益率回报”是我最喜欢的function之一。 我不是每天都用它,但我曾经用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各有其位置。
无论是扩展方法,运算符重载,generics,通用约束,默认参数,空合并,三元运算符,静态构造函数,选中/未选中,自动属性,预处理指令,值types…作为一个全职程序员,我使用所有( foo(x) ?? bar(y)
现在必须写成{ var temp = foo(x); if (temp == null) temp = bar(y) }
),或者要求我编写较胖/较慢的代码(例如,如果用类replace值types,我的一些代码会变慢,内存使用量将大幅增加)。
不是有太多的function,我认为它不够。 任何时候我都必须一遍又一遍地写出类似的代码,我诅咒语言没有任何捷径。
诀窍就是让不全职的程序员理解。 (对于那些用C#全职编程,仍然不能学习语言的人来说吧?)如果微软的function更加“Googlable”或者至less“F1-able”,这可能会有所帮助。 例如,当我把光标放在“??” 或“=>”并按F1,我应该得到这些操作员的帮助页面。 或者考虑静态构造函数:如果代码中使用“static constructor()”而不是“static MyClassName()”,那么网页search就更容易了。
国际海事组织,比语言膨胀更大的问题是框架膨胀。 .NET框架是巨大的,微软反复重复相同的事情,每次都会造成臃肿,有缺陷的devise:WinForms和WPF,访问数据库的各种方式等等。
您可能应该阅读微软的C#编译器团队成员Eric Gunnerson的博客文章 。
他解释了新function如何进入语言。 基本上他们一开始就得到了“-100分”,这意味着它必须对整体包装有显着的净积极影响,才能使之成为语言。“
实际上,C#应该如何发展有很多争议。 事实上,有人认为通过增加许多新function,语言变得难以学习,但大多数人认为C#是一种多范式编程语言。 它首先是一个强types的全function的面向对象语言,但它的概念直到最近才被限制在function和dynamic编程语言中。 这些function虽然对初学者来说似乎有些困惑,但却提供了很大的灵活性和强大的function,有时它们可能足以让您在应用程序中使用特定于领域的语言,并处理所有的集成问题。 你总是可以谈论什么应该在语言本身中实现,什么应该是框架的一部分,但是请记住,你提到并认为是多余的大部分function实际上是开发者请求的结果,提供将C#与其他语言分开设置的function(Java浮现)。 一旦程序员习惯了这些function,他就会意识到自己的优势。
你提到了Linq,我不得不承认起初我有些怀疑,因为我一直认为SQL是数据处理的一种非常自然的语言,但现在我真的很喜欢,而且我确实看到了查询编译时间。 Lambdaexpression式总是很好,如果过度使用,它们确实会使代码难以阅读,但是有时它们实际上可以简化它。 我不是'var'关键字的忠实拥趸,但是有时它确实派上用场,而且让我们诚实地说,在编写Linq时会让代码难以阅读。 我自己是一个初学者程序员,我不认为学习这些概念是困难的。 我也在学校中使用Java,而且我真的很想念C#的一些特性(我并不是说Java是一种糟糕的语言,相反,在某些方面我认为它比C#代码合同更好,特别是学术目的)。
我不认为学习新的语言特征是需要担心的部分:学习正确的应用情境是几十年的事情。
有时他们很难理解使用所有新function的人编写的代码。
这是你需要解决的真正的问题。 一个代码库分裂成不同的风格,每个人都无法维护,是一个昂贵的代码库。 使用新颖的function编写“短而精美的代码”可能无法最大限度地为您的组织的代码的效用。
你的情况的根源是什么? 是吗:
- 有些程序员不了解新function
- 新function使用不当
- 新function已被用来绕过devise缺陷(通常情况下是reflection)
我敢打赌,这将是上述的混合。
难以学习现代编程语言吗?
对于:你理想的情况是要使用最强大的语言,这可以让你正确地expression事情。
反对:你想要考虑手头的问题,而不是语言的运作方式。
总的来说:即使他们比较困难,我也会select更强大的语言。 当我不能使语言做我需要的东西时,我发现自己很恼火,所以我必须解决它,或者把它变成另一种愚蠢的模式。 我不特别介意碰到一些奇怪的新语法,因为互联网只是一个点击。
编辑额外的想法:我试图保持一致/逻辑语法时添加function的语言,但这不是一个lisp讨论的正确线索。
有C#应该摆脱的function吗?
我使用了很多新的function,如LINQ,扩展方法,var(我只是写了这个types,为什么我要再写一次?)和匿名函数。 我发现他们可以提供相当大的生产力效益。 我会build议任何一个没有使用LINQ的人,但是他们需要一些时间来学习Linq-to-Objects,因为任何时候设置逻辑都是非常方便的。
虽然我不特别喜欢特殊的类似于SQL的LINQ语法。 我发现它在C#代码的中间有点刺耳 – 我脑海中与对象方法调用语法风格冲突。 我会更乐意使用比较常用的列表理解语法,比如Python中使用的语法。
是否有C#需要的新function?
我真的很喜欢一些更好的语法来快速初始化数组(或者IEnumerables?)和字典。 C#在这方面有点笨拙 – 我最终不得不输出很多大括号。 与此相关的是,我真的很想念收益! (产生此集合中的每个项目)语法。
我也想C#借用F#的改进types推断,也许它的元组和多个赋值。 也许我应该去使用F#。
尽pipe我只是一个随便的C#用户, 具有Delphi,C ++和Python的强大背景; 我可以很容易地掌握C#特性的概念。 在我看来,C#是一个适当平衡的语言。 唯一的烦恼是,我几乎不能记住我的脑海里有足够的语法(特别是与Linq有关的),用Python来编写触摸打字速度的代码。 我偏好使用pascal语法也会阻碍我。 但是,在全能的Visual Studio.NET Express的帮助下,这完全没有问题。
只要他们免费提供这样一个惊人的工具,我相信与VS.NET的C#是在可用的最佳编码环境之中。
我也喜欢大部分新function,老实说不会失去一般的扩展方法和linq。
就易学性而言,我认为这个问题对于新人来说更是一个问题 – 从经验上来说,让他们加快速度绝对是select最大的胜利,并在遇到别的事情时帮助他们的一个例子。 除了multithreading,理解generics似乎是获得其他function的好处的关键。
每个附加function肯定会带来额外的好处。 最终会出现新的语言,使这些相同的function更易于使用,但这并不意味着我们不应该尝试改进我们现在使用的语言。
是的C#有很多function,但这就是我们使用它的原因! 任何进入程序员职业的人都应该期望在那里度过职业学习/学习新事物和考试! 作为喜欢学习新事物的人,这就是为什么我们喜欢它!
就个人而言,我发现lambdaexpression式和扩展方法,例如,非常有用。 为了创build更大规模的分布式应用程序,我想要分离数据和逻辑,我发现LINQ不是那么有用。 但是我期待c#4的特性,比如可选参数。
正如@Alex所说,我认为学习何时使用function是最具挑战性的一个方面。 Horrah对于我们这些从C#开始就一直使用C#的人来说!
我认为问题在于那些只需要在所有地方都使用最新语法的人。 他们让一个简单的“Hello World”程序在意大利面工厂看起来像是一场爆炸。
想象一下,你是一个作家,你坚持使用最复杂,混淆,很less需要或理解的话。
没有多less人会读你的书。
事实上,这个语言让一些人弄得这么混乱,因为他们必须弄清楚到底发生了什么。 我的经验是,像这样编写代码的人不写代码,工作得很好,需要大量的维护。 我的意思是他们已经把垃圾原则扔进了垃圾桶。 恕我直言,艺术或编程使复杂的事情变得简单,反之亦然。 这种情况可能会创造一个更简单的语言的市场,它只是做你需要做的一切事情,但只能用可读的人类语法。
这些特性是我们使用C#和使C#“现代化”的原因。 如果C#没有提供类或者multithreading的话,任何人都可以使用它? 汇编是一个真正没有function的语言的例子。 作为一门语言学习很容易,但没有人愿意使用它。
小领域特定语言在这方面确实是一个极端。 以经典正则expression式为例。 它只是为了string操作而获得了一堆特性。 如果没有这些,谁会用呢? 这些function是如此强大和performance力。 与更一般的语言相同。
并不是所有这些function都是编写C#所必需的。 了解C#代码是问题出现的地方。 但是,如果这些不是C#中的特性,那么每个人都会以自己的方式实现multithreading,而不是学习处理multithreading的一种方法,您需要根据您正在阅读的代码学习几个。
是的,C#做了很多function,这不是我的意见, 这是一个事实 ,这是一个丰富的平台。 如果有人想争论,并声称这种语言没有太多的function,请给我看一个有很多function的语言,并解释为什么它有更多的function,然后C#。
无论如何, 我没有看到任何问题 。 您始终可以select适合您的function的子集并使用它们。 一个function丰富的语言没有任何问题,只要function正确使用,而不是仅仅因为它们存在而强制执行。