C# 销毁对象不会';无法从调用列表中删除委托

C# 销毁对象不会';无法从调用列表中删除委托,c#,object,delegates,destroy,C#,Object,Delegates,Destroy,我的物品有点问题。。。 我有一个对象,其中有一个委托,它在构造函数中订阅该委托。 当我销毁这个对象时,调用列表仍然告诉我它有一个订阅服务器。当我再次创建这个对象时,我在其中发现了两个订户(我销毁的旧订户和新订户)。 如何解决此问题并清除列表中的订阅服务器 下面是测试代码:(两个按钮用于销毁和创建内部对象) 谢谢你的帮助 private void DestroyObject_Click(object sender, EventArgs e) {//destroy object thisde

我的物品有点问题。。。 我有一个对象,其中有一个委托,它在构造函数中订阅该委托。 当我销毁这个对象时,调用列表仍然告诉我它有一个订阅服务器。当我再次创建这个对象时,我在其中发现了两个订户(我销毁的旧订户和新订户)。 如何解决此问题并清除列表中的订阅服务器

下面是测试代码:(两个按钮用于销毁和创建内部对象)

谢谢你的帮助

private void DestroyObject_Click(object sender, EventArgs e)
{//destroy object
    thisdelegatetest = null;
}
这并不会真正破坏对象。对象被垃圾收集器“销毁”(释放)


事实上,它不能被标记为可收集,因为
静态
委托仍然引用它。因此,从不调用析构函数。您已经手动删除订阅服务器,例如通过公共方法。

既然您无法手动调用析构函数,为什么不实现
IDisposable
接口并在
Dispose
方法中执行注销?=

public class testdelegate : IDisposable
{
    public delegate void del_copysomething(int newvaluetocopy);
    internal static del_copysomething dl_myfunctionthatcopy;
    public int valueforallobject = 0;

    public testdelegate()//ctor
    {
        dl_myfunctionthatcopy += new del_copysomething(copythisint);
    }
    private void copythisint(int newvalue)
    {
        valueforallobject = newvalue;
        Console.WriteLine("Copied");
    }

    public void Dispose()
    {
        dl_myfunctionthatcopy -= new del_copysomething(copythisint);
        GC.SuppressFinalize(this);
    }
}
DestroyObject\u单击
方法时,您只需调用
Dispose
方法:

private void DestroyObject_Click(object sender, EventArgs e)
{   //call Dispose destroy object
    thisdelegatetest.Dispose();
}

将变量设置为
null
不会“破坏”对象。无论你的思维模式是什么,对象在C#中如何工作,这都是错误的。你能解释一下你所做的编辑吗?请不要编辑你的问题,使其不再显示问题,因此没有意义。编辑的内容在/*编辑*/引号之间。我认为非常清楚。除了这种情况,对象将不符合GC的条件,正是因为有一个委托仍在引用它,“调用析构函数之前需要两个垃圾收集周期。”-你能提供一个引用来支持这条语句吗?语句“这并没有真正销毁对象”,有点误导。它有点像是在某种程度上破坏了这个物体。它根本不会破坏它。好吧,我/*编辑*/我更改的部分。这样更好吗?所以我需要两行来销毁对象,一行用于取消订阅委托/事件,另一行用于取消对GC对象的引用?tat对吗?@Enigmativity对,在第一个循环后调用析构函数,但在第二个循环后释放对象。我弄糊涂了。非常感谢大家@Jablonovo我想它起作用了,我还没有测试过。很高兴我能帮忙
private void DestroyObject_Click(object sender, EventArgs e)
{   //call Dispose destroy object
    thisdelegatetest.Dispose();
}