C#3.0中引入了许多让我感到不安的功能,例如对象初始化器,扩展方法和隐式类型变量.现在在C#4.0中使用动态关键字之类的东西我会更加关注.
我知道每个功能的CAN以适当的方式使用但在我看来,它们使开发人员更容易做出错误的编码判决,因此写信更差的代码.在我看来,微软正试图通过简化编码而不是要求来赢得市场份额.就个人而言,我更喜欢一种严谨的语言,对我的编码标准提出更高的要求,并迫使我以OOP的方式构建事物.
以下是我对上述功能的一些关注示例:
对象构造函数可以执行未向使用者公开的重要逻辑.这是对象开发人员的控制.对象初始化程序将此控制权移除,并允许使用者决定要初始化哪些字段.
编辑:我没有意识到你可以混合构造函数和初始化程序(我的坏)但这开始看起来很麻烦,所以我仍然不相信这是向前迈进的一步.
允许开发人员使用扩展方法扩展内置类型允许所有和各种各样的人开始将他们喜欢的宠物方法添加到字符串类中,这可能最终导致一系列令人眼花缭乱的选项,或者需要更多的编码标准来监管这些方法.
允许隐式类型化变量允许快速和脏的编程,或者正确的OOP方法,这可能很快成为整个应用程序中无法管理的变量.
我的担忧是否合理?
对象初始化器只允许客户端在构造后立即设置属性,不会放弃任何控制,因为调用者必须仍然确保满足所有构造函数参数.
就个人而言,我觉得他们添加的很少:
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()作为扩展方法是非常好的,因为它可以在空引用上调用.
我不认为你需要担心,优秀的开发人员总是会尊重他们的工具,糟糕的开发人员总是会想办法误导他们的工具:限制工具集不会解决这个问题.