Proto by měly členské proměnné se inicializuje v konstruktérů?

hlasů
5

Když jsem poprvé začal pracovat s objektově orientovaný programovací jazyky, byl jsem učil na následující pravidlo:

Při deklaraci pole ve třídě, neinicializujete to ještě. Tomu, že v konstruktoru.

Jako příklad v C #:

public class Test
{
    private List<String> l;

    public Test()
    {
        l = new List<String>();
    }
}

Ale když se mě někdo zeptal, proč v poslední době k tomu, že jsem nemohl přijít na důvod. Nejsem obeznámen s vnitřním fungování C # (nebo jiných programovacích jazyků, když na to přijde, protože věřím, že to lze provést ve všech objektově orientovaných jazycích).

Tak proč se to dělá? Je to zabezpečení? Vlastnosti?

Položena 26/03/2009 v 13:40
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
14

  • Máte-li více konstruktérů, možná budete chtít inicializovat pole pro různé hodnoty

  • Při inicializaci pole v konstruktoru, nemůže existovat žádný zmatek nad tím, kdy přesně se inicializuje ve vztahu ke zbytku konstruktoru. To se může zdát triviální pomocí jediného druhu, ale ne tolik, když máte hierarchii dědičnosti s konstruktor kód běží na každé úrovni, a přístup k nadtřídy pole.

Odpovězeno 26/03/2009 v 13:44
zdroj uživatelem

hlasů
10

C # kompilátor bude mít jakýkoliv non-statické členské intialization že vy vložené a přesunout ji do konstruktoru pro vás. Jinými slovy, toto:

class Test
{
    Object o = new Object();
}

dostane sestaven tak, aby toto:

class Test
{
    Object o;

    public Test()
    {
        this.o = new Object();
    }
}

Nejsem si jistý, jak překladače pro další jazyky zvládnout, ale pokud jde o C # je to otázka stylu a máte možnost dělat podle toho, co si budete přát. Upozorňujeme, že statická pole jsou zpracovány jinak: přečtěte si tento článek pro více informací o které .

Odpovězeno 26/03/2009 v 13:43
zdroj uživatelem

hlasů
2

Jedním z důvodů pro to je, že se dá všechno inicializace kódu na jednom místě, které je vhodné pro ostatní čtení svou třídou. Po tomto nemám opravdu to ze dvou hlavních důvodů. (1) Já používám TDD testování / jednotku pro definování chování mé třídě. Chcete-li vědět, co je bez parametrů konstruktoru ano, měli byste opravdu přečíst testů jsem postavené na bez parametrů konstruktoru. (2) S C # 3.0, jsem obvykle používají automatické vlastnosti a inicializaci inline se bez parametrů konstruktoru instanci objektu. To je mnohem pružnější a klade definici vlastností přímo v řádku, kde je používán kód. To by přepsat některou inicializaci v konstruktoru, a tak jsem jen zřídka nevložíš tam. Samozřejmě, že toto platí pouze pro C #.

Ex. (Z 2)

  var foo = new Foo { Bar = "baz" };

  public class Foo
  {
       public string Bar { get; set; }

       public Foo() { }
  }
Odpovězeno 26/03/2009 v 13:49
zdroj uživatelem

hlasů
1

Někdy konstruktor má parametry, které se používají pro inicializaci vnitřních proměnných. Například velikost polí

Odpovězeno 26/03/2009 v 13:46
zdroj uživatelem

hlasů
0

Vždycky jsem chtěl myslet na třídu jako továrny na objekty a stavitele jako poslední zastávku na výrobní lince. Pole deklarované ve třídě jsou plány descirbing objekt, ale plán nebude realizován do objektu před takový objekt je nařízeno tthrough volání konstruktoru ... Také, jak někdo upozornil, dělá všechny své initialisations v váš konstruktér zlepší čitelnost, stejně jako to wil poskytovat dynamicita v inicializaci (to nemusí být bez parametrů konstruktor máte co do činění s).

Také, v některých jazycích konstruktér může být použito pro resetování objektu do původního stavu, což je důvod, proč to pak bude nutné instatiate objekt v konstruktoru.

Odpovězeno 26/03/2009 v 14:31
zdroj uživatelem

hlasů
0

Neslyšel jsem přesvědčivý důvod pro to nabídnout obě možnosti. Domnívám se, že skutečným důvodem, proč má co do činění s zjednodušit jazykovou strukturu z pohledu rozebrat. To platí zejména v jazycích C-derivát, kde analýze příkazu přiřazení vyžaduje 75% syntaktických pravidel jazyka. Zdá se mi, že umožňuje to a definování toho, jak to bude fungovat přesně by bylo hezké. Souhlasím s Michaelova poznámka o zvýšení složitosti při vložení dědictví a více konstruktérů, ale jen proto, že jste přidat funkci, neznamená, že budete muset použít. Bych volil tak, aby podporoval, i když můj hlas opravdu není přidat až moc.

Odpovězeno 26/03/2009 v 13:50
zdroj uživatelem

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