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

C# c使用创建事件方法时更改修饰符+=,c#,visual-studio,events,modifier,C#,Visual Studio,Events,Modifier,如果我向处理程序订阅一个新方法,并在+=VS之后按Tab键两次,则会实现如下主体: public class A { public A(){ button1.Click += OnButton1Click(); } private OnButton1Click(object sender, EventArgs e){ } } 如何更改VS以将方法体创建为public而不是private 亲切问候,, Asat0r 如何更改VS以将方法体创建为public 私人的 不

如果我向处理程序订阅一个新方法,并在+=VS之后按Tab键两次,则会实现如下主体:

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

  private OnButton1Click(object sender, EventArgs e){

  }
}
如何更改VS以将方法体创建为public而不是private

亲切问候,, Asat0r

如何更改VS以将方法体创建为public 私人的


不确定是否有任何选择,但您为什么要这样做?事件处理程序并不意味着是公共的。如果您想从其他类型调用处理程序内部的逻辑,那么可以将该逻辑重构为一个helper方法,并重新使用它。

其他答案建议该方法不应该是公共的

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

通常情况下,事件处理程序的签名除了作为事件处理程序之外没有任何用处;直接调用方法时,这些参数通常不有用。但也有例外。 如果使用公共方法订阅事件处理程序,则任何其他代码都可以通过创建相等的委托来取消订阅该事件处理程序。如果您控制应用程序中的所有代码,那么问题就不大了。 这两种情况都可以通过公开具有所需参数的公共方法来解决,这些参数可能仍然是事件处理程序参数,但通常不会是,然后使用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快捷方式来执行此操作,但简单地指定公共修饰符非常简单。

为什么需要公共事件处理程序?你可以创建一个公共方法,然后从你的私有事件处理程序调用它。你真的不应该让你的事件处理程序成为公共的。唯一能给你带来的好处就是能够在课外给他们打电话。听起来很难闻。为什么你一开始就希望每个事件处理程序都是公共的?在我的情况下,有时我需要取消订阅活动。这是基于我们工作的逻辑,这就是为什么我希望他们公开。我只需要它来调用A.button1.Click-=A.OnButton1Click;除非它是一个全局事件,而在本例中它不是,否则它应该保持私有。事件处理程序不应该是公共的-我不知道你的意思是什么。是否使用方法来处理事件应该与是否将其公开非常正交。通常它们是私有的,但如果方法的签名正是您想要公开的,我认为这样做没有问题。@DaisyShipton我的意思是,事件处理程序总是非公开的,这很有意义,因为通常您不会像显式调用方法一样调用该处理程序。你的评论不太清楚是的,通常你不想调用这个方法——但是如果OP想公开它,他们可能会调用这个方法,或者可能将它用作另一个类的事件处理程序。我不知道处理程序以什么方式不应该是公共的。@DaisyShipton是的,它们可以,但那会很奇怪,而且从未见过有人这样做,因为事件处理程序应该封装在其中。如果其他类想要使用,那么最好将该事件冒泡到父容器中,并让它在那里再次处理。您的意思是应该是这样的,但没有任何理由。我同意这是正常的情况,但我尽量不作出任何判断,开发人员应该做什么的基础上,无论是正常的意义或含糊不清的应该。我在自己的回答中给出了几个更具体的理由,但即便如此,这些理由也很容易被其他理由所推翻,或者在特定情况下被认为不是问题。针对特定实践的建议更有说服力,背后有很多原因。