[C#] 널 입력 가능 ToString ()

나는 모든 곳에서 다음과 같은 구조를 봅니다.

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

단순히 사용하지 않는 이유 :

string test = myVar.ToString();

정확히 동일하지 않습니까? 적어도 리플렉터는 다음과 같이 말합니다.

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

그렇다면 그게 맞습니까 (더 짧은 버전) 아니면 뭔가 빠졌습니까?



답변

당신은 꽤 정확합니다. 또한 이 질문 에서 이전 솔루션은 제안되었지만 아무도 실제로 알지 못합니다.ToString() 정답을 제공하지 않습니다.

어쩌면 더 자세한 솔루션의 인수는 가독성은 다음과 같습니다 당신이 호출 할 때 ToString()뭔가에 가정 으로 null, 당신은 일반적으로 기대NullReferenceException가 슬로우되지 않는 여기에 있지만.


답변

나는 많은 사람들이 null 값을 가질 수있는 객체의 자연스러운 행동이 아니기 때문에 그러한 검사를한다고 생각합니다.


답변

아니요, 맞습니다. 더 짧은 버전은 다른 사람들이 그 점에서 한 것과 동일합니다. nullables가있는 삼항 대신 많은 것을 사용하는 다른 구문은 null 병합 연산자입니다. 또한 널로부터 당신을 보호합니다. ToString ()의 경우 (필자가 지적한대로) 필요하지 않지만 기본 int 값 (예 :)에서는 다음과 같이 훌륭하게 작동합니다.

int page = currentPage ?? 1;

이를 통해 currentPage에서 명시 적으로 null 검사 및 값을 호출하지 않고 페이지에서 모든 정수 연산을 수행 할 수 있습니다 (currentPage는 int? 아마도 매개 변수로 전달됨)


답변

관련성이 오래 된 후에도 알고 있지만 … int와 같은 nullable 유형 때문인지 의심합니다. .ToString () 메소드에서는 형식 문자열을 사용할 수 없습니다. ToString ()을 사용하여 nullable DateTime을 어떻게 형식화 할 수 있습니까?를 참조하십시오 . . 아마도 원래 코드에서 .ToString ()에 형식 문자열이 있었거나 코더가 형식 문자열이없는 .ToString ()을 여전히 nullable 형식에서 사용할 수 있다는 것을 잊었을 수 있습니다.


답변

패턴을 따르는 것입니까? 또는 그들은 백엔드를 모른다. 당신은 올바른 코드입니다 정확히 동일합니다. 당신은 할 수 있습니다 :

int? i = null;
i.ToString(); //No NullReferenceException


답변

int?nullable 변수의 선언을 단순화하는 구문 설탕입니다. 와 동일Nullable<int> .

따라서 (아래 참조)에ToString() 대한 메소드 구현을 살펴보면 값이없는 경우 빈 문자열을 반환한다는 것을 알 수 있습니다.Nullable<T>

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

MSDN의 말 :

Nullable.ToString 메서드

HasValue 속성이 true 인 경우 현재 Nullable 개체 값의 텍스트 표현을 반환하거나 HasValue 속성이 false 인 경우 빈 문자열 ( “”)을 반환합니다.

따라서 다음 코드는 ArgumentNullException예외를 발생시키는 대신 빈 문자열을 콘솔에 인쇄합니다 .

static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}


답변