【问题标题】:How can I create a method in C# that doesn't care about the location of its parameters?如何在 C# 中创建一个不关心其参数位置的方法?
【发布时间】:2022-11-17 07:50:37
【问题描述】:

不知道我说的是否有道理,如果没有,这是我的意思的一个例子:

我创建了一个执行“标量矩阵”乘法的方法,也就是二维数组的每个元素都乘以一个标量(乘以小数)。现在,无论您执行 array * decimal 还是 decimal * array 都没有关系,无论哪种方式,您都应该得到相同的答案。到目前为止,这就是我所拥有的:

public static double[,] ScalarMatrixMult(double[,] A, double n)
{
    for (int i = 0; i < A.GetLength(0); i++)
    {
        for (int j = 0; j < A.GetLength(1); j++)
        {
            A[i, j] = A[i, j] * n ;
        }
    }

    return A;
}

public static double[,] ScalarMatrixMult2(double n, double[,] A)
{
    for (int i = 0; i < A.GetLength(0); i++)
    {
        for (int j = 0; j < A.GetLength(1); j++)
        {
            A[i, j] = A[i, j] * n;
        }
    }

    return A;
}

我有 2 种不同的方法来做完全相同的事情......因为它们关心参数的位置。

我能以某种方式在一种方法中捕捉到“不关心参数位置”的想法吗?或者也许我可以在另一个里面使用其中一个?我真的想避免为本质上相同的事物使用 2 个不同的名称(以及复制粘贴代码 sn-ps)。

【问题讨论】:

  • C# 编译器不会简单地将参数与基于类型的参数进行匹配。如果你有两个参数都是doubles 怎么办?如果您传递的其中一个东西不是 double 但它可以隐式转换为它怎么办?不,C# 要求您以相同的顺序或按名称指定它们,以便它们可以相应地匹配。
  • 超载,我一定会进一步研究,感谢您提供的信息!

标签: c# matrix methods parameters


【解决方案1】:

您可以使用Named Parameters 来实现这一点。您将定义一个方法,调用者可以按名称提供参数,这样顺序就无关紧要了。

如果您不记得参数的顺序但知道它们的名称,则可以按任何顺序发送参数。

【讨论】:

    【解决方案2】:

    我真的想避免在本质上使用 2 个不同的名称 同样的事情(和复制粘贴代码 sn-ps)。

    您可以overload方法,使用相同的名称,并简单地让一个版本调用另一个版本:

    public static double[,] ScalarMatrixMult(double n, double[,] A)
    {
        return ScalarMatrixMult(A, n);
    }
     
    public static double[,] ScalarMatrixMult(double[,] A, double n)
    {
        for (int i = 0; i < A.GetLength(0); i++)
        {
            for (int j = 0; j < A.GetLength(1); j++)
            {
                A[i, j] = A[i, j] * n ;
            }
        }
    
        return A;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多