2010-12-02 2 views
0

밀폐 된 C++/CLI 클래스에서 공개 이벤트를 선언 할 때 코드 분석 경고 CA1047이 표시됩니다. 이 경고는 자동 생성 된 보호 된 멤버 함수에서 오는 것으로 보입니다. 이 경고는 어떻게 수정합니까?CA1047 '멤버를 개인, 공개 또는 내부로 올리기'및 C++/CLI 이벤트

다음은 예입니다. 이 코드

ref class Test sealed { 
public: 
    event EventHandler^ blah; 
}; 

를 생성 :

경고 : CA1047 : Microsoft.Design : 회원 확인 '테스트 :: ㅋ :: 인상 (객체 ^있는 EventArgs을 ^)을'공공 민간 또는

내부
+0

최소한의 예를 보여줄 수 있습니까? –

답변

1

나는 더 나은 질문을 문서화합니다. 이 코드

ref class Test sealed { 
public: 
    event EventHandler^ blah; 
}; 

를 생성 :

경고 : CA1047 : Microsoft.Design : 회원 확인 '테스트 :: ㅋ :: 인상 (객체 ^있는 EventArgs을 ^)을'공공 민간 또는

내부

예, 이벤트 접근자를 지정하지 않으면 컴파일러에서 자동으로 생성합니다. 그것은 add, remove 및 raise 접근자를 자동으로 생성합니다.

.method family hidebysig specialname instance void 
     raise_blah(object value0, 
        class [mscorlib]System.EventArgs value1) cil managed 
{ 
    // etc.. 
} 

가족 속성은 코드 분석 경고를 일으키는 것입니다 : 당신이 Ildasm.exe를 함께 볼 때 후자의 하나는 다음과 같습니다. 자동으로 생성 된 추가 및 제거 접근자는 물론 공개됩니다. 직접 작성하는 것은 의심스러운 해결 방법입니다. 사용자 정의 접근자를 구현해야하는 진정한 이유가있는 경우에만이 작업을 수행하고 싶을 것입니다. 상용구 버전은 다음과 같습니다.

using namespace System::Runtime::CompilerServices; 

ref class Test sealed { 
private: 
    EventHandler^ foo; 
public: 
    event EventHandler^ blah { 
     [MethodImpl(MethodImplOptions::Synchronized)] 
     void add(EventHandler^ d) { foo += d; } 
     [MethodImpl(MethodImplOptions::Synchronized)] 
     void remove(EventHandler^ d) { foo -= d; } 
    private: 
     void raise(Object^ sender, EventArgs^ e) { 
      EventHandler^ handler = foo; 
      if (handler != nullptr) handler(sender, e); 
     }; 
    } 
}; 

글쎄, 분명히 경고가 표시되지 않습니다. Propeller를 회전시키지 않으면 [SuppressMessage] 속성을 사용하는 것이 좋습니다.

+0

'raise '접근자가 실제로 여기에 필요합니까? 결국, 뒷받침 속성을 직접 사용할 수도 있고 간단한 도우미 기능을 사용하여 (경쟁 조건 회피 논리를 제공 할 수도 있습니다). 또는 명시 적으로 아무 것도 지정되어 있지 않고 여전히 FxCop을 트리거하면 컴파일러는 자동으로'raise' 메소드를 생성합니까? –

+0

예, 두 번째 부분입니다. –

+0

자동 코드 생성이 적절하지 않은 경우 인상시 적절한 접근자를 설정할 수 없습니다. – Eric