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

有帮助吗?

解决方案

有些人认为它是一种滥用的工具。像“Option Strict Off”一样和“On Error Resume Next”在VB中,“纯粹的”像C#和Java这样的语言从未有过。

许多人对“var”表示同样的看法。关键字,但我不认为它被滥用,一旦被理解为它与VB的“变体”不一样

在懒惰的开发人员不希望对类进行类型检查的地方可能会滥用它,只是尝试捕获动态调用而不是写“如果blah是Blah ......”。

我个人觉得它可以在最近这个的情况下正常使用我回答的问题。

我认为那些真正理解它的力量的是那些充满动态.NET语言的东西。

其他提示

我认为人们对此功能表达的许多反感归结为“这是一种糟糕的语言功能,因为它会让糟糕的开发人员编写错误的代码。”如果您考虑一下,那么逻辑所有语言功能都是不好的。

当我遇到一个VB代码块时,一些天才的前缀是 On Error Resume Next ,这不是我诅咒的VB。我想也许我应该这样做。但根据我的经验,一个决心在保险丝盒里放一分钱的人会找到一种方法。即使你清空他的口袋,他也会塑造他自己的便士。

我,我期待在C#和Python之间进行互操作的更有用的方法。我正在编写越来越多的代码来执行此操作。对于特定的用例, dynamic 关键字不能很快到来,因为目前这样做的方式让我觉得我是20世纪50年代的苏联学者,他正在西方旅行参加会议:在我离开之前有大量的规则和文书工作,我很确定有人会一直看着我,而我在那里的大部分时间都会被带走我回来的时候在边境。

动态很糟糕,因为这样的代码会遍布整个地方:

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年后没有必要投票给我:)

真正的陷阱?严重缺乏文件。整个应用程序的体系结构存在于编写它的人(或人)的脑海中。至少在强类型的情况下,您可以通过其类定义查看对象的作用。使用动态类型,您必须充分推断其使用的含义。在最坏的情况下,你没有IDEA对象是什么。这就像用JavaScript编写所有内容。 ACK!

当人们意识到他们没有通过 dynamic 获得良好的IntelliSense时,他们将从 dynamic -happy切换回 dynamic - 当-必要 - 和 - <代码> VAR -at-所有其他次。

dynamic 的目的包括:与动态语言和平台(如COM / C ++和DLR / IronPython / IronRuby)的互操作性;以及将C#本身转换为IronSmalltalkWithBraces以及实现 IDynamicObject 的所有内容。

所有人都将度过美好的时光。 (除非你需要维护别人写的代码。)

这有点像讨论公共摄像机,确定它们可以并且将被滥用,但也可以使用它们。

没有理由不能取缔“动态”的行为。如果您不需要,可以在自己的编码指南中使用关键字。所以有什么问题?我的意思是,如果你想用“动态”做疯狂的事情。关键字和假装C#是JavaScript的一些突变表兄弟,是我的客人。只是将这些实验保留在我的代码库之外。 ;)

FUD。这可能是自切片面包以来最好的事情,但我用VB,JavaScript等所有的经验让我感到寒意,知道C#将具有动态绑定。我知道我将能够在不久的将来理性地看待它,看看这个新功能将如何与动态语言实现互操作性。但这需要一些时间。我是人,好吗? : - )

我没有看到为什么当前动态调用方法的方式存在缺陷的原因:

它需要三行才能完成,或者您可以在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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top