在 C# 中,我现在有一个名为 myclass 的类,
我正在创建一个这样的对象,
myclass myx = new myclass();
然后
myx = new myclass();
它没有给出任何错误,但这意味着什么......
这意味着您正在创建另一个实例并将其分配给您的变量,有效地“放弃”您使用 new 创建的第一个实例。
垃圾收集器会知道在某个时候清理旧的。您不能再访问它,因为您没有将它保存到另一个变量。
这意味着您正在丢弃第一个 myclass 实例并创建一个新实例。可能还有其他代码在处理第一个代码,例如将其添加到列表中。
myclass myx = new myclass();
这一行有声明和初始化
但
myx = new myclass();
这只有一个先前声明的对象的初始化
如果你想要一个错误然后myclass myx = new myclass();
从你的代码中删除,你肯定会得到一个错误。简而言之new
,关键字用于任何对象的初始化,但必须首先声明该对象,这可以在同一行完成,也可以在对象声明后的其他地方完成。
有关new
转到此处的更多信息
您可能知道 .Net 语言中有两种不同类型的对象,引用类型和值类型。(类与结构).Net 以不同的方式管理每种类型。当您将引用类型设置为变量时,它的名称意味着对该对象的内存地址保存在变量中,但是当您将值类型对象(诸如 int 、 long 和 ... 的结构)设置为变量时,您实际上将值保存在变量中。因此在这种情况下:
var a=new MyClass();
var b=a;
如果 MyClass 是一个类,a 和 b 都引用内存上的同一个对象,否则两者都有不同的值,因此如果我们这样做:
a.Value=5;
如果 MyClass 是引用类型,a.Value==b.Value 将为真,如果它是值类型对象,则为假现在回答您的问题,您是否将变量 myx 设置为 MyClass 的新引用(如果它是类)或者您正在其中设置 MyClass 的新值(如果它是一个结构)当您执行此类操作时,您将拥有不再需要的东西(myx 的旧设置)并且将在下次 GC 时被垃圾收集试图清理内存。
myx
是对您的实例(对象)的引用myclass
。
随着myclass myx = new myclass();
你告诉你的引用myx
指向一个用new myclass()
.
由于引用是可重用的,当您编写 时myx = new myclass();
,该引用 ( myx
) 停止指向 的旧实例,myclass
现在指向您刚刚创建的新实例。
由于没有其他人指向旧对象,因此垃圾收集器被激活(不是立即激活,但不要担心)并将旧myclass
对象从堆中删除。