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
中的验证是否声明为只读?