![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
opozdaika |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 28.4.2008 Репутация: нет Всего: нет |
Перевожу с VB на C# функцию с опциональным параметром-строкой.
В VB было:
Пробую переписать на C#:
Короче, я пробовал передавать строку как ref, как out и просто. Два первых вариатна не компилятся, третий не возвращает значения из функции. Как сдалать, чтобы работало? |
||||
|
|||||
sonin |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 15.5.2008 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
переменное число параметров делается через ключевое слово params, только вот оно не допускает использование рядом с собой никаких других модификаторов
а почему возникло желание изменять именно переданную строку? чем вариант с возвращаемым значением не устравивает (не думаю, что в данном случае выделение памяти на новый экземпляр строки настолько критично)? |
|||
|
||||
QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 10 Всего: 32 |
В C# опциональные параметры реализуются через перегрузку методов
Добавь
Это сообщение отредактировал(а) QryStaL - 21.5.2008, 13:57 -------------------- I don't need a reason being who I am... |
|||
|
||||
opozdaika |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 28.4.2008 Репутация: нет Всего: нет |
Вот те на... только что на этом месте был текст, который мне реально помог, а именно string s = null; F(ref s); Спасибо!! Но теперь ты заменил его на static F() {} Но в действительности у меня как раз и есть такая перегруженная функция, которая теперь будет выглядеть так: static F() { string s = null; F(ref s); } Вот такое нехитрое делигирование. Спасибо. |
||||
|
|||||
QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 10 Всего: 32 |
opozdaika, да, я что-то подобное и имел в виду. =)
-------------------- I don't need a reason being who I am... |
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 3 Всего: 56 |
Этот код не имеет смысла, просто отнимает пару тиков процессора, а функционально идентичен static void F() {} ибо вызов F(ref s); из F() меняет значение локальной переменной, которая сразу после этого навсегда уходит из области видимости... Поэтому QryStaL вовсе не случайно удалил тело метода F() -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
opozdaika |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 28.4.2008 Репутация: нет Всего: нет |
Ну вот смотри. На самом деле строка, которую я назвал s, у меня играет роль диагностического сообщения. Сама функция возвращает успех/не успех (bool), а при желании может еще и написать что-нибудь толковое в строку при неудаче. Вот и выходит, что два метода иметь нецелесообразно. Это всего лишь дополнительная опция. В теле функции я проверяю, просит ли вызывающий объяснять причины неуспеха. Если да, то в строку пишеся, если нет, то просто выход с False. И на VB данная концепция ложилась как раз в русло идиалогии. А вот в C# присутствует натяжака. Если бы я сразу на C# писал, то может быть сделал бы по-другому. |
|||
|
||||
opozdaika |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 28.4.2008 Репутация: нет Всего: нет |
И вот еще на эту же тему. Когда я писал на C, то практиковал аналогичный подход. Есть функция, принимающая несколько указателей определенных типов. По этим указателям она записывает данные. Но при вызове я могу запрасить не все данные, а только некоторые. При этом я "забиваю " NULL-ами не интересующие меня позиции. Примерно так:
Функция GetPersonInfo возвращает данные о персоне: имя, возраст и пол. При ее вызове из main я запрашиваю только имя (первый параметр). Остальные указатели NULL. Причем я могу не только последние забить NULL-ами, но в любом порядке. Вот как такое реализовать на C#? Про string - обсудили. А с другими типами? Спасибо. |
|||
|
||||
opozdaika |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 28.4.2008 Репутация: нет Всего: нет |
КЛАССНО! Я нашел решение! Буду теперь писать так:
int? i = null; bool? b = null;
|
|||
|
||||
source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 3 Всего: 56 |
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |