【发布时间】:2016-02-21 17:12:33
【问题描述】:
所有。我从来没有使用过析构函数也没有处理过,所以这对我来说是新的。
我的任务是创建一个具有析构函数和处置方法的类,并且该类具有自动递增的 UInt64 Id 属性和必须由 Id 引用的静态 Dictionary<UInt64,MyClass> all live MyClass 的实例。
在搜索了如何正确使用它们之后,这就是我最终要做的:
public class MyClass : IDisposable
{
private static Object Lock = new Object();
private static Dictionary<UInt64, MyClass> LiveInstances = new Dictionary<UInt64, MyClass>();
public UInt64 Id { get; private set; }
public MyClass()
{
lock (Lock)
{
var newId = IncrementalId();
if (newId == 0)
{
throw new ArgumentException("Reached MAX VAL");
}
Id = newId;
LiveInstances.Add(Id, this);
}
}
~MyClass()
{
CleanUpNativeResources();
}
public void Dispose()
{
lock (Lock)
{
CleanUpManagedResources();
CleanUpNativeResources();
GC.SuppressFinalize(this);
}
}
protected virtual void CleanUpManagedResources()
{
LiveInstances.Remove(Id);
}
protected virtual void CleanUpNativeResources()
{
}
private static UInt64 IncrementalId()
{
for (ulong i = 0; i <= Convert.ToUInt64(LiveInstances.Count) ; i++)
{
if (i != UInt64.MaxValue && !LiveInstances.ContainsKey(i + 1))
{
return i+1;
}
}
return 0;
}
}
现在,我的问题是如何处置对象?无论我是否尝试查找处置对象的示例,我都会发现类似这样的内容:
// Code to dispose the managed resources of the class
Console.WriteLine("Object disposed");
提前致谢。
【问题讨论】:
-
你没有非托管资源,也没有实现
IDisposable的非托管资源,所以你不需要实现IDisposable。垃圾收集器将为您处理一切。 -
好的。但是如果我想摆脱对象的当前实例呢?我需要创建其他对象并替换已删除的对象(这意味着,它们将使用已删除对象曾经拥有的 Id),并且我不希望我的程序周围具有相同 Id 的对象。
标签: c# asp.net destructor dispose