Эта строка кода:
SettingsInstance = SomeOtherSettingsInstance;
не копирует ничего внутри объектов, вместо этого он перезаписывает ссылку, сохраненную в SettingsInstance, на ссылку, сохраненную в SomeOtherSettingsInstance.
Сам объект не мудрее.
По сути, после того, как вы выполнили первую из трех последних строк, у вас есть такой сценарий:
SomeOtherSettingsInstance -----> Object 1 in memory of type Settings
SettingsInstance --------------> Object 2 in memory of type Settings
^
|
+- References
После того, как вы выполнили третью строку, она выглядит следующим образом:
SomeOtherSettingsInstance --+--> Object 1 in memory of type Settings
/
SettingsInstance ---------+ Object 2 in memory of type Settings
Теперь у вас есть две ссылки на первый объект, по одной через каждую переменную, и вы оставили новый объект, который вы только что создали, для гниения, чтобы сборщик мусора мог его забрать позже.
Если вы хотите скопировать внутреннее устройство, тогда да, вы должны копировать только одно свойство за раз.
Я регулярно создаю поддержку клонирования следующим образом:
public Settings Clone()
{
Settings clone = CreateCloneInstance();
CloneTo(clone);
return clone;
}
protected virtual Settings CreateCloneInstance()
{
return new Settings();
}
public virtual void CloneTo(Settings clone)
{
clone.RootFolder = RootFolder;
... + any other properties you might have
}
В вашем сценарии вы хотите подключить событие перед копированием, поэтому вы бы назвали его так:
public Settings SettingsInstance = new Settings();
SettingsInstance.SettingsChanged += SettingsInstance_SettingsChanged;
SomeOtherSettingsInstance.CloneTo(SettingsInstance);
Причина, по которой я реализую такую поддержку клонирования, связана с иерархиями объектов. Если это не проблема для вас (вы не собираетесь наследовать от настроек), вы можете просто сделать это:
public Settings Clone()
{
Settings clone = new Settings();
CloneTo(clone);
return clone;
}
public void CloneTo(Settings clone)
{
clone.RootFolder = RootFolder;
... + any other properties you might have
}