Inicializace C # auto-vlastnosti

hlasů
162

Jsem zvyklý na psaní tříd, jako je tento:

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

Konverzi Bar na auto-majetku se zdá pohodlnější a stručné, ale jak mohu zachovat inicializace bez přidání konstruktor a uvedení inicializaci tam?

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

Mohli jste vidět, že přidání konstruktor není inline s úsporami intenzity bych měl být dostat z automatických vlastností.

Něco takového by větší smysl pro mě:

public string Bar { get; set; } = bar;
Položena 03/10/2008 v 23:59
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
3

Ve výchozí konstruktor (a všechny non-výchozí ty, pokud máte některý příliš samozřejmě):

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

To není o nic méně výkonný, že váš původní kód Věřím, protože to je to, co se děje v zákulisí stejně.

Odpovězeno 04/10/2008 v 00:04
zdroj uživatelem

hlasů
34

Můžete to udělat pomocí konstruktoru své třídě:

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

Pokud máte jiný konstruktor (tedy ten, který trvá paramters) nebo parta konstruktérů vždy můžete mít tento (tzv konstruktoru řetězení):

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

Pokud jste vždy zřetězení volání do výchozí konstruktor můžete mít všechny inicializace výchozí vlastnost nastavena zde. Když řetězení bude připoutaný konstruktor být volána před volání konstruktoru tak, aby vaše další specializované konstruktéři budou moci nastavit různé výchozí hodnoty podle potřeby.

Odpovězeno 04/10/2008 v 00:06
zdroj uživatelem

hlasů
179

Aktualizace - odpověď níže byl napsán před jazyce C # 6 přišel. V C # 6 můžete psát:

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

Můžete také napsat read-only automaticky implementované vlastnosti, které jsou pouze zapisovat v konstruktoru (ale může být také dané výchozí počáteční hodnotu:

public class Foo
{
    public string Bar { get; }

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

Je to nešťastné, že neexistuje žádný způsob, jak dělat právě teď. Musíte nastavit hodnotu v konstruktoru. (Použití konstruktoru řetězení může pomoci, aby se zabránilo zdvojování.)

Automaticky prováděny vlastnosti jsou po ruce právě teď, ale mohl by určitě hezčí. Nepovažuji sám chce tento druh inicializace tak často, jak jen pro čtení automaticky implementována majetku, který by mohly být stanoveny pouze v konstruktoru a bude podpořena pole pouze pro čtení.

To se nestalo až do a včetně C # 5, ale je plánována na C # 6 - a to jak z hlediska umožnění inicializace v okamžiku prohlášení, a umožňuje pouze pro čtení automaticky implementované vlastnosti, které mají být inicializovány v konstruktoru těle.

Odpovězeno 04/10/2008 v 07:38
zdroj uživatelem

hlasů
22

To bude možné v jazyce C # 6.0:

public int Y { get; } = 2;
Odpovězeno 29/08/2014 v 21:55
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more