【问题标题】:CA1047 'Make member raise private, public, or internal' and C++/CLI eventsCA1047“使成员引发私有、公共或内部”和 C++/CLI 事件
【发布时间】:2010-12-02 15:44:21
【问题描述】:

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

这是一个例子。这段代码

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

生成:

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

【问题讨论】:

  • 你能举个小例子吗?

标签: c++-cli fxcop


【解决方案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] 属性,如果它不能旋转你的螺旋桨。

【讨论】:

  • 这里真的需要raise 访问器吗?毕竟,支持属性可以直接使用,也可以使用简单的辅助函数(提供竞争条件避免逻辑)。或者如果没有明确给出,编译器会自动生成raise 方法,并且仍然触发FxCop?
  • 太糟糕了,自动代码生成不够智能,无法在 raise 时设置适当的访问器。
猜你喜欢
  • 2014-06-03
  • 2016-07-31
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多