Гарантирует ли ключевое слово params элементы в том же порядке, в котором они перечислены? - PullRequest
3 голосов
/ 13 июня 2011

Я работаю над простым API, который будет принимать несколько вариантов IBehaviours, которые затем применяются в конфигурации. Я делаю это с помощью ключевого слова params, поскольку часто требуется только одно поведение, а иногда и больше.

Однако очень важно, чтобы поведение применялось в правильном порядке.

public void Configure(string wow, params IBehaviour[] behaviours) { ... }

Configure("oh yes", new MustHappenFirst(), new MustHappenSecondly());

Это

  1. Технически подразумеваем, что behaviours происходит в том же порядке, когда Перечисляя? (как в стандартном не просто в практическом плане).

  2. Семантически и интуитивно передать то же поведение?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 13 июня 2011

Оценка аргументов будет происходить в порядке слева направо, и они будут помещены в массив в этом порядке.

Обратите внимание, что если "null" является допустимым значением для поведения,Вы можете попасть в беду:

Configure("hello", null);

звонки

Configure("hello", (IBehaviour[]) null);

не

Configure("hello", new IBehaviour[1] { null } );

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

4 голосов
/ 13 июня 2011

Да. Когда вы используете params, компилятор просто превращает аргументы в массив в том же порядке, в котором аргументы были перечислены в программе. Они всегда будут в таком порядке внутри метода.

Звонок на:

Configure("wow", one, two, three);

Всегда будет отображаться на:

Configure("wow", new[] {one, two, three});
1 голос
/ 13 июня 2011

Да.Параметры, указанные для метода с использованием ключевого слова params, будут помещены в массив params в порядке, указанном в вызове метода.Обычно это понимают разработчики, знакомые с методами использования параметров, такими как String.Format, где порядок значения форматирования в списке параметров очень важен.

0 голосов
/ 13 июня 2011
  1. Да;заказ сохранен.

  2. Да;это нормально.

...