📜  C#|可空类型

📅  最后修改于: 2021-05-29 21:00:39             🧑  作者: Mango

在C#中,编译器不允许您为变量分配空值。因此, C#2.0提供了一种特殊功能,可以为被称为Nullable类型的变量分配空值。 Nullable类型允许您为变量分配空值。 C#2.0中引入的可空类型只能与值类型一起使用,而不能与引用类型一起使用。

Reference Type的可空类型将在2019年的C#8.0中引入,以便我们可以显式定义引用类型是否可以容纳null值。这帮助我们在不使用条件的情况下解决了NullReferenceException的问题。在本文中,讨论围绕值类型的可空类型展开。

Nullable类型是System.Nullable struct的一个实例。这里T是一个包含不可空值类型的类型,例如整数类型,浮点类型,布尔类型等。例如,在整数类型的可空值中,您可以存储-2147483648到2147483647或空值。

句法:

Nullable variable_name = null;

或者您也可以使用包含以下内容的快捷方式?数据类型的运算符。

datatype? variable_name = null;

例子:

// this will give compile time error
int j = null;           

// Valid declaration
Nullable j = null;   

// Valid declaration
int? j = null;           

如何访问Nullable类型变量的值?
您不能直接访问Nullable类型的值。如果原始分配的值不为null,则必须使用GetValueOrDefault()方法来获取它。如果为空,则将获得默认值。 null的默认值为零。

例子:

C#
// C# program to illustrate Nullable Types
using System;
 
class Geeks {
 
    // Main Method
    static void Main(string[] args)
    {
         
        // defining Nullable type
        Nullable n = null;
 
        // using the method
        // output will be 0 as default
        // value of null is 0
        Console.WriteLine(n.GetValueOrDefault());
         
        // defining Nullable type
        int? n1 = null;
 
        // using the method
        // output will be 0 as default
        // value of null is 0
        Console.WriteLine(n1.GetValueOrDefault());
         
          
        // using Nullable type syntax
        // to define non-nullable
        int? n2 = 47;
 
        // using the method
        Console.WriteLine(n2.GetValueOrDefault());
         
        // using Nullable type syntax
        // to define non-nullable
        Nullable n3 = 457;
 
        // using the method
        Console.WriteLine(n3.GetValueOrDefault());
         
    }
     
}


C#
// C# program to illustrate the
// use of Nullable type
using System;
 
class GFG {
 
    // Main Method
    static public void Main()
    {
 
        // a is nullable type
        // and contains null value
        int ? a = null;
 
        // b is nullable type int
        // and behave as a normal int
        int ? b = 2345;
 
        // this will not print
        // anything on console
        Console.WriteLine(a);
         
        // gives 2345 as output
        Console.WriteLine(b);
    }
}


C#
// C# program to illustrate the
// use of Nullable.Hasvalue
using System;
 
class GFG {
 
    // Main Method
    static void Main()
    {
         
        // a is nullable type
        // and contains null value
        Nullable a = null;
 
        // check the value of object
        Console.WriteLine(a.HasValue);
         
        // b is nullable type
        // and contains a value
        Nullable b = 7;
 
        // check the value of object
        Console.WriteLine(b.HasValue);
 
    }
}


C#
// C# program to illustrate the
// use of  null-coalescing operator(??)
using System;
 
class GFG {
     
    // Main Method
    static public void Main()
    {
         
        // a is nullable type
        // and contains null value
        int ? a = null;
         
         
        // it means if a is null
        // then assign 3 to b
        int b = a ?? 3;
         
        // It will print 3
        Console.WriteLine(b);
    }
}


输出:

0
0
47
457

可空类型的特征

  • 借助可为空的类型,您可以为变量分配一个空值,而无需基于引用类型创建可为空的类型。
  • 在可为空的类型中,您还可以将值分配给可为空的类型。如下例所示。

例子:

C#

// C# program to illustrate the
// use of Nullable type
using System;
 
class GFG {
 
    // Main Method
    static public void Main()
    {
 
        // a is nullable type
        // and contains null value
        int ? a = null;
 
        // b is nullable type int
        // and behave as a normal int
        int ? b = 2345;
 
        // this will not print
        // anything on console
        Console.WriteLine(a);
         
        // gives 2345 as output
        Console.WriteLine(b);
    }
}

输出:

2345

  • 您可以使用Nullable.HasValueNullable.Value来检查该值。如果为对象分配了值,则它将返回“ True”,如果将对象分配为null,则将返回“ False”。如果该对象未分配任何值,则将给出编译时错误。

例子:

C#

// C# program to illustrate the
// use of Nullable.Hasvalue
using System;
 
class GFG {
 
    // Main Method
    static void Main()
    {
         
        // a is nullable type
        // and contains null value
        Nullable a = null;
 
        // check the value of object
        Console.WriteLine(a.HasValue);
         
        // b is nullable type
        // and contains a value
        Nullable b = 7;
 
        // check the value of object
        Console.WriteLine(b.HasValue);
 
    }
}

输出:

False
True

  • 您也可以使用==和!可空类型的运算符。
  • 如果可空类型的值为null,则也可以使用GetValueOrDefault(T)方法获取分配的值或提供的默认值。
  • 您还可以使用空合并运算符(??)为源自可空类型的值的基础类型分配值。

例子:

C#

// C# program to illustrate the
// use of  null-coalescing operator(??)
using System;
 
class GFG {
     
    // Main Method
    static public void Main()
    {
         
        // a is nullable type
        // and contains null value
        int ? a = null;
         
         
        // it means if a is null
        // then assign 3 to b
        int b = a ?? 3;
         
        // It will print 3
        Console.WriteLine(b);
    }
}

输出:

3

  • 可空类型不支持嵌套的可空类型。
  • 可空类型不支持var类型。如果将Nullable与var一起使用,则编译器将给您一个编译时错误。

可空类型的优点:

  • 可空类型的主要用途是在数据库应用程序中。假设在表中的一列中需要空值,那么您可以使用可空类型输入空值。
  • 可空类型对于表示未定义的值也很有用。
  • 您还可以使用Nullable类型而不是引用类型来存储null值。