Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 5

Присваивание ссылок

09.05.2017, 17:07. Показов 831. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Начал изучать C# по книжке C# in a nutshell, возникло несколько вопросов относительно ссылочных типов.

Есть класс Панда

C#
1
2
3
4
5
6
7
8
9
10
public class Panda
{
    public int x;
    public Panda () {}
    public int setX (int a)
    {
        x=a;
        return x;
    }
}
Сначала делаем так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void Main()
{
    Panda p1 = new Panda ();
    p1.setX(2);
    Console.WriteLine(p1.x);
    Panda p2 = new Panda ();
    p2=p1;
    Console.WriteLine(p2.x);
    p1.setX(3);
    Console.WriteLine(p1.x);
    Console.WriteLine(p2.x);
    p2.setX(4);
    Console.WriteLine(p1.x);
    Console.WriteLine(p2.x);    
}
Вывод такой:

2
2
3
3
4
4

Как собственно и написано в учебнике, p2 присвоилась ссылка, которая была в p1 и ведут они себя совершенно одинаково, то есть при изменении p1 изменяется p2.
Вопрос №1: почему при изменении p2 изменяется p1? То есть, p2 это копия p1, но почему при измении копии изменяется и оригинал?

Теперь, если p2=p1 заменить на p1=p2

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main()
{
    Panda p1 = new Panda ();
    p1.setX(2);
    Console.WriteLine(p1.x);
    Panda p2 = new Panda ();
    p1=p2;
    Console.WriteLine(p2.x);
    p1.setX(3);
    Console.WriteLine(p1.x);
    Console.WriteLine(p2.x);
    p2.setX(4);
    Console.WriteLine(p1.x);
    Console.WriteLine(p2.x);
    
}
то вывод будет
2
0
3
3
4
4

Здесь почему-то сначала оригиналу не присвоилось значении копии, но после изменения копии изменился и оригинал. Почему?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2017, 17:07
Ответы с готовыми решениями:

Присваивание ссылок на массивы
Допустим есть выражение: int a = new int { 1, 2, 3, 4, 5 }; int b; b = a; b = 99; Console.WriteLine(a); // 99 Почему...

Присваивание...
Здравстыуйте! вот фрагменты моего кода: private List<FractionCillection> TableStr = new List<FractionCillection>(); // (*) ...

Присваивание объектов
У меня есть такой вопрос когда 2 объекта присваиваем,когда меняем один объект другой тоже меняется , но мне нужно что менялось только тот...

9
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.05.2017, 17:13
Цитата Сообщение от saproling Посмотреть сообщение
Вопрос №1: почему при изменении p2 изменяется p1?
Потому что ссылка - это не сам реальный объект в куче, а указатель на него. Может быть сколько угодно указателей на один объект, и и работа с любой ссылкой будет отражаться на самом объекте.

Добавлено через 2 минуты
Цитата Сообщение от saproling Посмотреть сообщение
Здесь почему-то сначала оригиналу не присвоилось значении копии, но после изменения копии изменился и оригинал. Почему?
Тут почти как и в первом случае, только вы первой ссылке присвоили другой объект. Вроде все ясно и понятно.
0
0 / 0 / 0
Регистрация: 09.05.2017
Сообщений: 5
09.05.2017, 17:36  [ТС]
дошло, спасибо

Добавлено через 16 минут
еще вопрос, в книжке написано, что string это тоже сслочный тип, но с ним вышеописанные фокусы не прокатывают:
C#
1
2
3
4
5
6
7
8
9
10
static void Main()
{
 
    string s1 = "string1";
    string s2 = "string2";
    s1=s2;
    s2 = "newstring";
    Console.WriteLine(s1); // вывод string2 вместо newstring
    
}
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
09.05.2017, 17:39
Просто string особенный, ведет себя как тип-значение.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.05.2017, 18:09
Цитата Сообщение от Someone007 Посмотреть сообщение
Просто string особенный, ведет себя как тип-значение.
Особенный - да, ведет себя как тип-значение - нет. Он является ссылочным и ведет себя как ссылочный за исключением copy-on-write поведением.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.05.2017, 18:13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
ведет себя как ссылочный
Не совсем как ссылочный. Многое в нем изменено именно для поддержки семантики типа значения.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication12 {
    class Program {
        static void Main(string[] args) {
            string s1 = "one";
            string s2 = "one";
            Console.WriteLine(s1 == s2);
            Console.ReadLine();
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
09.05.2017, 18:26
insite2012, я не вижу здесь поведения как у значимого типа. Компилятор помещает в сборку только одну строку "one" и когда вызывается перегруженный оператор == он сравнивает ссылки и сразу получает true.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.05.2017, 19:31
Цитата Сообщение от OwenGlendower Посмотреть сообщение
не вижу здесь поведения как у значимого типа.
Создайте два объекта любого класса с полностью одинаковыми полями/свойствами, и этот оператор выведет false. Так что у string именно так сделано - этот оператор работает с ним как с типом значения.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
перегруженный оператор ==
В том и соль, что это ссылочный тип, но настроен так, чтобы имитировать (в определенных случаях) поведение как у типа значения.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
09.05.2017, 21:13
Цитата Сообщение от insite2012 Посмотреть сообщение
этот оператор работает с ним как с типом значения.
Если создать любой тип-значение и попробовать выполнить сравнение оператором ==, то будет ошибка компиляции.
Просто у строк этот оператор переопределен

Добавлено через 1 минуту
Цитата Сообщение от saproling Посмотреть сообщение
с ним вышеописанные фокусы не прокатывают
Со строкой все то же самое, просто у нее нет изменяемых членов, потому вы и не видите разницы, присваивая двум переменным ссылку на одну и ту же строку.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.05.2017, 21:19
Цитата Сообщение от kolorotur Посмотреть сообщение
Если создать любой тип-значение и попробовать выполнить сравнение оператором ==, то будет ошибка компиляции.
Речь идет про встроенные типы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2017, 21:19
Помогаю со студенческими работами здесь

Присваивание Items
Добрый день! Интересует вот что. Как в C# передать значение из listBox1.Items одной формы в comboBox1.Items другой формы? ...

Не работает присваивание
Пример из Шилдта выдает ошибку, что, мол, левая часть должна быть переменной, индексатором или свойством. for (i = 0; i < 5; i++) ...

Объекты, их присваивание
Читаю Троелсена, у него в примерах есть нечто подобное: Shape myShape = {new Hexagon("Имя шестиугольника"), new Circle("Имя...

Присваивание массива
Здравствуйте! Я новичок. Я пока учу переменные и массивы. Я люблю компьютерные игры и благодаря им я пытаюсь воссоздать некое подобие игры...

Присваивание уникального id как в 1с
Добрый день. Хочу реализовать нумерацию id строк таблицы моей бд, немного не допонимаю как это реализовали в 1с, а конкретнее нумерация у...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru