使用C#3.0功能有什么缺点吗?

时间:2010-02-22 18:17:07

标签: c#-3.0 language-features

我喜欢C#3.0特性,特别是lambda表达式,自动实现的属性或在合适的情况下也隐式输入局部变量(var关键字),但当我的老板透露我正在使用它们时,他让我不要使用任何C#3.0功能都在工作中。有人告诉我,对于大多数开发人员而言,这些功能并不标准且令人困惑,其实用性值得怀疑。我被限制只使用C#2.0功能,他也在考虑禁止使用匿名方法。

由于我们的目标是.NET Framework 3.5,因此我看不出这些限制的任何原因。在我看来,也许唯一的缺点是我的几个同事和老板(也是程序员)必须学习一些C#3.0的基础知识,这应该不难。你怎么看待这件事?我的老板是对的,我错过了什么吗?在C#是主要编程语言的开发公司中,有没有充分的理由限制这种限制?

10 个答案:

答案 0 :(得分:10)

我有过类似的经历(要求不要使用Generics,因为这可能让我的同事感到困惑)。

事实是,我们现在使用泛型而非我的同事正在使用它们。他们可能没有掌握如何创建泛型类,但他们确实理解如何使用它们。

我的观点是,任何开发人员都可以学习如何使用这些语言功能。它们起初可能看起来很先进,但随着人们习惯它们,新的冲击会减弱。

使用这些功能(或任何新语言功能)的主要理由是,这是一种简单易行的方法,可以帮助我的同事提高技能,而不是停滞不前。

至于你的特殊问题 - 不使用lambdas。很多对BCL的更新都有重载,它们将委托作为参数 - 在很多情况下这些都很容易表示为lambda,而不是以这种方式使用它们忽略了BCL的一些新的和更新的用法。

关于你的同伴无法学习lambdas的问题 - 我发现Jon Skeets C#深入探讨了他们如何从代表那里以易于理解和真正大开眼界的方式进化。我建议你为老板和同事索取一份副本。

答案 1 :(得分:7)

你的老板需要了解语言(和其他)改进旨在为开发人员提供更多功能,并使他们更有效地完成手头的任务,如果他不打算允许他们为未知理由然后:

  • 开发团队并没有发挥最大的潜力。
  • 公司没有从提高效率/生产力中受益。
和其他人一样,如果开发人员无法及时了解他们每天使用的语言的一些最新改进,那么开发人员就不值得花钱了。我怀疑你的老板最近没有做太多编码,而且他无法理解推动这一决定的最新语言改进。

答案 2 :(得分:4)

  

有人告诉我,对于大多数开发人员而言,这些功能并不标准且令人困惑,其实用性值得怀疑。我被限制只使用C#2.0功能,他也在考虑禁止使用匿名方法。

据推测,大概翻译成你的老板意思......

  

这些功能对我来说很困惑,我觉得它们没用,因为我不理解它们。

这是the Blub paradox的相当症状(好吧,或者只是纯粹的懒惰)。无论哪种方式,他所说的都没有任何价值,如果他继续走这条路,你应该开始寻找另一份工作。

答案 3 :(得分:3)

如果项目从现在开始严格来说是C#3+,那么你就不会通过包含这些项来破坏构建。但是,在使用它们之前,您应该了解以下内容:

  • 如果项目负责人做出决定并投票否决,则不能使用它们。
  • 除此之外,你使用它们,使代码更容易维护。
  • 这意味着你不应该在代码实际相同或几乎没有改进的地方使用它们。

答案 4 :(得分:3)

如果微软没有定义标准,并且这些是他们添加到非Microsoft语言的功能,我会说你的老板可能有一个观点。但是,由于Microsoft定义了这种语言,并在实现.NET 3.5(和4.0)的重要部分时使用了这些特性,我会说你忽略它们是愚蠢的。您可能不会选择使用其中的一些 - 例如,由于编码标准,var可能在所有环境中都不可接受 - 但避免新功能的一揽子政策似乎是不合理的。

当你开始使用新功能时,更强大的一点是,因为它们可能会让人感到困惑并可能会延迟开发。一般来说,我选择在新项目中使用新的语言功能和平台元素。当功能/框架增强功能出现时,我经常会避免在当前正在开发的项目中使用它们,推迟到下一个项目。在一个长期项目中,我可能会在一个重要的里程碑中介绍它们如果重新架构的数量很少或者该功能值得更改。通常情况下,我会等到项目到期发生重大变化,然后评估是否需要重新构建更新的功能。

答案 5 :(得分:3)

陪审团仍然关注某些特征的长期后果,但如果他们的主要理由是“它让其他开发人员感到困惑”或类似的事情,那么我会关注人才的质量。

