阅读了许多针对这个线程的回复后,我发现很多反感它的人都提到了新关键字被滥用的潜在可能性。我的问题是,什么样的滥用?它怎么会被滥用到让人非常反感的程度?这只是关于纯粹主义吗?还是有一个真正的陷阱我没有看到?
On Error Resume Next
前缀的VB代码块时,我谴责的不是VB。也许我应该这样做。但是在我的经验中,无论如何都决心往保险丝盒里塞一便士的人都会找到方法。即使你把他的口袋掏空了,他也会自己铸造便士。dynamic
关键字不能再慢速一点了,因为当前的方法让我感觉像是1950年代苏联学术界的人前往西方参加会议:出国前要处理大量规则和文件,我很确定有人会一直监视我,在那里我获得的大部分东西都会在返回国境时被没收。有些人认为它是一个会被滥用的工具。就像VB中的"Option Strict Off"和"On Error Resume Next"一样,而像C#和Java这样的“纯”语言从未拥有过。
许多人对"var"关键字也有同样的看法,但我并没有看到它被滥用,一旦人们明白了它与VB的"Variant"不同。
它可能会被滥用在那些懒惰的开发者不想对类进行类型检查,只是使用try catch动态调用而不是编写"if blah is Blah ..."的地方。
我个人认为,在像我最近回答的这个问题这样的情况下,它可以被正确地使用。
我认为真正理解它的力量的人是那些深入研究动态.NET语言的人。
动态编程很糟糕,因为这样的代码会无处不在:
public dynamic Foo(dynamic other) {
dynamic clone = other.Clone();
clone.AssignData(this.Data);
return clone ;
}
替代:
public T Foo<T>(T other) where T: ICloneable, IAssignData{
T clone = (T)other.Clone();
clone.AssignData(this.Data);
return clone;
}
第一个缺点是没有静态类型信息,没有编译时检查,不具备自我文档化,也没有类型推断,因此人们将被迫在调用现场使用动态引用来存储结果,导致更多的类型丢失,而所有这些问题都会不断恶化。
我已经开始担心动态了。
真正的陷阱?文档严重缺失。整个应用程序的架构存在于编写它的人(或人们)的头脑中。至少在强类型语言中,您可以通过其类定义查看对象的功能。而在动态类型语言中,您必须从其使用中推断出含义,最多只能这样做。最糟糕的是,您根本不知道对象是什么。这就像用JavaScript编写所有内容一样。哎呀!
这有点像讨论公共摄像头,当然它们可能会被滥用,但是拥有它们也有好处。
如果您不需要它们,那么您可以在自己的编码指南中禁止使用 "dynamic" 关键字。那么问题在哪里呢?我的意思是,如果您想使用 "dynamic" 关键字做一些疯狂的事情,并假装 C# 是 JavaScript 的变异表亲,那就随便你了。只要把这些实验从我的代码库中排除就行了。 ;)
class Program
{
static void Main(string[] args)
{
var foo = new Foo();
Console.WriteLine(foo.Invoke("Hello","Jonathan"));
}
}
static class DynamicDispatchHelper
{
static public object Invoke(this object ot, string methodName, params object[] args)
{
var t = ot.GetType();
var m = t.GetMethod(methodName);
return m.Invoke(ot, args);
}
}
class Foo
{
public string Hello(string name)
{
return ("Hello World, " + name);
}
}