C# Nullable Class 和Nullable<T> Struct

Nullable Class 微软介绍:

Nullable Class

定义

命名空间:

System

Assemblies:

System.Runtime.dll, mscorlib.dll, netstandard.dll

支持可分配有 null 的值类型。 此类不能被继承。

[System.Runtime.InteropServices.ComVisible(true)]

public static class Nullable

继承:

Object->Nullable

属性:

ComVisibleAttribute

 

注解:

一种类型称为可为 null,如果它可以分配一个值,或者可以分配null,这意味着该类型有没有任何值。 默认情况下,所有的引用类型,如String,可以为 null,但所有值类型,如Int32,不是。

通过使用 C# 和 Visual Basic 中,在标记为可为 null 的值类型?后的值类型的表示法。 例如, int? C# 中或Integer?在 Visual Basic 中声明了整数值类型,可以分配null。

Nullable类提供了补充支持Nullable<T>结构。 Nullable类支持获取基础类型的为 null 的类型,并对其基础值类型可以为 null 的类型的比较和相等操作不支持泛型比较和相等运算。

 

装箱和取消装箱:

可以为 null 的类型进行装箱时,公共语言运行时自动框的基础值Nullable<T>对象,而不Nullable<T>对象本身。 也就是说,如果HasValue属性是true,内容Value属性进行装箱。 如果HasValue属性是false,null进行装箱。 未装箱可以为 null 的类型的基础值时,公共语言运行时创建一个新Nullable<T>结构初始化为基础的值。

 

方法 :

Compare<T>(Nullable<T>, Nullable<T>) 

比较两个 Nullable<T> 对象的相对值。

 

Equals<T>(Nullable<T>, Nullable<T>)     

指示所指定的两个 Nullable<T> 对象是否相等。

 

GetUnderlyingType(Type)   

返回指定可以为 null 的类型的基础类型参数。

Nullable<T> Struct 微软介绍:

Nullable<T> Struct

定义

命名空间:

System

Assemblies:

System.Runtime.dll, mscorlib.dll, netstandard.dll

表示可分配有 null 的值类型。

[Serializable]

public struct Nullable<T> where T : struct

类型参数

T

Nullable<T> 泛型类型的基础值类型。

继承

Object->ValueType->Nullable<T>

属性

SerializableAttribute

示例

下面的代码示例定义 Microsoft Pubs 示例数据库中表的三个行。 该表包含两个不可为 null 的列和两个都可以为 null 的列。

using System;

class Sample

{

    // Define the "titleAuthor" table of the Microsoft "pubs" database.

    public struct titleAuthor

    {

      // Author ID; format ###-##-####

      public string au_id;

      // Title ID; format AA####

      public string title_id;

      // Author ORD is nullable.

      public short? au_ord;

      // Royalty Percent is nullable.

      public int? royaltyper;

    }

 

    public static void Main()

    {

      // Declare and initialize the titleAuthor array.

      titleAuthor[] ta = new titleAuthor[3];

      ta[0].au_id = "712-32-1176";

      ta[0].title_id = "PS3333";

      ta[0].au_ord = 1;

      ta[0].royaltyper = 100;

   

      ta[1].au_id = "213-46-8915";

      ta[1].title_id = "BU1032";

      ta[1].au_ord = null;

      ta[1].royaltyper = null;

 

      ta[2].au_id = "672-71-3249";

      ta[2].title_id = "TC7777";

      ta[2].au_ord = null;

      ta[2].royaltyper = 40;

 

      // Display the values of the titleAuthor array elements, and

      // display a legend.

      Display("Title Authors Table", ta);

      Console.WriteLine("Legend:");

      Console.WriteLine("An Author ORD of -1 means no value is defined.");

      Console.WriteLine("A Royalty % of 0 means no value is defined.");

    }

 

    // Display the values of the titleAuthor array elements.

    public static void Display(string dspTitle,

                               titleAuthor[] dspAllTitleAuthors)

    {

      Console.WriteLine("*** {0} ***", dspTitle);

      foreach (titleAuthor dspTA in dspAllTitleAuthors) {

         Console.WriteLine("Author ID ... {0}", dspTA.au_id);

         Console.WriteLine("Title ID .... {0}", dspTA.title_id);

         Console.WriteLine("Author ORD .. {0}", dspTA.au_ord ?? -1);

         Console.WriteLine("Royalty % ... {0}", dspTA.royaltyper ?? 0);

         Console.WriteLine();      

      }

    }

}

// The example displays the following output:

