繁体   English   中英

C#,如何处理常量表

[英]C#, how to handle constant tables

这种语言显然没有合适的功能,这似乎很奇怪。

我发现自己的数据最好被表达为一个多维数组,但它完全不变,任何人都无法在不改变相关代码的情况下改变它。 面对Delphi中的这些东西,答案是显而易见的 - 一个常量,其值是表。 但是,C#似乎不支持这样的东西。

谷歌显示许多人对此抱怨,没有好的答案。

人们如何处理这种情况?

(并且不要说常量不属于代码 - 我碰到的最后一个是4个项目的所有可能的排列。除非时空变化的本质,这是固定的。)

发生了什么?? 有一个答案非常接近,我问的是一个细节,它消失了! 简单地声明一个数组排序工作 - 唯一的问题是数组分配将每次运行。 我前面的那个包含96个值 - 如何让它只初始化一次? 我是否只需要接受范围远大于应有范围的范围? (因为它代表的是一个3行程序,其内部相当于O(n ^ 3)程序。)

有关此特定内容的C#FAQ中有一页。

他们建议使用静态只读数组:

static readonly int[,] constIntArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }};

但是,请注意,这只是一种常量 - 您仍然可以重新分配数组中的各个元素。 此外,这必须在类级别指定,因为它是静态的,但它将工作得相当好。

您可以使用只读Hashtable。 唯一的缺点是readonly不会阻止您更改Hashtable中特定项的值。 所以它不是真正的常量。

readonly Hashtable table = new Hashtable(){{1,"One"},{2,"Two"}};

或者数组

public readonly string[,] arry = new string[,]{{"1","2"},{"2","4"}};

是的,您需要在适当的范围内声明变量,以便不会多次初始化它。

就像他们说的那样,只需添加另一层间接。 C#不需要提供专门的数据结构作为语言原语,尽管有时希望有一种方法可以使任何类不可变,但这是另一种讨论。

现在你没有提到你是否需要存储不同的东西。 事实上,你没有提到除了多维之外的任何东西,也没有能力改变数值或数组。 我甚至不知道访问模式(单个int,int,int索引器)是否合适。

但总的来说,对于一个三维锯齿状阵列,以下工作(但它并不漂亮)。

一个警告是你构造它的类型也需要是不可变的,但这是你的问题。 您可以只创建自己的只读包装器。

public static readonly ReadOnlyThreeDimensions<int> MyGlobalThree 
    = new ReadOnlyThreeDimensions<int>(IntInitializer);

public class ReadOnlyThreeDimensions<T> 
{
    private T[][][] _arrayOfT;

    public ReadOnlyThreeDimensions(Func<T[][][]> initializer)
    {
        _arrayOfT = initializer();
    }

    public ReadOnlyThreeDimensions(T[][][] arrayOfT)
    {
        _arrayOfT = arrayOfT;
    }

    public T this [int x, int y, int z]
    {
        get 
        {
            return _arrayOfT[x][y][z];
        } 
    }
}

然后你只需要提供一些初始化方法,或者在静态构造函数中分配它。

public static int[][][] IntInitializer()
{
    return xyz // something that constructs a [][][]  
}

枚举,当然。

好吧,我采取了下面的方法,它有点讨厌,但很容易编辑。

    public struct Something
    {
        public readonly int Number;
        public readonly string Name;
        public Something(int num, string name) { this.Number = num; this.Name = name; }
    }

    public readonly Something[] GlobalCollection = new Something[] 
    {
        new Something(1, "One"),
        new Something(2, "Two"),
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM