代码之家  ›  专栏  ›  技术社区  ›  WeNeedAnswers

使用newdynamic关键字作为替换switch语句是个坏主意吗?

  •  8
  • WeNeedAnswers  · 技术社区  · 15 年前

    我喜欢新的Dynamic关键字,并认为它可以用作替换访问者模式。

    它使代码更具声明性,我更喜欢这样。

    class VistorTest
    {
        public string DynamicVisit(dynamic obj)
        {
            return Visit(obj);
        }
    
    
        private string Visit(string str)
        {
            return "a string was called with value " + str;
        }
    
    
        private string Visit(int value)
        {
            return "an int was called with value " + value;
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Reed Copsey    15 年前

    这取决于你认为什么是“好主意”。

    这是可行的,而且它以一种相当优雅的方式工作。与其他方法相比,它有一些优点,也有一些缺点。

    优势方面:

    1. 它简洁,易于扩展

    对于缺点:

    1. 错误检查可能比经典的访问者实现更困难,因为所有的错误检查都必须在运行时完成。例如,如果你通过 visitorTest.DynamicVisit(4.2); ,您将在运行时得到一个异常,但没有编译时投诉。
    2. 代码可能不太明显,并且维护成本较高。

    我个人认为这是一个合理的方法。在一个经典的实现中,visitor模式具有相当高的维护成本,并且通常很难进行干净的测试。这可能使成本稍高,但使实现更简单。

    不过,我想在这里做一些改变。首先,正如我提到的,您确实需要包含错误检查。

    第二,我会 DynamicVisit dynamic

    class VistorTest
    {
        public string DynamicVisit(dynamic obj)
        {
            try
            {
                return Visit(obj);
            }
            catch (RuntimeBinderException e)
            {
                // Handle the exception here!
                Console.WriteLine("Invalid type specified");
            }
            return string.Empty;
        }
    
         // ...Rest of code
    
        2
  •  2
  •   Greg Beech    15 年前

    visitor模式的存在主要是为了解决某些语言不允许的问题 double dispatch multiple dispatch

    多分派(Multiple dispatch)或multimethods是一些面向对象编程语言的特性,在这些语言中,函数或方法可以基于其多个参数的运行时(dynamic)类型进行动态分派。这是单一分派多态性的扩展,其中方法调用根据对象的实际派生类型动态分派。多重分派将动态分派推广到处理两个或多个对象的组合。

    在第4版之前,C#是这些语言中的一种。随着 dynamic

    你根本没有改变类型安全,因为即使是 switch (或者更可能是dispatch dictionary,因为C#不允许打开类型)必须有一个 default