C# 将二维整数存储为单独类中的只读/常量,同时保持非公开
这是我用这个地方作为“去”的第一个问题,我想了解一下什么有效/不有效/为什么有效等等。让我们试试这个 以我有限的经验,我一直在努力寻找更好的方法来创建固定数据字段,我可以在整个程序中引用这些字段,比如我反复显示的最终用户可视字符串,以及我希望保持不变且不受更改的其他参数。我将重复使用的数据保存在单独的静态类中,并将字符串放在C# 将二维整数存储为单独类中的只读/常量,同时保持非公开,c#,.net-4.0,C#,.net 4.0,这是我用这个地方作为“去”的第一个问题,我想了解一下什么有效/不有效/为什么有效等等。让我们试试这个 以我有限的经验,我一直在努力寻找更好的方法来创建固定数据字段,我可以在整个程序中引用这些字段,比如我反复显示的最终用户可视字符串,以及我希望保持不变且不受更改的其他参数。我将重复使用的数据保存在单独的静态类中,并将字符串放在私有静态只读数组中,通过使用私有ILists中的包装来公开这些数组,这些数组具有返回我要查找的单个字符串的公共getter。希望到目前为止我没有滥用术语! 到目前为止我所做的
私有静态只读
数组中,通过使用私有ILists
中的包装来公开这些数组,这些数组具有返回我要查找的单个字符串的公共getter。希望到目前为止我没有滥用术语!
到目前为止我所做的:
namespace MyNamespace
{
public static partial class Tables
{
private static readonly string[] _Messages =
{
"One",
"Two"
};
private static readonly IList<string> MessagesReadOnly = Array.AsReadOnly(_Messages);
public static IList<string> Messages { get { return MessagesReadOnly; } }
}
}
名称空间MyNamespace
{
公共静态部分类表
{
私有静态只读字符串[]\u消息=
{
“一个”,
“两个”
};
私有静态只读IList MessagesReadOnly=Array.AsReadOnly(_Messages);
公共静态IList消息{get{return messagesreadoly;}}
}
}
我明白这一点,但现在我有了一个二维数据表(int
),我需要以类似的非公开方式存储它,以便访问。这些数据将进入它自己的类,因为现在我正在处理一个单独的真实数据类型。 真实场景-我有不同的燃料及其相关的燃烧常数,我需要使用从气体分析仪获得的数据进行燃烧分析。因此,我想将这些数组/列表与其所有方法分开,但我似乎不知道如何做到这一点 如果我像以前一样,通过数组的路径(但这次是2D),那么我会遇到一个问题,即
array.AsReadOnly(myArray)
似乎只适用于一维数组。我不够精明,不知道如何编写自己的代码来解决这个问题(假设这是一个足够简单的任务)。因此,如果我尝试使用锯齿状数组,因为这似乎是我找到的另一种可行的方法,我会陷入困境,试图找出如何以及在何处创建初始锯齿状数组(构造函数或as类方法),然后在其中初始化数组呢
如果我不需要保护数组,那么我可以把它全部放在构造函数中,这可能没问题(据我所知),但我必须保持它不暴露。我第一次理解如何在编程上适合类,但试图使用未公开的锯齿数组,这让我搞糊涂了。我在web上看到的所有示例似乎都是在main
中创建和初始化的,这很好(虽然已公开),但当我将其放在其他地方时,如何在不公开数据的情况下将其提供给任何可能需要数据的对象
希望你能理解为什么我觉得自己在兜圈子,也许答案很简单,我忽略了显而易见的东西,但直到我看到其他人做了类似的事情,我才明白,而且我还没有找到足够近的东西来给我线索。如果已经有一个类似的职位上,所以请告诉我在那个方向。正如我所说,我已经搜索了这两个MSDN,所以我在网上漫游寻找面包屑
如果你需要更多关于我一直尝试的信息,请告诉我,谢谢阅读
我刚刚在这个问题上添加了标签,看到了一个数组标签,所以我想看看是否可以缩小范围。不确定我是否也应该添加该标记,我还可以添加列表
这些数据将进入它自己的类,因为现在我正在处理一个单独的真实世界数据t
如果要将其存储在自定义类中,只需为该类编写一个
这看起来像:
private YourType[,] internalArray; // Create and set this up in constructor or elsewhere...
public YourType this[int row, int column]
{
get
{
return internalArray[row,column];
}
{
可以在静态类的静态构造函数中初始化锯齿数组 所以
公共静态只读IList数组;
静态表(){
//初始化数组
//使其只读
列表ar1=新列表();
对于(int i=0;i<10;i++)
{
列表ar2=新列表();
对于(int j=0;j<10;j++)
{
ar2.加入(j);
}
ar1.Add(ar2.AsReadOnly());
}
array=ar1.AsReadOnly();
}
您不能为此使用列表,并定义一个只有用于检索数据的getter的公共只读属性。tl;博士有什么问题吗?听起来像是存储在程序集资源中的那种数据。@Gabe:很抱歉,您认为这太长了,只是具体地告诉我到目前为止所做的工作。是的,有一个问题在那里,所以这8段都只是问“我如何创建一个不可变的2D数组”?是的。。。如果我知道我所要做的就是问“我如何创建一个不可变的2D数组?”那么我就会问这个问题。有很多问题,所以比这要长得多-你是否也要强调“tl dr”呢?每个人都必须从某个地方开始,而现在我并不总是知道如何用10个字或更少的话问我想要什么,或者我应该在我的问题中给出或不给出多少信息。当你学习一些东西时,这就是问题所在。问题是这样他就失去了数组的可枚举性和长度属性。@xanatos:我不这么认为internalArray
是一个锯齿状数组,所以我们有这些属性,我们甚至可以为此定义一些公共属性。@xanatos:如果他的类实现了IEnumerable
和/或ICollection
,就不会了-根据需要很容易重新公开这些信息。是的。。。这正变得越来越完整。。。您可以/应该添加一个IList@xanatos:我真的会推荐阿金斯
public static readonly IList<IList<int>> array;
static Tables() {
// Init array
// Make it read only
List<IList<int>> ar1 = new List<IList<int>>();
for (int i = 0; i < 10; i++)
{
List<int> ar2 = new List<int>();
for (int j = 0; j < 10; j++)
{
ar2.Add(j);
}
ar1.Add(ar2.AsReadOnly());
}
array = ar1.AsReadOnly();
}