Méthodes anonymes et analyse du code
Une méthode anonyme est une méthode sans nom.Les méthodes anonymes sont le plus souvent utilisées pour passer un bloc de code en paramètre de délégué.
Cette rubrique explique comment l'analyse du code gère les avertissements et la métrique associés aux méthodes anonymes.
Méthodes anonymes déclarées dans un membre
Les avertissements et la métrique d'une méthode anonyme déclarés dans un membre, tels qu'une méthode ou un accesseur, sont associés au membre qui déclare la méthode.Ils ne sont pas associés au membre qui appelle la méthode.
Par exemple, dans la classe suivante, tout avertissement trouvé dans la déclaration d'anonymousMethod doit être déclenché concernant Method1 et non Method2.
Delegate Function ADelegate(ByVal value As Integer) As Boolean
Class AClass
Sub Method1()
Dim anonymousMethod As ADelegate = Function(ByVal value As
Integer) value > 5
Method2(anonymousMethod)
End Sub
Sub Method2(ByVal anonymousMethod As ADelegate)
anonymousMethod(10)
End Sub
End Class
delegate void Delegate();
class Class
{
void Method1()
{
Delegate anonymousMethod = delegate()
{
Console.WriteLine("");
}
Method2(anonymousMethod);
}
void Method2(Delegate anonymousMethod)
{
anonymousMethod();
}
}
Méthodes anonymes inline
Les avertissements et la métrique pour une méthode anonyme déclarée comme une assignation inline à un champ sont associés au constructeur.Si le champ est déclaré comme static (Shared dans Visual Basic), les avertissements et la métrique sont associés au constructeur de classe ; sinon, ils sont associés au constructeur d'instance.
Par exemple, dans la classe suivante, tout avertissement trouvé dans la déclaration d'anonymousMethod1 sera déclenché concernant le constructeur par défaut généré implicitement de Class.Tandis que ceux trouvés dans anonymousMethod2 seront appliqués au constructeur de classe généré implicitement.
Delegate Function ADelegate(ByVal value As Integer) As Boolean
Class AClass
Dim anonymousMethod1 As ADelegate = Function(ByVal value As
Integer) value > 5
Shared anonymousMethod2 As ADelegate = Function(ByVal value As
Integer) value > 5
Sub Method1()
anonymousMethod1(10)
anonymousMethod2(10)
End Sub
End Class
delegate void Delegate();
class Class
{
Delegate anonymousMethod1 = delegate()
{
Console.WriteLine("");
}
static Delegate anonymousMethod2 = delegate()
{
Console.WriteLine("");
}
void Method()
{
anonymousMethod1();
anonymousMethod2();
}
}
Une classe pourrait contenir une méthode anonyme inline qui assigne une valeur à un champ comportant plusieurs constructeurs.Dans ce cas, les avertissements et la métrique sont associés à tous les constructeurs à moins que ce constructeur s'enchaîne à un autre constructeur dans la même classe.
Par exemple, dans la classe suivante, tout avertissement trouvé dans la déclaration d'anonymousMethod doit être déclenché concernant Class(int) et Class(string), mais pas concernant Class().
Delegate Function ADelegate(ByVal value As Integer) As Boolean
Class AClass
Dim anonymousMethod As ADelegate = Function(ByVal value As Integer)
value > 5
Sub New()
New(CStr(Nothing))
End Sub
Sub New(ByVal a As Integer)
End Sub
Sub New(ByVal a As String)
End Sub
End Class
delegate void Delegate();
class Class
{
Delegate anonymousMethod = delegate()
{
Console.WriteLine("");
}
Class() : this((string)null)
{
}
Class(int a)
{
}
Class(string a)
{
}
}
Bien que cela puisse paraître inattendu, ceci est dû au fait que le compilateur génère une méthode unique pour chaque constructeur qui ne s'enchaîne pas à un autre constructeur.À cause de ce comportement, toute violation se produisant dans anonymousMethod doit être supprimée séparément.Cela signifie également que si un nouveau constructeur est présenté, les avertissements concernant Class(int) et Class(string) supprimés précédemment doivent également être supprimés concernant le nouveau constructeur.
Vous pouvez contourner ce problème de deux façons.Vous pouvez déclarer anonymousMethod dans un constructeur commun auquel tous les constructeurs s'enchaînent.Vous pouvez également le déclarer dans une méthode d'initialisation appelée par tous les constructeurs.
Voir aussi
Concepts
Analyse de la qualité d'un code managé à l'aide de l'analyse du code