【问题标题】:will a nullable bit field return false when NULL当 NULL 时,可空位字段是否会返回 false
【发布时间】:2015-02-18 21:19:02
【问题描述】:

我有一个可以为空的位类型的 DBIsValid 列。

我有一个 bool 类型的变量 IsValid,如果 DBIsvalid 为 True,我想将其设置为 True。如果我下面的代码行可以正常工作,还是应该检查 NULL。

bool IsValid = this.DBIsValid.Value

如果 DBIsValid 在 DB 中为 NULL,基本上会返回 false 吗?

【问题讨论】:

  • 您还没有提到如何从数据库中选择值。问题不清楚。 什么到底是DBIsValid?

标签: c# sql-server


【解决方案1】:

你应该使用HasValue属性,如果值为null,访问.Value会抛出异常。

另一种更安全的获取价值的方法是使用GetValueOrDefault

bool IsValid = this.DBIsValid.GetValueOrDefault();

【讨论】:

  • 如果我想在 Null bool IsValid = this.DBIsValid == true 时返回 false 是否可行;
  • 是的。 bool 的默认值为false,因此如果值为空,GetValueOrDefault 将返回false。您还可以使用其他重载指定默认值,例如:this.DBIsValid.GetValueOrDefault(false),但在这种情况下没有必要。
【解决方案2】:

如果它可以为空,您将收到一个null(既不是真也不是假)。

当引用任何类型的Nullable<T> 时,您应该检查HasValue。或者,如果您在有空值时有所需的值,则可以使用GetValueOrDefault。

// Value coming from database
Boolean? db_IsValid = null;

// Option 1:
// Check for null
Boolean IsValid = db_IsValue.HasValue ? db_IsNull.Value : false;

// Option 2:
// Using GetValueOrDefault
Boolean IsValid = db_IsValid.GetValueOrDefault(/*optional: false*/);
// note above, without parameter, returns default(Boolean)

// Option 3:
// Syntactical sugar (producing same output as Option 1 or 2)
Boolean IsValid = IsValid ?? false;

【讨论】:

  • 如果我想在 Null bool IsValid = this.DBIsValid == true 时返回 false 是否可行;
  • 是的。如果DBIsValid = null,则比较DBIsValid == true 的结果是false。
【解决方案3】:

不,它有三种状态:true、false 和null、null 表示没有值。

如果您在this.DBIsValid 为null 时访问this.DBIsValid.Value,则会引发异常。

如果您想赋予null 值false 的含义,您必须测试以下任何一项:

bool IsValid = this.DBIsValid ??  false; // commom pattern for a default
bool IsValid = this.DBIsValid.GetValueOrDefault(); // works because false is the default value for booleans
bool IsValid = this.DBIsValid.HasValue && this.DBIsValid.Value; // interprets no value as false

【讨论】:

    【解决方案4】:

    使用空合并运算符 ??如下图

    bool IsValid = this.DBIsValid ?? false
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 2011-12-19
      • 2011-10-22
      相关资源
      最近更新 更多