C# 一次性班 请考虑以下类别: public class Level : IDisposable { public Level() { } public void Dispose() { } }
我的问题是,如果我调用C# 一次性班 请考虑以下类别: public class Level : IDisposable { public Level() { } public void Dispose() { } },c#,.net-2.0,C#,.net 2.0,我的问题是,如果我调用Dispose方法,该类实际上会被释放(垃圾收集)吗 例: 谢谢。每个实现了IDisposable的类都定义了要处理的内容。根据这一推理,是的,你的班级将得到它想要的处置 我的问题是,如果我调用Dispose方法,该类实际上会被释放吗 如果你指的是垃圾收集,那么不,这不会发生。当您调用Dispose方法时,将会发生的事情是,调用Dispose方法并执行其主体 此外,建议将一次性资源包装在中,以确保即使在发生异常时也始终调用Dispose方法。因此,您可以: using (L
Dispose
方法,该类实际上会被释放(垃圾收集)吗
例:
谢谢。每个实现了
IDisposable
的类都定义了要处理的内容。根据这一推理,是的,你的班级将得到它想要的处置
我的问题是,如果我调用Dispose方法,该类实际上会被释放吗
如果你指的是垃圾收集,那么不,这不会发生。当您调用Dispose方法时,将会发生的事情是,调用Dispose方法并执行其主体
此外,建议将一次性资源包装在中,以确保即使在发生异常时也始终调用Dispose方法。因此,您可以:
using (Level level = new Level())
{
// ... do something with the level
}
通常,当对象持有指向某些非托管资源的指针并提供一种机制来确定释放这些资源时,将使用Dispose方法。否,实例不会因为调用Dispose而被垃圾收集。Dispose方法是您可以释放实例所持有的任何资源的方法,它与处理实例本身无关 如果你调用
Dispose()
它将被释放,这并不意味着它将被垃圾收集,在我看来这是你的问题,如果不是,请澄清。我假设你想要的是一种知道调用了Dispose()
的方法
您可以在消费代码中执行此操作,方法是在处理后将实例设置为null
:
Level level = new Level();
//do stuff with the instance..
level.Dispose();
level = null;
//in other place:
if (level != null)
{
//still available
}
或者在类本身中,添加布尔标志,并在每个方法中检查:
public class Level : IDisposable
{
private bool disposing = false;
public Level() { }
public void Foo()
{
if (disposing)
return;
MessageBox.Show("foo");
}
public void Dispose()
{
if (disposing)
return;
disposing = true;
}
}
在.NET中,处理和垃圾收集是两件不同的事情: 处置的要点是释放任何不是由.NET管理的资源(如手动分配的内存),或者在不再需要它们时(如文件句柄或网络连接)有兴趣被释放的资源 垃圾收集的目的是释放由.NET管理的内存(与普通对象类似)
因此,正如其他人所指出的:当对象被处置时,它不一定会被垃圾收集。请解释一下“被处置”是什么意思。那么我应该如何实现它呢?假设类中还有其他属性、方法等?@yonan2236,你到底在说什么?您希望如何回答这样一个问题:
假设类中还有其他属性、方法等?
。这个班在做什么?它的目的是什么?使用的方法是什么?此类是否包含指向非托管资源的指针?首先是什么让您认为需要实现Dispose模式。。。。对不起,如果你没有理解我的观点,我无法很好地解释。我不是电脑迷,我只是自学这门语言。以我目前的水平,我想我无法进一步表达我的想法。。“不要理会这个胡说八道的问题。”yonan干杯,那么这就是你想要的,还是你还需要更清楚的解释?
public class Level : IDisposable
{
private bool disposing = false;
public Level() { }
public void Foo()
{
if (disposing)
return;
MessageBox.Show("foo");
}
public void Dispose()
{
if (disposing)
return;
disposing = true;
}
}