当我调用名为Vyměň的方法(它具有矩阵“matice”作为形式参数)时,但是当方法结束时,实际矩阵“a”(其中没有改变)a被覆盖。为什么呢?
static int[,] Vyměň(int sloupec, int[,] matice, int [] vektor)
{
for (int i = 0; i < matice.GetLength(0); i++)
{
matice[i, sloupec] = vektor[i];
}
return matice;
}
static void Main(string[] args)
{
int[,] a = new int[3,4];
int[] b = new int[3];
a = Čti(); //Method Čti works fine
for( int i = 0; i <3; i++)
{
b[i] = a[i, 3];
}
int detA = determinanty.det3(a);
Vypis(a);
int detX = determinanty.det3(Vyměň(0, a, b));
Vypis(a);
int detY = determinanty.det3(Vyměň(1, a,b));
Vypis(a);
int detZ = determinanty.det3(Vyměň(2, a,b));
Vypis(a);
double x = detX / detA;
double y = detY / detA;
double z = detZ / detA;
Console.WriteLine("kořen x = {0}", x);
Console.WriteLine("kořen y = {0}", y);
Console.WriteLine("kořen z = {0}", z);
}
}
答案 0 :(得分:3)
数组在C#中通过引用传递,您正在更改方法内的矩阵值。
如果您不想这样做,请使用数组的克隆来传递方法。
答案 1 :(得分:0)
我想通过形式参数你的意思是价值类型..
但由于您使用的是数组(引用类型),因此它们将作为引用类型传递。
答案 2 :(得分:0)
数组是引用类型 - 因此将此类型的变量放入方法中不会创建值的副本,但是rater let方法可以修改该值。
如果您需要数组/矩阵类型的真正“值”语义,则需要创建自己的类型,强制您创建副本以修改值(类似于string
)。