C# 克隆对象时事件是否孤立?

C# 克隆对象时事件是否孤立?,c#,.net,events,C#,.net,Events,对于我拥有的其中一个类,有必要实现克隆方法。因此,我试图找出是否需要通过引用或值复制类的事件 例如,假设您有以下内容: Ball ballOne = new Ball(); ballOne.Bounce += new EventHandler(ballOne_Bounce); Ball ballTwo = ballOne.Clone(); 我应该如何编写克隆方法以触发ballTwo的反弹事件 谢谢, 泰勒 委托是.NET中的引用类型,它们也是不可变的,因此“引用与值”没有意义。如果要复制事件

对于我拥有的其中一个类,有必要实现克隆方法。因此,我试图找出是否需要通过引用复制类的事件

例如,假设您有以下内容:

Ball ballOne = new Ball();
ballOne.Bounce += new EventHandler(ballOne_Bounce);

Ball ballTwo = ballOne.Clone();
我应该如何编写克隆方法以触发ballTwo的反弹事件

谢谢, 泰勒


委托是.NET中的引用类型,它们也是不可变的,因此“引用与值”没有意义。如果要复制事件委托,只需复制它(即复制引用)。

这实际上取决于您如何使用Ball对象以及如何克隆它。这在很大程度上取决于听者在做什么

如果希望ballOne和ballTwo具有完全相同的已注册事件侦听器,只需将事件处理程序引用从ballOne传递给ballTwo,它们都应该工作。不过,请记住,如果您随后向ballOne添加一个新的事件侦听器,ballTwo也不会得到它

我不知道你想做什么,但如果你有很多克隆球,你不知道哪些球有哪些事件侦听器,这可能会导致内存泄漏和很多麻烦

 public class Box
{

    public void InitializeBalls()
    {
        Ball ballOne = new Ball();
        this.RegisterBall(ballOne);

        Ball ballTwo = ballOne.Clone();
        this.RegisterBall(ballTwo);

    }


    public void Ball_Bounce()
    {
    }

    public void RegisterBall(Ball ball)
    {
        ball.Bounce += Ball_Bounce;
    }

}

public class Ball
{

    public event BounceEventHandler Bounce;
    public delegate void BounceEventHandler();


    public Ball Clone()
    {
        Ball clonedBall = null;
        // Do some fancy clonin'
        return clonedBall;

    }

}
您最好在任何类上创建一个方法,以便它可以添加适当的事件侦听器

 public class Box
{

    public void InitializeBalls()
    {
        Ball ballOne = new Ball();
        this.RegisterBall(ballOne);

        Ball ballTwo = ballOne.Clone();
        this.RegisterBall(ballTwo);

    }


    public void Ball_Bounce()
    {
    }

    public void RegisterBall(Ball ball)
    {
        ball.Bounce += Ball_Bounce;
    }

}

public class Ball
{

    public event BounceEventHandler Bounce;
    public delegate void BounceEventHandler();


    public Ball Clone()
    {
        Ball clonedBall = null;
        // Do some fancy clonin'
        return clonedBall;

    }

}

但他不想复制事件代表,因为这将指向ballOne而不是ballTwo,对吗?该代表对ballOne一无所知。它只引用ballOne_Bounce,它可能位于其他对象(表单?)上。