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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как передать значение string по ссылке 
:(
    Опции темы
KuMa1104
Дата 1.11.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет!!!

Интересует следующая деталь языка C#.

Предположем что необходимо передать значение string по ссылке.
Т.е.

Как всем известно существуют типы значения и ссылочные типы.
Так вот т.к. string относиться к типу значения, ТО  такой код не сработает.

Код

 class Program
    {
        static void Main(string[] args)
        {
            string a = "Начальная строка";
            fnc(a);
            Console.WriteLine(a);

            StringBuilder ss = new StringBuilder("Начальная строка");
            fnc2(ss);
            Console.WriteLine(ss.ToString());
        }
         static bool  fnc(string ss)
        {
            ss = "Изменённая строка";
            return true;
        }
        static bool fnc2(StringBuilder ss)
        {
            ss = new StringBuilder("Изменённая строка");
            return true;
        }

    }

результат
Код

Начальная строка
Начальная строка


Интересно то что и StringBuilder ss тоже передаёться как тип значения. 

Но иногда былобы удобно чтобы фу-й изменяли параметры таких типов.


Код

static bool fnc3(string s1,string s2)
        {
            try
            {
            // Выполняем действия, в итоге..

                s1 = "Действие выполнено";
                s2 = "Прцесс завершон удачно";
                return true;
            }
            catch
            {
                s1 = "Операция не возможна";
                s2 = "Аварийное закрытие";
                return false;
            }
        }
 static void Main(string[] args)
        {
            string s1, s2;
            if (!fnc3(s1, s2))
            {
                Console.WriteLine(s1);
                Console.WriteLine(s2);
                return;
            }
            else
                 Console.WriteLine("Всё хорошо продолжаю работу");
         }


 Конечно можно к примеру сделать свой изменяемый  класс-обёртку над String, перегрузить у него операторы и сделать  преобразования в String и из String. Но это долго.... может возможно сделать это малой кровью?


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
Void
Дата 1.11.2009, 21:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



System.String — это не тип-значение.
Курить ref-параметры.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DragonFire
Дата 2.11.2009, 14:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

static bool fnc2(StringBuilder ss)
        {
            ss = new StringBuilder("Изменённая строка");
            return true;
        }

В ss передается адрес объекта. 
ss = new ... - мы записываем туда новый адрес. И конечно же вызывающая программа о новом адресе ничего не знает. И после выхода из функции сборщик мусора чистит твою измененную строку.

string - ссылочный тип, просто неизменяемый. Читай clr via c#.


--------------------
PM MAIL ICQ   Вверх
BinaryShadow
Дата 2.11.2009, 14:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В C# есть передача параметров по ссылке, для инициализированных ref, для не инициализированных out.
Код

Class P
{
     int x;
     int y;

     public void Getlala(out int x, out int y)
     {
          x = this.x;
          y = this.y;
     }
}
Class T
{
     public static void Main()
     {
          int x;
          int y;
          
          mP = new P();

          mP.Getlala(out x, out y);
     }
}


PM   Вверх
IGV
Дата 2.11.2009, 16:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



DragonFire
Цитата(DragonFire @  2.11.2009,  14:17 Найти цитируемый пост)
string - ссылочный тип, просто неизменяемый. 

Это не совсем так.

Я бы хотел немного пояснить про string и пример от KuMa1104, просто сам долго этого не понимал
Код

class Program
    {
        static void Main(string[] args)
        {
            string a = "Начальная строка";
            Console.WriteLine(a);
            fnc(a);
            Console.WriteLine(a);
        }

         static void  fnc(string ss)
        {
            ss = "Изменённая строка";
            Console.WriteLine(ss);
        }
    }
 
String является обычным ссылочным типом, как и все остальные. В случае, когда вы пишите
Код

string a = "Начальная строка";

Компилятор помещает литеральную  строку "Начальная строка" в метаданные сборки. А потом просто ссылается на эту строку.
Когда вы передаете string в метод, то реально в метод передается копия ссылки. И присваивая переменной новую литеральную строку вы изменяете новую ссылку.
Поэтому ничего и не изменяется. 


PM MAIL ICQ   Вверх
KuMa1104
Дата 2.11.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вау Гаспода спасибо всем! За такое и плюсика не жалко)
Всё это хорошо происнило мои мозг.
Если кто то ещё хочет добавить что то что щитает интересным , то пожалуста не стесняйтесь)


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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