//     *** Title Authors Table ***

//     Author ID ... 712-32-1176

//     Title ID .... PS3333

//     Author ORD .. 1

//     Royalty % ... 100

//    

//     Author ID ... 213-46-8915

//     Title ID .... BU1032

//     Author ORD .. -1

//     Royalty % ... 0

//    

//     Author ID ... 672-71-3249

//     Title ID .... TC7777

//     Author ORD .. -1

//     Royalty % ... 40

//    

//     Legend:

//     An Author ORD of -1 means no value is defined.

//     A Royalty % of 0 means no value is defined.

注解

一种类型称为可为 null,如果它可以分配一个值,或者可以分配null,这意味着该类型有没有任何值。 默认情况下,所有的引用类型,如String,可以为 null,但所有值类型,如Int32,不是。

 

通过使用 C# 和 Visual Basic 中,在标记为可为 null 的值类型?后的值类型的表示法。 例如, int? C# 中或Integer?在 Visual Basic 中声明了整数值类型,可以分配null。

 

Nullable<T>结构为 null 的类型使用值类型,因为引用类型都可以为 null 的设计的支持。

 

Nullable类提供了补充支持Nullable<T>结构。 Nullable类支持获取基础类型的为 null 的类型,并对其基础值类型可以为 null 的类型的比较和相等操作不支持泛型比较和相等运算。

 

基本属性

两个基本成员Nullable<T>结构是否HasValue和Value属性。 如果HasValue属性Nullable<T>对象是true,可以使用访问对象的值Value属性。 如果HasValue属性是false,该对象的值是不确定并尝试访问Value属性,则会引发InvalidOperationException。

 

装箱和取消装箱

可以为 null 的类型进行装箱时,公共语言运行时自动框的基础值Nullable<T>对象,而不Nullable<T>对象本身。 也就是说,如果HasValue属性是true,内容Value属性进行装箱。 未装箱可以为 null 的类型的基础值时,公共语言运行时创建一个新Nullable<T>结构初始化为基础的值。

 

如果HasValue属性为 null 的类型是false,装箱操作的结果是null。 因此,如果可以为 null 的装箱的类型传递给需要的对象参数的方法,该方法必须准备处理其中的参数是这种情况null。 当null是未装箱到 null 的类型,公共语言运行时创建一个新Nullable<T>结构并初始化其HasValue属性设置为false。

 

.NET Framework 4.5.1 和 Windows 运行时组件

从开始.NET Framework 4.5.1,可以包括Nullable<T>类型作为结构导出 WinMD 库中的成员。 以前,这不是支持。

构造函数:

Nullable<T>(T)     

将 Nullable<T> 结构的新实例初始化为指定值。

属性:

HasValue      

获取一个值,该值指示 Nullable<T> 对象是否具有基础类型的有效值。

Value     

获取当前 Nullable<T> 对象的值,如果它已被分配了有效的基础值。

方法:

Equals(Object)      

指示当前 Nullable<T> 对象是否与指定的对象相等。

GetHashCode()    

检索由 Value 属性返回的对象的哈希代码。

GetValueOrDefault()    

检索当前 Nullable<T> 对象的值,或基础类型的默认值。

GetValueOrDefault(T)  

检索当前 Nullable<T> 对象的值或指定的默认值。

ToString()      

返回当前 Nullable<T> 对象的值的文本表示形式。

操作员:

Explicit(Nullable<T> to T)   

定义 Nullable<T> 实例到其基础值的显式转换。

Implicit(T to Nullable<T>)   

创建一个新的 Nullable<T> 对象,并将其初始化为指定的值。

可空类型如何安全地转换为非可空类型?

1.强制类型转换

不安全

2.空接合操作符(??)

C#在新版本中加入了一个新的操作符,它被称为空接合操作符,使用如下的格式:
 

returnValue = first ?? second;


  这样,如果first不为空,那么它的值将返回作为returnValue的值。如果first为空,那么second的值将被返回。注意:returnValue可以为可空变量或者非可空变量。 

  如果你希望可空变量的值到一个非可空的版本,你可以这样做:
 

int? ValA= 123;
int? ValB = null;

int NewVarA = ValA ?? -1;
int NewVarB = ValB ?? -1;


  NewVarA的值将会为123因为ValA不是空值。NewVarb的值是-1因为ValB是空值。你看一看到,这里你将可以将变量从一个空值转化成一个缺省值。这里缺省值是-1。

猜你喜欢

转载自blog.csdn.net/qq_40741855/article/details/83832844
今日推荐