Привет!
Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
"Oxy" <5701@news.rsdn.ru> wrote in message news:484389@news.rsdn.ru... > Привет! > Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
В принципе нет. Такие вещи делают через перегрузку:
Здравствуйте, Oxy, Вы писали:
Oxy>Привет! Oxy>Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
Нельзя, но для этих целей можно использовать перегрузку
int DoSmth(string str)
{
DoSmt(str, 5);
}
int DoSmth(string str, int i)
{
Console.WriteLine(str + i.ToString());
}
То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Здравствуйте, Oxy, Вы писали:
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Здравствуйте, Oxy, Вы писали:
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Помоему в Васике они есть. Но второй выход использование массивов параметров.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Igor Trofimov, Вы писали:
G>>считая что при равенстве параметра -1 используется значение по умолчанию:
iT>По-моему, это наихудшее решение. И ведет к неприятностям. iT>Ничего личного.
Это зависит от решаемой задачи.
Если рассматривать в широком смысле, то оно вообще не применимо.
Можно использовать второй способ решения, передавая размерный тип в ссылочном.
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек.
Не преувеличивай. По три строчки каждую на перегрузку. Ты же не собираешься отдельно реализовывать каждый раз функцию, просто вызываешь более конкретный вариант из более общего.
Здравствуйте, mihailik, Вы писали:
Oxy>>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек.
M>Не преувеличивай. По три строчки каждую на перегрузку. Ты же не собираешься отдельно реализовывать каждый раз функцию, просто вызываешь более конкретный вариант из более общего.
Ну вообще то можно и так. Но все равно это, ИМХО, не удобно.
Re[5]: Default-параметры в ф-циях на C#
От:
Аноним
Дата:
22.12.03 10:31
Оценка:
Oxy>Но все равно это, ИМХО, не удобно.
По-моему, наоборот — вариант с перегрузкой логичнее. Если собираешься использовать функцию с параметрами по умолчанию, то по умолчанию, подразумевается, что ты должен знать, какие это значения. При перегрузке, никакой дополнительной информации не требуется — просто используется нужный набор параметров.
Re[2]: Default-параметры в ф-циях на C#
От:
Аноним
Дата:
22.12.03 10:51
Оценка:
Здравствуйте, Gerion, Вы писали:
G>Можно попробовать решить вашу проблему следующим образом, G>считая что при равенстве параметра -1 используется значение по умолчанию:
В качестве значения отсутствующего параметра по умолчанию (если уж понадобилось) можно (или нужно) использовать Type.Missing.
Здравствуйте, Gerion, Вы писали:
G>Можно попробовать решить вашу проблему следующим образом,
<skip>
Вы наверно не прняли в чем именно дело. Я просто не хочу явно передавать параметр если он мне не нужен.
Например
void do_something (int i, int j = 0)
Например я вызываю
do_something(1,1);
Тогда j принимает вполне конкретное значение 1.
или
do_something(1);
Тогда j принимает значение 0 (по умолчанию)
Это очень удобно. По крайней мере для меня. Я использовал эту возможность как в С++ так и Delphi и привык к ней.
Конечно, как в этом топике уже писали, можно применять перегрузку, но мне это не нравится. Не мешало бы разработчикам C# перенять эту возможность из С++ раз уж это С.
Здравствуйте, Oxy, Вы писали:
Oxy>Здравствуйте, Аноним, Вы писали:
А>>По-моему, наоборот — вариант с перегрузкой логичнее. Если собираешься использовать функцию с параметрами по
Oxy>Может и логичнее, но, отнюдь, не удобнее. ИМХО, конечно.
Пути Биловой команды неисповедимы.
Маємо те що маємо. Л.Кравчук:E... << RSDN@Home 1.1.2 beta 1 >>
Oxy>Конечно, как в этом топике уже писали, можно применять перегрузку, но мне это не нравится. Не мешало бы разработчикам C# перенять эту возможность из С++ раз уж это С.
Судя по всему, от этой возможности отказались вполне сознательно.
FL>Параметр по умолчанию очень удобен, когда добавляется параметр функции, и не хочется переписывать старый код.
Т.е., изменить сигнатуру функции и от души посмеяться над теми, у кого функция перестанет вызываться?
IMHO, пример создания потенциальных проблем на пустом месте — и всё из за трёх строчек кода?
Другое дело, если в функции 40 параметров, и каждый не обязателен. Как такое писать на шарпе — не представляю. Но надеюсь, никогда и не узнаю.
FL>Type.Missing этой проблемы не решает.
Вариант с Type.Missing не самый удобный, но позволяет избавиться от двусмысленности.
Здравствуйте, Ransom Stark, Вы писали:
FL>>Параметр по умолчанию очень удобен, когда добавляется параметр функции, и не хочется переписывать старый код. RS>Т.е., изменить сигнатуру функции и от души посмеяться над теми, у кого функция перестанет вызываться? RS>IMHO, пример создания потенциальных проблем на пустом месте — и всё из за трёх строчек кода? RS>Другое дело, если в функции 40 параметров, и каждый не обязателен. Как такое писать на шарпе — не представляю. Но надеюсь, никогда и не узнаю.
Создать класс с 40 полями и передавать в фунцию его экземпляр. В конструкторе полям приписываются значения по умоланию.
Здравствуйте, Lloyd, Вы писали:
L>Создать класс с 40 полями и передавать в фунцию его экземпляр. В конструкторе полям приписываются значения по умоланию.
Ну зачем же сразу класс, можно ссылку на структуру. Обычный подход с дефаултным конструктором
Массив параметров вам тоже поможет
и солнце б утром не вставало, когда бы не было меня
L>>Создать класс с 40 полями и передавать в фунцию его экземпляр. В конструкторе полям приписываются значения по умоланию. S> Ну зачем же сразу класс, можно ссылку на структуру. Обычный подход с дефаултным конструктором
Если обобщить и вернуться к теме — IMHO, параметры по умолчанию — не лучший выбор с точки зрения стиля и дизайна
Все понятно. Задал параметр, значит будет добавляться AllText, не задал не будет.
Возникает вопрос, а как сделать аналогичную конструкцию на С#?
1. Сделать две перегруженные копии ф-ции. В одной будет добавление All а в другой — нет. Это имхо неудобно если потребуется изменить код ф-ции. Прийдется менят в двух местах.
2. Создать 3 ф-ции
Две из них это интерфейсы к третьей, которая собственно и будет делать всю работу.
3. Использовать все же ф-цию с 2 параметрами и всегда их явно указывать. Это, имхо, лучший вариант, но стоило ли тогда огород городить...
Это я к тому, что некоторые говорят будто перегрузка всегда лучше и логичнее чем дефолтовые параметры. Не лучшее. И лучше бы они оставили в C# параметры по умолчанию.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Lloyd, Вы писали:
L>>Создать класс с 40 полями и передавать в фунцию его экземпляр. В конструкторе полям приписываются значения по умоланию. S> Ну зачем же сразу класс, можно ссылку на структуру. Обычный подход с дефаултным конструктором
Класс -- потому что это стандартый подход (патерн) для данной проблемы. Кажется так и называется Parameter.
Дефаултный конструктор у структуры? Нука-нука. Расскажи.
Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
S> Массив параметров вам тоже поможет
Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли?
Здравствуйте, Lloyd, Вы писали:
L>Дефаултный конструктор у структуры? Нука-нука. Расскажи.
Не расскажу. Хоть и нельзя но можно. Просто под конструктором может выступаь любая статическая функция. С Новым Годом!!! И больше положительных Эмоций!!! L>Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
Во Во сишники. Как Win Api так ссылки на структуры нормальное явление. Классы ни ни.
Только стек и никаких куч. S>> Массив параметров вам тоже поможет
L>Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли?
Чья проблема, тот так и реализует.
Еще раз С Нвым Годом!!!!
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Lloyd, Вы писали:
L>>Дефаултный конструктор у структуры? Нука-нука. Расскажи.
S> Не расскажу. Хоть и нельзя но можно. Просто под конструктором может выступаь любая статическая функция. С Новым Годом!!! И больше положительных Эмоций!!!
А зачем тогда структура-то? Не понимаю.
L>>Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
S>Во Во сишники. Как Win Api так ссылки на структуры нормальное явление. Классы ни ни. S> Только стек и никаких куч.
Вообще-то, класс и стуктура в сях мало чем отличаются. Обласью видимости по умолчанию только (у класов -- приват, а структур -- паблик). Именно по этому и используют структуры. Чтобы лишний раз public не писать.
S>>> Массив параметров вам тоже поможет
L>>Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли? S> Чья проблема, тот так и реализует.
Опять не понял. Ты скажи прямо, плевать или нет?
Если не плевать, то как быть с параметрами разного типа, если плевать, то с вами, пациент, все ясно.
S> Еще раз С Нвым Годом!!!!
Здравствуйте, Lloyd, Вы писали:
L>А зачем тогда структура-то? Не понимаю.
L>>>Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
Ну разница есть оссобенно когда структура много..... S>>Во Во сишники. Как Win Api так ссылки на структуры нормальное явление. Классы ни ни. S>> Только стек и никаких куч.
L>Вообще-то, класс и стуктура в сях мало чем отличаются. Обласью видимости по умолчанию только (у класов -- приват, а структур -- паблик). Именно по этому и используют структуры. Чтобы лишний раз public не писать.
А в Net это отличие. Структура в зависимости от объявления может находитсы и в стеке. И согласно скорости ее и надо использовть.
S>>>> Массив параметров вам тоже поможет
L>>>Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли? S>> Чья проблема, тот так и реализует.
L>Опять не понял. Ты скажи прямо, плевать или нет? L>Если не плевать, то как быть с параметрами разного типа, если плевать, то с вами, пациент, все ясно.
Ну значит разные Consol итд к Вам. Зачем же такой. Применяются налево и на право.
Ты в какой области Доктор????
ГОВОРЮ ПРЯМО. КОНЕЧНО НЕ ПЛЕВАТЬ. ПО СВОЕЙ СУТИ ПЕРЕДАЧА ССЫЛКИ НА СТРУКТУРУ или Объект лучше, чем запихивать в стек кучу нетипизированных данных, и их обработка в вызываемой процедуре.
Но понятие дефолтных параметров, если я конечно не ошибаюсь, появилась с Васика как и именованные параметры. Суть в общем таже.
А если рассматривать как передача по значению структуры или отделно взятых параметров то физический смысл один и тот же.
С Наступающим Новым Годом!!!!
L>А почему С большая?
L>P.S. Nothing personal.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Lloyd, Вы писали:
L>>А зачем тогда структура-то? Не понимаю.
L>>>>Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
S> Ну разница есть оссобенно когда структура много.....
Что много ...? Ты загадками сегодня лучше не говори, конец недели все-таки. Соображаю туго.
S>>>Во Во сишники. Как Win Api так ссылки на структуры нормальное явление. Классы ни ни. S>>> Только стек и никаких куч.
L>>Вообще-то, класс и стуктура в сях мало чем отличаются. Обласью видимости по умолчанию только (у класов -- приват, а структур -- паблик). Именно по этому и используют структуры. Чтобы лишний раз public не писать.
S> А в Net это отличие. Структура в зависимости от объявления может находитсы и в стеке. И согласно скорости ее и надо использовть.
А причем тут тогда winapi?
S>>>>> Массив параметров вам тоже поможет
L>>>>Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли? S>>> Чья проблема, тот так и реализует.
L>>Опять не понял. Ты скажи прямо, плевать или нет? L>>Если не плевать, то как быть с параметрами разного типа, если плевать, то с вами, пациент, все ясно. S> Ну значит разные Consol итд к Вам. Зачем же такой. Применяются налево и на право.
Ну во первых Consol вряд ли где примняется. А вот Console -- другое дело.
А ты подумай, много ли там изпользуется от передаваемого параметра? ToString да проверка на IFormattable разве только. Если ты согласен этим ограничиться, то welcome.
S>Ты в какой области Доктор???? S> ГОВОРЮ ПРЯМО. КОНЕЧНО НЕ ПЛЕВАТЬ. ПО СВОЕЙ СУТИ ПЕРЕДАЧА ССЫЛКИ НА СТРУКТУРУ или Объект лучше, чем запихивать в стек кучу нетипизированных данных, и их обработка в вызываемой процедуре.
Чем передача ссылки на структуру лучше передачи объекта? Не понимаю. К тому же мы не решаем проблему изменеия переданных данных.
S> Но понятие дефолтных параметров, если я конечно не ошибаюсь, появилась с Васика как и именованные параметры. Суть в общем таже.
Сильно сомневаюсь.
S> А если рассматривать как передача по значению структуры или отделно взятых параметров то физический смысл один и тот же.
А зачем рассматривать передачу по значению структуры?
S> С Наступающим Новым Годом!!!!
L>>А почему С большая?
L>>P.S. Nothing personal.
Здравствуйте, Lloyd с Новым Наступающим Годом !!!
L>>>А зачем тогда структура-то? Не понимаю.
Да По Барабану. Хочешь объектк, хочешь структуру по ссылке. Или Есть какая то разница. Вернее она есть, но .... L>>>>>Да и зачем ссылку? Ты собрался значения через нее что-ли возвращать?
S>> Ну разница есть оссобенно когда структура много.....
L>Что много ...? Ты загадками сегодня лучше не говори, конец недели все-таки. Соображаю туго.
Вот и я думаю, зачем в Win Api в основном по ссылке структуры передают ???? S>>>>Во Во сишники. Как Win Api так ссылки на структуры нормальное явление. Классы ни ни. S>>>> Только стек и никаких куч.
L>>>Вообще-то, класс и стуктура в сях мало чем отличаются. Обласью видимости по умолчанию только (у класов -- приват, а структур -- паблик). Именно по этому и используют структуры. Чтобы лишний раз public не писать.
Только в WinApi они называются struct. А так у родоначальников надо спросить. Да и Win API это C, а там вроде объектов не было.
S>> А в Net это отличие. Структура в зависимости от объявления может находитсы и в стеке. И согласно скорости ее и надо использовть.
L>А причем тут тогда winapi?
Суть та же. S>>>>>> Массив параметров вам тоже поможет
L>>>>>Угу. Нам типа плевать на типобезопасность и все такое. Как что-ли? S>>>> Чья проблема, тот так и реализует.
L>>>Опять не понял. Ты скажи прямо, плевать или нет? L>>>Если не плевать, то как быть с параметрами разного типа, если плевать, то с вами, пациент, все ясно. S>> Ну значит разные Consol итд к Вам. Зачем же такой. Применяются налево и на право.
L>Ну во первых Consol вряд ли где примняется. А вот Console -- другое дело. L>А ты подумай, много ли там изпользуется от передаваемого параметра? ToString да проверка на IFormattable разве только. Если ты согласен этим ограничиться, то welcome.
S>>Ты в какой области Доктор???? S>> ГОВОРЮ ПРЯМО. КОНЕЧНО НЕ ПЛЕВАТЬ. ПО СВОЕЙ СУТИ ПЕРЕДАЧА ССЫЛКИ НА СТРУКТУРУ или Объект лучше, чем запихивать в стек кучу нетипизированных данных, и их обработка в вызываемой процедуре.
L>Чем передача ссылки на структуру лучше передачи объекта? Не понимаю. К тому же мы не решаем проблему изменеия переданных данных.
По большому счету ни чем, просто за объектом GC начинает следить, и при очень большом выделении объектов это сразу заметно.
S>> Но понятие дефолтных параметров, если я конечно не ошибаюсь, появилась с Васика как и именованные параметры. Суть в общем таже.
L>Сильно сомневаюсь.
S>> А если рассматривать как передача по значению структуры или отделно взятых параметров то физический смысл один и тот же.
L>А зачем рассматривать передачу по значению структуры?
А чем передача Default-параметры параметров отличается от передачи структуры по значению????С Наступающим Новым Годом!!!!
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ransom Stark, Вы писали:
RS>С точки зрения дальнейшей работы надежнее и понятнее. "Либо так, либо так", вместо "так, но если очень хочется. то эдак"
Странно... Значит Страуструп нелогичный и непоследовательный идиот, а все из M$ мудрецы продвинутые, идиал во плоти так сказать...
Здравствуйте, Ransom Stark, Вы писали:
RS>Если обобщить и вернуться к теме — IMHO, параметры по умолчанию — не лучший выбор с точки зрения стиля и дизайна