Zugriff auf eine Membervariable...Wie ist es richtig?



  • Guten Morgen allerseits,

    ein kleines Codebeispiel voran:

    class Test
    {
      private int foo;
      public int Foo
      {
        get
        {
          return this.foo;
        }
        set
        {
          this.foo = value;
        }
      }
    }
    

    Wenn ich "intern" in der Klasse auf die Variable foo bzw. Foo zugreifen will, mache ich das derzeit mit

    this.foo
    

    . Ich wollte nun wissen, ob das auch richtig so ist, oder ob man auch intern mithilfe des Properties Foo daraufzugreift, da man dann auch die "Intelligenz" des Properties benutzen kann!

    Also was ist die designtechnisch gesehen richtige Art des Zugriffs?

    Merci für die Antworten!



  • Na, da gibt's so viel ich weiss keine speziellen Richtlinien. 😛
    Mach, was dir besser gefällt. Aber:
    Wenn bei get oder set noch irgendwelche anderen Operationen hinzukommen,
    als nur das Zurückgeben oder Setzen eines Werts (zum Beispiel beim Setzen
    überprüfen, ob der Wert ok ist), würde ich dann schon über die Properties
    zugreifen. Und um das dann einheitlich zu halten, greife ich persönlich
    immer auf die Properties zu.

    Wies performancemässig aussieht, weiss ich bei Properties allerdings nicht.



  • Asmodiel schrieb:

    Wies performancemässig aussieht, weiss ich bei Properties allerdings nicht.

    Hab interessehalber einen Vergleichstest gemacht!

    Bei den Properties ist noch folgendes zu sagen:
    Gelesen wurde mit

    return this.field
    

    Gesetzt wurde mit

    this.field = value
    // Ohne irgendwelche Überprüfungen
    

    Bei 1 Mrd. Schleifendurchläufe sieht das Ergebnis so aus (in Millisekunden):

    Field | Property
    ---------------------------
    get | 2796,875 | 8562,5
    set | 1593,75 | 7218,75

    Interessant zu beobachten ist das Verhältnis zwischen get und set jeweils von Field (2 : 1) und von Property!

    Naja trotzdem mal ganz interessant!

    Grüße



  • Du könntest Dir mal die neue Property-Syntax für triviale Properties mal anschauen.
    public int Foo { get; set; }
    Der Compiler legt das Element dann automatisch an.



  • Ah ok, cool...gut zu wissen.

    Ist des schon C# 3.0??



  • Yo.



  • @Freak
    Ich bin mir fast sicher dass du da Mist gemessen hast 🙂
    Sinnvolle Benchmarks zu schreiben ist nicht einfach, erst recht nicht wenn ein JIT Compiler mitspielt.



  • hustbaer schrieb:

    Sinnvolle Benchmarks zu schreiben ist nicht einfach, ...

    Stimme ich dir vollkommen zu. Bei war es ja auch nur ein Durchlauf und somit keine gemittelten Werte!
    Ich hat mich halt kurz interessiert und es dann hier gepostet, weil ich niemandem was vorenthalten will!
    Wobei Benchmarks echt ein interessantes Thema wären...

    Grüße



  • Freax rocks schrieb:

    hustbaer schrieb:

    Sinnvolle Benchmarks zu schreiben ist nicht einfach, ...

    Stimme ich dir vollkommen zu. Bei war es ja auch nur ein Durchlauf und somit keine gemittelten Werte!
    Ich hat mich halt kurz interessiert und es dann hier gepostet, weil ich niemandem was vorenthalten will!
    Wobei Benchmarks echt ein interessantes Thema wären...

    Grüße

    Nicht die Benchmarks an sich sind hier das Problem sondern der Jit-Compiler. Je nach Einstellung kann der Properties komplett wegoptimieren, womit dann der direkte Zugrigg auf den Member identisch mit dem Zugriff über Property wäre in solchen Situationen.

    Ein solcher Benchmark misst also eher nur einen von vielen Möglichen Fällen. Daraus eine Aussage abzuleiten ist schwer.

    Grundsätzlich gilt heutzutage eher das Performance nicht mehr oberstes Ziel ist, sondern Softwarequalität. Was bringt schon ein schnelleres Programm wenn es lediglich schneller Abstürzt? Daraus folgt das man sich nicht mit solcher Micro-Optimierung (auch bekannt als Premature Optimizing) aufhalten sollte. Entscheidend ist die Frage, was zu einer höheren Sourcequalität führt: Direkte Zugriffe auf Memebrvariablen oder der Zugriff über Properties.


Anmelden zum Antworten