C#4动态关键字 - 为什么不呢?

时间:2008-10-28 23:57:49

标签: dynamic c#-4.0

在阅读了许多对this thread的回复后,我发现许多不喜欢它的人都会发现滥用新关键字的可能性。我的问题是,什么样的滥用?怎么会这么严重地被滥用,以至于让人们激烈地不喜欢它呢?这只是纯粹主义吗?或者是否有一个我只是没有看到的真正陷阱?

8 个答案:

答案 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);
    }
}