C# 2.0 Nullable Value Type

C# 2.0의 CLR에 통합된 Nullable Value Type을 지원한다.
이미 알다 시피 Strongly-Typed Language인 C#에서 Value Type에 Null을 대입할 수는 없다.
Int32 a = null;
대입을 하게 되면 컴파일시에 “오류 CS0037: null을 허용하지 않는 값 형식이므로 null을 변환할 수 없습니다.”를 발생하게 된다.
Reference Type에는 당연히 Null이 허용된다.
object o = null;
그럼 Value Type에는 null을 대입하지 않으면 되는거 아닌가?
현실의 문제점은 데이터베이스가 nullable을 허용하고, 데이터베이스로 부터 가져온 null을 CLR이 표현할 방법이 없다는데 있다.
또한 Java에서는 DateTime 이 Reference type 이지만, CLR은 ValueType으로써 웹서비스 등으로 자바로 부터 가져온 DateTime의 Null에 대해 대응 할 방법이 없다.
이 상황을 발전 시켜 마이크로소프트는  CLR에 nullable value type의 개념을 추가 하였고, System.Nullable<T>의 형태로 FCL에 추가 되었다.
이에 그치지 않고 Int32? 또는 Double?의 notation으로 Seamless 하게 통합 하였고, 해당 타입에 따른 Operation도 추가하였다.
Nullable Type은 추가로 HasValue 와 GetValueOrDefault 메소드를 지원한다.
Nullable Type은 null 인지 아닌지를 체크할 수 있는 coalescing operator (??) 를 지원하며, 이는 Linq에도 통합되어 있다.
Int32? x = null;
int y = x ?? 0;
int y = (x.HasValue()) ? x.Value : 0; 와 같은 표현이다.
br />
Linq에 통합된 coalescing operator (??) 는
selec new {
Name = (string) c.Element(“Name”),
Title = (string) c.Element(“Title”),
Email = (string) c.Element(“Email”),
YearsAtCompany = (int?) c.Element(“YearsAtCompay”) ?? 0
}
와 같이 사용할 수 있다.
자세한 내용은 ScottGu의 포스트 The C# ?? null coalescing operator (and using it with LINQ) 와 C# and Nullable value types 를 참조
그럼 여기서 또 의문이 생긴다. System.Nullable<T>를 상속받은 Nullable Type의 수행 성능은 primitive type의 일반 연산 보다 떨어지지 않을까?
Nullable의 성능에 관해서는
if (obj != null)
{
  result = (DateTime)obj;
}
보다
Nullable type이 제공하는 메소드인
if (dateTime2.HasValue)
{
  result = dateTime2.GetValueOrDefault();
}
의 방법이 더욱 성능이 좋다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다