短暂的事件处理程序有什么问题吗?

Rya*_*hel 5 c# events

例如,这样的事情有什么问题吗?

private void button1_Click(object sender, EventArgs e)
{
    Packet packet = new Packet();

    packet.DataNotSent += packet_DataNotSent;

    packet.Send();
}

private void packet_DataNotSent(object sender, EventArgs e)
{
    Console.WriteLine("Packet wasn't sent.");
}

class Packet
{
    public event EventHandler DataNotSent;

    public void Send()
    {
        if (DataNotSent != null)
        {
            DataNotSent(null, EventArgs.Empty);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它只是一个简单的整数变量声明它会没问题,因为一旦它超出范围,后来被垃圾收集器收集,但事件有点......更长寿?我是否必须手动取消订阅或采取任何措施以确保其正常工作?

它只是感觉......很奇怪.不确定它是否正确.通常当我添加到事件处理程序时,它会持续整个应用程序,所以我不确定在不断添加和删除事件处理程序时会发生什么.

svi*_*ick 6

从技术上讲,这段代码没有任何问题.由于packet在方法完成后将不会有任何引用,因此也将(最终)收集订阅.

作为一种风格问题,我认为这样做非常不寻常.更好的解决方案可能是从中返回某种结果Send()并将其作为基础.顺序代码更容易理解.