不要嵌套类型警告 (C#)
Do not nest type warning (C#)
我在 class 中有以下代码来设置串行端口偶数处理程序。
我收到两个警告; CA1034(不要嵌套类型),它告诉我将委托设为私有(这将阻止我在继承的 classes 中设置偶数处理程序)和 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 问题,但我无法将建议的修复与我自己的代码联系起来。
This answer 有点道理,但将我的代码转换成看起来会导致
OnPacketReceived(this, packet);
被替换为
handle(this, new PacketReceivedEventHandler();
需要一个参数 (void (object, byte[]) target)
(这就是我卡住的地方)。至于尝试修复 CA1034 警告,我什至看不出我写的是嵌套类型,而且 MSDN 文章不包含如何修复违反规则的示例。
I don't even see how what I have written is a nested type
您已在 class 中声明了委托类型 (PacketReceivedEventHandler
)。那是一种嵌套在另一种类型中。只需将声明移到现有 class 声明之外。
对于另一个警告,您需要创建一个从 EventArgs
派生的 PacketEventArgs
class 并将数据包数据作为额外 属性 包含。那时,您可以使用 EventHandler<PacketEventArgs>
而根本不声明您自己的委托。
另外:
- 您当前检查处理程序是否为空的方法已损坏,因为它可能会在两次调用之间从 non-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# 6 中,使用 null 条件运算符使实现更简单:
public event EventHandler<PacketEventArgs> PacketReceived;
protected virtual void OnPacketReceived(byte[] packet)
{
PacketReceived?.Invoke(this, new PacketEventArgs(packet));
}
我在 class 中有以下代码来设置串行端口偶数处理程序。
我收到两个警告; CA1034(不要嵌套类型),它告诉我将委托设为私有(这将阻止我在继承的 classes 中设置偶数处理程序)和 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 问题,但我无法将建议的修复与我自己的代码联系起来。 This answer 有点道理,但将我的代码转换成看起来会导致
OnPacketReceived(this, packet);
被替换为
handle(this, new PacketReceivedEventHandler();
需要一个参数 (void (object, byte[]) target)
(这就是我卡住的地方)。至于尝试修复 CA1034 警告,我什至看不出我写的是嵌套类型,而且 MSDN 文章不包含如何修复违反规则的示例。
I don't even see how what I have written is a nested type
您已在 class 中声明了委托类型 (PacketReceivedEventHandler
)。那是一种嵌套在另一种类型中。只需将声明移到现有 class 声明之外。
对于另一个警告,您需要创建一个从 EventArgs
派生的 PacketEventArgs
class 并将数据包数据作为额外 属性 包含。那时,您可以使用 EventHandler<PacketEventArgs>
而根本不声明您自己的委托。
另外:
- 您当前检查处理程序是否为空的方法已损坏,因为它可能会在两次调用之间从 non-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# 6 中,使用 null 条件运算符使实现更简单:
public event EventHandler<PacketEventArgs> PacketReceived;
protected virtual void OnPacketReceived(byte[] packet)
{
PacketReceived?.Invoke(this, new PacketEventArgs(packet));
}