将结构赋给变量时,是复制还是引用了实例?

时间:2013-12-06 16:23:58

标签: struct reference copy instance

这个程序会返回true还是false? 结构的x值是否会从b?

转移到a
struct Vector(x, y)
{
    public int x, y;
    public Vector(x, y)
    {
        this.x = x;
        this.y = y;
    }
}

class Main()
{
    Vector a = new Vector(1, 2);
    Vector b = a;
    b.x = 3;
    if (a.x == 3) return true;
    else return false;
}

2 个答案:

答案 0 :(得分:0)

它不会延续,它们是同一回事。 a和b指向同一个对象。无论一方面有什么变化,您都可以通过对方的参考来访问。所以答案是肯定的。

答案 1 :(得分:0)

结构在语义上基本等同于用胶带粘在一起的一堆独立变量。因此,如果一个人宣布

public struct Foo {public int X,Y};

Foo f1,f2;
...
f1 = f2;     

f1和f2的声明大致相当于:

int f1_X,f1_Y, f2_X,f2_y;

并且f2到f1的赋值等同于

f1_X = f2_X;
f1_Y = f2_Y;

此外,定义和调用方法:

void Bar(Foo it) {...}
Bar(f1);

基本上相当于:

void Bar(int it_X, int it_Y) {...}
Bar(f1_X,f1_Y);

使Foo fint f_X,f_Y;真正不同的结构的唯一方面是在传递ref时结构的所有字段都表现为单位的事实(例如{ {1}}将收到一个void Boz(ref Foo it);,它标识两个变量,而不是每个变量一个),并且结构类型的数组同样使用一个引用用于所有内容,因此ref将声明一个包含的数组十二对整数,而var bar = new Foo[12]将声明一对数组,每个数组包含十二个整数。

虽然结构可以声明辅助方法,并且可以限制外部代码访问结构的能力,除非通过这样的方法,最好将结构视为一堆与管道胶带粘在一起的独立变量。如果这是他们想要的,那么公共领域结构是完美的选择。如果想要一个行为与其他类似的类型,那么应该使用其他东西。 "可变结构是邪恶的想法"部分原因在于编译器有时使用修改var bar_X = new int[12], bar_Y = new int[12];的方法来处理邪恶的事情,部分原因在于类型应该不仅仅是用胶带粘在一起的变量。毫无疑问,大多数类型应该表现为变量合并之外的其他类型,并且这些类型应该被实现为除公共字段结构之外的其他类型。然而,这并不意味着在那些确实需要合并自变量的情况下,应该尝试使用不可变类来笨拙地模仿这种行为,或者所谓的“不可变”"尝试模拟不可变类的笨拙行为的结构,而不是使用暴露字段结构,这种结构在没有尴尬的情况下,本质上完全符合要求。