Event handler methods should be declared as private or protected

Rule ND1808 Visibility

An event handler (like OnClickButton()) should be private and only called on event firing — or protected, as some designers (e.g. ASP.NET) generate it so sub-classes can call it.

How to fix

If another class needs to call the handler, find a structure matching the actual concept: the other class doesn't want to click a button, it wants to do what clicking the button also does.

CQLinq source

This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.

// <Name>Event handler methods should be declared as private or protected</Name>
// <Id>ND1808:EventHandlerMethodsShouldBeDeclaredAsPrivateOrProtected</Id>

warnif count > 0
from m in Application.Methods where 
  !(m.IsPrivate || m.IsProtected) &&
  !m.IsGeneratedByCompiler &&

   // A method is considered as an event handler if…
   m.NbParameters == 2 &&          // … it has two parameters …
   m.Name.Contains("Object") &&    // … of types Object …
   m.Name.Contains("EventArgs") && // … and EventArgs
   
   // Discard special cases
  !m.ParentType.IsDelegate &&
  !m.IsGeneratedByCompiler

select new { 
   m,
   m.Visibility,
   Debt = 2.ToMinutes().ToDebt(),
   Severity = Severity.Medium
}

//<Expl>
// The *{0}* is an event handler. It should be declared as *private*
// or *protected* as it is intended to be used exclusively within its 
// own class or class-hierarchy for event handling and should not be 
// invoked in other context.
//</Expl>

//<Desc>
// An event handler (like *OnClickButton()*) should be *private* and only
// called on event firing — or *protected*, as some designers (e.g. ASP.NET)
// generate it so sub-classes can call it.
//</Desc>

//<HowToFix>
// If another class needs to call the handler, find a structure matching the
// actual concept: the other class doesn't want to click a button, it wants
// to do what clicking the button also does.
//</HowToFix>

Visibility: all 12 items