Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic C#4动态关键字-为什么不?_Dynamic_C# 4.0 - Fatal编程技术网

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

Dynamic C#4动态关键字-为什么不?,dynamic,c#-4.0,Dynamic,C# 4.0,在阅读了许多回复之后,我发现许多不喜欢它的人都提到了滥用新关键字的可能性。我的问题是,什么样的虐待?这怎么会被滥用到如此严重的程度,以至于人们强烈地不喜欢它?这只是纯粹主义吗?还是有我没有看到的真正的陷阱?有些人认为它是一种会被滥用的工具。像VB中的“Option Strict Off”和“On Error Resume Next”,这是像C#和Java这样的“纯”语言所没有的 很多人都对“var”关键字说了同样的话,但我不认为它被滥用,因为它被理解为与VB的“Variant”不同 如果懒惰的开

在阅读了许多回复之后,我发现许多不喜欢它的人都提到了滥用新关键字的可能性。我的问题是,什么样的虐待?这怎么会被滥用到如此严重的程度,以至于人们强烈地不喜欢它?这只是纯粹主义吗?还是有我没有看到的真正的陷阱?

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

很多人都对“var”关键字说了同样的话,但我不认为它被滥用,因为它被理解为与VB的“Variant”不同

如果懒惰的开发人员不希望对类进行类型检查,而只是尝试捕获动态调用,而不是编写“if blah is blah…”,那么它可能会被滥用

我个人觉得它可以在我最近回答的问题中正确使用


我认为真正了解it功能的是那些对动态.NET语言有着浓厚兴趣的人。

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

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

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;
}
public T Foo(T other),其中T:iClonable,iaSignData{
T clone=(T)other.clone();
clone.AssignData(this.Data);
返回克隆;
}
第一个,没有静态类型信息,没有编译时检查,它不是自文档,没有类型推断,因此人们将被迫在调用站点使用动态引用来存储结果,导致更多的类型丢失,所有这些都会下降

我已经开始害怕动态了


编辑:危险已经过去(呸!)。。。而且dynamic毕竟没有被滥用,三年后也没必要投票否决我:)

当人们意识到他们不能从
dynamic
中获得良好的智能感知时,他们会从
dynamic
-高兴地
dynamic
-在必要时,以及在所有其他时间

dynamic
的目的包括:与COM/C++和DLR/IronPython/IronRuby等动态语言和平台的互操作性;以及将C#本身变成带大括号的IronSmalltalk,所有东西都实现了
IDynamicObject


大家都会过得很好。(除非你需要维护别人编写的代码。)

我认为人们对这个特性的反感归结为“这是一个糟糕的语言特性,因为它会让糟糕的开发人员编写糟糕的代码。”如果你仔细想想,按照这个逻辑,所有的语言特性都是糟糕的

当我遇到一块VB代码时,我诅咒的不是VB,而是一些天才在错误恢复下一步时加了前缀
。也许我应该,我想。但根据我的经验,一个决心在保险丝盒里放一分钱的人会找到办法的。即使你掏空他的口袋,他也会自己设计硬币


在我看来,我期待着在C#和Python之间找到一种更有用的互操作方式。我正在编写越来越多的代码来实现这一点。对于那个特定的用例,
dynamic
关键字不能很快出现,因为目前的做法让我觉得自己是20世纪50年代的苏联学者,要去西方参加一个会议:在我离开之前有大量的规则和文件,我敢肯定,我在那里的整个时间都会有人盯着我,我在那里捡到的大部分东西在我回来的时候都会在边境被拿走。

我看不出当前动态调用方法的方式有缺陷的原因:

完成此操作需要三行代码,或者您可以在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);
    }
}

这有点像讨论公共摄像机,当然它们会被滥用,但拥有它们也有好处


如果您不需要“动态”关键字,那么您没有理由不在自己的编码准则中取缔它们。那有什么问题?我的意思是,如果你想用“dynamic”关键字做一些疯狂的事情,并假装C#是JavaScript的变种表亲,那就请便吧。不要让这些实验进入我的代码库

平心而论,这在某种程度上已经是可能的:大量使用接口的C#程序会使确定给定调用的实际实现成为一种挫折感,充满猜测和全文搜索。是的,但接口提供了一些操作的上下文。动态对象不提供任何上下文。动态q的另一端是什么?谁知道呢?你认为什么会鼓励人们不必要地编写动态代码?我在actionscript中做了一个项目,它是动态和静态的,我要说的是动态/静态混合模式并不好用。所有人都从一个例子中概括出来。或者,至少我知道。:)我用QBASIC做了一个项目,那也不应该是一种语言。但是关于ActionScript和QBASIC的要点与C#没有任何关系。C#仍然是静态类型的面向对象的核心,混合了非常有用的替代功能集?如果有人长时间传递int怎么办?性能如何?当你沿着这条路走得够远的时候,你已经重写了DLR的一大部分,仍然没有处理Python或COM互操作…更不用说索引或中缀运算符的自然C#语法,它只支持基于反射的后期绑定。它不适用于基于IDynamiObject的后期绑定。N