Объявление коллекций в C # - PullRequest
       10

Объявление коллекций в C #

1 голос
/ 18 декабря 2009

Мой вопрос: что наиболее эффективно и правильно для большого набора данных?

 _pointBuffer1 = new Point3DCollection {  
            new Point3D(140.961, 142.064, 109.300), new Point3D(142.728, 255.678, (...)

- или -

_pointBuffer1.Add(new Point3D(140.961, 142.064, 109.300)); _poitBuffer1.Add(142.728, (...)

Или это тоже самое?

Point3D объявлен как Point3DCollection, но мой вопрос касается любой коллекции объектов (например, Int32) ..

Ответы [ 3 ]

7 голосов
/ 18 декабря 2009

Я бы настоятельно рекомендовал использовать инициализатор коллекции для ясности (хотя я бы также использовал некоторые переводы строки).

Они не вполне заканчивают тем же IL, заметьте. Первое в конечном итоге эквивалентно:

var tmp = new Point3DCollection();
tmp.Add(new Point3D(140.961, 142.064, 109.300));
tmp.Add(new Point3D(142.728, 255.678));
...
_pointBuffer1 = tmp;

Другими словами, присвоение возможной переменной производится только после всех вызовов Add.

Это важно, если ваш Point3D конструктор как-то ссылается на _pointBuffer1!

4 голосов
/ 18 декабря 2009

Оба компилируются в один и тот же IL. Инициализаторы коллекции - это просто синтаксический сахар. Они будут вызывать метод Add. Пример:

var res = new List<int>() { 1, 2, 3 };

компилируется в:

List<int> <>g__initLocal0 = new List<int>();
<>g__initLocal0.Add(1);
<>g__initLocal0.Add(2);
<>g__initLocal0.Add(3);
List<int> res = <>g__initLocal0;

Единственное отличие заключается в объявлении дополнительной локальной переменной.

1 голос
/ 18 декабря 2009

Инициализация коллекции - синтаксический сахар. Под этим я подразумеваю, что это удобное сокращение, понимаемое компилятором. Компилятор создаст код, который логически идентичен вызову метода add коллекции для каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...