C#中常数对象的常数数组

时间:2018-07-20 05:16:37

标签: c# constants

我知道在C#中const只能在编译时初始化。这与我正在尝试做的事情有关。

我的目标是用C#写一个常量对象的常量数组。我怎样才能做到这一点?

为了解释自己,请允许我在C ++中插入一些代码(我之前写过一些代码)来解释我要做什么。

(在C ++中)

struct FD{
 string name; 
 double CE[2]; 
};

const FD models[2]={
     {"one",{2.0,1.0}},
     {"two",{3.0,4.0}}
};

看起来很简单,对吧?我该如何在C#中做类似的事情?


编辑:(尝试的答案)

我发现您可以在C#中做类似的事情

 struct FD
    {
        public string name;
        public double[] CE;
    }
 static readonly FD[] models= new[]
   {
     new FD(){name="one" , CE= new double[]{1.0,2.0 } },
     new FD(){name="two", CE= new double[]{3.0,4.0}}         
   };

我想知道这是否是实现我目标的好方法?

3 个答案:

答案 0 :(得分:2)

遗憾的是,在C#中,您不能将数组或结构定义为const,因为构造函数可以具有运行时逻辑,因此必须在运行时执行。提议的解决方案几乎是您想要的,您只需要一个ReadonlyCollection<FD>来封装您的Array:

using System.Collections.ObjectModel;

static readonly ReadOnlyCollection<FD> models = new ReadOnlyCollection<FD>(new[]
{
    new FD(){name="one" , CE= new double[]{1.0,2.0 } },
    new FD(){name="two", CE= new double[]{3.0,4.0}}
});

现在您不能更改模型的引用(readonly),也不能更改模型的内容(ReadonlyCollection)。您也不能更改FD实例的任何成员,因为FDstruct并且ReadonlyCollection创建了另一层间接层,基本上是复制您的结构:

models = new ReadOnlyCollection<FD>(new FD[] { }); // Error CS0198  A static readonly field cannot be assigned to
models[0] = new FD(); // Error CS0200  indexer  is read only
models[0].name = "testname"; // Error CS1612  Cannot modify the return value

编辑:我忽略了一些内容,您仍然可以更改数组:

 models[0].CE[0] = 1; // compiles just fine

如果可能的话,您也想将CE设为只读,但是我不确定您的API是否允许

答案 1 :(得分:0)

跳出框框思考:P

其他人为您提供了很棒的主意,但如果您想拥有真正的const 4值,则可以:

null

答案 2 :(得分:0)

最后,感谢用户Corak和Freggar,我可以提供这样的东西。 (我认为model3是答案

结构

 struct FD
    {
        public string name;
        public double[] CE;
    }

    struct FD2
    {
        public FD2(string name, IEnumerable<double>ce)
        {
            Name = name;
            CE = new ReadOnlyCollection<double>(new List<double>(ce));
        }
        public readonly string Name;   
        public readonly IReadOnlyList<double> CE;
    }

和列表

 //This solution does not give the entire constant structure as name and FD[0] can be changed
        static readonly FD[] models= new[]
          {
              new FD(){name="one" , CE= new double[]{1.0,2.0 } },
              new FD(){name="two", CE= new double[]{3.0,4.0}}

          };

        //Here name can not be changed but models2[0] can be
        static readonly FD2[] models2 = new[]
        {
            new FD2("one",new double[]{1.0,2.0 }),
            new FD2("two", new double[]{3.0,4.0 })
        };

        //This is the best solution
        static readonly IReadOnlyList<FD2> models3 = new ReadOnlyCollection<FD2>(new[] {
            new FD2("one",new double[]{1.0,2.0 }),
            new FD2("two", new double[]{3.0,4.0 })
        }
        );

        //This is also a good solution but models4[0].CE[0] can be changed
        static readonly ReadOnlyCollection<FD> models4 = new ReadOnlyCollection<FD>(new[]
        {
             new FD(){name="one" , CE= new double[]{1.0,2.0 }},
             new FD(){name="two", CE= new double[]{3.0,4.0}}
        }); 

我想models3可以很好地实现我想要实现的目标。