2009-12-17 4 views
8

나는 다음과 같은 경고를 받고 있어요 (이전 버전의 FxCop) VS2010 베타에서 코드 분석을 실행 한 후 : 외부에서 볼 수있는 방법 'Identity.Identity (WindowsIdentity)'에서검증 C# 기본 클래스 생성자 매개 변수

을, 매개 변수 'windowsIdentity' 의 유효성을 검사하십시오.

생성자는 다음과 같습니다

public class Identity : WindowsIdentity 

내 질문은, 어떻게이 windowsIdentity 매개 변수의 유효성을 검사 할되어 클래스에 대한

public Identity(WindowsIdentity windowsIdentity) 
     : base(windowsIdentity.Token) 
{ 
     init(); 
} 

과 같이 정의? 생성자에서 유효성을 검사하고 예외를 throw해야합니까, 아니면 이것을 호출하는 더 좋은 방법이 있습니까?

답변

12

당신은 정적 메서드에서 유효성을 검사 할 수 있습니다 :

2

기본 클래스 생성자를 호출 할 때 windowsIdentity에 액세스하여 NullReferenceException이 발생할 수 있다고 생각하기 때문에 FXCop에서이 오류를보고한다고 생각합니다.

private static WindowsIdentity ValidateIdentity(WindowsIdentity identity) 
{ 
    if(identity == null) 
     throw new ArgumentNullException("identity"); 
    // possibly some other validation checks here... 

    return identity;   
} 

public Identity(WindowsIdentity windowsIdentity) 
    : base(ValidateIdentity(windowsIdentity).Token) 
{ 
    init(); 
} 

또 다른 방법이하는 것입니다 : 널 (null)에 대한 유효성 검사를 추가 할 수

방법 중 하나는 적절한 조치를 널 (null)에 대한 WindowsIdentity 매개 변수를 확인하고 취할 수있는 클래스에 정적 개인 기능을 추가하는 것입니다 다음과 같이 세 번째 연산자를 사용하여 매개 변수를 확인하십시오.

public Identity(WindowsIdentity windowsIdentity) 
    : base(windowsIdentity == null ? null : windowsIdentity.Token) 
{ 
    init(); 
} 

하지만 실제로해야 할 일은 무엇이라고 생각하십니까? 단순히 예외를 던지려는 경우, 인수가 null 인 경우 이미 NullReferenceException을 통과 할 것이므로 코드를 그대로 두는 것이 좋습니다.

1

NULL을 windowsIdentity로 전달하면 생성자가 기본 클래스로 연결될 때 null 참조 예외가 발생하므로 불평합니다.

가장 좋은 방법은 디자인에 따라 다릅니다.

:base(windowsIdentity == null ? null : windowsIdentity.Token) 

을 또는 당신은 매개 변수로 WindowsIdentity 소요 기본 클래스 생성자에서 다른 생성자를 만들 수있는, 그 생성자는 검증의 그 부분을 가지고 이 같은 널 위해 그것을 확인할 수 있습니다. 기본적으로 귀하의 상황에 가장 잘 맞는 것을 사용하십시오.

0

FX 경찰은 말하고있다

public Identity(WindowsIdentity windowsIdentity) 
     : base(GetToken(windowsIdentity)) 
{ 
     init(); 
} 

static Token GetToken(WindowsIdentity ident) 
{ 
    if(ident == null) 
     throw new ArgumentNullException("ident"); 

    return ident.Token; 
} 

(나는 WindowsIdentity.Token의 유형을 찾기 위해 귀찮게하지 않았다,하지만 당신은 아이디어를 얻을) 당신은 매개 변수가 null이 될 수 없다. 그래서 당신이 정말로 그것을 필요로한다면 어떻게 든 그것의 유효성을 검사해야한다. 당신이 생성자에서 그것을 사용하고 있기 때문에, 당신은 아마도 null과 다른 값을 원할 것입니다. 그래서 여러분은 FX cop stop이 당신을 성가 시게하는 것을 검증해야합니다.

null로 생성자가 필요한 경우, 매개 변수가없는 생성자.

사용하지 않거나 다른 지점에서 유효성을 검사하는 경우 경고를 건너 뛸 수 있습니다.

FXcop의 문제를 피하려면 ArgumentNullException을 던져야합니다.

public Identity(WindowsIdentity winIdentity) 
    : base(winIdentity?.Token ?? throw new ArgumentNullException(nameof(winIdentity))) 
{ 
    init(); 
} 
:
관련 문제