.NET 중 빈 값 유형[Nullable]실현 원리

.Net 의 값 형식 을 null 로 할당 할 수 있 도록 마이크로소프트 는 Nullable형식 을 특별히 추 가 했 습 니 다.T?라 고 간략하게 쓸 수도 있 습 니 다.그러나 Nullable자 체 는 구조 체 이자 값 유형 입 니 다.그러면 null 을 값 유형 에 할당 하 는 것 은 어떻게 실현 합 니까?
다음은 Nullable의 실현 원 리 를 빈 값 형식 으로 정의 합 니 다.
사용자 정의 빈 값 형식

struct XfhNullable<T> where T : struct
{
  private T innerValue;
  //       
  public bool HasValue { set; get; }
  public T Value
  {
    get
    {
      return HasValue ? innerValue: throw new InvalidOperationException();
    }
  }
  public XfhNullable(T value)
  {
    this.innerValue= value;
    HasValue = true;
  }
  public T GetValueOrDefault(T value)
  {
    return HasValue ? this.innerValue: value;
  }
  public T GetValueOrDefault()
  {
    return this.innerValue;
  }
}
빈 값 형식의 구조 체 는 대체적으로 기능 이 정의 되 었 습 니 다.다음은 빈 값 형식의 인 스 턴 스 를 만들어 서 검증 하 겠 습 니 다.

using static System.Console;
class Program
{
  static void Main()
  {
    //                   
    XfhNullable<int> num = new XfhNullable<int>();
    WriteLine(num.HasValue);
    WriteLine(null_num.GetValueOrDefault());
  }
}

이 를 통 해 알 수 있 듯 이 변수 num 은 값 을 포함 하지 않 습 니 다.GetValueOrDefault()를 호출 하면 기본 값 0 을 가 져 옵 니 다.
이 때 우 리 는 null 을 변수 num 에 할당 하면 컴 파일 러 가 잘못 보고 한 것 을 발견 할 수 있 습 니 다.Cannot convert null to'XfhNullable'because it is a non-nullable value type 은 컴 파일 러 가 우리 가 정의 하 는 구조 체 XfhNullable를 빈 값 형식 이 아 닌 일반 값 형식 으로 보기 때 문 입 니 다.따라서 우 리 는 빈 값 형식 과 XfhNullable간 의 전환 기능 을 추가 해 야 합 니 다.

public static implicit operator XfhNullable<T>(T? nullabelValue)
{
  if (nullabelValue== null)
  {
    return new XfhNullable<T>();
  }
  return new XfhNullable<T>(nullabelValue.Value);
}
위의 코드 는 빈 값 형식 이 XfhNullable로 의 암시 적 전환 을 실현 하 였 으 며,위의 코드 를 추가 한 후에 컴 파일 러 가 더 이상 잘못 보고 하지 않 는 것 을 발견 하 였 다.XfhNullable는 null 의 값 형식 이 되 었 습 니 다.

static void Main()
{
  XfhNullable<int> null_num = null;
  WriteLine(null_num.HasValue);
}

XfhNullable의 속성 HasValue 의 역할 은 현재 형식 이 null 인지 아 닌 지 를 표시 하 는 것 입 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.그렇지 않 으 면 True 로 돌아 갑 니 다.HasValue 가 False 일 때 이 유형의 Value 속성 을 호출 하면 이상 Invalid Operation Exception 을 던 집 니 다.그러나 GetValueOrDefault()방법 으로 형식의 기본 값 을 가 져 올 수 있 습 니 다.
Nullable형식 은 연산 자===을 통 해 값 이 null 인지 여 부 를 판단 할 수 있 습 니 다.연산 자 를 다시 불 러 와 서 이 기능 을 실현 할 수 있 습 니 다.

public static bool operator ==(XfhNullable<T> cn, object obj)
{
  if (cn.HasValue)
  {
    return false;
  }
  return true;
}
public static bool operator !=(XfhNullable<T> cn, object obj)
{
  return !(cn == obj);
}

static void Main()
{
  XfhNullable<int> null_num = null;
  WriteLine(null_num == null);
}

다음은 일반 값 형식 과 XfhNullable간 의 전환 을 실현 합 니 다.

public static implicit operator XfhNullable<T>(T value)
{
  return new XfhNullable<T>(value);
}
public static explicit operator T(XfhNullable<T> value)
{
  return value.innerValue;
}

static void Main()
{
  XfhNullable<int> null_num = null;
  null_num = 12;//int       XfhNullable<int>  
  WriteLine(null_num == null);
  WriteLine(null_num.Value);
  int i = (int)null_num;//XfhNullable<int>       int  
  WriteLine(i);
}

실행 중인 인 스 턴 스 형식 가 져 오기:

static void Main()
{
  XfhNullable<int> null_num = 12;
  WriteLine(null_num.GetType());
}

이 반환 값 은 그다지 우호 적 이지 않 습 니 다.우 리 는 여기에 내 장 된 값 유형,System.Int 32 를 되 돌려 주 기 를 바 랍 니 다.구체 적 인 실현 코드 는 다음 과 같 습 니 다.

//  Object   GetType         (             )
//         new   Object   GetType  
public new Type GetType()
{
  return innerValue.GetType();
}

결론:빈 값 형식 이 없습니다.
이로써 우 리 는 비어 있 는 값 형식 XfhNullable를 사용자 정의 하 였 습 니 다.상기 코드 를 통 해 비어 있 는 값 형식 이 존재 하지 않 는 다 는 것 을 알 수 있 습 니 다.속성 HasValue 를 통 해 null 값 을 표시 합 니 다.그 내 부 는 필드 innerValue(이 필드 는 Nullable의 value 필드 에 대응)를 통 해 이 유형의 값 을 유지 합 니 다.값 이 null 이면 innerValue 는 값 형식의 초기 값 으로 초기 화 됩 니 다.다시 말 하면 Nullable는 논리 적 인 측면 에서 null 을 값 유형 에 부여 하 는 것 을 실 현 했 을 뿐 우리 에 게 값 유형 이 null 이 될 수 있 는 느낌 을 주 었 다.
마지막 으로 빈 값 형식의 포장 과 상 자 를 뜯 을 수 있 습 니 다.
CLR 은 Nullable인 스 턴 스 를 통 해 포장 작업 을 수행 할 때 먼저 null 인지 확인 합 니 다.만약 에 CLR 이 포장 하지 않 고 null 로 돌아 갑 니 다.인 스 턴 스 의 값 이 null 이 아니라면 이 인 스 턴 스 의 값(Value 속성)을 가 져 오고 이 값 을 포장 합 니 다.
상 자 를 뜯 을 때 null 에 대해 서 는 Nullable()인 스 턴 스 를 되 돌려 주 고 구체 적 인 수치,예 를 들 어 5 와 같이 Nullable(5)인 스 턴 스 를 되 돌려 줍 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기