如何强制等于 return false 而不是 Null 引用异常?
Any way how to force Equals to return false instead of Null reference exception?
我 运行 进入空引用异常行:
dr["IsSandpit"] = p.MineralName.Equals("Sand");
当然,解决方法是:
dr["IsSandpit"] = p.MineralName!=null && p.MineralName.Equals("Sand");
但我想知道是否可以将可空类型配置为 Equals 方法而不是抛出 null 引用异常而只是 return false
强类型变量?或者某种方法NotNullAndEquals
?
数据库中的 Null 表示类似于 "not filled" 或空并且 "empty" 肯定不等于 "Sand"。 (也许这是重复的,但我没有找到正确的问题)
您可以对两个操作数调用静态 Equals
方法:
var isEqual = string.Equals("Sand", p.MineralName); // return false for null.
这将消除访问可能为空的引用的需要。
或者,如果值为 null,您可以使用 null 传播运算符来避免该操作:
var isEqual = p.MineralName?.Equals("Sand"); // return null for null.
IMO,这些方法比使用扩展方法将理论上可以在空引用上调用的方法组合在一起要好得多,因为这种方法会导致混淆是否可以在不检查空引用的情况下安全地调用方法.想象一下这段代码:
if (!p.MineralName.Equals("Sand"))
{
return p.MineralName.ToUpper(); // throws NullReferencException!
}
表达式
p.MineralName?.Equals("Sand")
如果 p.MineralName
为空, 将计算为 null
。然后您可以将其合并为 false,如下所示:
p.MineralName?.Equals("Sand") ?? false
作为一个选项,您可以使用 self-created NotNullAndEquals 扩展方法:
public static class Utilities {
public static bool NotNullAndEquals(this string value, string expected) {
return value != null && value.Equals(expected);
}
}
我 运行 进入空引用异常行:
dr["IsSandpit"] = p.MineralName.Equals("Sand");
当然,解决方法是:
dr["IsSandpit"] = p.MineralName!=null && p.MineralName.Equals("Sand");
但我想知道是否可以将可空类型配置为 Equals 方法而不是抛出 null 引用异常而只是 return false
强类型变量?或者某种方法NotNullAndEquals
?
数据库中的 Null 表示类似于 "not filled" 或空并且 "empty" 肯定不等于 "Sand"。 (也许这是重复的,但我没有找到正确的问题)
您可以对两个操作数调用静态 Equals
方法:
var isEqual = string.Equals("Sand", p.MineralName); // return false for null.
这将消除访问可能为空的引用的需要。 或者,如果值为 null,您可以使用 null 传播运算符来避免该操作:
var isEqual = p.MineralName?.Equals("Sand"); // return null for null.
IMO,这些方法比使用扩展方法将理论上可以在空引用上调用的方法组合在一起要好得多,因为这种方法会导致混淆是否可以在不检查空引用的情况下安全地调用方法.想象一下这段代码:
if (!p.MineralName.Equals("Sand"))
{
return p.MineralName.ToUpper(); // throws NullReferencException!
}
表达式
p.MineralName?.Equals("Sand")
如果 p.MineralName
为空, 将计算为 null
。然后您可以将其合并为 false,如下所示:
p.MineralName?.Equals("Sand") ?? false
作为一个选项,您可以使用 self-created NotNullAndEquals 扩展方法:
public static class Utilities {
public static bool NotNullAndEquals(this string value, string expected) {
return value != null && value.Equals(expected);
}
}