如何在构造函数中创建数组,稍后将使用

时间:2019-02-09 02:08:35

标签: c# variables types constructor global-variables

我正在创建一个Matrix类,也想让构造函数也输入Matrix类型。如何初始化特定类型的2d数组?

public class Matrix
    {
        public int[][] matrix;
        //??


        Matrix(int x,int y,string type)
        {
            switch (type)
            {
                case "int":
                    //initialize a int 2d array
                case "double":
                    //initialize a double 2d array
                case "float":
                    //initialize a float 2d array
                default:
                   //initialize a float 2d array
                   break;

           }

       }
   }

3 个答案:

答案 0 :(得分:4)

如果可以在设计时声明类型,则约束为new的泛型可能会有所帮助

public class Matrix<T> where T : new()
{
   public T[][] matrix;
   public Matrix(int x, int y)
      => matrix = Enumerable.Range(0,x).Select(elem => new T[y]).ToArray();    
}

用法

var something = new Matrix<int>(4,4);

答案 1 :(得分:0)

标准方法是使用泛型而不是类似Matrix<T>这样的字符串名称。

如果要在运行时将类型指定为字符串,则必须添加多个字段来存储数组的每种类型,或者使用dynamicobject作为数组的类型(因为无法将float[][]分配给类型int[][]的字段。

对于非性能敏感的代码,我将与dynamic一起使用,因为它将为您提供看起来合理的代码(您失去了智能感知和编译时的安全性),并且无论如何都会在运行时验证所有操作。

public class Matrix
{
    dynamic matrix;

    Matrix(int x,int y,string type)
    {
        switch (type)
        {
            case "int":
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new int[y]).ToArray();
                break;
            case "double":
                //initialize a double 2d array
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new double[y]).ToArray();
                break;
            case "float":
            default:
                //initialize a float 2d array
                matrix = 
                   Enumerable.Repeat(0, x).Select(_ => new float[y]).ToArray();
                break;
         }
     }
 }

有关数组初始化,请参见Multidimensional Array问题。

答案 2 :(得分:0)

查看generics

public class Matrix<T> 
{    
    public T[,] matrix;

    public Matrix<T>(int x, int y)
    {
        matrix = new T[x, y];
    }
}

您可能会在互联网上的某个地方找到经过测试的现有Matrix类。