使用动态vs接口作为参数的C#构造函数

时间:2011-05-25 17:25:32

标签: dynamic c#-4.0 decoupling

为了在c#中创建干净的解耦代码,我希望得到一些关于使用动态参数来构造对象的反馈。通常我相信你会创建一个接口并使用接口作为合同,但是你必须为你所有的类创建接口,我觉得它们有点蹩脚......

所以,我的问题是做这样的事情有什么优点和缺点:

class Class1
{
    public string Description { get; set; }
    public string Name { get; set; }

    public Class1(dynamic obj)
    {
        Name = obj.Name;
        Description = obj.Description;
    }
}

VS

class Class1
{
    public string Description { get; set; }
    public string Name { get; set; }

    public Class1(IClass1 obj)
    {
        Name = obj.Name;
        Description = obj.Description;
    }
}

2 个答案:

答案 0 :(得分:7)

界面优点:

  • 编译器会告诉您是否使用了错误的参数
  • 构造函数的签名告诉您参数
  • 的要求

dynamic的优点:

  • 您无需声明界面或实施界面
  • 具有“名称”和“描述”属性的现有类可以使用而无需更改
  • 如果匿名类型具有名称和描述属性,则可以在同一程序集中使用

就我个人而言,我通常使用C#作为静态类型语言,除非我与自然动态的东西进行交互(例如我在其他地方使用反射,或者调用COM或DLR)...但我可以在某些内容中看到这可能是有用的。只是不要过度:)

答案 1 :(得分:1)

在两种情况下,方法按预期正常运行,传递给方法的对象必须具有Name和Description属性。

我担心的是使用动态的最佳实践,你需要提供额外的方法文档,以确保其他程序员甚至自己六个月后知道必须存在于对象上的预期数据协定传递,即使那时你真的应该在你的方法中写入错误处理,以确保它在合同被破坏时按预期运行。

所有这些潜在的重要性都不是假设没有编写接口的假设,在给出的示例中,只有5个基本代码行,这将会强制您自己手动完成所有操作。

假设您希望遵循最佳实践,从而获得记录良好且易于阅读的代码。我倾向于为此目的使用界面。