2010-04-13 6 views
2

이것은 대부분 호기심에서 벗어나 잠재적으로 어리석은 질문입니다. :) 메소드 인수에 대한 검사를 더 빠르게 수행

내가하는 방법과 같이 있습니다 : 인수의

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    // some magic here 
} 

없음 null이 될 수 없다, 그리고 문자열 인수 중 어느 것도 String.Empty와 다를 수 있습니다. 단지 모든 문자열 인수를 확인하는 빠른 방법이

if(arg1 == string.Empty || arg1 == null) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

대신 내

은의 큰 목록을 가지고?

제 질문에 명확하지 않은 경우 사과드립니다.

감사합니다.

+0

합니다. 내 책에서는 메소드 시그니처의 인수에 사용할 "심볼"을 정의 할 수 있다면 좋을 것입니다. 그래서 우리는 null이 아닌 empty의 체크를 심볼에 할당하고, 메소드 시그니처에서 C#으로 자동 검사를하고 예외를 던지는 MyMethod (string! myArg)가 될 수 있습니다. 물론 지금은 방법으로이 작업을 수행 할 수 있지만, 서명에 사용할 수있는 심볼을 할당 할 수 있다면 타이핑하는 것이 훨씬 더 빠를 것입니다! 생각? – AndrewC

답변

7

당신이 만들거나 사용하는 프레임 워크이 방법의 계약을 확인하기 위해, 예를 들어, Code Contracts.

또한 인자 확인 로직을 캡슐화하는 ThrowIfNullOrEmpty과 같은 다양한 유틸리티 메소드를 생성 할 수 있습니다.

+0

감사합니다. 이걸 보면서! – AndrewC

3
if (string.IsNullOrEmpty(arg1)) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

또한 .NET에서 code contracts가 4

4

당신은 String.IsNullOrEmpty를 사용할 수 있습니다

if (String.IsNullOrEmpty(arg1)) 
    throw new ArgumentException("issue with arg1"); 

당신이 프레임 워크 4에있어 경우 String.IsNullOrWhiteSpace 방법은 (아마도 당신은 또한 누군가가 문자열이 공백 포함와 메소드를 호출하는 경우 던져 할 수도있다 만).

유틸리티 메서드를 사용하여 인수를 확인하고 throw 할 수 있지만 가장 짧은 표기법입니다. C#에서는 컴파일러에게 표현할 수있는 구문이 없으며 null을 사용할 수없고 언어가 예외를 throw하도록 허용합니다.

프레임 워크 4를 사용하면 CodeContracts이되지만이를 사용하는 구문은 메소드 호출로 남아 있습니다.

+1

더 멋진 방법이 있는지 궁금합니다. 큰 소리로 생각해보십시오. 그러나 C#이 null이거나 비어있는 경우 C#이 자동으로 인수 예외를 throw하도록 메서드 시그너처의 인수에 추가 할 수있는 간단한 형식의 표기법이 있으면 멋질 것입니다. – AndrewC

0

글쎄, 우선, if (!String.IsNullOrEmpty(arg1))을 사용하여 if 표현식을 줄일 수 있습니다.

둘째, 릴리스 빌드에서 인수 검사가 필요하거나 디버그 빌드에서 arg 검사를 수행하는 것으로 충분합니까? 그것은 데이터의 출처에 달려 있습니다. 이 함수가 자신의 코드에 의해 호출되고 args가 호출 코드에 의해 처리된다면 디버그 빌드에서만 args를 검사하면 충분할 것입니다. 이 경우 Debug.Assert(!String.IsNullOrEmpty(arg1), "msg"); 등을 사용하십시오. 어설 션은 릴리스 빌드에서 제거됩니다.

셋째, 여기에 진짜 문제는 당신의 방법은 너무 많은 인수를 가지고 있다는 것입니다 DevLabs: Code Contracts

3

을 확인하십시오. 따라서 인증 코드를 작성하기가 쉽지 않습니다. 클라이언트 코드에서도 다루기가 어렵습니다. 지금 전달하는 인수가 속성 인 도우미 클래스 작성을 고려하십시오. 이제 메소드에는 단 하나의 인수 만 사용할 수 있습니다. 그리고 유효성 검사는 메소드 대신 클래스 자체에서 수행 할 수 있습니다.

프레임 워크에서이 패턴의 표준 예는 Process 클래스입니다.ProcessStartInfo 도우미 클래스는이를 사용할 수 있도록 유지합니다.

3

이것에 대한 유창 인터페이스 제공 CuttingEdge.Conditions라는 멋진 라이브러리있다 다음을 포함하여 점검 범위 번호를 확인 그것은 널 (null) 검사를 포함한 검증의 모든 종류에 대한 형태 보증 조건을 제공

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    Condition.Requires(arg1, "arg1").IsNotNull().IsNotEmpty().StartsWith("Foo"); 
} 

을, 문자열 (StartsWith) 등 ... 매개 변수에 대한 여러 검사가있는 경우 유효성 검사를 크게 단축하고 단순화 할 수 있으며 가장 중요한 것은 응용 프로그램 전체에서 인수 검사 및 예외를 일관되게 유지하는 것입니다.

+0

참 좋은 라이브러리 – sll

-1

지금까지 내가 귀하의 질문에, 어떻게 그것에 대해 이해할 수로 : 나는 조금보고 정말 답 아니므로 내가 주석으로이 게재됩니다 했어

static void Main(string[] args) 
{ 
    Test(null, "", "", ""); 
} 

static void Test(MyClass arg1, params string[] args) 
{ 
    if (args.Count(a => String.IsNullOrEmpty(a)) == args.Length) 
    { 
     throw new Exception("All params are null or empty"); 
    } 
} 
+1

if (args.Any (a => a == null || (a는 string &&! string.IsNullOrEmpty (a))) {throw new Exception ("No param can null이든 비어 있어도됩니다. ")}'? – ANeves

+0

@sr pt : 고마워! – abatishchev

관련 문제