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

Я скучаю по этим милым необязательным аргументам со времен, когда я программировал на 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 # был разработан, они не хотели поддерживать необязательные аргументы?

8
задан Raj More 2 March 2010 в 17:39
поделиться

4 ответа

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

12
ответ дан 5 December 2019 в 06:23
поделиться

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

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

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

7
ответ дан 5 December 2019 в 06:23
поделиться

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

6
ответ дан 5 December 2019 в 06:23
поделиться

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

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

1
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: