Разработка компиляторов

       

Список параметров


В некоторых случаях точное количество параметров заранее неизвестно; например, метод вывода Console.WriteLine может принимать как одиночные переменные известного типа, так и произвольное число объектов для печати. В С++ для этого используется аргумент "многоточие"; в C# такая функциональность реализуется с помощью специального ключевого слова params , которое должно быть последним в списке параметров метода и сопровождаться указанием типа принимаемых параметров. Если в списке параметров могут встречаться аргументы различного типа, то необходимо использовать тип object, так как любой аргумент может быть приведен к этому типу путем упаковки.

Компилятор всегда начинает обработку вызова метода с попытки найти перегруженный метод, точно соответствующий типам переданных параметров, и только при отсутствии совпадающего метода обращается к варианту, использующему список параметров. Вызов со списком параметров обычно не очень эффективен, так как подразумевает создание и заполнение массива объектов, поэтому рекомендуется создавать различные перегруженные методы для наиболее употребительных случаев использования. Скажем, следующий пример с печатью трассирующих сообщений имеет смысл дополнить вариантами методов для одного, двух и трех параметров различных типов. Тогда вариант со списком параметров будет использоваться только в крайних случаях.

class Info { public static void Trace (string strMessage) { Console.WriteLine (strMessage); } public static void TraceX (string strFormat, params object[] list) { Console.WriteLine (strFormat, list); } }

class Test { public static void Main() { Info.Trace ("Plain vanilla string... "); Info.TraceX ("{0} {1} {2}", "C", "U", 2001); } }



Содержание раздела