首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLR4.0中新的“动态”变量类型是否解决了.NET中的单个/多个方法调度问题?

CLR4.0中新的“动态”变量类型是否解决了.NET中的单个/多个方法调度问题?
EN

Stack Overflow用户
提问于 2010-05-02 13:20:11
回答 2查看 1.2K关注 0票数 7

单一分派的问题对于使用静态类型语言(如Java和C# )编码的人来说最为熟悉。基本思想是:

而运行时多态性允许我们根据receiver的类型(运行时类型)分派到正确的方法调用,例如:

代码语言:javascript
复制
IAnimal mything = new Cat();
mything.chop();

方法调用将根据mything的运行时类型,即Cat来执行。这就是单一分派功能(它存在于Java/C#中)。

现在,如果您不仅需要调度接收器的运行时类型,而且还需要调度(多个)参数的类型,那么您将面临一个小问题:

代码语言:javascript
复制
public class MyAcceptor {  
    public void accept (IVisitor vst) {...}   
    public void accept (EnhancedConcreteVisitor vst) {...}  
}

第二个方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过通用的超类型或接口来处理不同类型的对象(在我的例子中是访问者)。

这就是我为什么这么问的原因--因为动态类型允许多分派多态性,而C# 4.0就有这个动态关键字;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-02 15:17:41

是的,动态类型允许多次分派--不,你不必创建自己的动态对象来做这件事。

假设我们想要自己实现Enumerable.Count(),并且我们不希望在代码中有大量的"if (source is IList)“测试。我们可以这样写:

代码语言:javascript
复制
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;
    }
}

我不是说这是个好主意,但这就是它的工作方式:)

请注意,您需要小心,不要引入可能以某些类型的不明确调用结束的情况。使用类作为参数不是问题,但是考虑到单个类可以实现多个接口。

票数 12
EN

Stack Overflow用户

发布于 2010-05-02 14:01:24

可以,您可以创建执行任意复杂调度的DLR类型。查看http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2752523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档