.NET中的对象相等

Kar*_*gus 3 c# equality object

我觉得这很无知,但是有人能够向我解释为什么会这样吗?

class MyClass{ public int i {get; set; } }
class Program
{
    static void Main(string[] args)
    {
        MyClass a = new MyClass();
        MyClass b = new MyClass();

                b.i = 2;
        a = b;
        a.i = 1;

        Console.Write(b.i + "\n"); //Outputs 1
    }
}

这对我来说是有意义的,因为我使用指针和所有那些伟大的东西,但我的印象是,使用C#,"b"将保持独立于"a".

我只是使用了一些非常糟糕的做法吗?也许有人可以指出我解释为什么在C#中这样的事情?

谢谢.

Joe*_*orn 10

这条线让你感到困惑:

a = b;
Run Code Online (Sandbox Code Playgroud)

您预计b要复制到a由值,但实际上所发生的一切是你已经分配从基准ba.

.Net将世界划分为两类:引用类型和值类型(还有委托类型和其他几个,但这是另一个故事).您定义的任何类都是引用类型,并且有一些重要的事项要记住引用类型:

  • 没有内置的方法来进行深层复制
  • 小心检查平等.==旨在用于引用相等(变量引用同一个对象),而.Equals()用于值相等,并且您可能需要为您的类型重写.Equals()(和GetHashCode())以使其正确.
  • 赋值只是复制引用(这是你的位置)