Struct 将结构指定给变量时,实例是否被复制或引用?

Struct 将结构指定给变量时,实例是否被复制或引用?,struct,reference,copy,instance,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 ==

这个程序会返回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;
}

这不会继续下去,它们是一样的。a和b指向同一个对象。无论其中一个发生了什么变化,您都可以通过另一个的引用进行访问。所以答案是正确的。

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

public struct Foo {public int X,Y};

Foo f1,f2;
...
f1 = f2;     
f1和f2的声明大致相当于:

int f1_X,f1_Y, f2_X,f2_y;
void Bar(int it_X, int it_Y) {...}
Bar(f1_X,f1_Y);
f2到f1的赋值等于

f1_X = f2_X;
f1_Y = f2_Y;
此外,定义和调用方法:

void Bar(Foo it) {...}
Bar(f1);
本质上相当于:

int f1_X,f1_Y, f2_X,f2_y;
void Bar(int it_X, int it_Y) {...}
Bar(f1_X,f1_Y);
结构的唯一方面使得
foof
intf_X,f_Y真正不同
是指当传递
ref
时,结构的所有字段都作为一个单元运行(例如
void-Boz(ref-Foo-it);
将接收一个
ref
,它标识两个变量,而不是每个变量一个),结构类型的数组同样对所有内容使用一个引用,因此
var-bar=new-Foo[12]
将声明一个包含12对整数的数组,而
var bar_X=new int[12],bar_Y=new int[12]
将声明一对数组,每个数组包含12个整数


尽管结构可以声明帮助器方法,并且可以限制外部代码访问结构的能力(除非通过此类方法),但将结构简单地看作是一组与管道胶带粘在一起的自变量是最有帮助的。如果这正是我们想要的,那么公共字段结构就是一个完美的选择。如果一个人想要一个行为类似于其他东西的类型,他可能应该使用其他东西。“可变结构是邪恶的”这一观点部分源于编译器有时会用修改
这个
的方法来做邪恶的事情,部分源于类型不应该是用胶带粘在一起的变量串。当然,在大多数类型中,应该作为变量合并之外的东西来执行,并且这些类型应该作为公共字段结构之外的东西来实现。但是,这并不意味着在需要合并自变量的情况下,应该尝试使用不可变类笨拙地模拟此类行为,或者使用所谓的“不可变”结构来模拟不可变类的笨拙行为,而不是使用公开的字段结构,没有尴尬,本质上表现得完全符合要求。

我很愚蠢,我发布这个问题是因为我在工作,我回家后会测试一下……请你指定语言好吗?因为我使用的是
向量
s作为示例,你可能理解我在2D中使用它们的目的,加速度、速度和位置。所以我想我应该使用向量b=a.Clone()?Ninjaedit:我的意思是,如果我在2D环境中有一堆对象,这些对象被分配了一堆
向量,我可以使用这种方法,对吗?@HolyGarbage:结构对于坐标和向量之类的东西非常有用,因为即使它们允许分段变异,也不需要“克隆”它们。如果定义向量和坐标的结构类型,并为诸如
vector+vector->vector
vector-vector->vector
coordinate+vector->coordinate
、和
vector*scalar->vector
之类的内容定义合适的运算符,然后像
velocity+=加速度*timestep这样编码;位置+=速度*时间步最终将等同于……
速度×加速度×时间步;速度_y+=速度_x*时间步;位置x+=速度x*时间步;位置y+=速度y*时间步。C#编译器的“中间代码”输出最终将使用大量临时变量,但根据.NET运行时的版本,它可能会优化其中的许多变量,以生成类似于“离散变量”形式的代码。如果要使用不可变对象作为向量,则必须在每一步创建新的对象实例;使用可变对象时,必须小心在需要时进行防御性复制。