| 

.NET C# Java Javascript Exception

3
Neulich bin ich über diesen Ausdruck gestolpert. Dass er etwas auf "nur lesen" setzt, wird aus der Übersetzung klar. Aber was setzt man auf "nur lesen" und wann? Mir ist der Sinn nicht ganz klar.
News:
19.01.2011
Pooh 31 2
2 Antworten
4
Readonly-Felder lassen sich NUR im Konstruktor der Klasse oder zur Compile-Zeit setzten. Das ist immer dann wichtig wenn man sicherstellen möchte das bestimmte Variablen oder Eigenschaften nicht versehendlich überschrieben werden.

Beispielsweise könnte ich mir sowas vorstellen:

class Person{
readonly int _personnummer;
public Person(int PersonNummer){
this._personnummer = PersonNummer;
this.GetPersonDetails()
}

public string Name{get;set;}
public string Vorname{get;set;}
public void GetPersonDetails(){
//Datenbankzugriff um Name, Vorname, Geburtsdatum etc. auszulesen
}
}


Es darf niemals die PersonNummer geändert werden da sonst die ausgelesenen Informationen und die PersonNummer nicht mehr übereinstimmen.

Zusammengefasst kann man sagen, wenn etwas zur Laufzeit nur einmal geschrieben werden darf, und dannach unveränderlich sein soll, dann verwendet man ReadOnly.

Nachtrag:

Ich hab noch eine sehr schöne Zusammenfassung der wichtigsten Unterschiede zwischen Const und ReadOnly gefunden die ich hier gerne der Vollständigkeithalber mit aufzeigen will:

'const':

  • Can't be static.
  • Value is evaluated at compile time.
  • Initiailized at declaration only.


'readonly':

  • Can be either instance-level or static.
  • Value is evaluated at run time.
  • Can be initialized in declaration or by code in the constructor.

Quelle: http://weblogs.asp.net/psteele/archive/2004/01/27/63416.aspx
19.01.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Schön zusammengefasst. +1
klaus_b 19.01.2011
3
readonly-Felder lassen sich nur im Konstruktor oder per Feldinitialierer beschreiben - nach dem Ablauf des Konstruktors sind sie nur noch lesbar.

Insofern unterscheiden sie sich von const, da const-Felder *NUR* per Feldinitialisierer, nicht aber im Konstruktor, definiert werden können.

Und - ganz, ganz wichtig: Im Gegensatz zu const wird der Wert eines readonly-Felds zur Laufzeit gesetzt - der von einem const-Feld zur Compilezeit. Heißt: Wenn ich zwei Assemblies A und B habe, und A ein const-Feld definiert, beispielsweise auf den Wert 5, dann wird der Wert 5 auch in B hartcodiert eingetragen! Grund: const wird zur Compilezeit ausgewertet. Wenn ich den Wert des Feldes in A irgendwann mal ändere, hat das in B erst dann eine Auswirkung, wenn B neu kompiliert wird.

readonly verhält sich hier anders, hier wird tatsächlich erst zur Laufzeit initialisiert - was dann so wohl in A und in B zum richtigen Wert führt, egal ob B neu kompiliert wurde oder nicht.

Insofern sollte man const ausschließlich dann nutzen, wenn man zu 100% weiß, dass sich der Wert NIEMALS ändern kann - ansonsten IMMER readonly den Vorzug geben.
19.01.2011
Golo Roden 2,7k 3 9
+1, da versucht jemand Punkte zu erhaschen, und es Funktioniert auch noch :P
Floyd 19.01.2011
Was heißt "Punkte erhaschen"? Der Teil mit readonly und const fehlte halt nun mal, ist aber IMHO durchaus relevant, um den Einsatz von readonly vernünftig abwägen zu können.

;-)
Golo Roden 19.01.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH