Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > как передать значение string по ссылке


Автор: KuMa1104 1.11.2009, 20:52
Всем привет!!!

Интересует следующая деталь языка 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. Но это долго.... может возможно сделать это малой кровью?

Автор: Void 1.11.2009, 21:57
System.String — это не тип-значение.
Курить ref-параметры.

Автор: DragonFire 2.11.2009, 14:17
Код

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

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

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

Автор: BinaryShadow 2.11.2009, 14:19
В 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);
     }
}


Автор: IGV 2.11.2009, 16:14
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 в метод, то реально в метод передается копия ссылки. И присваивая переменной новую литеральную строку вы изменяете новую ссылку.
Поэтому ничего и не изменяется. 


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)