c#使用+=创建事件方法时更改修饰符

Posted

技术标签:

【中文标题】c#使用+=创建事件方法时更改修饰符【英文标题】:c# change modifier when creating event method with += 【发布时间】:2018-05-16 12:28:13 【问题描述】:

如果我为一个处理程序订阅一个新方法并在“+=”之后按两次“Tab” VS 将实现一个像这样的 Body:

public class A 
  public A()
    button1.Click += OnButton1Click();
  

  private OnButton1Click(object sender, EventArgs e)

  

如何更改 VS 以将方法主体创建为公共而不是私有?

亲切的问候, Asat0r

【问题讨论】:

为什么需要公共事件处理程序?您可以创建一个公共方法,然后从您的私有事件处理程序中调用它。 你真的不应该公开你的事件处理程序。能给你带来的唯一好处是能够从外面的课堂上给他们打电话。对我来说听起来很臭。 为什么首先要公开每个事件处理程序?以后再换就这么麻烦吗? 就我而言,有时我需要取消订阅事件。它基于我们工作的逻辑,这就是我希望它们公开的原因。我只需要它调用“A.button1.Click -= A.OnButton1Click();” 除非它是一个全局事件,在这种情况下它不是应该保持私有的。 【参考方案1】:

如何更改 VS 以将方法的主体创建为公共而不是 私人的?

不确定是否有任何选择,但您为什么要这样做?事件处理程序不应该是public。如果您想从其他类型调用处理程序内部的逻辑,则将该逻辑重构为辅助方法并可能重用它。

【讨论】:

“事件处理程序不应该公开” - 我不确定你的意思。是否使用方法来处理事件应该与是否公开它几乎正交。通常它们是私有的,但如果方法的签名正是您想要公开的,我认为这样做没有问题。 @DaisyShipton 我的意思是,事件处理程序始终是非公开的,这是有道理的,因为通常您不会显式调用该处理程序(如方法)。不过你的评论不太清楚 是的,通常您不想调用该方法 - 但大概如果 OP 想要将其公开,他们 确实 想要调用该方法,或者可能使用它作为另一个类的事件处理程序。我看不出处理程序以何种方式“不应该”公开。 @DaisyShipton 是的,他们可以,但那会很奇怪,而且从未见过有人这样做,因为事件处理程序应该封装在其中。如果其他一些类想要使用,那么最好将该事件冒泡到父容器并让它在那里处理 你又说应该是这样的,但没有任何理由。我同意这是通常的情况,但我尽量不根据“通常有意义的事情”或模糊的“应该”对开发人员应该做什么做出任何判断.我在自己的回答中给出了几个更具体的理由,但即便如此,这些理由也很容易被其他理由所推翻(或在特定情况下被认为不是问题)。对特定实践的建议更有说服力,背后的原因。【参考方案2】:

其他答案表明该方法不应公开。

从广义上讲,我拒绝这样做 - 至少没有进一步的理由。 如果您想公开具有该签名的方法,我通常会继续这样做。不过,有两个警告:

通常事件处理程序的签名没有用除了作为事件处理程序;直接调用方法时,参数通常没有用处。与以往一样,也有例外。 如果您使用公共方法订阅事件处理程序,则任何其他代码都可以通过创建相等的委托取消订阅该事件处理程序。如果您控制应用程序中的所有代码,这不是什么大问题。

这两种情况都可以通过公开一个带有您想要的参数的公共方法来解决(可能仍然是事件处理程序参数,但通常不是),然后使用 lambda 表达式进行订阅参加活动:

// I want to be able to call this from other code
public void SaveItem()

    // ...


// Hook up the event handler using a lambda expression
saveButton.Click += (sender, args) => SaveItem();

另一方面,如果两个要点都不是问题,请继续手动公开该方法。我不希望有一个 VS 快捷方式来执行此操作,但只需指定 public 修饰符非常简单。

【讨论】:

以上是关于c#使用+=创建事件方法时更改修饰符的主要内容,如果未能解决你的问题,请参考以下文章

C#更改嵌套类的方法修饰符

c#类的修饰符都有哪些?

Vue:如何在按住键盘修饰符时更改按钮的文本?

在运行时更改访问修饰符

C# 修饰符“static”对该项无效

C#中类。方法。字段 的默认访问修饰符分别是啥?