什么是布尔?返回类型意味着什

时间:2011-02-21 10:28:11

标签: c# .net

我看到一个方法返回bool?,有人知道它的含义吗?

3 个答案:

答案 0 :(得分:25)

T?Nullable<T>的C#语法快捷方式。因此bool?映射到Nullable<bool>。所以在你的情况下,它是一个nullbool值的结构。

如果Nullable<T>null,则与引用类型为空有点不同。它基本上是一个包含底层类型和布尔标志HasValue的结构。但是运行时和C#语言都有点神奇,假装Nullable HasValue==false真的是空的。但有时候差异仍然存在。

底层类型可隐式转换为可空类型(bool - &gt; bool?)。要从可空类型中获取基础类型,您可以显式转换((bool)myNullableBool或使用Value属性(myNullableBool.Value)。但是,您之前应该检查null,如果可空值为null,您将获得异常。

答案 1 :(得分:12)

在C#中,“原始”类型不能包含空值:

int blah = null;

这会产生异常,因为'int'不能保存空值。

与double,float,bool,DateTime相同......

真的很好。使用数据库时会出现问题。在数据库中,您可以拥有可以为null的行,例如Age(即int)。

如何在对象上保留该行?你的int不能保存null值,行可以为null。

由于这个原因,MS创建了一个新的结构,Nullable,你可以将一个“原始”类型(或结构)传递给该结构,使其成为可空的,如:

Nullable<int> blah = null;

现在,这个变量可以保存一个int和一个null。

因为Nullable太长了,MS创建了某种别名:如果你把'?'在类型之后,它变得可以为空:

int? blah = null;
Nullable<int> blah = null;

这两行完全相同,但第一行更容易阅读。

类似的东西:)

答案 2 :(得分:5)

?为后缀的任何(非废话 1 值类型使其成为可以为空的类型:

  • int?是一个可以为空的整数
  • bool?是可以为空的布尔值,它实际上是三态布尔truefalsenull) - 想想它你需要实现一些三重状态行为。
  • ...

换句话说,object类型不支持可空定义为object?,因为它是引用类型,并且可以具有null的值。

现实使用

Nullable类型最常用于数据库,因为它们可以很容易地转换为nullable int / bit / datetime / etc.列到CLR类型。就像在这个例子中一样:

create table Test
(
    Id int identity not null primary key,
    Days int null,
    ExactDate datetime null,
    Selected bit null
)

这很容易转换为POCO:

public class Test
{
    public int Id { get; set; }
    public int? Days { get; set; }
    public DateTime? ExactDate { get; set; }
    public bool? Selected { get; set; }
}
  

1 no-nonsense 是指除Nullable<T>之外的所有值类型,它本身就是一个值类型,但它在制作时没有任何意义它可以再次为空......避免这样的愚蠢...无论如何它都不会编译,因为Nullable<Nullable<int>> i = null;可以用两种方式解释:

     
    

i.HasValue == false
    •i.HasValue == true && i.Value.HasValue == false