C#中的事件或lambda?
我把这个扔出去只是出于好奇 假设您只期望/希望提供一种方法,这是不赞成的还是不好的做法C#中的事件或lambda?,c#,events,lambda,C#,Events,Lambda,我把这个扔出去只是出于好奇 假设您只期望/希望提供一种方法,这是不赞成的还是不好的做法 公共类{ 公共行动OnRemove=()=>{}; 公共操作OnFinishedLoading=(发送方,e)=>{}; } //然后用像。。。 something.OnRemove=()=>{/*做点什么…*/}; something.OnFinishedLoading=(发送方,e)=>{/*执行其他操作…*/}; 我意识到这就像在活动中作弊,但我知道这种方法有什么不好的地方吗?从长远来看,这会导致应用
公共类{
公共行动OnRemove=()=>{};
公共操作OnFinishedLoading=(发送方,e)=>{};
}
//然后用像。。。
something.OnRemove=()=>{/*做点什么…*/};
something.OnFinishedLoading=(发送方,e)=>{/*执行其他操作…*/};
我意识到这就像在活动中作弊,但我知道这种方法有什么不好的地方吗?从长远来看,这会导致应用程序出现任何潜在问题吗
我意识到,如果您希望运行多个方法,那么一个事件会更好,这主要是一个问题,即您是否只希望/期望一个方法。对于事件,您不能这样做:
something.OnRemove = null;
事件为您提供了一个包装器,一种带有属性和属性的包装器,所以您可以确保通过委托方法进行封装。好吧,最明显的“错误”是它公开了公共字段。我至少会使用一个属性——在这一点上,事件可能会更简单。与属性相比,它以更少的代码提供了更大的灵活性(因为无法使用具有特定默认值的自动实现属性)
另一种选择是将其放入构造函数中,然后将其作为私有只读字段保留。这可能是我真正想做的。。。是否真的需要将操作公开为属性/字段?这种方法没有错,我经常使用它。它使简单的处理程序具有简单的代码(这是一件好事) 这种方法的唯一缺点是,以这种方式创建的处理程序无法轻松删除。通常你会说
something.OnRemove -= SomeEvent;
但并非所有lambda表达式都是如此。文本相等的lambda表达式几乎肯定会有单独的实现,因此在添加和删除事件处理程序时不会匹配
例如,以下代码将无法删除处理程序
something.OnRemove += () { MessageBox.Show("Removed!"); }
something.OnRemove -= () { MessageBox.Show("Removed!"); }
但只要你只想添加,这就不是问题 它可能会暴露出比你想要的更多的信息。通常情况下,事件不允许客户端检查支持该事件的
多播委托的内容。我认为这种方法很好,它只是声明委托的一种简捷方法(查看操作系列的定义)。除非我正确地记得,在分配处理程序之前,事件为null,这可能会导致相同的情况。我在上面的示例中使用了字段来简单地缩短代码的长度。当你问一个关于好的/坏的实践的问题时,为了简洁起见,最好不要故意插入坏的实践;)你认为使用这种方法比使用事件有什么好处?我不知道什么,只是好奇这是否是一种完全错误的方法。
something.OnRemove += () { MessageBox.Show("Removed!"); }
something.OnRemove -= () { MessageBox.Show("Removed!"); }