我没有通过阅读使用指南找到信息,所以我在这里问我的问题: 假设有以下情况:
/// <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()
中定义的前置条件被认为是多余的,或者我应该休息一下。
答案 0 :(得分:2)
正如我在问题评论中提到的那样。您可以从Load
方法中删除验证。
您使用的模式称为Constructor Injection
。 C'tor注入背后的想法是您尝试创建的对象需要依赖项,如果您不提供依赖项,则没有任何默认/替代行为。在你的情况下,它似乎正是这种情况。
摘要:您验证了_settingsRepo
在C'tor中不为空,因此您无需在Load'
方法中再次验证它。
答案 1 :(得分:0)
虽然你没有传递给方法的参数,但值得一提的是,一般规则是验证公共方法的参数。
应该针对null检查传递给外部可见方法的所有引用参数。如果合适,当参数为null时抛出ArgumentNullException。
如果可以从未知程序集调用方法,因为它被声明为public或protected,则应验证该方法的所有参数。如果该方法只能由已知程序集调用,则应将该方法设置为internal,并将InternalsVisibleToAttribute属性应用于包含该方法的程序集。
这取决于代码分析: CA1062:验证公共方法的参数
但是,由于您已经在_settingsRepo
函数存在的不同位置验证了Load
,因此您可以省略验证。但这可能会在发布时触发警告,我的建议是在发布代码之前运行代码分析