创建对象就是删除旧对象?
creating an object is deleting the old one?
假设我创建了一个对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CreateObjOnobj
{
class Program
{
static void Main(string[] args)
{
testcreate myobjecttotest;
myobjecttotest = new testcreate();
myobjecttotest.num = 20;
myobjecttotest.bill = true;
myobjecttotest = new testcreate();
Console.WriteLine(myobjecttotest.bill.ToString());
Console.ReadKey();
}
}
class testcreate
{
public int num = 0;
public bool bill = false;
}
}
这段代码是否会自动删除对象并创建一个新对象而不丢失内存?
谢谢
不完全是。
实际发生的是,您更改了指向第一个对象的变量,现在它指向了第二个对象。从那一刻起,再也没有人指向第一个对象了。
由于 .NET 配备了自动内存管理,垃圾收集器会定期检查没有 "roots" 的对象——那些没有人持有引用的对象。它从内存中删除了这样的 "orphan" 个对象。
但是 -- 您不能对何时进行垃圾回收做出任何假设。它有时会在以后发生,这就是你所知道的。
通常,当您创建第二个对象并将变量更改为指向第二个对象时,您最终会在内存中有两个对象。有时稍后,第一个对象将被垃圾收集器删除。
基本上是,但更详细地说不是。
当您重新分配变量时,对先前对象的引用会丢失。然而,只要垃圾收集器不踢它,实例本身仍然存在。无论如何,只要不处理非托管引用,您就不会太在意这一点——例如您必须以某种方式释放的 COM 对象。因此,当您创建 class 和 "leave" 该变量的范围的实例时会发生同样的情况:
void MyMethod()
{
var myVar new MyClass();
}
当您离开方法时,变量和因此对 MyClass
实例的所有引用都将被删除,因此被标记为垃圾收集。但是你不知道什么时候会发生。
是的,它将被自动垃圾收集,除非有另一个实例指向该对象。
例如:
我们创建了 testcreate
的另一个实例,它将分配给第一个实例的指针值。
testcreate myobjecttotest = new testcreate();
testcreate myobjecttotest2 = myobjecttotest;
所以如果我们重新实例化myobjecttotest = new testcreate()
不会删除前一个对象,因为 myobjecttotest2
当前正指向它
假设我创建了一个对象:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CreateObjOnobj
{
class Program
{
static void Main(string[] args)
{
testcreate myobjecttotest;
myobjecttotest = new testcreate();
myobjecttotest.num = 20;
myobjecttotest.bill = true;
myobjecttotest = new testcreate();
Console.WriteLine(myobjecttotest.bill.ToString());
Console.ReadKey();
}
}
class testcreate
{
public int num = 0;
public bool bill = false;
}
}
这段代码是否会自动删除对象并创建一个新对象而不丢失内存?
谢谢
不完全是。
实际发生的是,您更改了指向第一个对象的变量,现在它指向了第二个对象。从那一刻起,再也没有人指向第一个对象了。
由于 .NET 配备了自动内存管理,垃圾收集器会定期检查没有 "roots" 的对象——那些没有人持有引用的对象。它从内存中删除了这样的 "orphan" 个对象。
但是 -- 您不能对何时进行垃圾回收做出任何假设。它有时会在以后发生,这就是你所知道的。
通常,当您创建第二个对象并将变量更改为指向第二个对象时,您最终会在内存中有两个对象。有时稍后,第一个对象将被垃圾收集器删除。
基本上是,但更详细地说不是。
当您重新分配变量时,对先前对象的引用会丢失。然而,只要垃圾收集器不踢它,实例本身仍然存在。无论如何,只要不处理非托管引用,您就不会太在意这一点——例如您必须以某种方式释放的 COM 对象。因此,当您创建 class 和 "leave" 该变量的范围的实例时会发生同样的情况:
void MyMethod()
{
var myVar new MyClass();
}
当您离开方法时,变量和因此对 MyClass
实例的所有引用都将被删除,因此被标记为垃圾收集。但是你不知道什么时候会发生。
是的,它将被自动垃圾收集,除非有另一个实例指向该对象。
例如:
我们创建了 testcreate
的另一个实例,它将分配给第一个实例的指针值。
testcreate myobjecttotest = new testcreate();
testcreate myobjecttotest2 = myobjecttotest;
所以如果我们重新实例化myobjecttotest = new testcreate()
不会删除前一个对象,因为 myobjecttotest2
当前正指向它