.NET 4.0 中的新“动态”变量类型是不是解决了 CLR 中的单/多方法分派问题?
Posted
技术标签:
【中文标题】.NET 4.0 中的新“动态”变量类型是不是解决了 CLR 中的单/多方法分派问题?【英文标题】:Does new 'dynamic' variable type in .NET 4.0 solve the single/multiple method dispatch issue in CLR?.NET 4.0 中的新“动态”变量类型是否解决了 CLR 中的单/多方法分派问题? 【发布时间】:2011-02-14 16:51:15 【问题描述】:单次分派问题对于使用 Java 和 C# 等静态类型语言进行编码的人来说最为熟悉。基本思路是:
而运行时多态性允许我们根据receiver
的类型(运行时类型)调度到正确的方法调用,例如:
IAnimal mything = new Cat();
mything.chop();
方法调用会根据mything
的运行时类型进行,即Cat
。
这是单一的分派能力(在 Java/C# 中存在)。
现在,如果您不仅需要在接收器的运行时类型上进行分派,而且还需要在(多个)参数的类型上进行分派,那么您将面临一个小问题:
public class MyAcceptor
public void accept (IVisitor vst) ...
public void accept (EnhancedConcreteVisitor vst) ...
第二个方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过它们共同的超类型或接口来处理不同类型的对象(在我的示例中为访问者)。
这就是我问的原因——因为动态类型允许多重分派多态性,而 C# 4.0 具有动态关键字;)
【问题讨论】:
什么是单/多方法调度问题? 我会用***链接更新我的问题) 呵呵,这个问题那个是不是很蠢?或者我只是想念什么? 我没有对你投反对票,但你的问题可以改进。你指的是什么问题?你能举个例子吗?你似乎对它有一些熟悉/历史;假设我们没有。 我现在补充一个简短的解释.. 【参考方案1】:是的,动态类型允许多次分派 - 不,您不必创建自己的动态对象来执行此操作。
假设我们想自己实现Enumerable.Count()
,并且我们不想在我们的代码中加载“if (source is IList)
”测试。我们可以这样写:
public static class Enumerable
public static int Count<T>(this IEnumerable<T> source)
dynamic d = source;
return CountImpl(d);
private static int CountImpl<T>(ICollection<T> collection)
return collection.Count;
private static int CountImpl(ICollection collection)
return collection.Count;
private static int CountImpl<T>(string text)
return text.Length;
private static int CountImpl<T>(IEnumerable<T> source)
// Fallback
int count = 0;
foreach (T t in source)
count++;
return count;
我并不是说这是一个好主意,但这就是它的工作原理:)
请注意,您需要注意不要引入可能最终导致对某些类型的模糊调用的情况。使用类作为参数这不是问题,但考虑到单个类可以实现多个接口。
【讨论】:
至少是dynamic
的一个很好的例子。
是的!这就是我所追求的)非常感谢您的解释和一点 O_o 看到 Jon Skeet 回答我的问题 :)【参考方案2】:
是的,您可以创建执行任意复杂调度的 DLR 类型。查看http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx
【讨论】:
以上是关于.NET 4.0 中的新“动态”变量类型是不是解决了 CLR 中的单/多方法分派问题?的主要内容,如果未能解决你的问题,请参考以下文章