.NET에는 참조 와 값 (int, double, structs, enums 등)의 두 가지 범주 유형이 있습니다. 이들의 차이점 중 하나는 참조가 될 수 있지만 null
값은 할 수 없다는 사실입니다 . 따라서 값 유형이 있고 "선택적"또는 "알 수없는"의미를 전달하려는 경우이를 사용하여 값을 지정할 수 있습니다 Nullable<>
. 주 Nullable<>
유형에 의해 제약된다 (그것은에만 값 형식을 적용합니다 where T : struct
절). Nullable<>
또한 컴파일러로부터 특별한 이익을 얻음으로써 null
값이 보호됩니다 NullReferenceExceptions
.
string x = null;
x.ToString(); // throws a NullReferenceException
int? y = null;
y.ToString(); // returns ""
(예 등 스칼라, F 번호, 하스켈, 스위프트 등) 함수형 언어에서 그것은 일반적입니다 null
에 존재하지 . 이는 전체 사람들이 존재를 나쁜 생각null
으로 간주 하고 언어 디자이너가이 문제를 허용하지 않음으로 해결하기로 결정했기 때문입니다.
다시 말해 , 이러한 언어 로 가치 가 없는 것을 표현할 방법이 필요하다는 것을 의미합니다 . Option
유형을 입력하십시오 (명칭은 다양 Maybe
하며 Haskell 에서 호출 됩니다). Nullable
값이 "없음"또는 "알 수 없음"인 경우를 추가하기 위해 유형을 래핑한다는 점에서 비슷한 작업을 수행합니다 .
실제 차이점은 구현하는 언어로 제공되는 추가 기능에 있습니다 Option
. 예를 들어 Option.map
(의사 코드로) :
function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
if (opt is None) return None
else return Option<T2>(mapFunc(opt.Value))
}
같은 체인 함수 Option.map
는 C #의 모든 곳에서 볼 수있는 일반적인 null check 상용구를 피하는 강력한 방법입니다.
if (service == null)
return null;
var x = service.GetValue();
if (x == null || x.Property == null)
return null;
return x.Property.Value;
C #의 Nullable 해당 항목은 다음과 같습니다.
public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
where T1 : struct
where T2 : struct
{
if (!nullable.HasValue) return (T2?)null;
else return (T2?) f(nullable.Value);
}
그러나 C #에서는 값 형식에 대해서만 작동하기 때문에 유틸리티가 제한적입니다.
C #의 새 버전은 "널 전파"연산자 ( ?.
)를 제공합니다.이 연산자 Option.map
는 메서드 및 속성 접근 자에만 적용 할 수 있다는 점만 제외 하면 함수 와 비슷합니다 . 위의 샘플은 다시 작성됩니다
return service?.GetValue()?.Property?.Value;