이 설명서는 보관되지만 유지 되지 않습니다.

Nullable 제네릭 구조체

참고: 이 구조체는 .NET Framework 버전 2.0에서 새로 추가되었습니다.

참조 형식처럼 Null 참조(Visual Basic의 경우 Nothing)도 할당될 수 있는 값 형식을 내부 형식으로 갖는 개체를 나타냅니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

[SerializableAttribute] 
public struct Nullable<T> where T : struct
J#에서는 제네릭 형식 및 메서드를 사용할 수 있지만 새로 선언할 수는 없습니다.
JScript에서는 제네릭 형식 및 메서드를 지원하지 않습니다.

값이 할당될 수 있거나, 값이 없음을 의미하는 Null 참조(Visual Basic의 경우 Nothing)이 할당될 수 있는 형식을 nullable 형식이라고 합니다. 따라서 nullable 형식은 값을 나타내거나 값이 없음을 나타낼 수 있습니다. 예를 들어, String과 같은 참조 형식은 nullable 형식이지만 Int32와 같은 값 형식은 nullable 형식이 아닙니다. 값 형식은 형식에 적절한 값만 표현할 수 있는 용량을 갖기 때문에 nullable 형식이 될 수 없습니다. 값 형식에는 null 값을 표현하는 데 필요한 추가 용량이 없습니다.

참조 형식은 nullable 형식으로 디자인되었으므로 Nullable 구조체에서는 값 형식만 nullable 형식으로 사용할 수 있습니다.

Nullable 클래스에서는 Nullable 구조체에 대한 보완적인 지원을 제공합니다. Nullable 클래스를 통해 nullable 형식의 내부 형식을 사용할 수 있으며, 내부 값 형식이 제네릭 비교 및 같음 연산을 지원하지 않는 nullable 형식 쌍에서 비교 및 같음 연산을 수행할 수 있습니다.

시나리오

nullable 형식을 사용하여 상황에 따라 있거나 없는 항목을 나타냅니다. 예를 들어, HTML 태그의 선택적 특성은 한 태그에는 있지만 다른 태그에는 없을 수 있으며, 데이터베이스 테이블의 null을 허용하는 열은 테이블의 한 행에는 있지만 다른 행에는 없을 수 있습니다.

특성이나 열을 클래스의 필드로 나타낼 수 있으며 필드를 값 형식으로 정의할 수 있습니다. 필드는 특성이나 열에 유효한 모든 값을 포함할 수 있지만 특성이나 열이 없음을 의미하는 추가 값을 수용할 수 없습니다. 이 경우 값 형식 대신 nullable 형식으로 필드를 정의합니다.

기본 속성

Nullable 구조체의 두 기본 멤버는 HasValueValue 속성입니다. Nullable 개체의 HasValue 속성이 true이면 Value 속성을 사용하여 개체의 값에 액세스할 수 있습니다. HasValue 속성이 false이면 개체의 값이 정의되지 않으며 Value 속성에 액세스하려고 하면 InvalidOperationException이 throw됩니다.

boxing 및 unboxing

nullable 형식이 boxing될 때 공용 언어 런타임에서는 Nullable 개체 자체가 아니라 Nullable 개체의 내부 값을 자동으로 boxing합니다. 즉, HasValue 속성이 true이면 Value 속성의 내용이 boxing됩니다. HasValue 속성이 false이면 Null 참조(Visual Basic의 경우 Nothing)이 boxing됩니다. nullable 형식의 내부 값이 unboxing될 때 공용 언어 런타임에서는 내부 값으로 초기화된 새 Nullable 구조체를 만듭니다.

다음 코드 예제에서는 Microsoft Pubs 샘플 데이터베이스에서 테이블의 세 행을 정의합니다. 테이블에는 null을 허용하지 않는 열 두 개와 null을 허용하는 열 두 개가 있습니다.

// 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 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();       
       }
    }
}

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

*/

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

.NET Framework

2.0에서 지원

.NET Compact Framework

2.0에서 지원
표시: