C# 删除类的实例?

C# 删除类的实例?,c#,class,instance,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

我对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引用后不做任何事情。GC只会在x2之后拾取x1,并且x3对x1的引用将被删除,对吗

即使有了这些参考资料,它也能接受。GC如何知道我是否真的需要x2和x3引用的实例x1,而不是删除它


还是我在这里遗漏了什么?

您不需要担心“删除”的任何托管资源。垃圾收集器会帮你处理这件事。您只需要在使用非托管资源的情况下担心清理问题(我假设您不是,因为您没有提到)

您不需要为GC清除变量来收集它

以下是我在stackoverflow相关问题上找到的一个链接,可能会有所帮助:
您不必担心“删除”任何托管资源。垃圾收集器会帮你处理这件事。您只需要在使用非托管资源的情况下担心清理问题(我假设您不是,因为您没有提到)

您不需要为GC清除变量来收集它

以下是我在stackoverflow相关问题上找到的一个链接,可能会有所帮助:

那么,销毁类的唯一方法就是将其从源代码树中删除:尽管可以销毁类的实例

与C不同,C#没有确定性析构函数。当对象实例变得不可访问时,对象实例就有资格进行垃圾收集。这可能是由于

  • 正在发布的所有引用(例如,变量超出范围),或
  • 对它的所有引用本身都是不可访问的(例如,对象实例是集合中的引用,而集合本身是不可访问的)
对象实例何时和是否被垃圾收集取决于应用程序域(进程)内的内存/资源压力。但当应用程序域结束时,所有内容都被垃圾收集

通常,您希望使重要的东西实现
IDisposable
,因此可以通过
使用
块等确定地释放所持有的非托管资源


这是一个简单的答案,但其要点是:不要担心。

好吧,销毁类的唯一方法是将其从源代码树中删除:D您可以,尽管可以销毁类的实例

与C不同,C#没有确定性析构函数。当对象实例变得不可访问时,对象实例就有资格进行垃圾收集。这可以通过

  • 正在发布的所有引用(例如,变量超出范围),或
  • 对它的所有引用本身都是不可访问的(例如,对象实例是集合中的引用,而集合本身是不可访问的)
对象实例何时和是否被垃圾收集取决于应用程序域(进程)内的内存/资源压力。但当应用程序域结束时,所有内容都被垃圾收集

通常,您希望使重要的东西实现
IDisposable
,因此可以通过
使用
块等确定地释放所持有的非托管资源


这是一个简单的答案,但其要点是:不要担心。

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

因此,我在webservice外部创建了一个类user,如下所示,并实例化了一个user类型列表:

 class WebService{
  public static List<user> UserLoglist = new List<user>();//list of logged in users

 [WebMethod(Description = "Per session Hit Counter", EnableSession = true)]
public void  ClnUpdateFlag(string un)//gets called via ajax
{//Updates the flags i

    //update users status
    WebService.UserLoglist.Find(y => y.username == un).isLoggedin = true;
}
    }
public class user
{
    public string username;
    public System.Timers.Timer timScheduledTask = new System.Timers.Timer();
    public bool isLoggedin = true;
    public  user(string puser)
    {
        username = puser;

        setimer(); //set server side timer
    }
    void Timer1_Tick(object sender, EventArgs e)
   {

     ...
  if (isLoggedin)// window is still open
          isLoggedin = false;
   else// user closed the window
      {
         ...

          WebService.UserLoglist.RemoveAll(x => x.username == username);// instance is deleted here

   ...

      } 
      }
    }

    void setimer()
    {
        timScheduledTask.Interval = 3000;
        timScheduledTask.Enabled = true;
         timScheduledTask.Start(); 
        timScheduledTask.Elapsed +=
        new System.Timers.ElapsedEventHandler(Timer1_Tick);
    }
 }

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

因此,我在webservice外部创建了一个类user,如下所示,并实例化了一个user类型列表:

 class WebService{
  public static List<user> UserLoglist = new List<user>();//list of logged in users

 [WebMethod(Description = "Per session Hit Counter", EnableSession = true)]
public void  ClnUpdateFlag(string un)//gets called via ajax
{//Updates the flags i

    //update users status
    WebService.UserLoglist.Find(y => y.username == un).isLoggedin = true;
}
    }
public class user
{
    public string username;
    public System.Timers.Timer timScheduledTask = new System.Timers.Timer();
    public bool isLoggedin = true;
    public  user(string puser)
    {
        username = puser;

        setimer(); //set server side timer
    }
    void Timer1_Tick(object sender, EventArgs e)
   {

     ...
  if (isLoggedin)// window is still open
          isLoggedin = false;
   else// user closed the window
      {
         ...

          WebService.UserLoglist.RemoveAll(x => x.username == username);// instance is deleted here

   ...

      } 
      }
    }

    void setimer()
    {
        timScheduledTask.Interval = 3000;
        timScheduledTask.Enabled = true;
         timScheduledTask.Start(); 
        timScheduledTask.Elapsed +=
        new System.Timers.ElapsedEventHandler(Timer1_Tick);
    }
 }

这是C#,完全不用担心“删除”类和释放内存/指针。GC会为您完成所有这些。“资源”指的是非托管资源,即操作系统句柄,而不是内存。如果您所做的只是为对象分配内存,GC将自动处理。您可以手动调用GC.collect()但是不建议这样做,因为c#是为你做的。但是如果你愿意,你可以,你只是告诉编译器在这个确切的位置收集垃圾