【发布时间】:2021-01-21 03:27:13
【问题描述】:
我有以下 code 方法,该方法旨在检查用户在两小时内登录的最大尝试次数(例如 10 次)无效后是否被暂时阻止。
public MyError ValidationMethod(MyObject myObject) {
int maxMaximumAttempts = 10;
if (myObject.Attempts >= maximumAttempts && myObject.LastAttempt.Value.AddHours(2)) < DateTime.Now)
return new MyError();
return null;
}
“Attempts”和“LastAttempt”这两个 DateTime 字段都可以为空,那么设置此 if 语句的格式以确保不会出现空引用异常的正确方法是什么?
任何一个字段都为 Null,应该与 if 语句返回 false 的结果相同,即他们之前没有尝试登录。然后我将从方法本身返回 null,这表示输入没有发现错误。
我认为字段为空会使整个语句为假,但我得到一个空引用异常,谁能解释一下为什么?
编辑:我添加了完整的方法以使上下文更清晰。
【问题讨论】:
-
如果任一值为为空,你希望发生什么?
-
做相反的
myObject.LastAttempt < DateTime.Now.AddHours(-2)。如果LastAttempt为空,这将失败。你必须决定如果要做什么。LastAttempt实际上是 null -
在这种情况下为 Null 意味着他们之前没有登录失败,因此与代码返回 false 的结果相同。此代码位于验证方法中,因此如果检查为假,我将返回 null。
-
然后使用
myObject.LastAttempt < DateTime.Now.AddHours(-2) -
不使用可为空的类型,而是使用普通的 DateTime,但对未初始化的情况使用 DateTime.Max 或 DateTime.Min 值。那么你就不用担心 null 了。
标签: c#