在阅读了许多对this thread的回复后,我发现许多不喜欢它的人都会发现滥用新关键字的可能性。我的问题是,什么样的滥用?怎么会这么严重地被滥用,以至于让人们激烈地不喜欢它呢?这只是纯粹主义吗?或者是否有一个我只是没有看到的真正陷阱?
答案 0 :(得分:17)
我认为人们对此功能表达的很多反感归结为“这是一个糟糕的语言功能,因为它会让糟糕的开发人员编写错误的代码。”如果您考虑一下,那么逻辑所有语言功能都是不好的。
当我遇到一个VB代码块时,一些天才的前缀是On Error Resume Next
,我不是诅咒VB。我想也许我应该这样做。但根据我的经验,一个决心在保险丝盒里放一分钱的人会找到一种方法。即使你清空他的口袋,他也会塑造他自己的便士。
我,我期待在C#和Python之间进行互操作的更有用的方法。我正在编写越来越多的代码来执行此操作。对于那个特定的用例来说,dynamic
关键字不能很快到来,因为目前这样做的方式让我觉得我是20世纪50年代的苏联学者,他正在西部去参加一个会议:有一个在我离开之前有大量的规则和文书工作,我很确定有人会一直看着我,而我在那里的大部分时间都会被我带走。我回来时的边界。
答案 1 :(得分:16)
有些人认为它是一种滥用的工具。就像VB中的“Option Strict Off”和“On Error Resume Next”一样,C#和Java之类的“纯粹”语言从未有过。
很多人对“var”关键字说了同样的话,但是一旦被理解为与VB的“Variant”不一样,我就不会看到它被滥用了
在懒惰的开发人员不希望对类进行类型检查的地方可能会滥用它,只是尝试捕获动态调用而不是写“如果blah是Blah ......”。
我个人觉得它可以在this我最近回答的问题的情况下正确使用。
我认为那些真正理解它的力量的是那些充满动态.NET语言的东西。
答案 2 :(得分:7)
动态很糟糕,因为这样的代码会遍布整个地方:
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;
}
第一个,没有静态类型信息,没有编译时检查,它不是自我记录,没有类型推断所以人们将被迫在调用站点使用动态引用来存储结果,导致更多的类型丢失,所有这一切螺旋下来。
我已经开始担心动态。
编辑:危险已经过去了(P!)......而且动态并没有被滥用,3年后没有必要投票给我:)
答案 3 :(得分:6)
真正的陷阱?严重缺乏文件。整个应用程序的体系结构存在于编写它的人(或人)的脑海中。至少在强类型的情况下,您可以通过其类定义查看对象的作用。使用动态类型,您必须充分推断其使用的含义。在最坏的情况下,你没有IDEA对象是什么。这就像用JavaScript编写所有内容。 ACK!
答案 4 :(得分:2)
当人们意识到他们没有通过dynamic
获得良好的智能感知时,他们会从dynamic
- 快乐切换回dynamic
- 当必要时 - 和 - {{ 1}} - 不惜一切其他次
var
的目的包括:与动态语言和平台(如COM / C ++和DLR / IronPython / IronRuby)的互操作性;以及将C#本身转换为IronSmalltalkWithBraces,并实现dynamic
的所有内容。
所有人都将度过美好的时光。 (除非你需要维护别人写的代码。)
答案 5 :(得分:1)
这有点像讨论公共摄像机,确定它们可以并且将被滥用,但也可以使用它们。
如果您不需要,您没有理由不在自己的编码指南中取缔“动态”关键字。所以有什么问题?我的意思是,如果你想用“动态”关键字做疯狂的事情,并假装C#是JavaScript的一些突变表兄弟,请成为我的客人。只是将这些实验保留在我的代码库之外。 ;)
答案 6 :(得分:-1)
FUD。这可能是自切片面包以来最好的事情,但我用VB,JavaScript等所有的经验让我感到寒意,知道C#将具有动态绑定。我知道我将能够在不久的将来合理地看待它,看看这个新功能在动态语言的互操作性方面有多好。但这需要一些时间。我是人,好吗? : - )
答案 7 :(得分:-2)
我没有看到为什么当前动态调用方法的方式存在缺陷的原因:
它需要三行才能完成,或者您可以在System.Object上添加一个扩展方法来为您完成:
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);
}
}