C Možnosti inicializace # objektu

hlasů
5

Nevznese námitky inicializaci mimo break konstruktor zapouzdření?

Vzhledem k tomu:

class MyClass 
{  
    public string _aString;  
}

Neměl by _aString člen být soukromé a instance pomocí volání konstruktor (konstruktoru zde vynechány):

 MyClass test = new MyClass(test);

Namísto alternativní metodu inicializace objektu:

MyClass test = new MyClass { _aString = Test };
Položena 09/07/2009 v 00:06
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
5

To je obvykle považováno za špatnou praxi vystavit veřejné pole ... to může být přijatelný v některých případech, například v případě, že pole je označen jako readonly(což znamená, že musí být nastaven v konstruktoru). Místo toho byste měli vytvořit toto pole soukromí a vystavit jej přes vlastnost, která může nebo nemusí být jen pro čtení, v závislosti na jejím účelu:

class MyClass
{
    private string _aString;
    public string AString
    {
        get { return _aString; }
        // uncomment to make the property writable
        //set { _aString = value; }
    }
}
Odpovězeno 09/07/2009 v 00:11
zdroj uživatelem

hlasů
0

Záleží na účelu proměnné. Má-li programátor mohl pouze nastavit proměnnou při inicializaci, ale nemají přístup k němu po tom, pak bych jít s soukromý proměnné. Pokud chcete, aby uživatel třídy, aby bylo možné nastavit / čtení proměnnou kdykoli poté ji zveřejní.

Odpovězeno 09/07/2009 v 00:12
zdroj uživatelem

hlasů
0

Máte-li
public string _aString;
to opravdu nezáleží na tom, při inicializaci tuto hodnotu, protože je to již vystaveny. Takže, pokud chceme hovořit o inicializaci bychom se měli posunout tento řetězec do vlastnictví. Než mluví o encapsutlation dává smysl.
Tak si představte, máme nějaký řetězec. Existují dva přístupy k mosly initializatnion. Jedním z nich je, aby to uvnitř konstruktoru, druhá je líná inicializace (inicializace, když nějaký požadavek tohoto data).

Odpovězeno 09/07/2009 v 00:12
zdroj uživatelem

hlasů
0

Ano, inicializovat pomocí konstruktoru, a přidat vlastnosti pro povolení (nebo ne) přístup k datům.

class MyClass {
private string _aString;
string MyProperty {
                    get { return this._aString; }
                    // you can make this  private or protected
                    set { this._aString = value; } 

                  }
}
Odpovězeno 09/07/2009 v 00:14
zdroj uživatelem

hlasů
1

Máte-li v úvahu vlastnosti jako získání a nastavení, já nevěřím, že to zlomí zapouzdření. Ale měli byste si všimnout, že jste nepoužili vlastnost, jste použili proměnnou instance. Ve skutečnosti, já nevěřím, že to bude fungovat jako váš příklad. Zkontrolujte, zda tento jeden:

class MyClass {
    private string aString;

    public string AString {
        get { return aString; }
        set {aString = value; }
    }
}
MyClass test = new MyClass {
    AString = "test"
};

V tomto případě se přístup k osobnímu pole přes to je přístupový objekt. Je to jako s použitím bez parametrů konstruktoru a nastavení hodnoty později.

Odpovězeno 09/07/2009 v 00:15
zdroj uživatelem

hlasů
6

„Nenamítá inicializaci mimo break konstruktor zapouzdření?“

No, no. Jak jste správně poukázal můžete inicializovat pouze vlastnosti, které jsou již dostupné v aktuálním rozsahu. (Veřejné, vnitřní etc)

Tento druh Intialization je opravdu jen některé syntaktický cukr kolem výstavby třídy a přiřazení hodnot vlastností, to je velmi užitečné pro anonymní tříd a Linq vybrat doložky.

Odpovězeno 09/07/2009 v 00:18
zdroj uživatelem

hlasů
0

Pokud se ptáte, zda nový inicializační objekt zkratka zlomí zapouzdření, pak odpověď zní ne. Můžete nastavit pouze veřejně rozsahem členy s novou metodou.

MyClass test = new MyClass { _aString = "Test" };

je stejné jako

MyClass test = new MyClass();
test._aString = "Test";
Odpovězeno 09/07/2009 v 00:19
zdroj uživatelem

hlasů
0

Ukázat veřejnosti objekt v C # třídy neláme „zapouzdření“ z hlediska „Objektově orientované programování“.

Z hlediska „dobré praxe“ to není dobrá věc, užitné vlastnosti, protože umožňuje externímu kódu použít tuto třídu, pokud změníte chování aktualizovat tuto hodnotu (kontrola, ...).

Odpovězeno 09/07/2009 v 00:20
zdroj uživatelem

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