2015-01-02 4 views
2

내 전화는, 예를 들면 예외 하위 요소 중 하나가 null의 경우 확인하지 : customers가 널 (NULL)이 될 수가장 좋은 방법은 던져

var bankacc = workReport.works.customers.bankaccounts.Name; 

works가 널 (NULL)이 될 수 있음을 의미 bankaccounts는 null도 가능 . null인지 아닌지 각각을 확인하고 싶지 않습니다. 전체 문장을 검사하기 위해 어떤 방법을 사용할 수 있습니까? null이면 빈 문자열을 돌려 줍니까?

편집 :

내가 .NET FM 4.5

+1

당신은 데메테르의 법칙을 체크 아웃 할 수 있습니다. –

+0

기본적으로 이런 종류의 코드를 작성하는 것은 좋지 않습니다. – Mario

+0

".NET 4.5"는 여기에 관련이 없습니다. 실제로 "C# 5"를 사용하고 있습니다.0 " – David

답변

2

나는 그것이 좋은 생각 말하고 있지 않다, 그러나 가능한 솔루션의 - 확장 방법.

public static class MyExtensions 
{ 
    public static TResult IfNotNull<TSource, TResult>(this TSource source, Func<TSource, TResult> function) 
     where TSource : class where TResult : class 
    { 
     if (source == null) 
      return null; 
     return function(source); 
    } 
} 

그리고 사용은 :

var bankacc = workReport.IfNotNull(x => x.works) 
         .IfNotNull(x => x.customers 
         .IfNotNull(x => x.bankaccounts 
         .IfNotNull(x => x.Name) ?? string.Empty; 
+0

좋은 생각이지만, "TResult로 null을 변환 할 수 없습니다." – senzacionale

+1

두 번째 제네릭 제약 조건이 추가되었습니다. – MarcinJuraszek

+0

super, 아마도 내 하루를 저장합니다 : D – senzacionale

2

이것은 null-propogating 구문 사용하고 -는 C# 6.0 사양의 예상 기능 (그리고 밖으로 지금 당신은 VS 2015 베타를 사용하려는 경우)를, 그러나 현재의 사양에는 하나도 없다.

var bankacc = workReport?.works?.customers?.bankaccounts?.Name; 

우아하면서, 또한, 현재 사양 (C# 5.0) 대신 일련의 변수를 사용하는 것입니다 if 문을 사용하여 가장 좋은 방법은 무엇 컴파일러가 일을 끝 : ?.의 새로운 구문을 사용하여 운영자가 ?. 인 경우

또한 가능하지만,이 하지 바람직 사용에 대한 예외임을 주목해야한다 (즉 catch { return null; } 문) 예외가 새롭게 개선 된 C#에서

+0

좋은 힌트지만 여전히 4.5에 있습니다. – senzacionale

+1

@senzacionale 사용중인 C# 버전과 사용중인 .NET 버전은 서로 다른 두 가지입니다. 각각의 최신 (베타 버전이 아닌) 버전은 C# 5.0 및 .NET 4.5이며 C# 5.0 타겟팅을 사용할 수 있습니다 .NET 2.0을 원할 경우 C#은 언어이고 .NET은 해당 언어에서 사용할 수있는 코드 라이브러리입니다. – Servy

1

(예 StackTrace 수집 같은) 상당한 오버 헤드를 초래하기 때문에 6.0, 당신은 null conditional operator하여이 작업을 수행 할 수 있습니다

var bankacc = workReport?.works?.customers?.bankaccounts?.Name; 

if (bankacc == null) 
{ 
    // throw exception 
} 
+0

좋은 힌트지만 아직 4.5에 있습니다. – senzacionale

0

는 C 번호의 현재 버전에서 그렇게 할 수있는 방법이 없습니다. 다음 버전에서 할 수있을 것입니다.

var bankacc = workReport?.works?.customers?.bankaccounts?.Name; 
+0

현재 해결 방법이 있습니까? – senzacionale

+0

아니요, 없습니다. –

0

아니요, 현재 C#의 표현식에 대해 일반적인 "null"검사를 수행 할 수 없습니다.

그러나, 당신은 명시 적으로 생성하는 것 NullReferenceException이 잡을 수 있습니다 : 이것은 정말 좋은 생각입니다

string backacc; 

try 
{ 
    bankacc = workReport.works.customers.bankaccounts.Name; 
} 
catch (NullReferenceException nre) 
{ 
    //Catching because I don't like if statements 
    bankacc = String.Empty; 
} 

하지,하지만 요청으로는 여러에게 if 문을 방지 할 수 있습니다.

+0

그런 예외를 사용하면 기분이 나 빠지게됩니다. – MarcinJuraszek

+0

@MarcinJuraszek 전적으로 동의합니다. if 문만을 사용합니다. 그러나 OP는 그가 그렇게하고 싶지 않다고 말했다. – BradleyDotNET

+0

'NullReferenceException'을 잡기위한 부. –

0

대체 솔루션이지만 유지하기가 어렵 기 때문에 권장하지 않습니다. 나는 BradleyDotNet의 솔루션을 추천 할 것이다.

var bankacc = workReport == null ? string.Empty : workReport.works == null ? string.Empty : workReport.works.customers == null ? string.Empty : workReport.works.customers.bankaccounts == null ? string.Empty : workReport.works.customers.bankaccounts.Name;