导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

Nullable<T> 结构

2013/12/13

表示基础类型为值类型的对象,值类型与引用类型一样也可以分配 null

Namespace:  System
程序集:  mscorlib(位于 mscorlib.dll 中)

public struct Nullable<T>
where T : struct, new()

类型参数

T

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

Nullable<T> 类型公开以下成员。

  名称说明
公共方法Nullable<T>Nullable<T> 结构的新实例初始化为指定值。
返回顶部

  名称说明
公共属性HasValue获取一个值,指示当前的 Nullable<T> 对象是否有值。
公共属性Value获取当前的 Nullable<T> 值。
返回顶部

  名称说明
公共方法Equals指示当前 Nullable<T> 对象是否等于指定的对象。 (重写 ValueType.Equals(Object)。)
受保护的方法Finalize允许 Object 在垃圾回收器回收该对象之前尝试释放资源并执行其他清理操作。 (从 Object 继承。)
公共方法GetHashCode检索由 Value 属性返回的对象的哈希代码。 (重写 ValueType.GetHashCode()。)
公共方法GetType获取当前实例的 Type (从 Object 继承。)
公共方法GetValueOrDefault()检索当前 Nullable<T> 对象的值,或该对象的默认值。
公共方法GetValueOrDefault(T)检索当前 Nullable<T> 对象的值或指定的默认值。
受保护的方法MemberwiseClone创建当前 Object 的浅表副本。 (从 Object 继承。)
公共方法ToString返回当前 Nullable<T> 对象的值的文本表示形式。 (重写 ValueType.ToString()。)
返回顶部

  名称说明
公共运算符静态成员Explicit(Nullable<T> to T)返回指定的 Nullable<T> 的值。
公共运算符静态成员Implicit(T to Nullable<T>)创建一个新的 Nullable<T> 对象,并将其初始化为指定的值。
返回顶部

对于一个类型,如果既可以给它分配一个值,也可以给它分配 null(表示没有任何值),我们就说这个类型是可空的。因此,可以为 null 的类型可表示一个值,或表示不存在任何值。例如,类似 String 的引用类型就是可以为 null 的类型,而类似 Int32 的值类型不是可以为 null 的类型。由于值类型的容量只够表示适合于该类型的值,因此它不可为空;值类型没有表示空值所需的额外容量。

Nullable<T> 结构支持只将一个值类型用作可以为 null 的类型,因为引用类型本身就是可空的。

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

方案

根据具体环境,使用可以为 null 的类型来表示存在或不存在的事物。例如,HTML 标记的某个可选特性可能存在于某一个标记中,但不存在于另一个标记中;或者数据库表的某个可空列可能存在于表的某一行中,但不存在于另一行中。

可将该特性或列表示为类中的一个字段,并可以将该字段定义为值类型。该字段可包含特性或列的所有有效值,但不能提供一个附加值来表示特性或列不存在。在这种情况下,将该字段定义为可以为 null 的类型而不是值类型。

基本属性

Nullable<T> 结构的两个基础成员为 HasValueValue 属性。如果 Nullable<T> 对象的 HasValue 属性为 true,则可以使用 Value 属性访问该对象的值。如果 HasValue 属性为 false,则表示尚未定义该对象的值,并且尝试访问 Value 属性时会引发 InvalidOperationException

装箱和取消装箱

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

如果可以为 null 的类型的 HasValue 属性为 false,则装箱操作的结果为 null。因此,如果将已装箱的可以为 null 的类型传递给需要对象参数的方法,则该方法必须准备处理参数为 null 的情况。如果对 null 进行取消装箱使其成为可以为 null 的类型,则公共语言运行时会创建一个新的 Nullable<T> 结构并将其 HasValue 属性初始化为 false

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

说明注意:

要运行此示例,请参见生成具有静态 Windows Phone TextBlock 控件的示例


// This code example demonstrates the Nullable<T> class.
// The code example defines a database table in which two columns 
// are nullable. In the application, an array of rows is created 
// and initialized. The table rows could subsequently be 
// written to a database.

using System;

class Example
{
   // 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 Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // 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(outputBlock, "Title Authors Table", ta);
      outputBlock.Text += "Legend:" + "\n";
      outputBlock.Text += "An Author ORD of -1 means no value is defined." + "\n";
      outputBlock.Text += "A Royalty % of 0 means no value is defined." + "\n";
   }

   // Display the values of the titleAuthor array elements.
   public static void Display(System.Windows.Controls.TextBlock outputBlock, string dspTitle,
                              titleAuthor[] dspAllTitleAuthors)
   {
      outputBlock.Text += String.Format("*** {0} ***", dspTitle) + "\n";
      foreach (titleAuthor dspTA in dspAllTitleAuthors)
      {
         outputBlock.Text += String.Format("Author ID ... {0}", dspTA.au_id) + "\n";
         outputBlock.Text += String.Format("Title ID .... {0}", dspTA.title_id) + "\n";
         outputBlock.Text += String.Format("Author ORD .. {0}", dspTA.au_ord ?? -1) + "\n";
         outputBlock.Text += String.Format("Royalty % ... {0}", dspTA.royaltyper ?? 0) + "\n";
         outputBlock.Text += "\n";
      }
   }
}

/*
This code example produces the following results:

*** 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.

*/


Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

此类型的所有公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

显示:
© 2014 Microsoft