C#删除类的实例?

时间:2014-02-28 22:13:28

标签: c# class instance

我是C#的新手,我对类的实例有一个快速的问题。 我被告知在类的实例上仅使用“null”不足以删除整个实例及其所有资源,例如指针等。所以我有: ClassHere myClass = new ClassHere()myClass = null

我真的一定要考虑这个问题......我会举一个例子来确定GC的确切运作方式。

假设我们有3个实例:x1,x2,x3。每个实例都将映射到一个变量:ClassHere myClass = new ClassHere(),除了你有x1,x2和x3而不是myClass。

然后说实例x2和x3对x1进行某种引用。假设x1被x2和x3引用后x1没有任何作用。 GC只会在x2之后拾取x1,并且x3的x1引用将被删除,对吗?

即使使用这些参考文献,它也会选择它。 GC如何知道我是否真的需要x2和x3引用的实例x1而不是删除它?

或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:1)

摧毁的唯一方法是将其从源树中删除:D您可以,虽然销毁类的实例

与C#不同,它没有确定性的析构函数。当对象实例无法访问时,对象实例将成为符合条件的用于垃圾回收。这可以通过

来实现
  • 所有对它的引用都被释放(例如,变量超出范围)或
  • 对它的所有引用本身都无法访问(例如,对象实例是集合中的引用,并且集合本身无法访问。

何时以及是否垃圾收集对象实例取决于应用程序域(进程)中的内存/资源压力。但是,当app域结束时,一切都被垃圾收集。

通常,您希望制作与实施IDisposable无关的内容,因此可以通过using块等确定性地释放未管理的资源。

这是一个简单的答案,但它的要点是:不要冒汗。

答案 1 :(得分:0)

您不需要担心“删除”任何托管资源。垃圾收集器将为您处理此事。在使用非托管资源的情况下,您只需要担心清理(我假设您不是因为您没有提及它)。

您无需为GC收集变量以便收集它。

这是我在相关的stackoverflow问题上找到的链接,可能会有所帮助: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx

答案 2 :(得分:-1)

如果代码在服务器上运行,GC不会释放对象 - 除非你每半小时重新启动一次服务器 - 对我来说似乎是一个合理的问题...我有一个类似的问题 - 检测用户何时关闭浏览器而不是手动注销网站 - 我的解决方案是为用户创建一个实例,其中包含一个计时器和一个通过ajax设置为true并由服务器端计时器重置为false的标志。但是存在内存泄漏的可能性 - 因为当用户被自动注销时,无法保证用户被解除分配。

所以我在这样的webservice之外创建一个类用户,并实例化一个类型为user的列表:

    class login{

   ...
    public void Logon_Click(object sender, EventArgs e)
{
    if (Membership.ValidateUser(UserEmail.Text, UserPass.Text)){
        ...
         WebService.UserLoglist.Add(new user(UserEmail.Text));// instance of the user is instantiated here
        }
   ...
   }
 }

}

Can not resolve Theme.AppCompat.Light.NoActionBar