Я скучаю по этим милым необязательным аргументам со времен, когда я программировал на 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 # был разработан, они не хотели поддерживать необязательные аргументы?
Как говорит Андрей, C # 4 имеет необязательные параметры и именованные аргументы. Тем не менее, стоит отметить, что одна из проблем, из-за которой Андерс не хотел включать их в начало, а именно то, что значение по умолчанию (которое должно быть константой) запеклось в коде вызывающего , все еще остается настоящее время. Другими словами, это та же проблема, что и общедоступные значения const
из C # 1.
Его еще нет, но он есть в C # 4. Это в основном связано с ценой и тем, насколько хорошо эта функция сочетается с основными новыми компонентами. языка (например, Generics в .Net 2 или linq в 3). Необязательные аргументы будут соответствовать новому динамическому материалу, входящему в версию 4, поэтому были включены.
Процитируем Эрика Липперта (который сам цитировал Эрика Ганнерсона ) о том, почему многие, казалось бы, хорошие особенности не включены:
(1) это не вычитающий процесс; мы не начинаем с C ++, Java или Haskell, а затем решаем, стоит ли упускать из них какую-то особенность. И (2) недостаточно просто быть хорошей функцией. Функции должны быть настолько привлекательными, чтобы оправдывать огромные долларовые затраты на разработку, внедрение, тестирование, документирование и доставку функции. Они должны стоить затрат на усложнение языка и затруднение разработки других функций в будущем.
Думаю, бесполезно пытаться отвечать на вопрос «Почему?». Но у меня есть хорошие новости, они есть в C # 4.0.
Необязательные аргументы не так просты, как кажутся. У вас могут возникнуть сложные проблемы, если у вас есть перегруженные методы, у которых есть необязательные аргументы. Правила разрешения могут очень быстро усложниться. Думаю, для первой версии C # не было хорошего решения, поэтому они пропустили необязательные параметры.
Но вы, вероятно, знаете, что C # 4.0 будет иметь необязательные и именованные аргументы, так что в целом это кажется неплохой идеей! ; -)