Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 5
  • 86
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 4

Należy rozpocząć od tego, że typ Delegate jako część .net Framework BCL (Base Class Library) nie jest specyficzny dla języka C#. Równocześnie typ Delegate nie jest specyficzny dla metod statycznych czy instancyjnych, czyli odpowiedź wprost brzmi: nie mamy różnych typów delegatów dla metod statycznych i instancyjnych. Pytanie otrzymało status "ciekawe" m.in. ze względu na odwołania w treści pytania do dokumentacji klasy Delegate dotyczące dwóch konstrukorów tej klasy. Patrząc na definicję typu - modyfikator dostępu (protected) dla konstruktorów oraz fakt, że klasa Delegate jest abstrakcyjna dojdziemy do wniosku, że można te konstruktory wywołać jedynie z klas wywiedzionych. Idąc dalej, dochodzimy do wniosku, że nie możemy dziedziczyć bezpośrednio po klasie Delegate i pozostaje nam wywołanie metody fabryki CreateDelegate. W tym miejscu powstaje pytanie, czy dla metod statycznych i instancyjnych CreateDelegate to najprostszy sposób na utworzenie delegacji? Oczywiście nie - znacznie wygodniej będziemy operować na składowych przy użyciu wbudowanych typów Action oraz Function. Dla zobrazowania sposobów wywołania metody zarówno za pomocą typu Delegate, jak i Action w przypadku składowych statycznych i instancyjnych możemy posłużyć się przykładem:

 

  class Program
    {
        static void Main(string[] args)
        {
            Type toolType = typeof(Tool);
            Action actionStaticMeth = Tool.SayHello;
            Delegate staticMeth = (Action) Tool.SayHello ;
            actionStaticMeth.Invoke();
            staticMeth.DynamicInvoke();

            Action ActionInstMeth = (new Tool()).SayYourHashCode;
            Delegate instMeth = (Action) (new Tool()).SayYourHashCode;

            ActionInstMeth.Invoke();
            instMeth.DynamicInvoke();
        }

    }
    public class Tool 
    {
        public static void SayHello()
        {
            Console.WriteLine("hello");
        }
        public void SayYourHashCode()
        {
            Console.WriteLine(this.GetHashCode());
        }
    }
  • Odpowiedział
  • @ | 23.02.2015
  • TRENER ALTKOM AKADEMII