{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

is
obj2
将使用
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
中,因此垃圾收集器将在某个时候收集这些值。