Wenn sowohl get als auch set in automatischen C#-Eigenschaften obligatorisch sind, warum muss ich mir dann überhaupt die Mühe machen, "get; set;" anzugeben?
Antworten
Zu viele Anzeigen?Offensichtlich brauchen Sie eine Möglichkeit, zwischen Feldern und Eigenschaften zu disambiguieren. Aber sind erforderliche Schlüsselwörter wirklich notwendig? Es ist zum Beispiel klar, dass diese beiden Deklarationen unterschiedlich sind:
public int Foo;
public int Bar { }
Das könnte funktionieren. Das heißt, es ist eine Syntax, die ein Compiler denkbar sinnvoll verwenden könnte.
Aber dann kommt man zu einer Situation, in der ein leerer Block eine semantische Bedeutung hat. Das scheint prekär zu sein.
Da es niemand erwähnt hat... Sie könnten die Auto-Eigenschaft virtuell machen und sie außer Kraft setzen:
public virtual int Property { get; set; }
Wenn es kein get/set gäbe, wie würde es überschrieben werden? Beachten Sie, dass Sie die Möglichkeit haben den Getter und nicht den Setter außer Kraft setzen :
public override int Property { get { return int.MinValue; } }
Auch, weil seit C# 6.0 (in Visual Studio 2015, zum Zeitpunkt dieser Antwort in der Version Ultimate Preview verfügbar) können Sie eine echte schreibgeschützte Eigenschaft implementieren:
public string Name { get; }
public string Name { get; } = "This won't change even internally";
... im Gegensatz zu dem derzeit unvollkommenen Workaround mit dem public getter/private setter Paar:
public string Name { get; private set; }
public Constructor() { Name="As initialised"; }
public void Method() { Name="This might be changed internally. By mistake. Or not."; }
Beispiel für das unten stehende Beispiel (online kompiliert und ausführbar) ici ).
using System;
public class Propertier {
public string ReadOnlyPlease { get; private set; }
public Propertier() { ReadOnlyPlease="As initialised"; }
public void Method() { ReadOnlyPlease="This might be changed internally"; }
public override string ToString() { return String.Format("[{0}]",ReadOnlyPlease); }
}
public class Program {
static void Main() {
Propertier p=new Propertier();
Console.WriteLine(p);
// p.ReadOnlyPlease="Changing externally!";
// Console.WriteLine(p);
// error CS0272: The property or indexer `Propertier.ReadOnlyPlease' cannot be used in this context because the set accessor is inaccessible
// That's good and intended.
// But...
p.Method();
Console.WriteLine(p);
}
}
Weitere interessante Neuigkeiten über C# 6.0 als offizielles Vorschauvideo ici .
- See previous answers
- Weitere Antworten anzeigen