Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2013, 19:30   #1
DoKZ
 
Регистрация: 19.07.2013
Сообщений: 5
Радость Передача параметров TreeNode и XmlNode

Я, по большей части, программист C++ и Delphi.

Сейчас активно занялся C#, поэтому следующий вопрос для меня остаётся непонятным.

Предположим следующий код. Изменение вытащенного из XmlDocument'а XmlNode'а влияет на документ:

Код:
// Класс

using namespace Tools.Subclass
{
  class OverXmlNode
  {
    private XmlNode xml;
    
    public XmlNode XML
    {get {...} set {...} }

    private OverXmlNode(XmlNode param)
    {
      // Как я понимаю, в param передаётся копия (раз нет ref) 
      // объекта XmlNode и xml присваивается этой копии.
      xml = param;
    }
  }
}

// Рабочий код

XmlDocument doc;
XmlNode node = doc.ChooseSingleNode(xp);
OverXmlNode overNode = new OverXmlNode(node);
overNode.XML.AppendChild(smth); // или еще что-либо
// XmlDocument doc поменялся, выбранный через 
// XPath элемент изменился. Почему? Ведь мы передавали не 
// ссылку, а копию объекта.
И второй случай:

Код:
// Предположим, на форме есть TreeView.

TreeNode node = listView1.Nodes[0];
node.Tag = 5;

MessageBox.Show(listView1.Nodes[0].Tag);
// Опять-таки, значение Node поменялось в TreeView, 
// хотя TreeNode node = listView1.Nodes[0] должно (по крайней мере, 
// в других языках) означать копирование.
Если написать следующий код:
Код:
int a = 5;
int b = a;
b = b + 5;
a останется неизменным, так ведь?
Так в чем разница и когда можно использовать такой странный способ изменения объектов, а когда нет? И как это работает, передаются указатели или что?

Заранее спасибо за ответ
DoKZ вне форума Ответить с цитированием
Старый 06.11.2013, 19:48   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

с чего тут копия, и в каком языке вы видели копию?
eval вне форума Ответить с цитированием
Старый 06.11.2013, 19:52   #3
DoKZ
 
Регистрация: 19.07.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
с чего тут копия, и в каком языке вы видели копию?
Предположим, такой код C++:
Код:
vector<string> a; // Предположим, что он непустой
string c = a[3];
c = "asd";
cout << a[3];
a[3] не изменилось, что очевидно, потому что
string c = a переносит значение a в c.

И такой код C#:
Код:
XmlDocument doc;
XmlNode = doc.ChildNodes[3];
XmlNode.Value = "asd";
MessageBox.Show(doc.ChildNodes[3]);
Документ изменился.
DoKZ вне форума Ответить с цитированием
Старый 06.11.2013, 19:56   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

так и в шарпе также
Цитата:
List<string> a;
string c = a[3];
c = "asd";
, но я спрашивал про
Цитата:
// хотя TreeNode node = listView1.Nodes[0] должно (по крайней мере,
// в других языках) означать копирование.
eval вне форума Ответить с цитированием
Старый 06.11.2013, 19:58   #5
DoKZ
 
Регистрация: 19.07.2013
Сообщений: 5
По умолчанию

Ну конкретно с подобными объектами в других языках не работал, поэтому извиняюсь за глупый вопрос.
Так что, всегда, когда я получаю объект TreeNode, ListViewItem или XmlNode, я получаю что-то вроде указателя на этот объект в общем документе \ списке \ таблице? А что делать, если я хочу получить копию объекта и работать с ним, не затрагивая документ?
DoKZ вне форума Ответить с цитированием
Старый 06.11.2013, 20:01   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

естественно клонировать надо, руками, ктото имеет уже метод Clone, но не все
eval вне форума Ответить с цитированием
Старый 06.11.2013, 20:02   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
я получаю что-то вроде указателя на этот объект
конкретно ссылку вы получаете
eval вне форума Ответить с цитированием
Старый 06.11.2013, 20:06   #8
DoKZ
 
Регистрация: 19.07.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
конкретно ссылку вы получаете
Нашел этот Clone

Просто я не разработчик Win Forms, а ACM-программист. Поэтому для меня ссылка имеет вид *a или, как я ожидал в языке C#, ref a. А всё остальное кажется простыми объектами.
Очень удобно, однако, будем привыкать. Спасибо
DoKZ вне форума Ответить с цитированием
Старый 06.11.2013, 20:23   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

это указатель, в шарпе они есть ... но ими пользуются только если ооооч надо
в делфи все точно также
eval вне форума Ответить с цитированием
Старый 06.11.2013, 21:39   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Вам нужно просто почитать про ссылочные типа и типы "по значению" в сишарпе. В инете вагон статей по данному вопросу.
Все простые типы - передаются по значению, и если они используются как аргументы - то делается копия. Строки - специальная саментика, они хоть и не простые типы, но передаются тоже по значению. Также структуры передаются по значению.
Все остальные типы - объекты, интерфейсы, делегаты и прочее - типы ссылочные и передаются всегда по ссылке.
В дельфи, кстати, всё практически точь-в-точь также.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в макрос masterbet Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 28.12.2011 11:07
Передача параметров _Mixer_ Общие вопросы по Java, Java SE, Kotlin 0 22.09.2011 20:17
Передача параметров в DLL -Flasher- Общие вопросы Delphi 2 04.06.2010 18:05
Передача параметров aesoem Общие вопросы Delphi 8 15.07.2008 21:51
Передача параметров Gudzon Общие вопросы Delphi 12 08.02.2007 08:19