使用新的动态关键字作为替换开关语句是一个坏主意吗?

WeN*_*ers 8 c#-4.0

我喜欢新的Dynamic关键字并读取它可以用作替换访问者模式.

它使代码更具声明性,我更喜欢.

尽管用实现动态调度的类替换'Type'上的所有switch开关实例是一个好主意.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

这真的取决于你认为什么是"好主意".

这是有效的,它以相当优雅的方式工作.它对其他方法有一些优点和一些缺点.

在优势方面:

  1. 它简洁,易于扩展
  2. 代码非常简单

对于缺点:

  1. 错误检查可能比传统的访问者实现更困难,因为所有错误检查必须在运行时完成.例如,如果你通过visitorTest.DynamicVisit(4.2);,你将在运行时获得异常,但没有编译时间投诉.
  2. 代码可能不那么明显,并且具有更高的维护成本.

就个人而言,我认为这是一种合理的方法.在典型的实现中,访问者模式具有相当高的维护成本并且通常难以干净地测试.这可能会使成本略高,但使实施更加简单.

通过良好的错误检查,我在使用动态作为方法时没有问题.就个人而言,我可能会使用这样的方法,因为以合理的方式执行的替代方案会变得非常讨厌.

但是,我会在这里做一些改变.首先,正如我所提到的,您确实需要包含错误检查.

其次,我实际上DynamicVisitdynamic直接采取行动,这可能会使(稍微)更明显地发生什么:

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
Run Code Online (Sandbox Code Playgroud)