나는 모든 곳에서 다음과 같은 구조를 봅니다.
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.
}