有没有一种方法可以创建一个静态只读数组,但这些值是在构建时计算的

本文关键字:计算 构建 静态 方法 一种 创建 只读 有没有 一个 数组 | 更新日期: 2023-09-27 18:08:46

有没有一种方法可以创建一个具有只读值的静态数组,但使用一些逻辑来创建它?让我试着解释一下:

我知道我能做到:

public static readonly int[] myArray = { 1, 2, 3 };

但是有可能做这样的事情吗:

public static readonly int[] myArray2 = 
{
    for (int i = 0; i < 256; i++)
    {
        float[i] = i;
    }
};

编辑时间:一个很好的解决我的问题:静态构造函数!http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=VS.100%29.aspx:D

有没有一种方法可以创建一个静态只读数组,但这些值是在构建时计算的

您可以做的是:

public class YourClass
{
    public static readonly int[] myArray2 = null;
    static YourClass()
    {
        myArray2 = new int[256];
        for (int i = 0; i < 256; i++)
        {
            myArray2 [i] = i;
        }        
    }
}

或者:

public static readonly int[] myArray2 = Enumerable.Range(0, 255).ToArray();

是的,试试看:

public static readonly IEnumerable<int> myArray = CreateValues();
public static IEnumerable<int> CreateValues()
{
  return new int[] { 1, 2, 3 };
}
public static readonly int[] Array = CreateArray();
private static int[] CreateArray()
{
    return new[] { 1, 2, 3, 4, 5 };
}

"readonly"应用于数组实例,而不是其内容。因此,您将无法替换原始数组或修改大小。但是,数组的单元格没有限制,可以随时修改。

public static readonly int[] myArray2 = ((Func<int[]>)(() => {
    var array = new int[] { 1, 2, 3 };
    return array;
}))();

更不可读Javascript没有教会你什么吗?:-(

(注意,这只是一个笑话!它之所以有趣,是因为它向您展示了C#编译器无法自动发现这个lambda函数的类型(

在Javascript中,你会写一些类似的东西:

// ILLEGAL IN C#!!! DANGER, WILL ROBINSON!
public static readonly int[] myArray2 = (() => {
    var array = new int[] { 1, 2, 3 };
    return array;
})();

现在我来看看"工作"的C#方式(哦!恐怖!(

public static readonly int[] myArray2 = (
    (Func<int[]>) /* <-- The cast to Func<int[]> delegate */ 
    ( 
    /* Start Declaration --> */ 
        () => { var array = new int[] { 1, 2, 3 }; return array;
    } /* <-- End Declaration */ 
    )
    ) 
    (); /* <-- Here we call it! */ 

实际上关键字readonly意味着您只能将变量分配/修改到构造函数中。

public static readonly int[] values = Enumerable.Range(0, 256).ToArray();

甚至

public static readonly IEnumerable<int> values = Enumerable.Range(0, 256).ToArray();

请参阅MSDN。