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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2012, 00:30   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Более корректный способ присвания посредством...?

Всем привет.
Волнует один вопрос. Суть в следующем:
Например, есть два класса

Код:
class TMyClass1
{
   private TMyClass2 FMyClass2Prop;
   public TMyClass2 MyClass2Prop
   {
      get { return FMyClass2Prop; }
      set
      {
         FMyClass2Prop = value;               // случай 1)
         // ИЛИ
         FMyClass2Prop.Assign(value);       // случай 2)
      }
   }
}

class TMyClass2
{
      public int IntValue { get; set; }
      public string StringValue { get; set; }

     public Assign(TMyClass2 MyClass2Obj)
     {
        this.IntValue = MyClass2Obj.IntValue;
        this.StringValue = MyClass2Obj.StringValue;
     }
}
Так вот, как видно из кода - класс TMyClass1 просто использует класс TMyClass2 через свойство. Но вот присваивание данного свойства, которое в классе TMyClass1 называется FMyClass2Prop, производит каким из тех двух случаев, что описаны в коде? Просто если выбрать вариант 1), то будет присвоена ссылка переменной FMyClass2Prop на какой-то внешний объект, а вот посредством варианта 2) мы просто в существующий объект FMyClass2Prop сольем данные из внешнего объекта. Если ничего не напутал, то вроде так. Только, что из этого более корректно использовать?
p.s. Или может просто перегрузить оператор присваивания для класса TMyClass2 ?
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 06.04.2012 в 00:41.
spamer вне форума Ответить с цитированием
Старый 06.04.2012, 07:12   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Если присваиваешь классы, копируется только ссылка. Перегрузить оператор '=' нельзя. Для мелкого копирования обычно используется метод Clone, который есть у некоторых стандартных классов, поэтому тебе лучше сделать Clone, а не Assign. Структуры, в отличие от классов, хрянятся без ссылок (как в C++), и присвоение делает мелкую копию объекта.

Нужно ли копировать сам объект, или же можно использовать один экземпляр - смотри по ситуации. Бывают очень неприятные баги, когда объект как бы изменяется сам по себе, без внешнего воздействие. В том числе и при мелком копировании, когда забываешь клонировать поля копируемого класса.

Код:
FMyClass2Prop = value;
Здесь копируется ссылка

Код:
this.IntValue = MyClass2Obj.IntValue;
Здесь копируется значение, так как Int32 - структура

Код:
this.StringValue = MyClass2Obj.StringValue;
Здесь копируется ссылка, но так как строку изменить нельзя (только создав новый экземпляр), можно не беспокоиться на этот счёт и работать со строками как со структурами

Последний раз редактировалось ds.Dante; 06.04.2012 в 08:54.
ds.Dante вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необычный оператор присвания и результат Стремящийся Общие вопросы C/C++ 14 29.02.2012 19:04
Корректный импорт в БД Dmitry1983 PHP 4 22.08.2011 21:40
Какое программирование в наше время более востребовано и более рентабельно? iukash Свободное общение 18 29.10.2009 13:02
Корректный ли код? Hero Общие вопросы Delphi 9 07.03.2008 03:42
Корректный выход Constellation БД в Delphi 3 07.12.2007 15:47