这个程序会返回true还是false? 结构的x值是否会从b?
转移到astruct 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;
}
答案 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 f
与int 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];
的方法来处理邪恶的事情,部分原因在于类型应该不仅仅是用胶带粘在一起的变量。毫无疑问,大多数类型应该表现为变量合并之外的其他类型,并且这些类型应该被实现为除公共字段结构之外的其他类型。然而,这并不意味着在那些确实需要合并自变量的情况下,应该尝试使用不可变类来笨拙地模仿这种行为,或者所谓的“不可变”"尝试模拟不可变类的笨拙行为的结构,而不是使用暴露字段结构,这种结构在没有尴尬的情况下,本质上完全符合要求。