В C # 2.0 или выше следующие коды эквивалентны (DelegateType
- тип делегата, как следует из его названия):
newDelegate = new DelegateType(oldDelegate);
newDelegate = oldDelegate;
(см. MSDN - Как: Объявить, создать и использовать делегата (Руководство по программированию в C #) )
Кроме того, Microsoft указывает (см. здесь ), что такая операция всегда будет создавать новый экземпляр DelegateType
, который имеет тот же список вызовов, что и oldDelegate
. Они не ссылаются на один и тот же объект (не путайте с присваиванием =
):
Обработка времени привязки выражения Delegate_creation_exp вида new D (E), где Dявляется типом делегата, а E является выражением, состоит из следующих шагов:
Если E является группой методов, выражение создания делегата обрабатывается так же, как преобразование группы методов (Преобразование группы методов) из E в D.
Если E является анонимной функцией, выражение создания делегата обрабатывается так же, как преобразование анонимной функции (преобразования анонимной функции) из Eв D.
Если E - это значение, E должно быть совместимо (объявления делегатов) с D, , а результатом является ссылка на вновь созданный делегат типа D, которыйссылается на тот же список вызовов, что и E . Если E не совместим с D, возникает ошибка компиляции.
Так что по вашему вопросу
Что произойдет с моим скопированным TreeNode'sДействия после удаления оригинального TreeNode? Будут ли они также удалены?
С ними ничего не случится. Они не будут удалены.
Кстати, поскольку вы пытаетесь сделать глубокую копию своего узла дерева, я подозреваю, что это правильный путь. Несмотря на то, что вы создали новый экземпляр вашего делегата, связанный с ним экземпляр класса (экземпляр, к которому будут вызываться методы-члены) остается прежним.