Benutzer mit den meisten Antworten
Schreibgeschützt? Was meint man denn damit?

Frage
-
Hallo,
Ich habe mir das programmiert:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication13 { class Program { static void Main(string[] args) { mensch schuayb = new mensch(); schuayb.Alter = 12; Console.WriteLine("{0}", schuayb.Alter); Console.ReadLine(); } } public class mensch { public int Alter = 1222; public int alter { get { return Alter; } } } }
Es ist doch jetzt schreibgeschützt, oder?
Warum kann ich dann mit den Objekt auf einen bestimmten Wert setzen?
Danke
Antworten
-
Stell dir vor, dau hast eine Eigenschaft, die du zwar ausgeben willst, aber die nicht geändert werden darf, weil dies dein System schädigen würde. Dann kannst du durch ein fehlendes SET verhindern, dass die Eigenschaft geändert wird.
Beispiel: http://msdn.microsoft.com/de-de/library/system.exception.message%28v=vs.110%29.aspx Die Exception-Klasse hat eine Eigenschaft names Message. Dieser Wert soll/darf/kann nicht verändert werden, damit die nachricht nicht verändert wird.
Im Übrigen kann man die SET-Funktionalität auch zur Prüfung verwenden.
set { if(value < 3 || value > 99) { //Wenn ein Mensch jünge r als 3 oder älter als 99 ist, dann darf er sich nicht hier eintragen. throw new Exception("Ungültiges Alter"); //Fehler werfen } _alter = value; }
© 2015 Thomas Roskop
- Als Antwort markiert schuayb Kazrabatli Sonntag, 28. Dezember 2014 16:52
Alle Antworten
-
Wie der Name schon sagt, bedeutet Schreibgeschützt, dass der Wert nicht geschrieben werden kann.
Versuch doch mal folgendes mit einem Beispiel:
mensch schuayb = new mensch(); schuayb.alter = 12; //Die Eigenschaft mit dem get { }
Der Compiler wird dich mit Pauken und Trompeten daran hindern, den wert zu ändern, da nur GET, also "erhalte" definiert ist. Wenn du auch ein SET ("Setze") einfügst ( set { Alter = value; } ), dann funktioniert das.
PS: Normalerweise werden die Klassennamen etc. groß Geschrieben und die anderen sachen klein. Was intern ist, kansnst du machen wie du willst. Folgendes wäre also besser:
class Program { static void Main(string[] args) { mensch schuayb = new mensch(); schuayb.Alter = 12; Console.WriteLine("{0}", schuayb.Alter); Console.ReadLine(); } } public class Mensch { public int _alter = 0; public int Alter { get { return _alter; } set { _alter = value; } } }
© 2015 Thomas Roskop
-
Stell dir vor, dau hast eine Eigenschaft, die du zwar ausgeben willst, aber die nicht geändert werden darf, weil dies dein System schädigen würde. Dann kannst du durch ein fehlendes SET verhindern, dass die Eigenschaft geändert wird.
Beispiel: http://msdn.microsoft.com/de-de/library/system.exception.message%28v=vs.110%29.aspx Die Exception-Klasse hat eine Eigenschaft names Message. Dieser Wert soll/darf/kann nicht verändert werden, damit die nachricht nicht verändert wird.
Im Übrigen kann man die SET-Funktionalität auch zur Prüfung verwenden.
set { if(value < 3 || value > 99) { //Wenn ein Mensch jünge r als 3 oder älter als 99 ist, dann darf er sich nicht hier eintragen. throw new Exception("Ungültiges Alter"); //Fehler werfen } _alter = value; }
© 2015 Thomas Roskop
- Als Antwort markiert schuayb Kazrabatli Sonntag, 28. Dezember 2014 16:52
-
Hierbei ist aber darauf zu achten _alter auf private zu setzen, da sonst ein unerwünschtes Umgehen der Überprüfung einfach möglich wäre.
schuayb._alter = 9999; //funktioniert noch da _alter in Mensch als public deklariert wurde
Die Klasse Mensch sollte also so aussehen
public class Mensch { private int _alter = 12; public int Alter { get { return _alter; } set { if(value < 3 || value > 99) { //Wenn ein Mensch jünger als 3 oder älter als 99 ist, dann darf er sich nicht hier eintragen. throw new Exception("Ungültiges Alter"); //Fehler werfen } _alter = value; } } }
schuayb._alter = 9999; //funktioniert nicht mehr da es von außerhalb der Klasse nicht mehr sichtbar ist
- Bearbeitet PBecker Sonntag, 28. Dezember 2014 19:20 Erklärungen
-
Stimmt, danke PBecker für die Information, habe ich in dem Code oben auch übersehen.
Und es gibt noch eine kleine Richtlinie. Wenn die "Mehode" im Getter/Setter sehr aufwändig ist, dann mache bitte eine Funktion daraus. Getter/Setter sollten nur bei kleinen Datenänderungen verwendet werden, da ein Programmierer davon ausgehen kann, dass die Eigenschaft schnell geladen werden kann.
Siehe dazu auch in der MSDN, wenn ich mich richtig erinnere?!
© 2015 Thomas Roskop