ProgramingTip

ToString () 전에 null 확인

bestdevel 2020. 10. 20. 07:53
반응형

ToString () 전에 null 확인


시나리오는 다음과 가변적입니다.

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

효과 작동하는 작동하는 동안이 나에게 못생긴 것입니다. ToString ()을 수행하기 전에 null을 확인하지 않는 수행 속성이 null이면 예외가 발생합니다. 이 시나리오를 처리하는 더 좋은 방법이 있습니까?

매우 감사합니다!


8 년 후 업데이트 (와우!)하여 C # 6의 null 조건부 연산자를 포함합니다 .

var value = maybeNull?.ToString() ?? String.Empty;

기타 접근 방식 :

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

나는 또한 사용하지 않는 것이 좋습니다.

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}

.NET Framework 3.5를 대상으로하는 경우 가장 우아한 솔루션은 내 생각에 확장 방법 일 것입니다.

public static class ObjectExtensions
{
    public static string NullSafeToString(this object obj)
    {
        return obj != null ? obj.ToString() : String.Empty;
    }
}

그런 다음 사용하려는 비용 :

attribs.something = entry.Properties["something"].Value.NullSafeToString();

Convert.ToString(entry.Properties["something"].Value);

에 빈 문자열 object-을 추가하는 ToString[해석] 다음과 같이 널 안전 CHAPTER 2 을 수행 할 수있는 일반적인 관용구입니다 .

attribs.something = ""+entry.Properties["something"].Value;

entry.Properties["something"].Value이다 null,이 조용히 빈을 반환합니다 string.

편집 : C # 6부터 ?.연산자를 사용 null하여 더 간단한 방법으로 검사 하는 것을 피할 수 있습니다 .

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^

할 수없는 일 :

attribs.something = entry.Properties["something"].Value as string;

attribs.something = String.Format("{0}", entry.Properties["something"].Value);

그래도 성능에 대해 잘 모르겠습니다 ...


RexM의 답변에 대한 변형으로 :

attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()

유일한 단점은 entry.Properties [ "something"]입니다. Value가 null 인 경우에도 attribs.something에 값 (이 예에서는 자체적으로)이 할당됩니다. .something 속성이 다른 처리를 수행하면 비용이 많이들 수 있습니다. 그리고 / 또는이 줄은 (루프처럼) 많이 실행됩니다.


정확히 수행하려는 작업을 수행하려는 경우 항상 도우미 메서드를 사용할 수 있습니다.

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);

void CopyIfNotNull(string src, out string dest)
{
  if(src != null)
    dest = src;
}

이 같은 것을 할 수 어떻게 든 위 데일 레이건의 답변을 하지만, (ToString을 무시) 대신 새로운 NullSafeToString () 메소드를 만드는? 이 (또는 "null"반환)이 기본 동작이되기를 바랍니다. 공용 정적 클래스 ObjectExtensions에 다음 메서드를 추가 할 때 컴파일러 (Visual C # 2010 Express)가 불평하지 않지만 메서드가 호출되지 않습니다.

public static String ToString(this Object obj)
{
    if (obj == null)
    {
        return "null";
    }
    else
    {
        return obj.GetType().Name;
    }
}

attribs.something  = string.Format("{0}",entry.Properties["something"].Value)

C # 6.0에서는 매우 우아한 방식으로 수행 할 수 있습니다.

attribs.something = entry.Properties["something"].Value?.ToString();

그리고 여기에 새로운 null 조건부 연산자 에 대한 기사가 있습니다.


다음과 같은 보조 방법을 사용하는 것은 어떻습니까?

attribs.something = getString(
    entry.Properties["something"].Value, 
    attribs.something);

static String getString(
    Object obj,
    String defaultString)
{
    if (obj == null) return defaultString;
    return obj.ToString();
}

또는 ??연산자를 사용할 수 있습니다 .

attribs.something = 
    (entry.Properties["something"].Value ?? attribs.something).ToString();

( ToString()값이 이면 호출에 유의하십시오. null)

참고 URL : https://stackoverflow.com/questions/550374/checking-for-null-before-tostring

반응형