Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用冗余代码契约先决条件_C#_.net_Code Contracts - Fatal编程技术网

C#使用冗余代码契约先决条件

C#使用冗余代码契约先决条件,c#,.net,code-contracts,C#,.net,Code Contracts,我没有通过阅读使用指南找到这些信息,因此我在这里提出了我的问题: 假设出现以下情况: /// <summary> /// Initalisiert eine neue Instanz des SettingsManager /// </summary> /// <param name="settingsRepo">Das SettingsRepository welches die Einstellungen enthält&l

我没有通过阅读使用指南找到这些信息,因此我在这里提出了我的问题: 假设出现以下情况:

    /// <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");
        .
        .
        .
    }
//
///设置管理器的初始实例
/// 
///这是一个非常重要的问题
公共设置管理器(ISettingsRepository settingsRepo)
{
Contract.Requires(settingsRepo!=null,“参数settingsRepo不能为null”);
_settingsRepo=settingsRepo;
}
/// 
///艾斯泰伦根酒店
/// 
公共空荷载()
{
Contract.Requires(_settingsRepo!=null,“存储库不能为null”);
.
.
.
}

其中
\u setingsrepo
是类
setingsmanager
的全局私有字段。在构造函数中,我定义了先决条件,即参数
setingsrepo
不为空。因此,当
settingsRepo
等于
null
时,会引发异常。但是方法
Load()
使用字段
\u settingsRepo
,该字段在实例化过程中肯定不是
null
。但是,我不知道当使用
Load()
时,
\u setingsrepo
是否等于
null
,我在方法
Load()
中定义的前提条件是否被认为是多余的,或者我应该休息一下。

尽管没有向方法传递参数,但值得一提的是,一般规则是验证公共方法的参数

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

如果由于方法声明为公共或受保护而无法从未知程序集调用该方法,则应验证该方法的所有参数。如果该方法设计为仅由已知程序集调用,则应将该方法设置为内部,并将InternalsVisibleToAttribute属性应用于包含该方法的程序集

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

但是,由于您已经在另一个位置验证了
\u setingsrepo
,这对于
加载
功能的存在至关重要,因此您可以忽略验证。但这可能会在发布时触发警告,我的建议是在发布代码之前运行代码分析


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

总结:您已验证了
\u settings repo
在任务表中不为空,因此无需在
Load'
方法中再次验证


这是一本非常好的书,我建议您阅读。

Load
是一种实例方法。如果
settingsRepo
为空,则会在任务中引发异常,因此不会创建该对象。您可以删除
Load
中的验证是否声明为
只读