代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

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

  •  6
  • Erik Forbes  · 技术社区  · 16 年前

    在阅读了许多回复之后 this thread 我看到很多不喜欢它的人都提到了滥用这个新关键词的可能性。我的问题是,什么样的虐待?这怎么会被滥用得如此严重以致于让人们强烈地厌恶它呢?是纯粹主义吗?还是有一个真正的陷阱我只是看不见?

    8 回复  |  直到 13 年前
        1
  •  16
  •   Community CDub    7 年前

    有些人认为它是一种会被滥用的工具。像VB中的“选项严格OFF”和“OnEngestRebug Next”这样的“纯”语言,如C和JAVA从来没有过。

    很多人对“var”关键字也这么说,但我看不到它被滥用,一旦它被理解为它与vb的“variant”不一样。

    在那些懒惰的开发人员不想在类上进行类型检查的地方,它可能会被滥用,只是尝试捕捉动态调用,而不是编写“如果blah是blah…”。

    我个人认为它可以在以下情况下正确使用 this 我最近回答的问题。

    我认为真正理解它的力量的人是那些深入到动态.NET语言中的人。

        2
  •  17
  •   Robert Rossney    16 年前

    我认为人们对这一特性的许多反感归结为“这是一个糟糕的语言特性,因为它会让糟糕的开发人员编写糟糕的代码。”如果你考虑一下,按照这种逻辑 全部的 语言功能不好。

    当我遇到一些天才在VB代码前加前缀的时候 On Error Resume Next 我诅咒的不是VB。我想,也许我应该。但根据我的经验,一个决心把一分钱放进保险箱的人会找到一个办法。即使你清空他的口袋,他也会自己做硬币。

    我,我期待着一种更有用的方法来在C和Python之间进行互操作。我正在写越来越多的代码来完成这个任务。这个 dynamic 关键字对于这个特定的用例来说还不够快,因为当前的方式让我觉得自己是20世纪50年代的一名苏联学者,他要去西方参加一个会议:在我离开之前有大量的规则和文书工作,我很确定有人会一直盯着我,我在那里,一个当我在那里时,我所得到的大部分东西都会在我回来的时候从我身边带走。

        3
  •  7
  •   Pop Catalin    13 年前

    动态 是坏的,因为这样的代码会到处弹出:

    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;
    }
    

    第一个,没有静态类型信息,没有编译时检查,它没有自我记录,没有类型推断,因此人们将被迫使用调用站点的动态引用来存储结果,导致更多的类型丢失,所有这些都呈螺旋状下降。

    我已经开始害怕了 动态 .

    编辑 :危险已经过去(PHEW!)…毕竟,dynamic并没有被滥用,3年后也没必要投我反对票。

        4
  •  6
  •   Robert C. Barth    16 年前

    真正的陷阱?严重缺乏文件。整个应用程序的体系结构存在于编写它的人的头脑中。至少通过强类型,您可以通过对象的类定义来查看它做了什么。对于动态类型,您最好从它的使用中推断出它的含义。最坏的情况是,你不知道物体是什么。就像用JavaScript编程一样。阿克!

        5
  •  2
  •   yfeldblum    16 年前

    当人们意识到他们不能很好地理解 dynamic 他们会从 动态 -高兴地 动态 -必要时和- var -在所有其他时间。

    目的 动态 包括:与动态语言和平台的互操作性,如COM/C++和DLR/IrnPython/IrRuuBuy;以及将C语言本身转换为具有所有实现的IrnSaltTalk括号。 IDynamicObject .

    所有人都会度过美好的时光。(除非您需要维护其他人编写的代码。)

        6
  •  1
  •   JohannesH    16 年前

    这有点像讨论公共摄像机,当然它们可以也将被误用,但拥有它们也有好处。

    如果您不需要“动态”关键字,那么就没有理由不在自己的编码准则中取缔它们。那么问题是什么呢?我的意思是,如果你想用“dynamic”关键字做一些疯狂的事情,假装c是javascript的变种表亲,那就来做客吧。把这些实验从我的代码库中去掉。;)

        7
  •  -1
  •   Rui Craveiro    15 年前

    FUD。这可能是最好的事情,因为切片面包,但所有的经验,我与vb,javascript等,使我寒心知道,C将有动态绑定。我知道,在不久的将来,我将能够理性地看待它,并看到新特性对于实现与动态语言的互操作性有多好。但这需要一些时间。我是人,好吗?-)

        8
  •  -2
  •   FlySwat    16 年前

    我不明白为什么当前动态调用方法的方法有缺陷:

    它需要三行来完成,或者您可以在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);
        }
    }