我正在寻找一种在 C# 中执行此操作的方法:
这可能吗?我似乎无法解决这个问题。
编辑:
感谢大家的精彩回复。尤其是弱引用。我不知道他们在那里。但是我有两个主要目标,我可以更清楚地说明它们。
编辑:
[删除了错误的代码块]
最佳答案
首先,您所谈论的是 IDisposable
接口(interface)背后的基本思想:一种确定性的资源释放方式。虽然它的主要用途是与需要显式释放的非托管资源交互(或与执行此操作的对象交互),但它的用法不限于此。
不幸的是,它没有满足您的最后一个要求:由于它是确定性的,因此必须由某人调用。这个人必须是提问者。
我能想到的唯一解决方案是在 WeakReference
对象中使用 Giver
类。这允许您维护对实例的引用,而不会阻止它被垃圾收集(收集后,您的引用变为 null
)。
不幸的是,这不是确定性的。在实际收集对象后,您的引用将变为 null
(并且 IsAlive
将成为 false
),这不能保证在任何特定时间(或在您的应用程序的生命周期内)发生。
考虑到这些警告,您可以像这样:
public class Giver
{
private Dictionary<string, WeakReference> cache =
new Dictionary<string, WeakReference>();
public object GetResource(string resourceName)
{
WeakReference output;
object returnValue = null;
if(cache.TryGetValue(resourceName, out output))
{
if(output.IsAlive) returnValue = output.Target;
if(returnValue == null) cache.Remove(resourceName);
}
if(returnValue == null)
{
returnValue = ...; // get the actual resource
cache.Add(resourceName, new WeakReference(returnValue));
}
return returnValue;
}
}
关于C# "shared pointer"用于替代内存管理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4864686/