C# 删除类的实例?
我对C#有点陌生,我有一个关于类实例的快速问题。 有人告诉我,仅在类的实例上使用“null”不足以删除整个实例及其所有资源,如指针等。因此我: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
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#是为你做的。但是如果你愿意,你可以,你只是告诉编译器在这个确切的位置收集垃圾