근본적인 이유 / 문제는 CLS 사양의 디자이너 (언어가 .net과 상호 작용하는 방법을 정의)가 클래스 멤버가 callvirt
호출자가 널 참조 검사; 또한 "정상적인"복싱에 적용되지 않는 구조를 정의하는 의미도 제공하지 않았습니다.
CLS 사양에 이러한 수단이 정의되어 있으면 .net이 COM (Common Object Model)에 의해 설정된 리드를 지속적으로 따르는 것이 가능합니다. 마찬가지로 기본값을 정의하기 위해 값 의미론을 가져야하는 사용자 정의 불변 클래스 유형. 기본적으로, 어떤의 각 구성원이 될 것 일어날 것 String
예를 들면 것은, Length
같은과 같이 작성한다 [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }
. 이 접근법은 가치처럼 행동 해야하는 것들에 대해 매우 훌륭한 의미를 제공했지만 구현 문제 때문에 힙에 저장해야합니다. 이 접근 방식의 가장 큰 어려움은 이러한 유형 간의 변환 의미론이 Object
약간 어둡습니다.
다른 접근 방식은 상속하지 않고 Object
대신 사용자 정의 boxing 및 unboxing 작업을 수행 하는 특수 구조 유형의 정의를 허용하는 것이 었습니다 (다른 클래스 유형으로 /에서 변환). 이러한 접근 방식에서는 NullableString
문자열처럼 작동 하는 클래스 유형 과 String
단일 개인 필드 Value
유형을 보유하는 사용자 정의 상자 구조 유형 이 있습니다 String
. 변환 시도 중String
로 NullableString
또는 Object
반환 Value
null이 아닌 경우, 또는 String.Empty
경우는 null입니다. 로 캐스팅하려고 String
하면 NullableString
인스턴스에 대한 null이 아닌 참조 는 참조를 Value
저장합니다 (길이가 0 인 경우 null을 저장함). 다른 참조를 캐스팅하면 예외가 발생합니다.
문자열을 힙에 저장해야하지만 널이 아닌 기본값을 가진 값 유형처럼 작동 하지 않아야 하는 이유는 개념적으로 없습니다 . 참조를 보유한 "정상"구조로 저장하면 "문자열"유형으로 사용하는 코드에서 효율적일 수 있지만 "객체"로 캐스팅 할 때 간접적이고 비효율적 인 계층이 추가됩니다. 이 늦은 날짜에 위의 기능 중 하나를 추가하는 .net을 예측하지는 않지만 미래 프레임 워크의 디자이너는이 기능을 포함하는 것을 고려할 수 있습니다.