我是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而不是删除它?
或者我在这里遗漏了什么?
答案 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