English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
众所周知,不能为值类型分配空值。例如,int i = null 컴파일 시 오류가 발생합니다.
c# 2.0에서 nullable 타입을 도입하여 값 타입 변수에 null 값을 할당할 수 있습니다. T가 타입인 Nullable<t>를 사용하여 nullable 타입을 선언할 수 있습니다.
Nullable<int> i = null;
nullable 타입은 기본 값 타입의 올바른 값 범위를 나타내며, 추가로 빈 값도 나타낼 수 있습니다. 예를 들어, Nullable<int>는 -2147483648 까지 2147483647 의 어떤 값도, 또는 null 값.
Nullable 타입은 System.Nullable<t> struct의 인스턴스입니다.
[Serializable] public struct Nullable<T> where T : struct { public bool HasValue { get; } public T Value { get; } // 기타 구현 }
Int 타입의 nullable은 일반 int 타입과 같지만, int가 값이 있는지 여부를 나타내는 기호가 추가됩니다(빈 null 값인가요?). 나머지 모든 것은 컴파일러 마법이며, "null"을 유효 값으로 간주합니다.
static void Main(string[] args) { Nullable<int> i = null; if (i.HasValue) Console.WriteLine(i.Value); // Console.WriteLine(i) else Console.WriteLine("null"); }
null
객체에 값이 할당되면 true를 반환합니다. 값이 할당되지 않거나 null 값을 할당되면 false를 반환합니다.
NullableType.value 타입이 null이거나 값을 할당하지 않았다면, NullableType.value를 통해 값을 접근하면 실행 시간 예외가 발생합니다. 예를 들어, i가 null이면 값을 접근하면 예외가 발생합니다:
null이 아니면 GetValueOrDefault() 메서드를 사용하여 실제 값을 가져옵니다. null이면 기본 값을 사용합니다. 예를 들어:
static void Main(string[] args) { Nullable<int> i = null; Console.WriteLine(i.GetValueOrDefault()); }
문법을 간소화하기 위해 '?' 연산자를 사용할 수 있습니다. 예를 들어, int ?, long? 대신 Nullable<T>를 사용할 수 있습니다.
int? i = null; double? D = null;
'??' 연산자를 사용하여 nullable 타입을 nullable 타입에 할당합니다.
int? i = null; int j = i ?? 0; Console.WriteLine(j);
0
위의 예제에서 i는 nullable int입니다. i를 nullable int이 아닌 int j에 할당하면 i가 null이면 실행 시간 예외가 발생합니다. 따라서 예외 발생 위험을 줄이기 위해 '??' 연산자를 사용하여 i가 null이면 0을 j에 할당합니다.
using System; namespace CalculatorApplication { class NullablesAtShow { static void Main(string[] args) { double? num1 = null; double? num2 = 3.14157; double num3; num3 = num1 ?? 5.34; // num1 null 값이면 반환 5.34 Console.WriteLine("num3 의 값: {0} num3); num3 = num2 ?? 5.34; Console.WriteLine("num3 의 값: {0} num3); Console.ReadLine(); } } }
출력 결과:
num3 의 값: 5.34 num3 의 값: 3.14157
nullable 타입의 할당 규칙은 값 타입의 할당 규칙과 동일합니다. 함수에서 nullable 타입을 지역 변수로 선언하면 사용하기 전에 값을 할당해야 합니다. 그것이 어떤 클래스의 필드라면 기본적으로 null 값이 있습니다.
예를 들어, 아래와 같은 nullable int형을 선언하고 사용하면 값을 할당하지 않습니다. 컴파일러는 출력합니다.“지정되지 않은 지역 변수 'i'를 사용했습니다”에러:
다음 예제에서 int 타입의 nullable은 해당 클래스의 필드로 사용되며, 따라서 오류가 발생하지 않습니다.
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
null은 어떤 값보다 작습니다. 따라서 비교 연산자는 null에 대해 사용할 수 없습니다. 다음 예제에서 i는 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("비교할 수 없음"); }
비교할 수 없음
Nullable 스타일 클래스는 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
nullable 타입은 값 타입과 함께 사용할 수 있습니다.
Value가 null이면 Value 속성은 InvalidOperationException을 던지며, 그렇지 않으면 값을 반환합니다.
변수가 값을 포함하면 HasValue 속성이 true를 반환하며, null이면 false를 반환합니다.
== 및 != 연산자는 비어있을 수 있는 타입과 함께 사용할 수 있습니다. 다른 비교를 위해 Nullable 스타일 클래스를 사용하십시오.
내장된 nullable 타입을 사용하지 않습니다. Nullable <Nullable <int >> i; 컴파일 시 오류가 발생합니다.
Nullable <T> 타입은 값 타입에 null을 할당할 수 있습니다.
?연산자는 nullable 타입의 간단한 문법입니다.
value 속성을 사용하여 nullable 타입의 값을 가져옵니다.
사용HasValue속성이 값을 할당하는지 확인합니다.가능빈 타입。
정적 nullable 클래스는 nullable 타입을 비교하는 도구 클래스입니다.