2009-07-10 5 views
17

은 내가 문자열 인수의 유효성을 검사하는 코드를 작성했다 얼마나 많은 수없이 모르는 :C# : 인수 확인 : 널 (null)/빈 문자열

public RoomName(string name) 
{ 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentException("Cannot be empty", "name"); 
    } 
} 

이를 방지하려면 어쨌든 있나요? 일부 속성 또는 이것을 피하기위한 계약 방식의 메커니즘이 있습니까? 말할 수있는 방법이 없습니까 :

public RoomName(NotNullOrEmptyString name) 
{ 

실제로 그 유형을 만들 필요가 없습니까?

+0

이 링크는 [속성 및 메서드 차단을 사용한 인수 유효성 검사]에서 찾을 수 있습니다 (http://www.codinginstinct.com/2008/05/argument- validation-using-attributes.html) 유용 – Joe

답변

7

속성을 사용하여 코드 삽입을 통해이를 수행 할 수 있습니다.

코딩 시간을 절약 할 수 있지만 여전히 많은 제어를 제공하는 또 다른 옵션은 CuttingEdge.Conditions과 같은 것을 사용하는 것입니다. 이 인수 검사에 대한 유창 인터페이스를 제공합니다, 그래서 당신은 쓸 수 있습니다 : 문제는 얼마 전에 대답하고있다

name.Requires().IsNotNull(); 
1

하지만, 요즘 같은 문제에 대해 생각하고있다. 공식화 된 코드 계약 (자동 검증 또는 확인)은 좋은 생각 인 것 같지만 일반적으로 검증 기능은 매우 제한적이며 null 또는 빈 문자열 검사와 같은 간단한 검사에는 많은 코드가 필요합니다.) 구식 수표보다.

역설적이게도, 문자열 케이스에 대한 제 생각으로는 null, 공백 또는 공백이 아닌 문자열을 감싸는 하나 또는 두 개의 클래스가 가장 적합합니다.

public class NonEmptyString : IComparable<NonEmptyString>, ... 
{ 
    private readonly string _value; 

    public NonEmptyString(string value) 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException("value"); 
     } 
     if (value.Length == 0) 
     {     
      throw NewStringIsEmptyException("value"); 
     } 
     _value = value; 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 

    ... 
} 

public class NonWhiteSpaceString : NonEmptyString 
{ 
    .... 
} 

물론, 이러한 경우 주위에 전달하는 것은 그들 자신을 null로되어 있는지 확인하는 데에 방해가되지 않지만, 몇 가지 큰 장점이있어 :

  • 당신은 비어 있거나 화이트 - 확인 필요는 없습니다 문자열이 반복되는 상황에서 오류가 발생할 수있는 공간 문자열 많이 지나친 다.
  • 구현에서 수행 한 것처럼 null을 검사하는 것은 빈 값 (또는 공백 값)을 검사하는 것과는 다르다. 왜냐하면 전자의 경우 특정 ArgumentNullException을 던지고 두 번째 경우 ArgumentException을 던지기 때문이다.
  • 모든 줄 바꿈 클래스가하는 것처럼 문자열의 값에 대한 제약을 분명히 알립니다. 사실 제약 조건이있는 문자열을 많이 전달하면 그 코드를 검사를 캡슐화하는 클래스에 랩핑하고 나머지 코드를 문제없이 유지하는 것이 좋습니다. 좋은 예가 특정 정규 표현식을 만족해야하는 문자열입니다. 그러나 여기에 질문에서 전환하고 있습니다 ...
+1

당신의 솔루션에 매개 변수 이름의 일부 추적을 추가해야 할 것 같아요. 왜냐하면'frob (string foo, string bar)'를'frob (null, "값")'이라고 불렀고'System.ArgumentNullException : 값을 null 일 수 없다. '라는 에러 메시지를 얻었을 때 대부분 혼란 스럽기 때문이다. 매개 변수 이름 : value' 대신 System.ArgumentNullException : 값을 null로 설정할 수 없습니다. 매개 변수 이름 : foo' –