Есть ли способ создать статический массив только для чтения, но значения рассчитываются во время сборки - PullRequest
9 голосов
/ 15 сентября 2011

Есть ли способ создать статический массив со значениями только для чтения, но с использованием некоторой логики для его создания? Позвольте мне попытаться объяснить:

Я знаю, что могу сделать это:

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

Ответы [ 6 ]

11 голосов
/ 15 сентября 2011

Что вы можете сделать, это:

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();
2 голосов
/ 15 сентября 2011
public static readonly int[] Array = CreateArray();

private static int[] CreateArray()
{
    return new[] { 1, 2, 3, 4, 5 };
}
2 голосов
/ 15 сентября 2011

Да, попробуйте:

public static readonly IEnumerable<int> myArray = CreateValues();
public static IEnumerable<int> CreateValues()
{
  return new int[] { 1, 2, 3 };
}
1 голос
/ 15 сентября 2011

«Только чтение» применяется к экземпляру массива, а не к его содержимому.Таким образом, вы не сможете заменить исходный массив или изменить размер.Однако нет ограничений на ячейки массива, которые могут быть изменены в любое время.

1 голос
/ 15 сентября 2011
public static readonly int[] myArray2 = ((Func<int[]>)(() => {
    var array = new int[] { 1, 2, 3 };
    return array;
}))();

БОЛЬШЕ нечитабельно !!! Разве Javascript тебя ничему не научил?: -)

(обратите внимание, это шутка! Это интересно только потому, что показывает, что компилятор C # не может автоматически определять тип этой лямбда-функции)

В 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! */ 
0 голосов
/ 15 сентября 2011

Фактически ключевое слово readonly означает, что вы можете назначить / изменить переменную только в конструкторе.

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

или даже

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

См. MSDN .

...