if 语句,&& 运算符逻辑(编写此类技巧的重要性是什么?)
if statement , && operators logic ( What is the importance of coding such trick ? )
public List<Product> SetProducts { get; set; }
public string ParentSetId { get; set; }
第一个案例:
if (SetProducts.Any(p => p.blabla== Enum.blabla) && string.IsNullOrEmpty(ParentSetId))
第二种情况:
if (string.IsNullOrEmpty(ParentSetId) && SetProducts.Any(p => p.blabla== Enum.blabla))
&& 运算符从左到右工作,因此 if 语句在每种情况下的行为都不同。
我们知道如果语句将在左条件之前检查然后如果结果 "true" 查找右语句。
第二种情况更有用。
它们的优点是什么?
编写这种技巧的重要性是什么?
谢谢
&&
会做一个短路评估,所以如果第一个条件为假,就不需要检查第二个条件。
考虑到这一点,您的第二个代码片段看起来更好,因为 string.IsNullOrEmpty(ParentSetId)
的比较可能 比通过项目列表并使用 [=12 检查更便宜=].
这个技巧很重要,即如果一个条件不满足则不应检查另一个条件。
例如:
if (node != null && node.data != key) {
...
}
如果我们交换了两个条件(即 node.data != key
首先被检查),那么我们就有取消引用空指针的风险。但是,如所写,我们在尝试取消引用之前确保 node
是 而不是 空指针。
您指的是短路布尔求值。
他们经常被用作守卫,如
if (someObject != null && someOperationInvolvingSomeObject)
从而防止在 someObject
为 null 的情况下出现异常。
它们有时也可用于重新排列逻辑以获得更好的性能,例如来自
if (slowMethod() || fastMethod())
到
if (fastMethod() || slowMethod())
public List<Product> SetProducts { get; set; }
public string ParentSetId { get; set; }
第一个案例:
if (SetProducts.Any(p => p.blabla== Enum.blabla) && string.IsNullOrEmpty(ParentSetId))
第二种情况:
if (string.IsNullOrEmpty(ParentSetId) && SetProducts.Any(p => p.blabla== Enum.blabla))
&& 运算符从左到右工作,因此 if 语句在每种情况下的行为都不同。 我们知道如果语句将在左条件之前检查然后如果结果 "true" 查找右语句。
第二种情况更有用。
它们的优点是什么?
编写这种技巧的重要性是什么?
谢谢
&&
会做一个短路评估,所以如果第一个条件为假,就不需要检查第二个条件。
考虑到这一点,您的第二个代码片段看起来更好,因为 string.IsNullOrEmpty(ParentSetId)
的比较可能 比通过项目列表并使用 [=12 检查更便宜=].
这个技巧很重要,即如果一个条件不满足则不应检查另一个条件。
例如:
if (node != null && node.data != key) {
...
}
如果我们交换了两个条件(即 node.data != key
首先被检查),那么我们就有取消引用空指针的风险。但是,如所写,我们在尝试取消引用之前确保 node
是 而不是 空指针。
您指的是短路布尔求值。
他们经常被用作守卫,如
if (someObject != null && someOperationInvolvingSomeObject)
从而防止在 someObject
为 null 的情况下出现异常。
它们有时也可用于重新排列逻辑以获得更好的性能,例如来自
if (slowMethod() || fastMethod())
到
if (fastMethod() || slowMethod())