2010-12-02 21 views
0

當我在封閉的C++/CLI類中聲明一個公共事件時,我得到代碼分析警告CA1047。警告似乎來自自動生成的受保護成員函數。我如何解決這個警告?CA1047'Make member raise private,public or internal'and C++/CLI events

下面是一個例子。此代碼

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

產生:

警告:CA1047:Microsoft.Design:請會員 '測試::胡說::加薪(對象^,^ EventArgs的)' 公營,私營,或內部

+0

你能舉一個最簡單的例子嗎? – 2010-12-02 18:36:14

回答

1

我會更好地記錄這個問題。此代碼

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

產生:

警告:CA1047:Microsoft.Design:請會員 '測試::胡說::加薪(對象^,^ EventArgs的)' 公營,私營,或內部

是的,當你沒有自己指定事件訪問器時,編譯器會爲你生成它們。它會自動生成添加,刪除和提高訪問器。後者看起來是這樣的,當你看與程序Ildasm.exe:

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

家庭屬性是什麼原因造成的代碼分析警告。自動生成的添加和刪除訪問器當然是公共的。自己編寫它們是一個值得商榷的解決方法,如果您有實際的原因來實現自定義訪問器,則只需要這樣做。樣板版本看起來像這樣:

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); 
     }; 
    } 
}; 

那麼,這肯定會抑制警告。如果不能旋轉螺旋槳,我建議您使用[SuppressMessage]屬性。

+0

在這裏實際需要`raise`訪問器嗎?畢竟,可以直接使用支持屬性,或者可以使用簡單的幫助函數(提供競爭條件避免邏輯)。或者如果沒有明確給出,編譯器會自動生成一個`raise`方法,並且仍然會觸發FxCop? – 2010-12-02 20:13:11

相關問題