在条件expression式中检查可为空的bool的最佳方法(如果…)
我想知道什么是对可空布尔进行条件检查的最干净和可以理解的语法。
以下是好的还是坏的编码风格? 有没有办法更好地/更干净地expression条件?
bool? nullableBool = true; if (nullableBool ?? false) { ... } else { ... }
尤其是if(nullableBool false)部分。 我不喜欢if (x.HasValue && x.Value)
风格…
(不知道这个问题之前是否被问过…找不到与search类似的东西)
我觉得很多人都把注意力集中在这个值是可以为空的事实上,而不要去想他们真正想要的东西:)
bool? nullableBool = true; if (nullableBool == true) { ... } // true else { ... } // false or null
或者,如果你想要更多的select…
bool? nullableBool = true; if (nullableBool == true) { ... } // true else if (nullableBool == false) { ... } // false else { ... } // null
(nullableBool == true)
永远不会返回true,如果布尔? 是空的:P
如何使用GetValueOrDefault ,这是相当自我解释,并允许使用任何你想要的默认值:
if (nullableBool.GetValueOrDefault(false)) { }
你可能不喜欢,但我个人觉得
if (x.HasValue && x.Value)
最具可读性。 它清楚地表明你正在使用一个可为空的types,它清楚地表明你首先检查可空types是否有一个值,然后才有条件地执行。
如果你把你的版本,并用xreplacevariables也读取:
if (x ?? false)
这是否清楚? 是否显而易见x是一个可为空的types? 我会让你决定的。
如果你想把null
当作false,那么我会说最简洁的方法是使用null coalesce运算符( ??
),如你所描述的那样:
if (nullableBool ?? false) { ... }
使用扩展。
public static class NullableMixin { public static bool IsTrue(this System.Nullable<bool> val) { return val == true; } public static bool IsFalse(this System.Nullable<bool> val) { return val == false; } public static bool IsNull(this System.Nullable<bool> val) { return val == null; } public static bool IsNotNull(this System.Nullable<bool> val) { return val.HasValue; } } Nullable<bool> value = null; if(value.IsTrue()) { // do something with it }
让我们来看看如何定义与null的比较:
static void Main() { Console.WriteLine($"null != null => {null != null}"); Console.WriteLine($"null == null => {null == null}"); Console.WriteLine($"null != true => {null != true}"); Console.WriteLine($"null == true => {null == true}"); Console.WriteLine($"null != false => {null != false}"); Console.WriteLine($"null == false => {null == false}"); }
结果是:
null != null => False null == null => True null != true => True null == true => False null != false => True null == false => False
所以你可以安全地使用:
// check if null or false if (nullable != true) ... // check if null or true if (nullable != false) ... // check if true or false if (nullable != null) ...
想想布尔? 因为有3个值,那么事情变得更容易:
if (someNullableBool == true) // only if true if (someNullableBool == false) // only if false if (someNullableBool == null) // only if null
如果你只想testingnull
/ false
true
,我刚才用过的一个很好的是
bool? someCondition = null if (someCondition.Equals(true)) ...
我想它取决于你。 我当然认为.HasValue方法更具可读性,特别是对于开发人员不熟悉的情况。 句法。
可空布尔types的另外一点是它是三态的,所以当它只是空的时候,你可能想要做其他的事情,而不是默认为false。
给定枚举
public enum PublishMode { Edit, View }
你可以像这样做
void MyMethod(PublishMode? mode) { var publishMode = mode ?? PublishMode.Edit; //or if (mode?? PublishMode.Edit == someValue) .... }
如果您处于无法控制部分条件是否检查可为空的值的情况,则始终可以尝试以下操作:
if( someInt == 6 && someNullableBool == null ? false : (bool)someNullableBool){ //perform your actions if true }
我知道,把一个三元组置于if语句中并不是纯粹的方法,但它确实解决了这个问题。
当然,这是一种手动的方式来说GetValueOrDefault(false)