不要嵌套类型警告(C#)



我在一个类中有以下代码来设置串行端口偶数处理程序。

我收到两个警告;CA1034(不要嵌套类型),它告诉我将delgate设为私有(这将阻止我在继承类中设置偶数处理程序),以及CA1009(将事件的第二个参数声明为EventArgs,或扩展EventArgs的类型的实例,名为"e"),我不理解。

我的代码低于

myPort.DataReceived += new SerialDataReceivedEventHandler(port_OnDataRecived); //Setup when port is opened
private void port_OnDataRecived(object sender, SerialDataReceivedEventArgs e)
{
        int lengthToRead = myPort.BytesToRead;
        byte[] rxBytes = new byte[lengthToRead];
        myPort.Read(rxBytes, 0, lengthToRead);
        PacketReceived(rxBytes, e);
}
public delegate void PacketReceivedEventHandler(object sender, byte[] packet);
public event PacketReceivedEventHandler OnPacketReceived;
public virtual void PacketReceived(byte[] packet, EventArgs e)
{
        if (OnPacketReceived != null)
        {
            OnPacketReceived(this, packet);                
        }
}

我一直在看MSDN文章和一些SO问题,但我无法将建议的修复与我自己的代码联系起来。这个答案有点道理,但将我的代码转换为

OnPacketReceived(this, packet); 

被取代

handle(this, new PacketReceivedEventHandler();

这需要一个参数CCD_ 1(这就是我陷入困境的地方)。至于试图修复CA1034警告,我甚至不知道我所写的是如何嵌套的类型,MSDN文章也没有包含如何修复规则冲突的示例。

我甚至不知道我写的是如何嵌套类型的

您已经在类中声明了您的委托类型(PacketReceivedEventHandler)。这是一种嵌套在另一种类型中的类型。只需将声明移到现有类声明之外即可。

对于另一个警告,您希望创建一个从EventArgs派生的PacketEventArgs类,并将数据包数据作为一个额外的属性。此时,您可以使用EventHandler<PacketEventArgs>,而根本不声明自己的委托。

另外:

  • 您当前检查处理程序无效性的方法已被破坏,因为它可能在调用之间从非null变为null
  • 通常情况下,该事件将被称为PacketReceived,而您的方法将是OnPacketReceived(并受保护),而不是相反

有了这些,你就会有:

public event EventHandler<PacketEventArgs> PacketReceived;
protected virtual void OnPacketReceived(byte[] packet)
{
    var handler = PacketReceived;
    if (handler != null)
    {
        handler.Invoke(this, new PacketEventArgs(packet));
    }
}

或者在C#中,使用null条件运算符使实现更简单:

public event EventHandler<PacketEventArgs> PacketReceived;
protected virtual void OnPacketReceived(byte[] packet)
{
    PacketReceived?.Invoke(this, new PacketEventArgs(packet));
}

相关内容

  • 没有找到相关文章

最新更新