什么时候使用Duck Typing?

Luc*_*key 8 c# duck-typing

我现在已经阅读了很多关于Duck Typing的内容,我似乎理解了这个概念.

我不明白的是,在什么情况下,放弃强大的典型编程的好处对于Duck Typing的好处是有效的.在什么情况下会使用Duck Typing而不是Interfaces和Inheritance?

我的意思是,如果你无论如何需要确保传递给Method的对象实现某些方法,为什么我不应该简单地定义一个接口?

为了清楚起见,我知道Duck Typing是如何工作的.我想知道何时使用它真的很有意义.

澄清:

在哪种情况下你会使用

public bool MyMethod(dynamic obj)
Run Code Online (Sandbox Code Playgroud)

代替

public bool MyMethod(ISomeInterface obj)
//or
public bool MyMethod(SomeBaseClass obj)
Run Code Online (Sandbox Code Playgroud)

Tom*_*vin 13

C#有很强的打字理由.除非你有正当理由(例如需要COM互操作)才能使用该dynamic类型,否则你应该像瘟疫那样避免使用它,否则你就有可能将编译时问题转化为运行时问题.dynamic是强大的,但容易滥用.如果你真的需要动态打字,请仔细思考 - 如果你认为有,那么你有可能在开始时遇到问题,并且需要重构你的代码.

要专门回答您的问题 - 一个潜在的用例是您编写序列化代码并需要接受反序列化对象,例如来自Web API请求的反序列化JSON结构.这些方法需要处理给予它们的任何类型,这是一种使用dynamic比替代方案更好的情况(即卡车负载的反射).

我能想到的另一个例子是与动态语言运行时语言的互操作性(例如JavaScript,IronPython,IronRuby,......),并且需要编写一个接受这些语言类型的方法.

Beginning Visual C#2012编程:

对于您编写的大多数C#代码,请避免使用dynamic关键字.然而,如果出现需要使用它的情况,使用它并喜欢它 - 并且为那些没有这个强大工具的过去那些可怜的程序员提供思想.

  • 如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它可能就是我. (3认同)
  • 我喜欢这是你最热烈的答案.多么合适...... (2认同)