什么时候应该在c#4.0中使用动态关键字?

ACP*_*ACP 54 c# dynamic keyword c#-4.0

什么时候应该在c#4.0中使用动态关键字?....... c#4.0中使用动态关键字解释其用法的任何好例子....

Ami*_*abh 38

在不使用动态时才应使用动态是痛苦的.就像在MS Office库中一样.在所有其他情况下,应该避免它,因为编译类型检查是有益的.以下是使用动态的好情况.

  1. 从Silverlight调用javascript方法.
  2. COM互操作.
  3. 也许在不创建自定义类的情况下阅读Xml,Json.

  • 我喜欢你把3号"也许"放在第3号.我认为这是一个_weak_"也许"因为通常在商业数据结构中定义可重用类的投资会在长期内得到回报.因此,当您快速构建产品原型并且没有时间或者懒得定义可重用的自定义业务数据类型时,也许应该保留"可能". (4认同)

use*_*376 11

这个怎么样?我一直在寻找的东西,并想知道为什么没有"动态"这么难.

interface ISomeData {}
class SomeActualData : ISomeData {}
class SomeOtherData : ISomeData {}

interface ISomeInterface
{
    void DoSomething(ISomeData data);
}

class SomeImplementation : ISomeInterface
{
    public void DoSomething(ISomeData data)
    {
        dynamic specificData = data;
        HandleThis( specificData );
    }
    private void HandleThis(SomeActualData data)
    { /* ... */ }
    private void HandleThis(SomeOtherData data)
    { /* ... */ }

}
Run Code Online (Sandbox Code Playgroud)

如果没有采用具体类型的重载方法,您可能必须捕获Runtime异常并处理您想要的方式.

相当于不使用dynamic将是:

    public void DoSomething(ISomeData data)
    {
        if(data is SomeActualData)
          HandleThis( (SomeActualData) data);
        else if(data is SomeOtherData)
          HandleThis( (SomeOtherData) data);
        ...
        else
         throw new SomeRuntimeException();
    }
Run Code Online (Sandbox Code Playgroud)

  • 我的天啊!使用ISomeData specificData = data; 而不是动态!为什么你会使用动态来完成这么简单的任务 (7认同)
  • 如果ISomeData来自另一个库并且您无法在其源代码中添加任何内容,该怎么办?或者您可能希望实现访问者模式,以便能够为这些对象添加动态行为? (2认同)

Ash*_*ous 6

作为描述这里的动态可以使设计拙劣的外部库更容易使用:微软提供的Microsoft.Office.Interop.Excel的例子组装。使用动态,您可以避免使用此装配体时产生很多烦人的显式转换。

另外,与@ user2415376相对,它绝对不是一种处理接口的方法,因为从语言的开始我们就已经实现了多态性!
您可以使用

  ISomeData specificData = data;
Run Code Online (Sandbox Code Playgroud)

代替

dynamic specificData = data;
Run Code Online (Sandbox Code Playgroud)

另外,它将确保您不会传递错误类型的数据对象。


Sum*_*ngi 5

查看这篇博客文章,其中讨论了 c# 中的动态关键字。这是要点:

dynamic 关键字确实很强大,当与动态语言一起使用时它是不可替代的,但也可以用于设计静态类型对象根本无法执行的代码时的棘手情况。

考虑缺点:

  1. 没有编译时类型检查,这意味着除非您对单元测试(咳嗽)有 100% 的信心,否则您将面临风险。

  2. 由于额外的运行时开销,dynamic 关键字比旧式静态类型代码使用更多的 CPU 周期,如果性能对您的项目很重要(通常是),请不要使用动态。

  3. 常见错误包括在公共方法中返回包裹在 dynamic 关键字中的匿名类型。匿名类型特定于程序集,跨程序集返回它们(通过公共方法)会抛出错误,即使简单的测试会捕捉到这一点,你现在有一个只能在特定地方使用的公共方法,这只是糟糕的设计.

  4. 这是一个滑坡,没有经验的开发人员渴望写一些新的东西并尽力避免更多的类(这不一定限于没有经验的人)如果他们在代码中看到它会越来越多地使用动态,通常我会做一个代码分析检查动态/在代码审查中添加它。