CA1047'使成员提升私有,公共或内部'和C ++ / CLI事件

时间:2010-12-02 15:44:21

标签: c++-cli fxcop

当我在密封的C ++ / CLI类中声明公共事件时,我收到代码分析警告CA1047。警告似乎来自自动生成的受保护成员函数。我该如何修复此警告?

这是一个例子。这段代码

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

产生

  

警告:CA1047:Microsoft.Design:使成员'Test :: blah :: raise(Object ^,EventArgs ^)'私有,公共或内部

1 个答案:

答案 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]属性。