什么是C#中的可空类型?

19
什么时候在C#.net中需要使用“可空”类型?能否举例解释一下。

http://www.c-sharpcorner.com/UploadFile/PashuSX/NullableTypes04282006114548AM/NullableTypes.aspx - Sirwan Afifi
4个回答

34

可空类型(何时使用可空类型)是可以取null值的值类型。它们的默认值是null,意味着你没有给它赋值。例如int、float、double、DateTime等都是值类型,它们有这些默认值。

int x = 0;
DateTime d = DateTime.MinValue;
float y = 0;

对于可空类型的替代方案,以上任何一种的默认值均为null。

int? x = null; //no value
DateTime? d = null; //no value

这使它们的行为类似于引用类型,例如对象、字符串。
string s = null;
object o = null;

当从数据库中获取到值时,如果这些值是NULL,那么可空类型非常有用。例如,假设您的数据库表中有一个可能为NULL的整数值,如果C#变量不可为空,则只能用0来表示。

还有一个例子,假设有一个EndDate列,在实际时间之前其值无法确定。虽然在数据库中可以将其设置为NULL,但您需要使用可空类型来在C#中存储它。

DateTime StartDate = DateTime.Today;
DateTime EndDate? = null; //we don't know yet

5
当我们在C#.net中使用可空类型时?
假设有一个整数变量id,表示特定的id。您可以存储1、44或任何其他值。但是如果您不知道id,您不能只存储-1或0。您可能会想要分配null,但通常无法将null分配给值类型。
int id=null;//error
Nullable type可以让你实现这一点。
int,double,char..等值类型无法表示为NULL值。
要在值类型中表示null,必须使用nullable type
它表示为值类型后面跟着?
例如:int? id=null; 这被翻译成:Nullable<int> id=new Nullable<int>(); 可空类型的默认值为null

1

来自: http://msdn.microsoft.com/zh-cn/library/1t3y8s4s(v=vs.80).aspx 可空类型是 System.Nullable 结构体的实例。可空类型可以表示其基础值类型的正常值范围,还包括一个额外的 null 值。例如,Nullable<Int32>(发音为“可空的 Int32”)可以被分配从 -2147483648 到 2147483647 的任何值,或者可以被分配为 null 值。Nullable<bool> 可以被分配为 true 或 false 值,也可以为 null。

class NullableExample
{
    static void Main()
    {
        int? num = null;
        if (num.HasValue == true)
        {
            System.Console.WriteLine("num = " + num.Value);
        }
        else
        {
            System.Console.WriteLine("num = Null");
        }

        //y is set to zero
        int y = num.GetValueOrDefault();

        // num.Value throws an InvalidOperationException if num.HasValue is false
        try
        {
            y = num.Value;
        }
        catch (System.InvalidOperationException e)
        {
            System.Console.WriteLine(e.Message);
        }
    }
}

1

我认为略有不准确,Nullable<T>是一种包装类型,允许值类型具有空值(或“可选”)语义。它不仅适用于基元类型,并且将null分配给可空类型实际上是语法糖。在引用意义上,nullNullable<T>并不真正为空。 - James Michael Hare
1
在将博客链接到SO之前,请先修复您在Blogspot上的语法。如果由于糟糕的语法而无法理解您的解释,那还有什么意义呢? - ragingasiancoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接