C# 例如,请尝试理解此问题

C# 例如,请尝试理解此问题,c#,java,aliasing,C#,Java,Aliasing,我试图学习别名,遇到了以下示例: public class A { // Instance variable private double _x; // 3 constructors public A(double x) { _x = x; } public A() { _x = 0; } public A(A a) { _x = a._x;

我试图学习
别名
,遇到了以下示例:

public class A
{
    // Instance variable 
    private double _x;

    // 3 constructors 

    public A(double x)
    {
        _x = x;
    }

    public A()
    {
        _x = 0;
    }

    public A(A a)
    {
        _x = a._x;
    }

    // methods 
    public double getX()
    {
        return _x;
    }

    public void setX(double x)
    {
        _x = x;
    }

    public String toString()
    {
        return "A:" + _x;
    } 
}

static void Main(string[] args)
{
    A a1 = new A(7);
    A a2 = new A(a1);
    A a3 = a2;

    Console.WriteLine("a1 = " + a1.toString());
    Console.WriteLine("a2 = " + a2.toString());
    Console.WriteLine("a3 = " + a3.toString());

    a1.setX(10);
    Console.WriteLine("after setting 10 to a1:");
    Console.WriteLine("a1 = " + a1.toString());
    Console.WriteLine("a2 = " + a2.toString());
    Console.WriteLine("a3 = " + a3.toString());

    a3.setX(5);
    Console.WriteLine("after setting 5 to a3:");
    Console.WriteLine("a1 = " + a1.toString());
    Console.WriteLine("a2 = " + a2.toString());
    Console.WriteLine("a3 = " + a3.toString());

    Console.ReadLine();
}
第一个
控制台.WriteLine
和第一个
SetX
是clrea,但是为什么在
a3.SetX(5)
之后,a2也发生了变化?
根据声明
a3=a2
和SetX引用
a3

两个
a2
a3
都是对同一对象的引用。由于您有一个对象(和两个对象引用),因此通过任何引用更改对象将再次通过任何引用产生可见的更改



这里的参考是C/C++中所谓指针的Java术语。当您在这些语言中使用指针别名时,您的示例将显示相同的行为。

很高兴标记您的编程语言。从技术上讲,这里没有指针。考虑将“指针”一词改为“引用”。为什么在设置A1到10之后,A2仍然是7?因为<代码> A1 < /C>是对一个对象的引用,并且<<代码> A2和<代码> A3都是对另一个对象的引用。总共创建了两个对象和三个引用,
a2
a3
彼此具有别名。通过
a2
a3
当然看不到
a1
引用的对象发生了什么。