猿教程 Logo

C# 可空类型Nullable

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

正如你所知,值类型不能被赋值为null值。 例如,int i = null会给你一个编译时错误。

C#2.0引入了可空类型,允许您将值分配给值类型变量。 您可以使用Nullable <t>声明可空类型,其中T是类型。

相关实例:

Nullable<int> i = null;

可空类型可以表示其基础值类型的值的正确范围,以及附加的空值。 例如,Nullable <int>可以分配从-2147483648到2147483647的任何值,或者为空值。

Nullable类型是System.Nullable <T> struct的实例。 认为它像下面的结构。

[Serializable]
public struct Nullable<T> where T : struct
{        
    public bool HasValue { get; }
      
    public T Value { get; }
        
    // other implementation
}

类型int的可空类型与普通int加上一个标志相同,该标志说明int是否具有值(为空或不为空)。 所有其余的是将“null”视为有效值的编译器魔术。

相关实例:

static void Main(string[] args)
{
    Nullable<int> i = null;

    if (i.HasValue)
        Console.WriteLine(i.Value); // or Console.WriteLine(i)
    else
        Console.WriteLine("Null");
}

运行结果:

Null

如果对象已经分配了一个值,HasValue返回true; 如果它没有被分配任何值或者已经被分配一个空值,它将返回false。

如果可空类型为null或未分配任何值,则使用NullableType.value访问值将抛出运行时异常。 例如,如果i为null,i.Value将抛出异常:


使用GetValueOrDefault()方法获取一个实际的值,如果它不为null将获得实际的值,如果它为null将获得一个默认值。 例如:

相关实例:

static void Main(string[] args)
{
    Nullable<int> i = null;

    Console.WriteLine(i.GetValueOrDefault()); 
}

Nullable类型的简写语法:

你可以使用'?' 操作符缩写语法例如 int?,long? 而不是使用Nullable <T>。

相关实例:

int? i = null;
double? D = null;

?? 操作符:

使用 '??' 运算符将可空类型分配给不可为空的类型。

相关实例:

int? i = null;
            
int j = i ?? 0;

Console.WriteLine(j);

运行结果:

0

在上面的例子中,i是一个可空的整数,如果你将它赋值给非空的int j,那么如果i为null,它将抛出一个运行时异常。 所以为了减少异常的风险,我们使用了'??' 运算符指定如果i为null,则将0赋给j。

作业规则:

可空类型具有与值类型相同的分配规则。 如果在函数中将可空类型声明为局部变量,则必须在使用它之前为其分配一个值。 如果它是任何类的字段,那么它将默认为null值。

例如,以下可以声明和使用int类型的可空值,而不分配任何值。 编译器会给出“使用未分配的局部变量'i'”错误:


在以下示例中,int类型的可空值是类的字段,因此不会给出任何错误。

相关实例:

class MyClass
{
    public Nullable<int> i;
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mycls = new MyClass();

        if(mycls.i == null)
            Console.WriteLine("Null");
    }
}

运行结果:

Null

静态Nullable帮助类:

Null被认为小于任何值。 因此比较运算符不会对null工作。 考虑下面的例子,其中i既不小于j,大于j也不等于j:

相关实例:

static void Main(string[] args)
{
    int? i = null;
    int j = 10;


    if (i < j)
        Console.WriteLine("i < j");
    else if( i > 10)
        Console.WriteLine("i > j");
    else if( i == 10)
        Console.WriteLine("i == j");
    else
        Console.WriteLine("Could not compare");
}

运行结果:

Could not compare

可空静态类是Nullable类型的辅助类。 它提供了一个比较方法来比较可空类型。 它还有一个GetUnderlyingType方法,返回可空类型的基础类型参数。

相关实例:

static void Main(string[] args)
{
    int? i = null;
    int j = 10;

    if (Nullable.Compare<int>(i, j) < 0)
        Console.WriteLine("i < j");
    else if (Nullable.Compare<int>(i, j) > 0)
        Console.WriteLine("i > j");
    else
        Console.WriteLine("i = j");

}

运行结果:

i < j

可空类型的特性:

  1. 可空类型只能与值类型一起使用。

  2. 如果值为null,则Value属性将抛出一个InvalidOperationException异常; 否则将返回值。

  3. 如果变量包含值,HasValue属性返回true,如果该值为null,则返回false。

  4. 你只能使用具有可空类型的==和!=运算符。 对于其他比较使用Nullable静态类。

  5. 不允许嵌套可为空的类型。 Nullable <Nullable <int >> i; 会给出编译时错误。

要点
注意事项:Nullable <T>类型允许将null值分配给值类型。 ? operator是Nullable类型的简写语法。 使用value属性获取可为nullable类型的值。 使用HasValue属性来检查值是否分配给可空类型。 静态Nullable类是一个帮助类来比较可空类型。

有关Nullable <T>结构的更多信息,请访问MSDN

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/csharp-nullable.html