52 Stimmen

C# Automatische Eigenschaften - Warum muss ich "get; set;" schreiben?

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?

2voto

Rune Grimstad Punkte 34670

Wie würde der Compiler die Eigenschaft von einem Feld trennen, wenn sie keine Accessoren hätte? Und was würde sie von einem Feld unterscheiden?

2voto

Robert Rossney Punkte 91100

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.

2voto

Zaid Masud Punkte 12759

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; } }

2voto

Robert Synoradzki Punkte 1480

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 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X