{Equaling objects}";“我的对象引用在哪里?”;c#
我有一个名为“人类”的{Equaling objects}";“我的对象引用在哪里?”;c#,c#,C#,我有一个名为“人类”的类和两个对象(obj1,obj2)。 我已经写了下面的代码 class human { public static int x; public readonly int id; public human() { x++; id = x; } public void show() { Console.WriteLine("id = " + id); } }
类和两个对象(obj1,obj2
)。
我已经写了下面的代码
class human
{
public static int x;
public readonly int id;
public human()
{
x++;
id = x;
}
public void show()
{
Console.WriteLine("id = " + id);
}
}
class Program
{
static void Main(string[] args)
{
human obj1 = new human();
human obj2 = new human();
obj2 = obj1;
Console.ReadKey();
}
}
我知道当我写代码时->humanobj2=obj1代码>
obj2
参考heap
但是在我的代码中,这个->humanobj2=newhuman()代码>
这样做->obj2=obj1代码>
isobj2
将使用obj1
的值更新其对象中的值
或obj2
将在obj1
谢谢:)因为它是一个类obj1
和obj2
都将引用内存中的同一对象(因为它们是引用类型)。id为1
C#的human
对象具有值类型和引用类型。值类型直接存储数据,而引用类型包含对数据的引用。类是引用类型
如果您有:
human obj1 = new human();
human obj2 = new human();
您正在创建两个新变量,其中包含对human
的不同新实例的引用
当您这样做时:
obj2 = obj1;
您的意思是“获取obj1包含的引用并将其分配给obj2”。这意味着obj1和obj2现在都引用了obj1最初引用的同一实例
例如,如果您有一个名为Name
的公共属性,并且您设置:
obj1.Name = "Bob"
然后访问obj2.Name
,您会发现您得到了值“Bob”,因为obj1
和obj2
都引用了相同的实例
在您的示例中,您会注意到obj1
和obj2
都具有相同的Id
您需要尝试在控制台中显示obj1和obj2的Id
。这将帮助您了解发生了什么小提示:使用.GetHashCode()
获取唯一的对象标识符。您可能想使用它来了解obj1
和obj2
是否指向同一个对象。您是否尝试过它?无论如何,obj1
和obj2
实际上不会“成为”人类类的实例。它们将是指向human类实例的指针。因此,当您执行obj2=obj1
操作时,您将复制指针(因此它们现在指向obj2
的同一个实例),不会将值从obj1
复制到obj2
,obj1
中,因此垃圾收集器将在某个时候收集这些值。