C#将结构作为参数传递

C#将结构作为参数传递,c#,struct,parameters,C#,Struct,Parameters,我在C#中有以下代码: 公共类 { 公共结构记录器 { 私有内部ndim; 私有双[]向量; 公共向量(double[]vector)=>(ndim,this.vector)=(vector.Length,vector); 公共双精度this[int i]{get=>vector[i];set=>vector[i]=value;} 公共重写字符串ToString() { 字符串str=“(”; 对于(int i=0;i

我在C#中有以下代码:

公共类
{
公共结构记录器
{
私有内部ndim;
私有双[]向量;
公共向量(double[]vector)=>(ndim,this.vector)=(vector.Length,vector);
公共双精度this[int i]{get=>vector[i];set=>vector[i]=value;}
公共重写字符串ToString()
{
字符串str=“(”;
对于(int i=0;i

在这个程序中,我创建了一个struct
RVector
。之后,我使用了一个方法
SwapVectorEntries
,它有一个struct参数。因为Struct是
值类型
,所以我认为方法
SwapVectorEntries
不会更改Struct参数。但是,在程序中,在命令
swapvectorrentries(b,1,2)之后,b已更改。请给我解释一下。谢谢大家!

B本身不作为引用传递,但是B的副本引用了相同的
double[]

B本身不作为引用传递,但是B的副本引用了相同的
double[]

问题就在于此。当您创建

double[] a = new double[4] { 1, 2, 3, 4 };
RVector b = new RVector(a);
您有两个对该数组的引用。当您将对象传递给该方法后

SwapVectorEntries(b, 1, 2);
您的对象已被复制,您的新对象对该数组具有相同的引用。这里您只有一个数组,对它有多个引用。


问题就在于此。当您创建

double[] a = new double[4] { 1, 2, 3, 4 };
RVector b = new RVector(a);
您有两个对该数组的引用。当您将对象传递给该方法后

SwapVectorEntries(b, 1, 2);
您的对象已被复制,您的新对象对该数组具有相同的引用。这里您只有一个数组,对它有多个引用。


您不是在修改结构,而是在修改阵列。数组不是值类型。将具有可变引用类型的结构声明为字段不是一个好主意。此外,您可以跳过向量值初始化(在
public RVector(int ndim)
constructor中):在c#中,新创建的数组的每个项都将有其默认值(0.0,在您的情况下使用double)。这与C/C++不同,您还可以避免使用
ndim
成员变量:您可以在每次需要时将其替换为
vector.length
。您不是在修改结构,而是在修改数组。数组不是值类型。将具有可变引用类型的结构声明为字段不是一个好主意。此外,您可以跳过向量值初始化(在
public RVector(int ndim)
constructor中):在c#中,新创建的数组的每个项都将有其默认值(0.0,在您的情况下使用double)。这与C/C++不同,您还可以避免使用
ndim
成员变量:您可以在每次需要时将其替换为
vector.length
。但是,
b
是structure
RVector
的一个实例。它是通过使用带有数组参数的构造函数创建的。所以,我认为
b
是一种值类型。是的,b是一种值类型。但是当它作为参数复制时,它的所有字段也会复制,因为“double[]vector”是一个引用,所以它的值(数组的地址)也会复制。所以你有两个不同的RVector对象,但它们必须是指向同一物体的向量。你的答案很清楚。现在我明白了。非常感谢你!但是,
b
是结构
RVector
的一个实例。它是通过使用带有数组参数的构造函数创建的。所以,我认为
b
是一种值类型。是的,b是一种值类型。但是当它作为参数复制时,它的所有字段也会复制,因为“double[]vector”是一个引用,所以它的值(数组的地址)也会复制。所以你有两个不同的RVector对象,但它们必须是指向同一物体的向量。你的答案很清楚。现在我明白了。非常感谢你!