Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的事件或lambda?_C#_Events_Lambda - Fatal编程技术网

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!"); }