Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опциональный строковый аргумент у функции 
V
    Опции темы
opozdaika
Дата 21.5.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



Перевожу с VB на C# функцию с опциональным параметром-строкой.
В VB было:

Код

Function F(Optional s As String)
   If Not IsMissing(s) then s = "Новое"
End Function

Sub Main()
   Dim s As String
   s = "Старое"
   F s
   Debug.Print s   ' Ок, пишет "Новое"
   F   ' Ок
End Sub

Пробую переписать на C#:

Код

static void F(ref string s) 
{
    if (s != null) s = "Новое";
}

static void Main()
{
   string s = "Старое";
   F(ref s);
   Console.Write("s = {0}", s);
   F(null);   // Не компилируется
   F(ref null);   // Тоже не компилируется
}

Короче, я пробовал передавать строку как ref, как out и просто. Два первых вариатна не компилятся, третий не возвращает значения из функции. Как сдалать, чтобы работало?
PM MAIL   Вверх
sonin
Дата 21.5.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 15.5.2008

Репутация: нет
Всего: нет




Модератор: Сообщение скрыто.

PM MAIL   Вверх
mihryak
Дата 21.5.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



переменное число параметров делается через ключевое слово params, только вот оно не допускает использование рядом с собой никаких других модификаторов

а почему возникло желание изменять именно переданную строку? чем вариант с возвращаемым значением не устравивает (не думаю, что в данном случае выделение памяти на новый экземпляр строки настолько критично)?
PM MAIL ICQ   Вверх
QryStaL
Дата 21.5.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



В C# опциональные параметры реализуются через перегрузку методов

Добавь

Код

static void F()
{
}


Это сообщение отредактировал(а) QryStaL - 21.5.2008, 13:57


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
opozdaika
Дата 21.5.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



Цитата(QryStaL @ 21.5.2008,  13:54)
В C# опциональные параметры реализуются через перегрузку методов

Добавь

Код

static void F()
{
}

Вот те на... только что на этом месте был текст, который мне реально помог, а именно 

string s = null;
F(ref s);

Спасибо!!

Но теперь ты заменил его на 

static F() {}

Но в действительности у меня как раз и есть такая перегруженная функция, которая теперь будет выглядеть так:

static F() 
{
   string s = null;
   F(ref s);
}

Вот такое нехитрое делигирование.
Спасибо.

PM MAIL   Вверх
QryStaL
Дата 21.5.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



opozdaika, да, я что-то подобное и имел в виду. =)


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
source777
Дата 21.5.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(opozdaika @  21.5.2008,  14:07 Найти цитируемый пост)
static void F() 
{
   string s = null;
   F(ref s);
}

Этот код не имеет смысла, просто отнимает пару тиков процессора, а функционально идентичен 
static void F() {}
ибо вызов F(ref s); из  F() меняет значение локальной переменной, которая сразу после этого навсегда уходит из области видимости... Поэтому QryStaL вовсе не случайно удалил тело метода F() 


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
opozdaika
Дата 21.5.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



Цитата(source777 @ 21.5.2008,  15:14)
Цитата(opozdaika @  21.5.2008,  14:07 Найти цитируемый пост)
static void F() 
{
   string s = null;
   F(ref s);
}

Этот код не имеет смысла, просто отнимает пару тиков процессора, а функционально идентичен 
static void F() {}
ибо вызов F(ref s); из  F() меняет значение локальной переменной, которая сразу после этого навсегда уходит из области видимости... Поэтому QryStaL вовсе не случайно удалил тело метода F()

Ну вот смотри. На самом деле строка, которую я назвал s, у меня играет роль диагностического сообщения. Сама функция возвращает успех/не успех (bool), а при желании может еще и написать что-нибудь толковое в строку при неудаче.  Вот и выходит, что два метода иметь нецелесообразно. Это всего лишь дополнительная опция. В теле функции я проверяю, просит ли вызывающий объяснять причины неуспеха. Если да, то в строку пишеся, если нет, то просто выход с False. И на VB данная концепция ложилась как раз в русло идиалогии. А вот в C# присутствует натяжака. Если бы я сразу на C# писал, то может быть сделал бы по-другому.
PM MAIL   Вверх
opozdaika
Дата 21.5.2008, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



И вот еще на эту же тему. Когда я писал на C, то практиковал аналогичный подход. Есть функция, принимающая несколько указателей определенных типов. По этим указателям она записывает данные. Но при вызове я могу запрасить не все данные, а только некоторые. При этом я "забиваю " NULL-ами не интересующие меня позиции. Примерно так:
Код

void GetPersonInfo(char* pName, int *pAge, bool *pIsMale)
{
    if (pName!=NULL) copystr(*pName, "Вася Пупкин");
    if  (pAge!=NULL) *pAge = 27;
    if  (pIsMale!=NULL) *pIsMale= true;
}

void main()
{
   char PersonName[255];
   GetPersonInfo(&PersonName[0],NULL, NULL);
}

Функция GetPersonInfo возвращает данные о персоне: имя, возраст и пол. При ее вызове из main я запрашиваю только имя (первый параметр). Остальные указатели NULL. Причем я могу не только последние забить NULL-ами, но в любом порядке. 
Вот как такое реализовать на C#? Про string - обсудили. А с другими типами?
Спасибо.
PM MAIL   Вверх
opozdaika
Дата 21.5.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 28.4.2008

Репутация: нет
Всего: нет



КЛАССНО! Я нашел решение! Буду теперь писать так:

int? i = null;
bool? b = null;

Код

void GetPersonInfo(string Name, int? Age, bool? IsMale)
{
    if (Name!=null) Name = "Вася Пупкин";
    if  (Age!=null) Age = 27;
    if  (IsMale!=null) IsMale= true;
}

PM MAIL   Вверх
source777
Дата 21.5.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(opozdaika @  21.5.2008,  16:23 Найти цитируемый пост)
КЛАССНО! Я нашел решение! Буду теперь писать так:

int? i = null;
bool? b = null;
А не проще ли воспользоваться модификатором out? А ещё лучше определить структуру PersonInfo...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1210 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.