널 입력 가능 ToString ()


142

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

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();
}

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


1
나는이 :) 같은 코드를 보지 못했다
tymtam

답변:


112

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

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


21
에릭 리퍼 트 ​​(Eric Lippert)와 요하네스 로셀 (Johannes Rössel)은 실제로 두 명 이상이 나타났습니다.
Jon Skeet

7
나는 그것이 당신이 의도 한 것이 아니라고 확신하지만 실제로는 참조가 null이 아닙니다. Nullable <T>는 값 유형입니다. 이것이 전화 를 던지지 ToString()않고 작동하는 이유 NullReferenceException입니다.
Thorarin

2
그것이 사고력이라면, 당신 .HasValue은 여전히 ​​그 예외를 던질 것으로 기대할 것 입니다.
Extragorey

사람들이 verbose 버전을 사용하는 또 다른 이유 myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null는 원하는 ToString메소드 에 액세스하기 위해 랩핑되지 않은 객체가 필요한 곳 과 같은 표현식과의 패리티 때문일 수 있습니다 . 물론 더 간결한 해결책도 있습니다 :$"{myNullableDateTime:d}"
Extragorey

14

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


@Andrew는 저와 같은 사람들이 처음에는 예외를 던질 것이라고 생각하기 때문에 동의했습니다.
Nathan Koop

1
나는 이것이 행동인지 전혀 몰랐다. x.ToString ()을 호출하면 (x == null)에 대해 true를 반환하는 구문도 NullReferenceException을 throw한다고 생각했을 것입니다.
Dan Bryant

5

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

int page = currentPage ?? 1;

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


5

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


3

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

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

nullables가 메뉴에 없으므로 ToString ()이 고정 문화권이어야하는 경우 긴 경로를 사용해야 할 수 있습니다.
Ε Г И І И О

1

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.
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.