.net 空委托会消耗内存吗?

.net 空委托会消耗内存吗?,.net,events,memory-management,delegates,.net,Events,Memory Management,Delegates,在上面的代码中,我用一个空委托初始化了登录事件处理程序。 这会影响内存空间的使用吗?特别是当有成百上千的事件以这种方式被宣布时?请划掉前面的答案(为后代保留在下面)。这取决于编译器的实现,但在当前的MS C#3.0编译器下,这实际上只创建一个实例,每个实例都可以重用。它之所以能够做到这一点,是因为委托是不可变的,并且该委托不需要来自实例的任何信息 不过,我不知道C#2.0的情况是否如此。您可以反编译代码,查看IL是否实际使用缓存字段。使用下面的答案是一种安全的方法,可以保证您只创建一个实例 原始

在上面的代码中,我用一个空委托初始化了
登录
事件处理程序。


这会影响内存空间的使用吗?特别是当有成百上千的事件以这种方式被宣布时?

请划掉前面的答案(为后代保留在下面)。这取决于编译器的实现,但在当前的MS C#3.0编译器下,这实际上只创建一个实例,每个实例都可以重用。它之所以能够做到这一点,是因为委托是不可变的,并且该委托不需要来自实例的任何信息

不过,我不知道C#2.0的情况是否如此。您可以反编译代码,查看IL是否实际使用缓存字段。使用下面的答案是一种安全的方法,可以保证您只创建一个实例

原始答案:

是的,它创建委托的实例。那需要一些记忆。但你可以减少这一点:

public sealed class FtpManager
{
    public event EventHandler LoggingIn = delegate { };
    private void OnLoggingIn(object sender, EventArgs e)
    {
        var handler = LoggingIn;
        handler(sender, e);
    }
// ...
}

在这一点上,只有一个实例,您可以从任何地方引用它。缺点是其他类可以使用相同的处理程序取消订阅。如果您相信代码库的其余部分不会这样做,那么从内存的角度来看,这可能是最好的选择。

这样做的另一种选择是在每次需要提高时检查登录是否为空。这可能比调用一个空委托更占用内存。

哇,我认为我的应用程序在内存使用率高的情况下疯狂运行的部分原因可能是因为我一直在用一个空委托声明事件。。。;再次感谢,Jon@Sung例如我完全改变了我的答案。将返回并编辑以放置以前的版本@宋:好的,它现在明显更完整了。你应该能够通过反编译你的应用程序来检查这是否是你的问题。Reflector在这方面很好,但是你需要查看IL来确定到底发生了什么。你是否运行过任何测试来支持这一点,或者只是一个假设?没有。我只是指出了一个限制因素。如果您想要测试,您可以像其他人一样轻松地编写它们。不要忘记所涉及的额外方法调用。您将调用事件处理程序和通过匿名委托指定的空方法。我没有运行任何测试,但你至少应该知道。。。
public static class EventHandlers
{
    public static readonly EventHandler Empty = delegate {};
}

public sealed class FtpManager
{
    public event EventHandler LoggingIn = EventHandlers.Empty;
}