Здравствуйте, Oxy, Вы писали:
Oxy>Привет! Oxy>Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
Нельзя, но для этих целей можно использовать перегрузку
int DoSmth(string str)
{
DoSmt(str, 5);
}
int DoSmth(string str, int i)
{
Console.WriteLine(str + i.ToString());
}
Привет!
Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
FL>Параметр по умолчанию очень удобен, когда добавляется параметр функции, и не хочется переписывать старый код.
Т.е., изменить сигнатуру функции и от души посмеяться над теми, у кого функция перестанет вызываться?
IMHO, пример создания потенциальных проблем на пустом месте — и всё из за трёх строчек кода?
Другое дело, если в функции 40 параметров, и каждый не обязателен. Как такое писать на шарпе — не представляю. Но надеюсь, никогда и не узнаю.
FL>Type.Missing этой проблемы не решает.
Вариант с Type.Missing не самый удобный, но позволяет избавиться от двусмысленности.
"Oxy" <5701@news.rsdn.ru> wrote in message news:484389@news.rsdn.ru... > Привет! > Можно ли описывать на C# ф-ции с дефолтовыми параметрами? То есть если я не задам этот параметр он автоматически примет какое то наперед заданное значение.
В принципе нет. Такие вещи делают через перегрузку:
Здравствуйте, Oxy, Вы писали:
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Здравствуйте, Igor Trofimov, Вы писали:
G>>считая что при равенстве параметра -1 используется значение по умолчанию:
iT>По-моему, это наихудшее решение. И ведет к неприятностям. iT>Ничего личного.
Это зависит от решаемой задачи.
Если рассматривать в широком смысле, то оно вообще не применимо.
Можно использовать второй способ решения, передавая размерный тип в ссылочном.
Здравствуйте, mihailik, Вы писали:
Oxy>>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек.
M>Не преувеличивай. По три строчки каждую на перегрузку. Ты же не собираешься отдельно реализовывать каждый раз функцию, просто вызываешь более конкретный вариант из более общего.
Ну вообще то можно и так. Но все равно это, ИМХО, не удобно.
Oxy>Конечно, как в этом топике уже писали, можно применять перегрузку, но мне это не нравится. Не мешало бы разработчикам C# перенять эту возможность из С++ раз уж это С.
Судя по всему, от этой возможности отказались вполне сознательно.
Здравствуйте, Ransom Stark, Вы писали:
FL>>Параметр по умолчанию очень удобен, когда добавляется параметр функции, и не хочется переписывать старый код. RS>Т.е., изменить сигнатуру функции и от души посмеяться над теми, у кого функция перестанет вызываться? RS>IMHO, пример создания потенциальных проблем на пустом месте — и всё из за трёх строчек кода? RS>Другое дело, если в функции 40 параметров, и каждый не обязателен. Как такое писать на шарпе — не представляю. Но надеюсь, никогда и не узнаю.
Создать класс с 40 полями и передавать в фунцию его экземпляр. В конструкторе полям приписываются значения по умоланию.
Здравствуйте, Oxy, Вы писали:
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек. Это разработчики так прикалываются?
Помоему в Васике они есть. Но второй выход использование массивов параметров.
и солнце б утром не вставало, когда бы не было меня
Oxy>То есть что бы использовать эту удобную возможность мне надо дублировать огромную кучу кода из=за 2-3 дополнительных строчек.
Не преувеличивай. По три строчки каждую на перегрузку. Ты же не собираешься отдельно реализовывать каждый раз функцию, просто вызываешь более конкретный вариант из более общего.
... << RSDN@Home 1.1.0 stable >>
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 >>
Здравствуйте, 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, параметры по умолчанию — не лучший выбор с точки зрения стиля и дизайна