答案 6 :(得分:3)

  

我特别喜欢C#3.0功能   lambda表达式,自动实现   属性或在适当的情况下也   隐式输入局部变量(var   关键字),但当我的老板透露   我正在使用它们,他没有问我   在工作中使用任何C#3.0功能。一世   被告知这些功能不是   标准和大多数人感到困惑   开发人员及其实用性   值得怀疑的。

他有一点意见。

按照这一思路,让我们对泛型集合制定规则,因为List<T>没有任何意义(尖括号?wtf?)。

虽然我们正在使用它,但是我们要消除所有接口(你什么时候需要一个没有任何实现的类?)。

哎呀,让我们继续消除继承,因为它现在如此棘手(是 - 有吗?我们不能只是朋友吗?)。

使用递归是解雇的理由(Foo()调用Foo()?当然你一定是在开玩笑!)。

Errrm ......回到现实。

并不是说C#3.0功能对程序员来说是混乱的,它的功能让你的老板感到困惑。他熟悉一种技术,并且顽固地拒绝参与其中。您即将进入 Twilight Zone Blub Paradox

  

程序员非常依赖他们的   最喜欢的语言,我不想要   为了伤害任何人的感情   解释这一点我将使用一个   假设的语言叫做Blub。   Blub正好落在中间   抽象连续体。它不是   最强大的语言,但它更多   比Cobol或机器强大   语言。

     

事实上,我们假设的Blub   程序员不会使用任何一个   他们。当然他不打算参加   机器语言。那是什么   编译器是为了。至于Cobol,   他不知道怎么会得到   用它完成的任何事情。它甚至没有   有x(你选择的Blub功能)。

     

只要我们假设Blub   程序员正在俯视权力   连续,他知道他在低头。   语言不如Blub强大   显然不那么强大,因为   他们错过了一些他用过的功能   至。但是当我们假设的Blub   程序员看起来在另一个   方向,上升力量连续,他   没有意识到他在抬头。什么   他看到的只是奇怪的语言。他   可能会考虑他们   相当于Blub的权力,但有   所有这些其他毛茸茸的东西扔进去了   同样。 Blub对他来说足够好,   因为他在Blub中思考。

     

当我们转向观点时   程序员使用任何一个   语言更高的权力   然而,我们发现他在   转向看不起Blub。你怎么   在Blub完成任何事情?它没有   甚至有y。

C#3.0并不难。当然你可以滥用它,但对于拥有超过一周C#3.0经验的程序员来说,这并不困难或困惑。你的老板的技能刚刚落后,他希望将团队的其他成员降到他的水平。不要让他离开!

继续使用匿名funcs,var关键字,自动属性以及您心中的内容。你不会失去你的工作。如果他对此感到沮丧,那就笑吧。

答案 7 :(得分:2)

不管您喜不喜欢,如果您打算在任何情况下使用LINQ,您将不得不使用一些C#3.0语言规范。

如果他想利用你从3.5获得的功能集,你的老板将不得不热身,他们很多,值得你花时间投资。

另外,根据我在领导团队方面的经验,我发现使用3.0规范实际上有助于开发人员的可读性和对代码库的理解。开发人员花费了大约一周的时间来尝试理解语法的含义,但是一旦他们得到它,他们就更喜欢新的方式。

答案 8 :(得分:2)

有些人只是害怕改变,因为也许你会使用花哨的新技术让他们看起来都很愚蠢。也可能是你的老板不希望团队学习新事物而不是以旧的方式完成工作。

var关键字肯定会被滥用,但在大多数情况下会减少冗余代码。 LINQ是你想要的.Net 3.5的主要内容,因为你必须节省大量的代码来编写代码。你的老板应该鼓励你使用它。此外,基类库现在将委托作为参数,因此您将通过不使用它们来限制自己。 Lambda只是一些花哨的语法糖,使代表们更清洁。

我会推荐你​​Effectively Integrating into Software Development TeamsLeading by Example。关于如何应对害怕改变的团队的两篇非常好的文章。

答案 9 :(得分:2)

也许你可以每周为每个人做一次每个功能的演示,并让一些开发人员帮助说服管理层获益。

我最近从一个前沿的C#house迁移到一个主要在dot.Net 1.1和一些2.0项目上运行的C#house,主要使用1.1个功能。幸运的是,管理层远离代码。大多数开发人员都喜欢新框架中的所有新功能,他们只是没有时间或倾向于自己解决这些问题。一旦我设法告诉他们如何让自己的生活更轻松,他们就开始自己使用它们,我们已经迁移了几个项目以获得新的语言功能和更好的工具优势。