C# 这些代理被垃圾收集了吗?

C# 这些代理被垃圾收集了吗?,c#,delegates,garbage-collection,C#,Delegates,Garbage Collection,我有一个类,它公开了一个用于“注册”委托的方法(这些委托在以后的过程中被调用)。传递给方法的委托被包装在一个小对象中,然后被添加到字典中。该方法看起来有点像这样:- public void Add(int id, Func<bool> someDelegate) { var wrapper = new MyDelegateWrapper(someDelegate); _wrappers.Add(id, wrapper); // _wrappers is a Dicti

我有一个类,它公开了一个用于“注册”委托的方法(这些委托在以后的过程中被调用)。传递给方法的委托被包装在一个小对象中,然后被添加到字典中。该方法看起来有点像这样:-

public void Add(int id, Func<bool> someDelegate)
{
    var wrapper = new MyDelegateWrapper(someDelegate);
    _wrappers.Add(id, wrapper); // _wrappers is a Dictionary<>
}
public void Remove(int id)
{
    _wrappers.Remove(id);
}

我很想知道这段代码是否会引入任何GC问题。i、 它会阻止“包装器”对象或创建委托的对象被GC调用吗?调用对象传入匿名委托还是它们自己的一个“真实”方法有区别吗?

GC从不需要收集的对象收集所有没有传入引用的对象。这是通过从堆栈和静态字段中的所有引用创建对象图来实现的。如果一个对象有对另一个对象的传出引用,这不会阻止垃圾收集

向事件添加处理程序时,将创建从包含事件的对象到包含事件侦听器的对象的引用。这不会阻止收集包含事件的对象


唯一的例外是在方法语法中实现事件(即使用
add
remove
方法)并使用
add
方法中的事件处理程序创建从侦听器到对象的引用时。然而,这将是非常不寻常的。

GC从不被收集的对象收集所有没有传入引用的对象。这是通过从堆栈和静态字段中的所有引用创建对象图来实现的。如果一个对象有对另一个对象的传出引用,这不会阻止垃圾收集

向事件添加处理程序时,将创建从包含事件的对象到包含事件侦听器的对象的引用。这不会阻止收集包含事件的对象


唯一的例外是在方法语法中实现事件(即使用
add
remove
方法)并使用
add
方法中的事件处理程序创建从侦听器到对象的引用时。然而,这将是非常不寻常的。

委托不是COM对象。它们不需要实现
IDispose
,并且在GC认为合适时进行垃圾收集


因此,一旦无法从其他.NET对象访问到它们,它们将被标记为收集,并在CLR需要清除空间时被收集。

委托不是COM对象。它们不需要实现
IDispose
,并且在GC认为合适时进行垃圾收集


因此,一旦无法从其他.NET对象访问到它们,它们就会被标记为收集,并在CLR需要清除空间时被收集。

提出这样的问题并不能适应您遇到的所有可能情况。如果您关心内存泄漏,请分析您的代码并查看是否存在实际内存泄漏。委托是正常的.net OBEJCT,它们是GC,并且遵循与任何其他对象相同的生命周期,因此,不,您提供的代码不会引入任何GC问题。一旦没有其他对象可以调用包装器和委托,包装器和委托都将被GC调用。提出这样的问题并不能适应您遇到的所有可能情况。如果您关心内存泄漏,请分析您的代码并查看是否存在实际内存泄漏。委托是正常的.net OBEJCT,它们是GC,并且遵循与任何其他对象相同的生命周期,因此,不,您提供的代码不会引入任何GC问题。一旦没有其他对象可以调用包装器和委托,包装器和委托都将被GC调用。