C#销毁对象及其所有引用

4

以下是 C# 代码:

ResBlock resBlock1 = new ResBlock();                
resBlock1.CustomerID = "ABC";

Block block = new Block();
block.Tag = resBlock1;

resBlock1 = null;

Console.WriteLine(((ResBlock)block.Tag).CustomerID);

输出结果将是"ABC"。当然,这只是我所面对的问题的一个例子,但我的代码更加复杂。

我想了解的是,当引用对象(resBlock1)设置为null或以其他方式被销毁时(哪一种?),是否有办法使block.Tag = null

这些类非常简单,因为这只是一个例子:

public class ResBlock: IDisposable
{
    public DateTime From { get; set; }
    public DateTime To { get; set; }
    public string CustomerID { get; set; }
    public string ItemID { get; set; }

    [...]

    public ResBlock() {
        DaysStatus = new List<ResBlockDayStatus>();
        Deleted = false;
    }

    public bool LogicallyDeleted { get; set; }

    public void Dispose() { }
}

public class Block
{        
    public bool Selected { get; set; }
    public object Tag { get; set; }
    public DateTime From { get; set; }
    public DateTime To { get; set; }
}

1
当引用对象(resBlock1)被设置为null或以其他方式被销毁时,您似乎认为将“原始”引用设置为resBlock1会销毁它。不仅不会销毁它,而且在对象的生命周期中出现的任何其他引用与“原始”引用之间也没有区别。您的block.Tag与“原始”resBlock1一样有价值和独特。 - GSerg
1
你不能在整个程序中神奇地将所有引用特定对象的引用设置为null。正确的方法可能是在对象内部保持一个“disposed”布尔状态,并在处理时启用它,然后使该对象的所有函数(包括getter和setter)抛出ObjectDisposedException。可能需要创建一个公共只读的“IsDisposed”属性来查询;能够检查总比必须处理异常要好。 - Nyerguds
@Nyerguds:属性“LogicallyDeleted”会以您建议的方式工作。谢谢。 - Nik Dell
@NicolaDell'anna 除了不能从外部设置之外,它应该与原始 .Net 框架中使用的名称相同,即“IsDisposed”。 - Nyerguds
1个回答

6

不行。在.NET中,对象的生命周期并不是通过这种方式来“销毁”的。你可以可能Tag属性更改为WeakReference,以防止Tag属性使对象保持在WeakReference中存活...... 但你仍然无法主动请求销毁对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接