вопрос о событиях клонирования и призмы - PullRequest
0 голосов
/ 08 февраля 2011

Так что у меня есть право события ...

 public class SetLineItemEvent : CompositePresentationEvent<SetLineItemEventPayload> { }

Нет, что SetLineItemEventPayLoad содержит объект LineItem, верно? Когда я запускаю это событие и создаю новый экземпляр SetLineitemEventPayLoad и устанавливаю объект элемента строки, он создает копию этого объекта? или я остался со ссылкой на исходный объект? Похоже, что он использует «Глубокое клонирование» (имеется в виду, что у меня есть совершенно новая копия), но я бы хотел, чтобы кто-то подтвердил это, если сможет.

Смотрите эту ссылку, чтобы лучше понять, что я имею в виду под глубоким клонированием. http://www.csharp411.com/c-object-clone-wars/

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

Как утверждает Пол Руане, пока SetLineItemEventPayload является классом, он будет передаваться по ссылке.Нет клонирования.

Вот небольшой пример программы во всей ее полноте, которая доказывает только это ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static normalclass c;
        static normalstruct s;
        static void Main(string[] args)
        {
            c = new normalclass() { classArg = 1 };
            s = new normalstruct() { structArg = 1 };
            EventVarPasser.BasicEvent += new EventHandler<FancyEventArgs>(EventVarPasser_BasicEvent);
            EventVarPasser.RaiseEvent(c,s);


        }

        static void EventVarPasser_BasicEvent(object sender, FancyEventArgs e)
        {
            Console.WriteLine("Before Messing with Eventargs");
            Console.WriteLine("Class:" + c.classArg.ToString() + "  Struct: " + s.structArg.ToString());
            e.normclass.classArg += 1;
            e.normstruct.structArg += 1;
            Console.WriteLine("After Messing with Eventargs");
            Console.WriteLine("Class :" + c.classArg.ToString() + "  Struct: " + s.structArg.ToString());

        }

    }

    static class EventVarPasser
    {
        public static event EventHandler<FancyEventArgs> BasicEvent;

        public static void RaiseEvent(normalclass nc, normalstruct ns)
        {
            FancyEventArgs e = new FancyEventArgs() { normclass = nc, normstruct = ns };        
             BasicEvent(null, e);
        }

    }

    class normalclass
    {
        public int classArg;
    }

    struct normalstruct
    {
        public int structArg;
    }

    class FancyEventArgs : EventArgs
    {
        public normalstruct normstruct;
        public normalclass normclass;
    }

}

Выходные данные:

Before Messing with Eventargs
Class:1  Struct: 1
After Messing with Eventargs
Class :2  Struct: 1
0 голосов
/ 08 февраля 2011

То, копируется ли объект или просто ссылается на него, зависит от того, основан ли объект на классе или структуре. На объекты класса всегда ссылаются, тогда как объекты структуры всегда копируются всякий раз, когда они назначаются или передаются в качестве параметров в методы.

struct A {}

A a1 = new A();
A a2 = a1; // copied
a1 == a2; // false

class B {}

B b1 = new B();
B b2 = bl; // both reference same object
b1 == b2; // true

Итак, поведение зависит от того, является ли ваша «позиция» классом или структурой.

...