Что правильный путь состоит в том, чтобы инициализировать непустой статический набор в C# 2.0?

undefined, boolean, string, number, function

if( typeof foo !== 'undefined' ) { 

}

Object, Array

if( foo instanceof Array ) { 

}
20
задан Aaron Whittier 5 January 2009 в 18:10
поделиться

9 ответов

Если я полностью понимаю Ваш вопрос, кажется, что некоторые другие упустили суть, Вы надеетесь создавать статический набор подобным образом к Java, в котором можно объявить и заполнить в одной строке кода, не имея необходимость создавать специализированный метод, чтобы сделать это (согласно некоторым из других предложений). Это может быть сделано с помощью литерала массивов (переписанный две строки для предотвращения прокрутки):

private static readonly ICollection<string> Strings = 
  new string[] { "Hello", "World" };

Это и объявляет и заполняет новый набор только для чтения со списком объекта сразу. Работы в 2,0 и 3.5, я протестировал его только, чтобы быть вдвойне уверенным.

В 3,5, хотя можно использовать вывод типа, таким образом, Вы больше не должны использовать строку [] массив, который удаляет еще больше нажатий клавиш:

private static readonly ICollection<string> Strings = 
  new[] { "Hello", "World" };

Уведомление недостающий "строковый" тип во второй строке строки. Строка автоматически выведена из содержания инициализатора массива.

, Если Вы хотите заполнить его как список, просто поменяйте новую струну [] для нового Списка а-ля:

private static readonly ICollection<string> Strings = 
  new List<string>() { "Hello", "World" };

, Конечно, потому что Ваш тип является IEnumerable, а не определенной реализацией, если Вы хотите к методам доступа, характерным для List< строка>, такая как.ForEach (), необходимо будет преобразовать его для Списка:

((List<string>)Strings).ForEach(Console.WriteLine);

, Но это - маленькая цена для оплаты за migratability [который является словом?].

27
ответ дан 29 November 2019 в 23:45
поделиться

Статическая конструкция:

public class Foo
{
    private static readonly ICollection<string> _collection;

    static Foo()
    {
        _collection = new List<string>();
        _collection.Add("One");
        _collection.Add("Two");
    }
}

, Но примечание, что в этом случае можно просто инициализировать встроенный набор (рекомендуемый для причины производительности ):

private static readonly ICollection<string> _collection = new List<string>(new string[] { "One", "Two" });

Это действительно зависит от того, насколько сложный Ваш код инициализации.

9
ответ дан 29 November 2019 в 23:45
поделиться

Возможно, можно назвать статический метод:

public class Foo
{
    private static readonly ICollection<string> g_collection = initializeCollection();

    private static ICollection<string> initializeCollection()
    {
        ... TODO allocate and return something here ...
    }
}

Или, имея статического конструктора (как другие предложенные люди) могло бы быть эквивалентным, или еще более идиоматичным.

5
ответ дан 29 November 2019 в 23:45
поделиться

кроме того, статического конструктора, это также будет работать

    public class Foo
    {
        private static readonly ICollection<string> _collection = 
              new List<string>(new string[] { "elem1", "elem2", "...", "elemn" });
    }
1
ответ дан 29 November 2019 в 23:45
поделиться

Единственным путем я могу думать, должен был бы иметь статического конструктора. Таким образом, сначала Вы новый новый набор на уровне класса, затем в Вашем статическом конструкторе, добавляете все значения к нему.

0
ответ дан 29 November 2019 в 23:45
поделиться

Используйте статического конструктора следующим образом:

public class Foo
{
    static readonly ICollection<string> g_collection;

    // Static constructor
    static Foo()
    {
        g_collection = new List<string>();
        g_collection.Add("Hello");
        g_collection.Add("World!");
    }
}
0
ответ дан 29 November 2019 в 23:45
поделиться

Вы могли объявить пользовательский класс набора и добавить Ваш собственный ctor к нему...

  public class MyFooCollection: Collection<string>
   {
      public MyFooCollection(string[] values)
      {
          foreach (string s in values)  base.Add(s); 
      }
   }

затем в Вашем клиентском коде Вы могли записать

  private static final MyFooCollection g_collection = 
         new MyFooCollection(new string[] {"A", "B"});
0
ответ дан 29 November 2019 в 23:45
поделиться

Мне нравится использовать IEnumerable<T>.ToList().
кроме того, если Ваш набор должен быть только для чтения, можно использовать System.Collections.ObjectModel.ReadOnlyCollection.

private readonly ICollection<string> collection = new string[] { "a", "b", "c" }.ToList();

private readonly ReadOnlyCollection<string> collection2 = new ReadOnlyCollection<string>(new string[] { "a", "b", "c" });

РЕДАКТИРОВАНИЕ:
С другой стороны, если Вы используете его в качестве ICollection, можно просто использовать конструктора Array (так как T[] IList<T> и ICollection<T>). Следует иметь в виду, что в этом случае много методов изменения тех, которые Добавляют, перестали бы работать:

private readonly ICollection<string> = new string[] { "a", "b", "c" };

РЕДАКТИРОВАНИЕ № 2: Я просто понял, что ToList является функцией расширения и может только использоваться в C# 3.0. Можно все еще использовать конструктора Списка хотя:

private readonly IList<string> = new List<string>(new string[] { "a", "b", "c" });

однако, я предпочитаю ReadOnlyCollection для списков только для чтения.

0
ответ дан 29 November 2019 в 23:45
поделиться

У Вас есть две опции:

  1. Использование возвращаемое значение статического метода инициализировать набор.

  2. Использование статический конструктор для создания набора заполните его и инициализируйте его к статической переменной.

От перспективной опции 1 производительности лучше, с тех пор в случае статических конструкторов, время выполнения должно проверить, вызвали ли статического конструктора перед каждым доступом к классу.

0
ответ дан 29 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: