Announcement

Collapse
No announcement yet.

C# Attribute

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# Attribute

    Hallo,<br>
    der u.s. Code zeigt, wie ein Attribute an eine Klasse gebunden wird. <br>
    <pre>
    <font face="Verdana" size="1" color="#000000">using System;

    namespace MyAttributes
    {
    [AttributeUsage(AttributeTargets.All)] // ist wohl das Attribute für DeveloperAttribute
    public class DeveloperAttribute : Attribute
    {
    public string FName;
    public string FAge;
    public bool FReviewed;
    public DeveloperAttribute(string name, string age, bool reviewed)
    {
    this.FName = name;
    this.FAge = age;
    this.FReviewed = reviewed;
    }
    public string Name
    {
    get {return FName;}
    set {FName = value;}
    }
    public string Age
    {
    get {return FAge;}
    set {FAge = value;}
    }
    public bool Reviewed
    {
    get {return FReviewed;}
    set {FReviewed = value;}
    }

    }

    [DeveloperAttribute("Jens Schumann", "37", true)] // binden des Attribute DeveloperAttribute an MainApp
    class MainApp
    {
    public static void Main()
    {
    //Call function to get and display the attribute.
    GetAttribute(typeof(MainApp));
    }

    public static void GetAttribute(Type t)
    {


    //Get instance of the attribute.
    DeveloperAttribute MyAttribute = (DeveloperAttribute) Attribute.GetCustomAttribute(t, typeof (DeveloperAttribute));

    if(null == MyAttribute)
    {
    Console.WriteLine("The attribute was not found.");
    }
    else
    {
    //Get the Name value.
    Console.WriteLine("The Name Attribute is: {0}." , MyAttribute.Name);
    //Get the Level value.
    Console.WriteLine("The Age Attribute is: {0}." , MyAttribute.Age);
    //Get the Reviewed value.
    Console.WriteLine("The Reviewed Attribute is: {0}." , MyAttribute.Reviewed);
    if (MyAttribute.Name=="Jens Schumann")
    Console.WriteLine("Vom Autor gestartet");
    }
    }
    }
    }</font>
    </pre>
    Im SDK konnte ich leider nicht die Stelle finden, an der beschreiben wird, wie z.B. das DeveloperAttribute von außen geändert werden kann.<br>
    Ich denke, dann wird die Sache doch erst richtig interessant. Wenn man mal davon absieht, das Attribute an Klassen, Methoden,<br>
    Properties usw. gebunden werden können, wo ist dann eigentlich der große Unterschied zu den alten Ini-Dateien. Wenn ich nur<br>
    durch ändern der Attribute (zur Laufzeit) das Verhalten der Anwendung ändern kann, dann kann ich doch Ini-Dateien verwenden, in denen in<br>
    den entsprechenden Sections die Werte definiert werden. Oder habe ich jetzt etwas grundsätzlich mißverstanden?<br>
    Jens Schumann<br>

  • #2
    Hallo Jens,

    da hast Du dir gleich den schwersten Brocken ausgesucht (um das Thema habe ich bisher einen Bogen gemacht). Aus meiner Sicht sind Attribute für die interessant, die eigene Klassen/Compiler für das .NET-Framework schreiben wollen (also das Gegenstück zu den Entwicklern von Komponenten unter Delphi).

    Der Sinn von Attributen wird an dem folgenden Beispiel deutlich (das allerdings nur unter der Beta 1 läuft):
    <pre>
    [ThreadAffinity(ThreadAffinity.REQUIRED)]
    class MyClass : public ContextBoundObject
    {
    // other code
    };
    </pre>
    Über das Attribut <i>ThreadAffinity.REQUIRED</i> wird .NET mitgeteilt, dass diese Methode immer nur von einem einzigen Thread gleichzeitig aufgerufen werden darf. Somit sorgt das Attribut dafür, dass wir uns selbst nicht mehr um Sperr-Mechanismen (Critical Section, Mutex, Semaphore etc.) kümmern müssen, sondern der Compiler/das Framework die notwendigen Zwischenaufrufe selbst einschiebt.

    Der zweite Schwerpunkt ist die Konfiguration, die bisher in der Registry (alte COM-Objekte) oder der RegDB (COM+ Objekte) abgelegt wurde. Über die Attribute kann die CLR zur Laufzeit die notwendigen Daten auslesen, da Konfiguration + Sourcecode an einer Stelle liegen und somit eine spezielle Registrierung nicht notwendig wird. Man kann es auch so ausdrücken: Die Attribute erlauben, das bei .NET das Prinzip "Installieren durch einfaches Kopieren der Dateien" funktionieren kann.

    Comment


    • #3
      Hallo Andreas,<br>ich versuche z.Z. die Beispiele und Artikel auf http://www.csharphelp.com/ zu verstehen. Dabei bin ich über einen Beitrag zum Thema Attribute gestolpert. Wir war gar nicht klar, dass es sich hier um einen dicken Brocken handelt. Aber es scheint sich ja auf jeden Fall zu lohnen sich mit den Attributen auseinanderzusetzen.
      Das Arrtibute [ThreadAffinity(ThreadAffinity.REQUIRED)] werde ich erstmal testen. Wie auf csharphelp zu lesen, ist das abspalten eines Threads ein einfache Sache. Ich stelle mir das jetzt folgendermaßen vor:<br>1. eine Klasse erzeugen<br>
      2. diese Klasse hat eine Methode in der ein Label aktualisiert wird.<br>
      3. diese Methode wird mit dem Attribute [ThreadAffinity(ThreadAffinity.REQUIRED)] belegt<br>
      4. mehrere Threads erzeugen, die diese Methode aufrufen und schauen was passiert.<br>Jens Schuman

      Comment


      • #4
        Hallo Jens,

        wenn ich mich richtig erinnere, gibt es in der Beta 2 das Attribut <i>ThreadAffinity</i> nicht mehr. Es war für mich nur ein plausibles Beispiel für den sinnvollen Einsatz von Attributen

        Comment

        Working...
        X