문제

나는 공장과 같은 대상의 방법이 있습니다. 유형을 제공하고 인스턴스를 생성하고 몇 가지 다른 작업을 수행합니다. (내 의견으로는) 우아한 방법은 다음과 같습니다.

public T MagicMethod<T>() where T: SomeBaseClass
{
    // Magic goes here
}

그러나 이것은 이것이 나쁜 스타일이라고 말하는 FXCOP를 화나게합니다. "CA1004 : 일반 방법은 유형 매개 변수를 제공해야합니다"경고를 제공합니다. 추론과 물건을 사용하지 않는 것에 관한 것. 제가 생각할 수있는 유일한 방법은 다음과 같습니다.

public SomeBaseClass MagicMethod(Type T)
{
    // Same magic goes here
}

나는 이것이 많은 계정에서 첫 번째 방법보다 열등하다고 생각하지만 스타일 규칙 ... 경고에 관한 MSDN 기사는 그것을 억제 할 이유가 없다고 말합니다.

결국이 경고를 억제하여 제대로하고 있습니까?

도움이 되었습니까?

해결책

FXCOP 경고는 그저 경고입니다. 암시 적 캐스트 경고와 마찬가지로, 그들은 당신이하고있는 일이 당신이 기대하지 않는 행동을 가질 수 있거나 의도하지 않았을 수도 있음을 알려줍니다.

암시 적 캐스트 경고는 코드를보고, 실제로 그렇게하려고했는지 결정하고, 그렇다면 명시적인 캐스트를 추가함으로써 처리됩니다.

fxcop도 마찬가지입니다. 경고를보고 코드를보고 경고가 유효한지 확인하십시오. 그렇다면 고치십시오. 그렇지 않다면 억제하십시오. 억압은 명백한 캐스트와 동일합니다. "예, FXCOP, 나는 이것을하고 싶다고 확신합니다."

실제로 오류라면 컴파일러 오류 일 것입니다.

다른 팁

나는 당신이 FXCOP가 당신에게 말하는 것을 오해하고 있다고 생각합니다. 아마도 문구가 이상적이지 않기 때문일 것입니다. 그것이 의미하는 바는 것입니다 일반적인 방법은 매개 변수를 제공해야합니다 그런 유형입니다, 일반적인 방법에 런타임을 제공하는 비 게 니체 과부하가 있어야하는 것은 아닙니다. Type 사례. 예를 들어,

public void DoSomething<T>(T myParam);

그만큼 myParam 참조하는 매개 변수입니다. 그것이 원하는 이유는 당신이 제안한 것처럼 추론입니다. 이것은 당신이 같은 일을 할 수 있습니다 ...

string foo = "bar";

DoSomething(foo);

글을 쓰지 않고

DoSomething<string>(foo);

귀하의 경우에는 경고를 억제하는 것이 좋습니다. 원하다 사용자는 유형을 명시 적으로 지정합니다. 그러나 (생성자가 매개 변수가 없다고 가정 함) 당신이 당신의 변화를 제안합니다 where 에게 where T : SomeBaseClass, new(). 이는 컴파일러가 전달되는 유형에 매개 변수가없는 생성자가 있어야하도록 지시한다는 것을 의미합니다. 이것은 또한 당신이 할 수 있음을 의미합니다 new T() 코드에서.

이 경고를 억제하는 데 아무런 문제가 없습니다. 우선 MS 자체 코드의 동등한 것은 Activator.CreateInstance<T>()

public static T CreateInstance<T>()

분석 규칙이 반환 유형 이 방법의는 일반 매개 변수로 덮여 있습니다 ...

이것은 이전에 여러 곳에서 언급되었습니다.

그리고 규칙에는 이전 버그가 있습니다.

public static void GenericMethod<T>(List<T> arg);

이전에는 그것을 트리거 할 것입니다 (2005 년 SP1에 수정되었습니다).

특정 예제에 대한 Connect 버그를 제출하는 것이 좋습니다.

FXCOP는 "스트리핑"되지 않은 경우 하나 이상의 인수에 일반 유형 매개 변수를 사용하더라도 해당 경고를 해제합니다.

public void LinkedList<T> Slice<T>(LinkedList<T> collection, Predicate<T> match)
{
    ...
}

이 서명과의 방법으로 요즘 'CA1004'오류가 발생했습니다.

FXCOP 팀보다 더 똑똑한 경우, 규칙이 모든 경우에 코드를 올바르게 결정할 수 있는지 확신하지 못합니다. 이것이 신뢰 수준의 것입니다. :)

두 번째 접근법은 첫 번째 접근법과 동일하지 않습니다. 두 번째로, 당신은 문자 그대로 유형이 주어 지지만 그 유형의 객체를 인스턴스화 할 수는 없습니다 (반사를 사용하지 않는 한 --- eeek!). 시작).

보다 이것 그것을 억제하는 것에 대한 참고 사항. 억압해도 괜찮은 것 같습니다.

편집하다: 이제 또 다른 아이디어가 있습니다. 'Out'매개 변수로 변경하고 반환 변수를 통해 반환하지 않으면 어떻게됩니까? 그러면 경고를 제거할까요?

public void MagicMethod<T>( out T retVar ) where T: SomeBaseClass
{
    // Magic goes here
}

개인적으로 나는 FXCOP에서 대부분의 경고를 귀찮게 할 것입니다.

당신은 당신이 무엇을하고 있는지 알고있는 것 같습니다. 왜 자동화 된 소프트웨어 조각이 더 잘 알 수 있습니까?

글쎄, 그것은 할 수 없다, 그것은 추측이다.

우선 그 경고는 발신자가 모든 것을 고의적으로 수행하도록하는 것입니다. 컴파일러는 미리 객체의 유형을 알고 있으므로 유형 매개 변수를 전달하지 않고 메소드를 호출 할 수 있습니다. FXCOP는 제네릭 및 비 게릭 오버로드를 사용하기위한 구문이 동일하게 보이도록 암시 적으로 말하고 있습니다 (나는 해당 원칙에 동의하지 않지만 개인적이고 여기서는 관련이 없습니다).

둘째, 두 번째 방법은 지금 생각할 수있는 것보다 더 많은 피해를 입힐 것입니다. 컴파일 시간 유형 확인이 없으므로 사용하면 런타임이 유효하지 않은 캐스트 예외에 대해 경고하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top