改变方法中的矩阵参数会改变原始矩阵

时间:2013-04-19 05:03:03

标签: c# matrix

当我调用名为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);

    }
}

3 个答案:

答案 0 :(得分:3)

数组在C#中通过引用传递,您正在更改方法内的矩阵值。

如果您不想这样做,请使用数组的克隆来传递方法。

答案 1 :(得分:0)

我想通过形式参数你的意思是价值类型..
但由于您使用的是数组(引用类型),因此它们将作为引用类型传递。

答案 2 :(得分:0)

数组是引用类型 - 因此将此类型的变量放入方法中不会创建值的副本,但是rater let方法可以修改该值。

如果您需要数组/矩阵类型的真正“值”语义,则需要创建自己的类型,强制您创建副本以修改值(类似于string)。