当我在密封的C ++ / CLI类中声明公共事件时,我收到代码分析警告CA1047。警告似乎来自自动生成的受保护成员函数。我该如何修复此警告?
这是一个例子。这段代码
ref class Test sealed {
public:
event EventHandler^ blah;
};
产生
警告:CA1047:Microsoft.Design:使成员'Test :: blah :: raise(Object ^,EventArgs ^)'私有,公共或内部
答案 0 :(得分:1)
我会更好地记录这个问题。这段代码
ref class Test sealed {
public:
event EventHandler^ blah;
};
产生
警告:CA1047:Microsoft.Design:使成员'Test :: blah :: raise(Object ^,EventArgs ^)'私有,公共或内部
是的,当您自己未指定事件访问器时,编译器将为您生成它们。它会自动生成添加,删除和提升访问者。当您使用ildasm.exe查看时,后者看起来像这样:
.method family hidebysig specialname instance void
raise_blah(object value0,
class [mscorlib]System.EventArgs value1) cil managed
{
// etc..
}
family 属性是导致代码分析警告的原因。自动生成的添加和删除访问器当然是公共的。自己编写它们是一个值得怀疑的解决方法,如果你有真正的理由来实现自定义访问器,你真的只想这样做。样板版本如下所示:
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]属性。