Udostępnij za pośrednictwem


Anonimowe metody i kod analizy

Metoda anonimowa jest metodą, która nie ma nazwy.Metody anonimowe są najczęściej używane do przekazywania bloku kodu jako parametru delegata.

Ten temat wyjaśnia, jak Analiza kodu radzi sobie z ostrzeżeniami i metrykami, które są skojarzone z metodami anonimowymi.

Metody anonimowe zadeklarowane w elemencie członkowskim.

Ostrzeżenia oraz metryki dla metody anonimowej, która jest zadeklarowana w elemencie członkowskim, takim jak metoda lub metoda dostępu, są skojarzone z elementem członkowskim, w którym zadeklarowana jest metoda.Nie są one skojarzone z elementem członkowskim, który wywołuje metodę.

Na przykład, w następującej klasie, jakiekolwiek ostrzeżenia, które zostaną znalezione w deklaracji anonymousMethod powinny wystąpić dla Method1 a nie 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();
    }
}

Metody anonimowe inline

Ostrzeżenia i metryki dla metody anonimowej, która jest zadeklarowana jako śródwierszowe przypisanie do pola są skojarzone z konstruktorem.Jeśli pole jest zadeklarowana jako static (Shared w Visual Basic), ostrzeżenia i metryki są skojarzone z konstruktorem klasy; w przeciwnym razie są one skojarzone z konstruktorem wystąpienia.

Na przykład w przypadku klasy, ostrzeżenia które znajdują się w deklaracji anonymousMethod1 zostaną przypisane do niejawnie wygenerowanego domyślnego konstruktora Class.Natomiast te, znalezione w metodzie anonymousMethod2 zostanie przypisane do niejawnie wygenerowanego konstruktora klasy.

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();
    }
}

Klasa może zawierać metodę anonimową inline, która przypisuje wartość do pola, które ma wiele konstruktorów.W takim przypadku ostrzeżenia i metryki są skojarzone z wszystkimi konstruktorami, chyba że ten konstruktor odwołuje się do innego konstruktora w tej samej klasie.

Na przykład, w następującej klasie, jakiekolwiek ostrzeżenia, które zostaną znalezione w deklaracji anonymousMethod powinny wystąpić dla Class(int) i Class(string), ale nie dla 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)
    {
    }
}

Chociaż może się to wydawać nieoczekiwane, dzieje się tak dlatego, że kompilator generuje unikatową metodę dla każdego konstruktora, który nie odwołuje się do następnego konstruktora.Z powodu tego zachowania, wszelkie naruszenia występujące w anonymousMethod muszą być pomijane oddzielnie.To również oznacza, że jeśli nowy konstruktor jest wprowadzony, ostrzeżenia które wcześniej były pomijane dla Class(int) i Class(string) muszą również zostać pominięte dla nowego konstruktora.

Można obejść ten problem na dwa sposoby.Można zadeklarować anonymousMethod w konstruktorze wspólnym do którego odwołują się wszystkie konstruktory.Lub można go zadeklarować w metodzie inicjacji, wywoływanej przez wszystkie konstruktory.

Zobacz też

Koncepcje

Analizowanie jakości kod zarządzany za pomocą analizy kodu