В чем причина того, что C # не поддерживает необязательные аргументы / аргументы по умолчанию? - PullRequest
8 голосов
/ 02 марта 2010

Я скучаю по этим милым необязательным аргументам со времен, когда я программировал на C ++ больше. Я знаю, что они не существуют в C #, но мой вопрос Почему .

Я думаю, перегрузка методов - плохая замена, которая очень быстро запутывает вещи.

void foo(int x,int y,int z=0){
  //do stuff...
}

//is so much more clean than

void foo(int x,int y){
  foo(x,y,0);
}
void foo(int x,int y,int z){
 //do stuff
}

Я просто не понимаю, в чем причина. У компилятора C #, очевидно, не будет проблем с поддержкой этого, просто Microsoft решила не поддерживать его.

Почему, когда C # был разработан, они не хотели поддерживать необязательные аргументы?

Ответы [ 4 ]

12 голосов
/ 02 марта 2010

Как говорит Андрей, C # 4 имеет необязательные параметры и именованные аргументы. Тем не менее, стоит отметить, что одна из проблем, которая заставила Андерса неохотно включать их для начала - а именно, что значение по умолчанию (которое должно быть константой) запекается в вызывающем коде - по-прежнему подарок. Другими словами, это та же проблема, что и общедоступные const значения из C # 1.

7 голосов
/ 02 марта 2010

Его пока нет, но это в C # 4. Это во многом связано со стоимостью и тем, насколько хорошо эта функция вписывается в основные новые части языка (такие как Generics в .Net 2 или linq в 3). Необязательные аргументы будут соответствовать новой динамической версии 4, поэтому они включены.

Процитирую Эрик Липперт (который сам цитировал Эрик Ганнерсон ) о том, почему многие, казалось бы, хорошие функции не включены:

(1) это не вычитающий процесс; мы не начинаем с C ++, Java или Haskell, а затем решаем, следует ли исключить некоторые из них. И (2) просто быть хорошей особенностью недостаточно. Функции должны быть настолько привлекательными, что они стоят огромных долларовых затрат на разработку, внедрение, тестирование, документирование и доставку этой функции. Они должны стоить затрат на усложнение языка и усложнение разработки других функций в будущем.

6 голосов
/ 02 марта 2010

Я думаю, что бесполезно пытаться ответить на вопрос «Почему?». Но у меня есть хорошие новости, в C # 4.0 они есть.

1 голос
/ 02 марта 2010

Необязательные аргументы не так просты, как они выглядят. Вы можете получить сложные проблемы, если у вас есть перегруженные методы, у всех из которых есть необязательные аргументы. Правила разрешения могут стать очень сложными очень быстро. Я думаю, что для первой версии C # не было хорошего решения, поэтому они пропустили необязательные параметры.

Но вы, вероятно, знаете, что в C # 4.0 будут необязательные и именованные аргументы, так что в целом это не плохая идея! ; -)

...