Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 13.09.13 17:35 
Hallo zusammen,
ich bin in meinem Lernfeld ein wenig weiter gekommen und mir stellt sich eine Frage.
Bisher habe ich wenn ich einen Wert benötigt habe diesen mit "return" aus der Methode zurück geben lassen.

Zum Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
public int test(int wert)
{
   return (wert * wert);
}


Jetzt habe ich hier in meinem Heft einen Code

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public int gewichtInGrammm
{
   get
   {
      return gewicht * 1000;
   }
}


Ich verstehe zwar was der Quellcode macht, verstehe allerdings nicht den Unterschied genau.
Wann nimmt man welchen "Stil", bzw. ist irgendwas sinnvoller oder besserer Programmierstil etc.

Hat da mal einer nen guten Link oder ähnliches, welches sich mit dem Thema beschäftigt, oder mache ich mir für eine "Kleinigkeit" zu viele Gedanken.

Vielen Dank

Gruß
Daniel
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 13.09.13 17:46 
Also das erste ist ja eine Methode, das zweite eine Property. Ein Unterschiedliogt ja schon im Aufruf: Einmal mit und enmal ohne Klammern.

Der Bedeutungsunterschied ist etwas schwerer zu fassen, aber ich versuche es mal:

Ein getter einer Property sollte
  • Stets schnell und deterministisch arbeiten. Die Laufzeit sollte sich nur geringfügig ändern und auf jeden Fall kurz sein.
  • Keine Exceptions werfen
  • Keine Nebeneffekte haben, also auch keine anderen Properties verändern.
  • Bei Aufrufen, die direkt nacheinander stattfinden, auch wieder das gleiche Ergebnis liefern.

Das ist mir jetzt so eingefallen. Falls einer der Punkte verletzt wird, solltest du eine Methode benutzen. Diese darf dann auch Exceptions werfen, lange brauchen und verschiedene Ergebnisse liefern ;-)

Dazu gibt es natürlich auch Infos im msdn: msdn.microsoft.com/e...wfsses(v=vs.90).aspx & msdn.microsoft.com/e...29054(v=vs.100).aspx
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 13.09.13 18:45 
Hast du mal was von den Get-/Set-Methoden gehört?

In Java werden die genutzt. Das sind in der Regel nur simple Methoden, die einzig und allein dafür da sind, eine private Variable der Klasse nach Außen abrufbar zu machen (z.B. GetName()), oder diese änderbar zu machen (z.B. SetName(string value))


In C# gibt es da aber die Propertys, die an sich eigentlich nur eine andere Umsetzung dieser Get-Set-Methoden sind. Auf Arbeit habe ich gelernt, dass der Compiler die get- und set-Accessoren eigentlich sowieso nur mit entsprechenden Methoden austauscht und die dann auch so nutzt.


Der Vorteil von Propertys ist aber der, dass sie sich ganz normal nutzen lassen, wie eine Variable.
Dennoch gibt es den Anweisungsblock in den Accessoren get und set.
Der get-Accessor sollte, wie schon gesagt, nix weiter tun, als die private Variable nach außen hin zugänglich machen. Wenn es nötig ist, kannst du da noch einbauen, dass die Anzahl der Zugriffe gezählt wird, aber eine andere Nutzung fällt mir jetzt auch nicht ein.
Der meiner Meinung nach größte Vorteil findet sich aber im set-Accessor, denn da kannst du hin gehen und nach schauen, ob der Wert, der übergeben wird, auch so stimmt. Du kannst z.B. prüfen, ob der Wert leer ist und dann lässt deine Name-Property keinen leeren Text zu, schließlich hat jeder einen Namen.

Das könntest du natürlich auch auslagern und überall mit einer extra dafür angelegten Methode prüfen, ob z.B. das Geburtsdatum im richtigen Bereich liegt, aber es wäre doch viel einfacher, wenn du ganz ohne daran zu denken, das eingegebene Geburtsdatum in die Variable schreiben kannst und damit ist die Sache geklärt.

Manchmal ist es sinnvoll, dass die Property dann auch eine Exception wirft, ich habe es letztens auch eingebaut, dass die Property den eingegebenen Wert intern entsprechend anpasst, weil ich ganz bewusst will, dass z.B. ein Zahlenwert in den erlaubten Bereich "geschoben" wird.