в чем разница между этим и просто созданием метода, который получает список или массив?
Разница между
void M(params int[] x)
а также
void N(int[] x)
это то, что М можно назвать так:
M(1, 2, 3)
или вот так:
M(new int[] { 1, 2, 3 });
но N можно назвать только вторым способом, а не первым .
возможно, это как-то влияет на производительность?
Влияние на производительность заключается в том, что независимо от того, вызываете ли вы M
первым или вторым способом, вы получаете созданный массив. Создание массива влияет на производительность, поскольку требует времени и памяти. Помните, что влияние на производительность следует измерять относительно целей производительности; маловероятно, что стоимость создания дополнительного массива является определяющим фактором, определяющим разницу между успехом и провалом на рынке.
Я не совсем понимаю или не вижу, каким образом вы бы предпочли тот, с неограниченными параметрами.
Для автора кода, вызывающего метод, это полностью и полностью удобно; это просто короче и легче писать
M(1, 2, 3);
вместо того чтобы писать
M(new int[] { 1, 2, 3 });
Это просто экономит несколько нажатий клавиш на стороне звонящего. Это все.
Несколько вопросов, которые вы не задавали, но, возможно, хотели бы знать ответ на:
Как называется эта функция?
Методы, позволяющие передавать переменное число аргументов на стороне вызывающей стороны, называются переменными . Методы Params - это то, как C # реализует переменные методы.
Как работает разрешение перегрузки с помощью метода вариаций?
Столкнувшись с проблемой разрешения перегрузки, C # будет рассматривать как «нормальную», так и «расширенную» формы, и «нормальная» форма всегда выигрывает, если применимы обе. Например, рассмотрим это:
void P(params object[] x){}
и у нас есть звонок
P(null);
Есть две применимые возможности. В «нормальной» форме мы вызываем P
и передаем нулевую ссылку для массива. В «развернутом» виде мы называем P(new object[] { null })
. В этом случае нормальная форма побеждает. Если у нас был вызов, P(null, null)
то обычная форма неприменима и расширенная форма выигрывает по умолчанию.
Задача : предположим, у нас есть var s = new[] { "hello" };
и звонок P(s);
. Опишите, что происходит на сайте вызова и почему. Вы можете быть удивлены!
Задача : предположим, у нас есть и то void P(object x){}
и другое void P(params object[] x){}
. Что делает P(null)
и почему?
Задача : предположим, у нас есть и то void M(string x){}
и другое void M(params string[] x){}
. Что делает M(null)
и почему? Чем это отличается от предыдущего случая?