Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
12 / 8 / 4
Регистрация: 20.03.2014
Сообщений: 129
1

Передача в метод по ссылке и по значению

30.06.2019, 09:07. Показов 1080. Ответов 4
Метки нет (Все метки)

Запутался малость...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    class Program
    {
        static void Main(string[] args)
        {
            List<string> str = new List<string>();
            for (int i = 0; i < 10; i++)
            {
                str.Add("Число " + i);
            }
 
            Class1 test = new Class1();
            List<string> str2 = Del(str);
 
            Console.ReadKey();
 
        }
 
        static List<string> Del(List<string> str)
        {
            str.RemoveAt(4);
            str.RemoveAt(5);
 
            return str;
        }
 
    }
Мы же в метод передаем аргумент по значению.
Почему тогда меняется значение str??
Как правильно сделать чтобы не менялся?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2019, 09:07
Ответы с готовыми решениями:

Передача по ссылке и по значению
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new...

С - > C# Передача значений по ссылке и значению
Есть Си функция: double lagrange(double X, double *Xi, double *Yi, int n) //Аппроксимация...

Передача данных по значению и по ссылке
Всем привет! Помогите плз разобраться в передаче данных в качестве параметров функции. *var и...

Передача объекта по ссылке или о значению
Да, да, снова этот вопрос. Допустим у меня есть объект Student с полями String surname и String...

4
488 / 285 / 128
Регистрация: 30.10.2018
Сообщений: 1,309
30.06.2019, 09:24 2
Цитата Сообщение от KPFU Посмотреть сообщение
Мы же в метод передаем аргумент по значению.
Почему тогда меняется значение str??
классы это ссылочные типы, передаются по значению, тебе нужно полностью скопировать список перед тем как изменять
C#
1
2
3
4
5
6
7
8
9
static List<string> Del(List<string> str)
        {
            List<string> str2 = new List<string>(str.Count-2);
            for(int i = 0; i < str.Count; i++)
            if(i != 4 && i != 5)
            str2.Add(str[i]);
 
            return str2;
        }
0
878 / 537 / 268
Регистрация: 26.11.2015
Сообщений: 1,698
Записей в блоге: 2
30.06.2019, 09:29 3
Значимые типы (int, bool, struct, и т.д.) передаются по значению, а ссылочные (List<T>, class, и т.д.) - по ссылке.
1
Эксперт .NET
14878 / 11264 / 2951
Регистрация: 17.09.2011
Сообщений: 18,864
30.06.2019, 09:40 4
Цитата Сообщение от KPFU Посмотреть сообщение
Мы же в метод передаем аргумент по значению.
Передача по ссылке/значению относится к переменной.
Переменные в методе Main и в методе Del — разные, т.к. копируются по значению, но значение у них одно и то же: ссылка на один и тот же объект.
Это как если на компьютере вы скопируете ярлык на файл, откроете файл через этот скопированный ярлык и внесете в него изменения, то они затронут оригинальный файл, хотя ярлыки разные.
А вот если скопированный ярлык вы перенаправите на новый файл (измените значение ярлыка), то это никак не отразится на оригинальном ярлыке, т.к. они копируются по значению.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void Main()
{
   var file = new List<string>();
   var shortcutA = file; // Ярлык на файл
 
   Modify(shortcutA);
   Console.WriteLine(shorctutA.Count); // 0, т.к. shortcutB в методе Modify — копия ярлыка.
 
   ModifyByRef(ref shortcutA);
   Console.WriteLine(shorctutA.Count); // 1, т.к. shortcutB в методе ModifyByRef — это shortcutA с новым именем. Одна и та же переменная.
}
 
void Modify(List<string> shortcutB)
{
   shorctutB = new List<string>(); // Перенаправляем копию ярлыка на новый файл
   shortcutB.Add("Hello!");  // Вносим изменения в сам файл через ярлык.
}
 
void ModifyByRef(ref List<string> shortcutB)
{
   shorctutB = new List<string>(); // Перенаправляем ярлык на новый файл
   shortcutB.Add("Hello!");  // Вносим изменения в сам файл через ярлык.  
}
2
97 / 98 / 58
Регистрация: 29.09.2016
Сообщений: 407
01.07.2019, 13:37 5
Лучший ответ Сообщение было отмечено KPFU как решение

Решение

Замени это
C#
1
List<string> str2 = Del(str);
на
C#
1
List<string> str2 = Del(new List<string>(str));
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2019, 13:37

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Конструкторы копирования, передача по ссылке и значению
Здравствуйте! Вопрос: существует конструктор копирования, которые принимает константный обьект по...

Передача параметров по указателю, ссылке и значению
Задание: Вычислить Y(x) и S(x). (где x принадлежит диапазону ) Y(x) и S(x) реализовать в виде...

Передача std::string по константной ссылке \ значению
Суть вопроса: есть простенький словарь с std::vector в качестве приватного поля. struct...

Передача параметров функции по значению, ссылке и указателю
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 ...

Передача параметров в функцию по значению, по ссылке и по указателю
Доброе время суток товарищи программисты. Столкнулся с кучей ошибок в написании простой программы....

Передача параметров в функцию по значению, по ссылке или по указателю
Передача параметров в функцию по значению, по ссылке или по указателю. Чем отличаются эти 3...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.