克隆对象时是孤立的事件吗?

时间:2010-07-13 00:47:20

标签: c# .net events

对于我所拥有的一个类,有必要实现一个克隆方法。所以我想弄清楚我是否需​​要通过引用来复制类的事件。

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

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

Ball ballTwo = ballOne.Clone();

我应该如何编写Clone方法,以便触发ballTwo的Bounce事件?

谢谢, 泰勒

2 个答案:

答案 0 :(得分:1)

public Ball Clone() {
    ... create the new instance ...
    clone.Bounce = Bounce;
    ... set more properties ...
    return clone;
}

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

答案 1 :(得分:0)

这实际上取决于你如何使用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;

    }

}