Dienstag, 8. April 2008

Keine Angst vor Delegates

Delegates solltem jedem C/C++ Entwickler als Funktionszeiger / Functionpointer bekannt sein. Unter C# ist die Abstraktion hierfür deutlich größer und daher wahrscheinlich auch das Verständnis selbst.

Um es kurz zusammenzufassen, ein Delegate ist eine Referenz auf eine Methode, d.h. nichts weiteres, als dass ich einer Methode eine andere als Übergabeparameter geben könnte. Oder man kann es auch als "Abkürzung" zu statischen Methoden einer anderen Klasse missbrauchen.

Beispiel Abkürzung:

   1:  namespace Geometry
   2:  {
   3:      public delegate double Trigometric(double a);
   4:   
   5:      public class XY
   6:      {
   7:          // in .NET 1.1 it is: Trigometric cos = new Trigometric(Math.Cos);
   8:          private Trigometric cos = Math.Cos; // possible in .NET 2.0+
   9:          private Trigometric sin = Math.Sin;
  10:   
  11:          ...
  12:          int x = (int)Math.Round(cos(30.0d));
  13:      }
  14:  }


Beispiel Übergabeparameter:

   1:  namespace Geometry
   2:  {
   3:      public delegate double Trigometric(double a);
   4:   
   5:      public class XY
   6:      {
   7:          // in .NET 1.1 it is: Trigometric cos = new Trigometric(Math.Cos);
   8:          private Trigometric cos = Math.Cos;
   9:          private Trigometric sin = Math.Sin;
  10:   
  11:          ...
  12:          public double CalculateAngle(Trigometric t, double angle)
  13:          {
  14:              return t(angle); // == return Math.Cos(angle) bzw. Math.Sin(angle)
  15:          }
  16:   
  17:          public void Test()
  18:          {
  19:              double angle = 30.0d;
  20:              double result = CalculateAngle(cos, angle);
  21:              
  22:              ...
  23:          }
  24:      }
  25:  }


Simpel, nicht wahr?

Keine Kommentare: