将二维整数存储为独立类中的Readonly / const,同时保持不暴露

这是我用这个地方作为我的“去”以获得关于什么有效/无效/为什么等的一般意见的第一个问题。 那么让我们试试吧……

凭借我有限的经验,我一直在努力探索创建固定数据字段的更好方法,我可以在整个程序中参考这些字段 – 例如我反复显示的最终用户可查看字符串以及其他参数。我希望保持不变并保持安全。 我将我的重用数据保存在单独的静态类中,并将我的字符串放在private static readonly数组中,我通过使用包含在私有ILists中的公开来获取公共getter返回我所追求的单个字符串。 希望到目前为止我还没有滥用术语! 到目前为止我做了什么:

 namespace MyNamespace { public static partial class Tables { private static readonly string[] _Messages = { "One", "Two" }; private static readonly IList MessagesReadOnly = Array.AsReadOnly(_Messages); public static IList Messages { get { return MessagesReadOnly; } } } } 

我理解的很多,但现在我有一个二维数据表( int ),我需要以一种类似的非暴露方式存储,我可以访问。
这个数据正在进入它自己的类,因为现在我正在处理一个单独的真实数据类型。 实际情况 – 我有不同的燃料及其相关的燃烧常数,我需要使用从气体分析仪获得的数据进行燃烧分析。 所以我想保持这些数组/列表与他们所有的方法分开,但我似乎无法弄清楚如何做到这一点。

如果我喜欢我以前做过并通过数组路径(但这次是2D)那么我遇到的问题似乎(根据MSDN上的信息) Array.AsReadOnly(myArray)仅适用于一维数组。 我不够精明,不知道如何编写我自己的解决方案(假设这是一个足够简单的任务)。 那么如果我去尝试使用锯齿状数组,因为这似乎是我发现的另一条可行路径,我会陷入困境,试图弄清楚如何以及在何处创建初始锯齿状数组(构造函数或类方法)和那么在那里初始化数组呢?

如果我不需要保护数组,那么我可以将它全部放在构造函数中,这可能没问题(据我所知,到目前为止)但我必须保持它不暴露。 第一种方式我理解程序化如何适应类,但试图使用非暴露的锯齿状数组让我陷入困境。 我在网上看到的所有例子似乎都创建了它们并在main中初始化,这很好(虽然暴露)但是当我把它放在别处时,如何让它可用于任何可能需要数据而不暴露它们的东西?

希望你能理解为什么我觉得我要进入圈子里,也许答案非常简单,但我错过了显而易见的事情,但在我看到其他人做类似事情之前,我无法弄明白,而我却无法理解找到足够接近的东西来给我提供线索。 如果在SO上已经存在类似的post,请指出我的方向。 就像我说过的那样,我已经搜索了MSDN,SO并在网上搜索面包屑。

如果您需要更多关于我一直在努力的信息并感谢阅读,请告诉我。

我刚刚在这个问题上添加了标签,看到有一个数据标签,所以我想知道我是否可以在那里缩小范围。 不确定我是否应该添加该标签,我还可以添加列表……?

这个数据正在进入它自己的类,因为现在我正在处理一个单独的现实世界数据

如果您要将其存储在自定义类中,则可以为该类编写自定义只读索引器属性 。

这看起来像是这样的:

 private YourType[,] internalArray; // Create and set this up in constructor or elsewhere... public YourType this[int row, int column] { get { return internalArray[row,column]; } { 

您无法为此目的使用List>并定义一个只有用于检索数据的getter的公共只读属性。

您可以在静态类的静态构造函数中初始化锯齿状数组。

所以

 public static readonly IList> array; static Tables() { // Init array // Make it read only List> ar1 = new List>(); for (int i = 0; i < 10; i++) { List ar2 = new List(); for (int j = 0; j < 10; j++) { ar2.Add(j); } ar1.Add(ar2.AsReadOnly()); } array = ar1.AsReadOnly(); }