2015-07-19 55 views
1

我没有通过阅读使用指南找到信息,所以我在这里问我的问题: 假设下面的情况:冗余代码合同,前提条件的C#使用

/// <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不为空。因此,当settingsRepo等于null时,会引发异常。但方法Load()使用在实例化期间确定不是null的字段_settingsRepo。但是,我不知道_settingsRepo目前是否等于null,当使用Load()时,我在方法Load()中定义的前提条件被认为是多余的,或者我应该将其搁置。

+1

Load是一种实例方法。如果'settingsRepo'为空,则在C'tor中抛出异常,因此该对象未创建。你可以在'Load'中删除验证。 –

+0

'_settingsRepo'声明为'readonly'吗? –

回答

2

正如我在这个问题的评论提到前运行代码分析。您可以从Load方法中删除验证。 您使用的图案称为Constructor Injection。 C'tor注入背后的想法是你正在创建的对象需要一个依赖关系,如果你不提供依赖关系,就没有任何默认/替代行为。在你的情况下,似乎恰恰是这种情况。

综述:您验证_settingsRepo不在C'tor空,因此你不需要在Load'方法再次进行验证。

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

0

尽管您没有传递给该方法的参数,但值得一提的是一般规则是验证公用方法的参数。

所有传递给外部可见方法的引用参数都应该根据null进行检查。如果合适,请在参数为null时引发ArgumentNullException。

如果一个方法可以从未知程序集中调用,因为它被声明为public或protected,那么应该验证该方法的所有参数。如果方法设计为仅由已知程序集调用,则应使该方法内部化并将InternalsVisibleToAttribute属性应用于包含该方法的程序集。

这正好代码分析下:CA1062:验证的公共方法

论点,但既然你已经在不同的地方,是必不可少的验证_settingsRepoLoad功能是存在的,那么你可以省略验证。但是,这可能会释放后触发警告,我的建议是释放码

Read more