C#/C# 문법
[C# 문법] Nullable 값 형식
범범조조
2022. 5. 22. 20:54
참고
- https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/nullable-value-types
개요
- nullable 값 형식은 기본 값 형식의 모든 값과 추가 null 값을 나타냅니다.
- 예를 들어 bool? 변수에는 다음 세 가지 값 중 하나를 할당할 수 있습니다.
- true, false, null 이렇게 할당 할 수 있습니다.
선언 및 할당
- 값 형식이 암시적으로 해당 null 허용 값 형식으로 변환될 수 있기 때문에 기본 값 형식에서와 마찬가지로 null 허용 값 형식의 변수에 값을 할당할 수 있습니다.
- null 값을 할당할 수도 있습니다.
double? pi = 3.14;
char? letter = 'a';
int m2 = 10;
int? m = m2;
bool? flag = null;
// An array of a nullable value type:
int?[] arr = new int?[10];
- Null 허용 값 형식의 기본 값은 null을 나타냅니다.
- 즉, Nullable
.HasValue 속성이 false를 반환하는 인스턴스 입니다.
Null 허용 값 형식의 인스턴스 검사
- C# 7.0 부터 형식 패턴 포함 연산자를 사용하여 null 허용 값 형식의 인스턴스에서 null 여부를 검사하고 기본 형식의 값을 검색할 수 있습니다.
int? a = 42;
if (a is int valueOfA)
{
Console.WriteLine($"a is {valueOfA}");
}
else
{
Console.WriteLine("a does not have a value");
}
// Output:
// a is 42
- 항상 다음 읽기 전용 속성을 사용하여 null 허용 값 형식 변수의 값을 검사하고 가져올 수 있습니다.
- Nullable
.HasValue 은 null 허용 값 형식의 인스턴스에 해당 기본 형식의 값이 있는지 여부를 나타냅니다. - Nullable
.Value은 HasValue가 true인 경우 기본 형식의 값을 가져옵니다. HasValue가 false인 경우 Value 속성은 InvalidOperationException을 throw합니다.
- Nullable
- 다음 예제는 HasValue 속성을 사용하여 표시하기 전에 변수가 값을 포함하는지 여부를 테스트 합니다.
int? b = 10;
if (b.HasValue)
{
Console.WriteLine($"b is {b.Value}");
}
else
{
Console.WriteLine("b does not have a value");
}
// Output:
// b is 10
- 다음 예제와 같이 HasValue 속성을 사용하는 대신 null 허용 값 형식 변수를 null 과 비교할 수도 있습니다.
int? c = 7;
if (c != null)
{
Console.WriteLine($"c is {c.Value}");
}
else
{
Console.WriteLine("c does not have a value");
}
// Output:
// c is 7
nullable 값 형식에서 기본 형식으로 변환
- Null 허용 값 형식의 값을 null을 허용하지 않는 값 형식 변수에 할당하려는 경우 null 대신 할당할 값을 지정해야 할 수 있습니다.
- null 병합 연산자를 사용하여 이 작업을 수행할 수 있습니다.
int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}"); // output: b is 28
int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}"); // output: d is -1
- 다음 예제와 같이 null 허용 값 형식을 null을 허용하지 않는 형식으로 명시적으로 캐스팅 할 수도 있습니다.
int? n = null;
//int m1 = n; // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null
- 런타임 시 nullable 값 형식의 값이 null 인 경우 명시적 캐스팅은 InvalidOperationException을 throw 합니다.
728x90