2011-12-16 6 views
1

의 우리는 우리가 무엇을이 트릭에 대해 뭔가에 null을 지정하려고하면 던져한다고 가정하자문법 설탕

public static class ExceptionExtension 
    { 
     public static T Throw<T>(this Exception exc) 
     { 
      throw exc; 
     } 
    } 

우리는 다음과 같은 예를 들어 사용할 수 있습니다

return possibleNull ?? new Exception("Unspecified something....").Throw<string>(); 

좋은/최악의/쓸모없는 연습이라고 생각합니까?

답변

5

나에게 이해가되지 않습니다. ?? 연산자의 두 번째 인수가 같은 형식의 possibleNull이 될 것으로 기대합니다.

나는 차라리 볼 것이다 :

if(possibleNull == null) 
{ 
    throw new Exception("Unspecified something...."); 
} 

return possibleNull; 
+0

예 Oded는 그것이 트릭이며, 그것은 나에게 좋을 것 같지만, 단지 다른 의견을 원합니다, 감사합니다! (+1) 나는 당신의 대답을 표시하기 전에 다른 사람들을 기다린다. –

+0

@FelicePollano - 이해합니다. 코드를 작성할 때 염두에 두어야 할 몇 가지 사항이 있습니다 (다른 사람들이 읽으므로). 1. [놀랍지 않은 원칙] (http://en.wikipedia.org/wiki/Principle_of_least_astonishment). 2.이 인용구 : "코드를 유지하는 사람이 살고있는 곳을 아는 폭력적인 정신병자 인 것처럼 항상 코드하십시오." John F. Woods. – Oded

+0

괜찮음 인용문 2) 답장으로 귀하의 것을 표시하도록 유도했습니다.) –

2

당신은 항상 짧은라는 이름의 정적 헬퍼 클래스의 일종에 대항 할 수있는 :

public static class Never 
{ 
    public static T Null<T>(T value) 
     where T : class 
    { 
     if (value == null) throw new ArgumentNullException(); 
     return value; 
    } 
} 

myClass.AProperty = Never.Null(somePotentiallyNullValue); 

귀하의 다른 예를 훨씬 이해가되지 것입니다, 나는 그것을 "쓸모없는"습관이라고 부르기로했다.

도우미 클래스에 약간의 "유창함"을 추가하는 것은 상황을보다 쉽게 ​​읽을 수있게 만드는 경향이 있습니다.

http://en.wikipedia.org/wiki/Fluent_interface

+0

이 경우 컴파일 할 수 없습니까? –

+0

@FelicePollano the return val ?? 던져 새' –

+0

그것은 일반으로 반환을 지정할 수 있기 때문에 컴파일 : 불행히도 그것은 유추 수 없습니다. –

2

내가 좋은 연습을 고려하지 않을이

public static class ThrowHelper 
{ 
    public static TException ThrowIfNull<TException>(object value) 
     where TException : Exception, new() 
    { 
     if (value == null) //or other checks 
     { 
      throw new TException(); 
     } 
    } 
} 
+0

+1 의견 감사합니다 –

2

처럼 을 던졌습니다 정적 헬퍼 클래스의 어떤 종류를 만들기 위해 더 많은 읽을 수 있습니다.

먼저 확장 메소드 자체는 이미 throw에 대한 키워드가있는 메소드를 소개합니다. 혼란 스러울 수 있습니다. 반환 값의 타입을 선언 합니다만, 값을 돌려주지는 않습니다. 다만, 컴파일러를 사용하고 싶은 문맥에서 컴파일러를 기쁘게하기 위해서입니다. 다른 사람들이 이미 지적한 것을 참고하면, 그것은 오히려 "가장 놀랄만 한 원리"입니다.

그런 다음이 방법을 사용하는 방법을 살펴보면 결과 코드가 읽히지 않을 것 같습니다. 더욱 나쁜 점은 표현식에서이 접근법을 사용할 수 있다는 것입니다. 따라서 어떤 방식 으로든 객체를 사용하는 코드로 끝나기를 원할 것입니다 (예 : 반환). 동일한 행에서 부작용으로 null을 검사합니다 . 내가 명시 적으로 null을 확인하고 뭔가 다른 혼합하지 않는 것이 좋습니다. CuttingEdge.Conditions과 같은 라이브러리를 사용하면 입력해야하는 코드의 양을 줄일 수 있습니다. 당신은이 방법으로 당신의 예에서 그것을 사용할 것입니다.

Condition.Requires(possibleNull , "possibleNull ").IsNotNull(); 
return possibleNull; 
+0

+1 의견 감사합니다 –