Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich bin zum Schreiben Klassen wie folgt verwendet:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

Konvertieren von Bar zu einer Auto-Eigenschaft scheint bequem und prägnant, aber wie kann ich behalten die Initialisierung ohne einen Konstruktor hinzufügen und die Initialisierung dort setzen?

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

Sie konnte sehen, dass ein Konstruktor Zugabe nicht den Aufwand Einsparungen InLine Ich soll von auto-Eigenschaften zu bekommen.

So etwas würde mehr Sinn für mich:

public string Bar { get; set; } = "bar";
War es hilfreich?

Lösung

Update - die Antwort darunter vor C # 6 geschrieben wurde kam. In C # 6 können Sie schreiben:

public class Foo
{
    public string Bar { get; set; } = "bar";
}

Sie können auch schreiben schreibgeschützt automatisch implementierter Eigenschaften, die nur beschreibbar im Konstruktor sind (kann aber auch einen Standardanfangswert angegeben werden:

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

Es ist bedauerlich, dass es keine Möglichkeit, dieses Recht jetzt zu tun. Sie haben den Wert im Konstruktor zu setzen. (Konstruktorverkettung Verwendung kann dazu beitragen, Doppelarbeit zu vermeiden.)

Automatisch implementiert Eigenschaften praktisch sind gerade jetzt, könnte aber sicherlich schöner. Ich finde nicht, ich diese Art der Initialisierung so oft als Nur-Lese-automatisch implementiert Eigenschaft fehlt, die nur im Konstruktor gesetzt werden könnten und würde von einem Nur-Lese-Bereich gesichert werden.

Dies geschah nicht bis einschließlich C # 5, aber für C # 6 ist in Planung - sowohl hinsichtlich der Initialisierung bei der Deklaration erlaubt, und so dass für Read-Only automatisch umgesetzt Eigenschaften in einem Konstruktorrumpf initialisiert werden.

Andere Tipps

Sie können es über den Konstruktor Ihrer Klasse tun:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

Wenn Sie einen anderen Konstruktor haben (dh eine, die Paramter nimmt) oder ein Bündel von Konstrukteuren kann man immer haben diese (so genannte Konstruktorverkettung):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

Wenn Sie immer einen Aufruf an die Standardkonstruktors ketten können Sie alle Standardeigenschaft Initialisierung dort gesetzt haben. Wenn die Verkettung wird der verkettete Konstruktor vor dem Aufruf Konstruktor aufgerufen werden, so dass Ihre speziellere Konstrukteurs verschiedene Voreinstellungen wie für eingestellt werden können.

Es ist möglich, in C # 6.0:

public int Y { get; } = 2;

In der Default-Konstruktor (und alle nicht-standardmässigen, wenn Sie irgendwelche natürlich auch):

public foo() {
    Bar = "bar";
}

Dies ist nicht weniger performant, dass Ihr Original-Code Ich glaube, da das ist, was ohnehin hinter den Kulissen passiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top