对于其中的一个类,有必要实现一个克隆方法。所以我想弄清楚我是否需要复制参考或值复制类的事件。克隆对象时发生孤立事件吗?
例如,让我们说你有以下几点:
Ball ballOne = new Ball();
ballOne.Bounce += new EventHandler(ballOne_Bounce);
Ball ballTwo = ballOne.Clone();
我应该怎么写的克隆方法,所以对于ballTwo的弹跳事件被触发?
感谢, 泰勒
对于其中的一个类,有必要实现一个克隆方法。所以我想弄清楚我是否需要复制参考或值复制类的事件。克隆对象时发生孤立事件吗?
例如,让我们说你有以下几点:
Ball ballOne = new Ball();
ballOne.Bounce += new EventHandler(ballOne_Bounce);
Ball ballTwo = ballOne.Clone();
我应该怎么写的克隆方法,所以对于ballTwo的弹跳事件被触发?
感谢, 泰勒
public Ball Clone() {
... create the new instance ...
clone.Bounce = Bounce;
... set more properties ...
return clone;
}
委托是在.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;
}
}
但他不想复制事件委托,因为这会指向ballOne not ballTwo right? – 2010-07-13 01:16:27
委托人对ballOne一无所知。它只引用ballOne_Bounce,这可能是在其他一些对象(表单?)上。 – 2010-07-13 01:19:01