C++ cli CA1047';让会员募集私人、公共或内部资金';和C++/CLI事件

C++ cli CA1047';让会员募集私人、公共或内部资金';和C++/CLI事件,c++-cli,fxcop,C++ Cli,Fxcop,当我在密封的C++/CLI类中声明公共事件时,我得到代码分析警告CA1047。警告似乎来自自动生成的受保护成员函数。如何修复此警告 这里有一个例子。此代码 ref class Test sealed { public: event EventHandler^ blah; }; ref class Test sealed { public: event EventHandler^ blah; }; 生成: 警告:CA1047:Microsoft.Design:Make成员“Te

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

这里有一个例子。此代码

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

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


我将更好地记录这个问题。此代码

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

警告:CA1047:Microsoft.Design:Make成员“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..
}
族属性是导致代码分析警告的原因。自动生成的添加和删除访问器当然是公共的。自己编写它们是一个值得商榷的解决方法,只有在真正有理由实现自定义访问器的情况下,您才真正想这样做。样板版本如下所示:

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]属性不会使螺旋桨旋转,我建议您使用它。

您能举一个简单的例子吗?这里确实需要使用
提升
访问器吗?毕竟,backing属性可以直接使用,也可以使用简单的helper函数(提供争用条件避免逻辑)。或者,如果没有明确给出任何方法,编译器是否会自动生成
raise
方法,并且仍然触发FxCop?糟糕的是,自动代码生成不够智能,无法在raise上设置适当的访问器。