undefined, boolean, string, number, function
if( typeof foo !== 'undefined' ) { }
Object, Array
if( foo instanceof Array ) {
}
Если я полностью понимаю Ваш вопрос, кажется, что некоторые другие упустили суть, Вы надеетесь создавать статический набор подобным образом к 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 [который является словом?].
Статическая конструкция:
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" });
Это действительно зависит от того, насколько сложный Ваш код инициализации.
Возможно, можно назвать статический метод:
public class Foo
{
private static readonly ICollection<string> g_collection = initializeCollection();
private static ICollection<string> initializeCollection()
{
... TODO allocate and return something here ...
}
}
Или, имея статического конструктора (как другие предложенные люди) могло бы быть эквивалентным, или еще более идиоматичным.
кроме того, статического конструктора, это также будет работать
public class Foo
{
private static readonly ICollection<string> _collection =
new List<string>(new string[] { "elem1", "elem2", "...", "elemn" });
}
Единственным путем я могу думать, должен был бы иметь статического конструктора. Таким образом, сначала Вы новый новый набор на уровне класса, затем в Вашем статическом конструкторе, добавляете все значения к нему.
Используйте статического конструктора следующим образом:
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!");
}
}
Вы могли объявить пользовательский класс набора и добавить Ваш собственный 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"});
Мне нравится использовать 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
для списков только для чтения.
У Вас есть две опции:
Использование возвращаемое значение статического метода инициализировать набор.
Использование статический конструктор для создания набора заполните его и инициализируйте его к статической переменной.
От перспективной опции 1 производительности лучше, с тех пор в случае статических конструкторов, время выполнения должно проверить, вызвали ли статического конструктора перед каждым доступом к классу.