2012-09-03 6 views
3

null은 유효한 값이므로 "각 값이 지정되어 있는지 여부가 지정되어 있지 않은지 여부와 함께 값을 메서드에 전달해야합니다. 따라서"지정되지 않은 것으로 해석 될 수 없습니다. "."specified"플래그가있는 값 개체

나는 일반적인 접근법을 취해 이러한 값을위한 간단한 컨테이너를 만들었지 만 (아래 참조), 이것이 올바른 방법일까요? 이 문제에 접근하는 더 좋은 방법이 있습니까? 이와 같은 클래스가 프레임 워크에 이미 존재합니까?

public struct Omissible<T> 
{ 
    public readonly T Value; 
    public readonly bool IsSpecified; 
    public static readonly Omissible<T> Unspecified; 

    public Omissible(T value) 
    { 
    this.Value = value; 
    this.IsSpecified = true; 
    } 
} 

방법 서명이 발신자가 특정 값 (지정) 업데이트되지 않도록 지정 할 수 있도록 다음과 같이 볼 수 있었다, 다른 사람이 널 (null)로 설정해야합니다/다른 값 (지정).

public void BulkUpdate(int[] itemIds, 
    Omissible<int?> value1, Omissible<string> value2) // etc. 
+0

두 번째 생성자가'T' 매개 변수를 사용하고 아무 것도하지 않는다는 것을 의미합니까? –

+2

나에게 맞는 모양. 나는'class' 대신에'struct'를 사용할 것을 제안합니다. 또한 두 번째'생성자 '를 검사하면,'value' 매개 변수가 사용되지 않습니다. – devundef

+0

와우, 수정되었습니다. 구조체도 좋은 생각입니다. – bernhof

답변

1

이것은 이론적으로 할 수있는 최선의 방법입니다. 일반 T과 "T 또는 null"을 구별하려면 T 변수가 보유 할 수있는 상태보다 더 많은 가능한 상태가 필요합니다.

예를 들어, 32 비트 int는 2^32 상태를 보유 할 수 있습니다. null 값을 저장하려면 2^32 + 1 가능한 상태가 4 바이트 위치에 맞아야합니다.

따라서 bool 값이 필요합니다. (이론적으로 말하면 Omissible<int> 경우에는 log2(2^32 + 1) - 32 비트가 필요하지만이를 저장할 수있는 쉬운 방법은 bool입니다.)

+0

그는 * null * 및 * 지정되지 않은 * 두 개의 제어 값이 필요합니다. 어떤 것은'byte'와'int'를 요구할 것입니다. –

+0

그렇다면 올바른 것입니다. – usr