我知道在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}}
};
我想知道这是否是实现我目标的好方法?
答案 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
实例的任何成员,因为FD
是struct
并且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可以很好地实现我想要实现的目标。