你如何处理C#的新功能,以便它们不会导致代码写得不好?

时间:2009-03-30 12:01:51

标签: c# coding-style

C#3.0中引入了许多让我感到不安的功能,例如对象初始化器,扩展方法和隐式类型变量。现在在C#4.0中使用动态关键字之类的东西我会更加关注。

我知道在我的视图中以适当的方式 BUT 使用 CAN 这些功能中的每一个都会使开发人员更容易做出错误的编码决策,从而编写更糟糕的代码。在我看来,微软正试图通过简化编码而不是要求来赢得市场份额。就个人而言,我更喜欢一种严谨的语言,对我的编码标准提出更高的要求,并迫使我以OOP的方式构建事物。

以下是我对上述功能的关注的一些示例:

对象构造函数可以执行未向使用者公开的重要逻辑。这是对象开发人员的控制。对象初始化器取消了这种控制,允许消费者决定初始化哪些字段。

编辑:我没有意识到你可以混合构造函数和初始化程序(我的不好),但这开始看起来很混乱,所以我仍然不相信这是向前迈进的一步。

允许开发人员使用扩展方法扩展内置类型允许所有人和各种各样的人开始将他们喜欢的宠物方法添加到字符串类中,这可能最终导致一系列令人眼花缭乱的选项,或者需要更多的编码标准来监管杂草这些。

允许隐式类型变量允许快速和脏的编程,或者正确的OOP方法,这很快就会成为整个应用程序中无法管理的变量。

我的担忧是否合理?

9 个答案:

答案 0 :(得分:5)

对象初始化器只允许客户端在构造后立即设置属性,不会放弃任何控制,因为调用者必须仍然确保满足所有构造函数参数。

就个人而言,我觉得他们添加的很少:

Person p1 = new Person("Fred");
p1.Age = 30;
p1.Height = 123;

Person p2 = new Person("Fred")
{
    Age = 30;
    Height = 123;
};

我知道很多人不喜欢'var'关键字。我可以理解为什么这是一个公开邀请的滥用,但我不介意它提供的类型是非常明显的:

var p1 = new Person("Fred");
Person p2 = GetPerson();

在上面的第二行中,尽管有方法名称,但类型并不明显。在这种情况下我会使用这种类型。

扩展方法 - 我会非常谨慎地使用它们,但它们对于使用便捷方法扩展.NET类型非常有用,尤其是IEnumerable,ICollection和String。 String.IsNullOrEmpty()作为扩展方法是非常好的,因为它可以在空引用上调用。

我认为你不必担心,优秀的开发人员会始终尊重他们的工具,糟糕的开发人员总是会想办法误导他们的工具:限制工具集不会解决这个问题。

答案 1 :(得分:2)

您可以通过将限制写入编码标准来限制开发人员可以使用的C#3.0功能。然后,在办理登机手续之前审查代码时,应发现任何违反这些规则的代码,并拒绝办理登机手续。其中一个案例可能就是扩展方法。

显然,您的开发人员会希望使用新功能 - 所有开发人员都会这样做。但是,如果你有很好的,有充分记录的原因,为什么不应该使用它们,好的开发人员会遵循它们。随着新信息的曝光,你也应该愿意修改这些规则。

使用VS 2008,您可以指定要定位的.NET版本(右键单击解决方案并选择“属性”>“应用程序”)。如果您将自己限制在.NET 2.0中,那么您将无法获得.NET 3.5中的任何新功能。显然,如果您想使用某些功能,这无济于事。

但是,我认为你对vars的担忧是没有根据的。 C#仍然像以前一样强类型。将某些内容声明为var只是告诉编译器为此变量选择最佳类型。变量不能改变类型,它始终是intPerson或其他。就个人而言,我遵循与保罗鲁恩相同的规则;如果语法中的类型清楚,则使用var;如果没有明确命名类型。

答案 2 :(得分:2)

我看到你的立场表达如下:

  

构建一个开发环境   任何傻瓜都可以使用,你得到的是什么   许多傻瓜在发展。

这是非常正确的,但相比之下我们其他人看起来都很好。我认为这是一件好事。我见过的最有趣的帖子之一就是

  

VB不应该被低估。它是一个非常强大的工具   让白痴远离这个[C ++]新闻组。

更严重的是,工具是否危险取决于持用者的智慧。你可以防止愚蠢的唯一方法是阻止行动。 foreach看起来无害,但在迭代集合时甚至无法删除项目,因为删除项会使迭代器无效。你最终倾销他们,转而使用经典的for循环。

答案 3 :(得分:1)

我认为你们群中唯一真正合理的问题是过度使用扩展方法。当重要功能只能通过扩展方法访问时,有时组中的每个人都很难找到并使用该功能。

担心对象初始化器和“var”关键字似乎非常挑剔。两者都是简单且可预测的语法,可用于使代码更具可读性,而且我不清楚你如何看待它们被“滥用”。

我建议你通过书面的,商定的编码标准来解决这样的问题。如果没有人能够提出使用新语言功能的充分理由,那么毕竟没有必要使用它们。

答案 4 :(得分:0)

对象初始化器只是花哨的语法。开发人员无法对他们做任何他以前无法做到的事情 - 但他们确实为您节省了几行代码。

如果通过“扩展内置类型”你的意思是扩展方法 - 再次,这不是什么新鲜事,只是更好的语法。这些方法是出现的静态方法,就好像它们是成员一样。类中的构建保持不变。

Linq需要隐式类型变量。我还将它们与具有许多类型参数的泛型一起使用。但我同意我不希望看到它们被完全使用。

当然,每个功能都可以被滥用,但我认为这些新功能实际上可以让您编写更易于阅读的代码。

答案 5 :(得分:0)

关于var的一个重要缓解因素是它永远不会在范围之间移动。它不能是返回类型或参数类型。这使得它在我看来更加安全,因为它始终是紧密输入的,并始终是一种方法的实现细节。

答案 6 :(得分:0)

引入了新功能,因为Microsoft意识到它们对于实现新语言功能是绝对必要的。例如,像LINQ一样。所以你可以使用相同的策略: 1)了解这些功能, 2)在你发现对你来说绝对必要之前不要使用

如果你真的了解这些功能,我打赌你很快就会觉得有必要。 :)

答案 7 :(得分:0)

至少对于“var”和初始化者来说,你真的无法做任何新的事情,这只是一种写东西的新方法。虽然它看起来像对象初始化程序编译为略有不同的IL。

真正让我想到扩展方法的一个角度是你可以将它们放在界面上。这意味着类可以通过实现接口来继承具体代码。而且由于一个类可以实现多个接口,这意味着,在一种迂回的方式中,C#现在具有多重继承的功能。所以这是一个应该小心处理的新功能。

答案 8 :(得分:-3)

  

我的担忧是否合理?

没有。这是对简单问题的简单回答的另一版本。