C#冗余代码合同使用前提条件

时间:2015-07-19 22:29:04

标签: c# .net code-contracts

我没有通过阅读使用指南找到信息,所以我在这里问我的问题: 假设有以下情况:

    /// <summary>
    /// Initalisiert eine neue Instanz des SettingsManager
    /// </summary>
    /// <param name="settingsRepo">Das SettingsRepository welches die Einstellungen enthält</param>
    public SettingsManager(ISettingsRepository settingsRepo)
    {
        Contract.Requires<ArgumentNullException>(settingsRepo != null, "The parameter settingsRepo cant be null");

        _settingsRepo = settingsRepo;
    }

    /// <summary>
    /// Lädt alle Einstellungen
    /// </summary>
    public void Load()
    {
        Contract.Requires<NullReferenceException>(_settingsRepo != null, "The repository cant be null");
        .
        .
        .
    }

其中_settingsRepo是类SettingsManager的全局私有字段。在构造函数中,我定义前提条件,参数settingsRepo不为null。因此,当settingsRepo等于null时,会抛出异常。但方法Load()使用的字段_settingsRepo在实例化期间绝对不是null 。但是,我不知道_settingsRepo目前是否等于null,当使用Load()时,我在方法Load()中定义的前置条件被认为是多余的,或者我应该休息一下。

2 个答案:

答案 0 :(得分:2)

正如我在问题评论中提到的那样。您可以从Load方法中删除验证。 您使用的模式称为Constructor Injection。 C'tor注入背后的想法是您尝试创建的对象需要依赖项,如果您不提供依赖项,则没有任何默认/替代行为。在你的情况下,它似乎正是这种情况。

摘要:您验证了_settingsRepo在C'tor中不为空,因此您无需在Load'方法中再次验证它。

This是一本非常好的关于DI的书,我建议你阅读它。

答案 1 :(得分:0)

虽然你没有传递给方法的参数,但值得一提的是,一般规则是验证公共方法的参数。

  

应该针对null检查传递给外部可见方法的所有引用参数。如果合适,当参数为null时抛出ArgumentNullException。

     

如果可以从未知程序集调用方法,因为它被声明为public或protected,则应验证该方法的所有参数。如果该方法只能由已知程序集调用,则应将该方法设置为internal,并将InternalsVisibleToAttribute属性应用于包含该方法的程序集。

这取决于代码分析: CA1062:验证公共方法的参数

但是,由于您已经在_settingsRepo函数存在的不同位置验证了Load,因此您可以省略验证。但这可能会在发布时触发警告,我的建议是在发布代码之前运行代码分析

Read more