如何避免对大型动态对象进行装箱/拆箱?

时间:2019-04-08 22:52:02

标签: c# dynamic boxing unboxing

我需要将两个相对较大的矩阵相乘,并进行多次(循环)。但是,这些矩阵在存储器中的存储格式(对象类型)应由用户选择。 有三种可能性:

  1. double [,] M1; double [,] M2;(二维数组)

  2. double[][] M1; double [][]M2;(锯齿状数组)。

  3. Matrix <double> M1;Matrix <double> M2;(数学净数字格式)。

每种格式都适合一种相应的方法(如您可能已经猜到的那样,取自数字库)。我需要不惜一切代价避免装箱和拆箱(因为它很昂贵),因此以下代码对我不起作用(除非您告诉我装箱/拆箱比快速矩阵乘法便宜):

object M1;
object M2;

switch case 
{
    case 1:
        M1 = new double[rows,columns];
    .../etc
}

一种解决方法非常简单:只需声明6个矩阵(6个变量),然后在运行时初始化其中的两个即可。但这看起来很丑陋,会使代码更加复杂。

我的问题:这个问题有什么优雅的解决方案吗?我是C#的新手,但是在该网站上进行搜索并没有太大帮助。

1 个答案:

答案 0 :(得分:0)

是的,您很好,这里没有装箱/拆箱。我弄清楚了我想要和需要做的事情。我将创建一个声明一些矩阵方法的接口:

interface MatrixMethods
{
   void MatrixIni();
   void DoMultiplication();
   double ReturnFinalResult();
// etc
}

然后我将使用泛型类:

class MatrixStorage <T> 
{
  protected T M1;
  protected T M2;
// etc
}

最后是所需的类:

    class MatrixMult<T> : MatrixStorage<T> , MatrixMethods
{
    public void MatrixIni()
    {
        //etc Matrix random ini
    }
    public void DoMultiplication()
    {
        // multiplication
    }
    public double ReturnFinalResult()
    {
        // compute output
    }
    MatrixMult(params int[] input)
    {
        // ini
    }

}

,然后实例化该类并进行计算:

MatrixMethods newMatrixMult;
newMatrixMult = new MatrixMult<UserMatrixType>(userData);
newMatrixMult.DoMultiplication();
double result = newMatrixMult.ReturnFinalResult

对于一个误导性问题,我深表歉意。 最好