2009-07-08 13 views
5

Non esegue l'inizializzazione dell'oggetto al di fuori di un incapsulamento di interruzione costruttore?Opzioni di inizializzazione dell'oggetto C#

Dato:

class MyClass 
{ 
    public string _aString; 
} 

non Qualora l'organo _aString essere private e istanziare tramite una chiamata al costruttore (costruttore omessa qui):

MyClass test = new MyClass("test"); 

Invece del metodo alternativo di inizializzazione dell'oggetto :

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

Wow! 5 risposte in nessun tempo! Grazie a tutti. Questo codice proviene da un libro su C#. Ero curioso di sapere se si trattasse di buone pratiche. –

risposta

6

"Non esegue l'inizializzazione dell'oggetto al di fuori di un incapsulamento di interruzione costruttore?"

Bene, no. Come hai giustamente sottolineato, puoi solo inizializzare le proprietà che sono già accessibili nel tuo ambito corrente. (pubblico, interno ecc.)

Questo tipo di intializzazione è in realtà solo un po 'di zucchero sintattico sulla costruzione di una classe e l'assegnazione di valori alle proprietà, è molto utile per le classi anonime e le clausole di selezione Linq.

5

di solito è considerata una cattiva pratica di esporre fi pubblico campi ... può essere accettabile in alcuni casi, ad esempio se il campo è contrassegnato come readonly (il che significa che deve essere impostato nel costruttore). Invece, si dovrebbe fare questo campo privato e esporlo attraverso una proprietà, che può o non può essere di sola lettura, a seconda del suo scopo:

class MyClass 
{ 
    private string _aString; 
    public string AString 
    { 
     get { return _aString; } 
     // uncomment to make the property writable 
     //set { _aString = value; } 
    } 
} 
0

Dipende dallo scopo della variabile. Se il programmatore dovrebbe essere in grado di impostare la variabile solo in fase di inizializzazione, ma successivamente non avrà accesso ad essa, allora andrei con la variabile privata. Se vuoi che l'utente della classe sia in grado di impostare/leggere la variabile in qualsiasi momento, rendilo pubblico.

0

Quando si dispone di
public string _aString;
in realtà non importa quando si inizializza questo valore dal momento che questo è già esposto. Quindi, quando vogliamo parlare dell'inizializzazione, dovremmo spostare questa stringa in proprietà. Più che parlare di incapsulamento ha senso.
Quindi, immaginiamo di avere una stringa. Ci sono due modi per inizializzare. Uno è farlo all'interno del costruttore, il secondo è l'inizializzazione pigra (inizializza quando alcuni richiedono questi dati).

0

sì, inizializzare tramite il costruttore e aggiungere proprietà per consentire (o non) l'accesso ai dati.

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

        } 
} 
1

Se si considera proprietà come getter e setter, non credo si romperà l'incapsulamento. Ma dovresti notare che non hai usato una proprietà, hai usato una variabile di istanza. In effetti, non credo che funzionerà come il tuo esempio. Controlla questo:

class MyClass { 
    private string aString; 

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

In questo caso, si accede al campo privato tramite il suo accessor. È come usare un costruttore senza parametri e impostarne il valore in seguito.

+1

L'impostazione diretta dei campi pubblici è a-ok negli inizializzatori di oggetti (dal punto di vista della semantica della lingua, non della progettazione corretta). –

+0

Che io non sapevo! Grazie! = D – Fernando

0

Se si sta chiedendo se la nuova stenografia dell'inizializzazione dell'oggetto interrompe l'incapsulamento, la risposta è no. È possibile impostare solo membri con ambito pubblico con il nuovo metodo.

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

è uguale

MyClass test = new MyClass(); 
test._aString = "Test"; 
0

Per mostrare un pubblico oggetto in una classe C# non si rompe "incapsulamento" dal punto di vista di "programmazione orientata agli oggetti".

Da un punto di vista di una "buona pratica" non è una buona cosa, utilizzare Proprietà perché consente al codice esterno di utilizzare questa classe se si modifica il comportamento di aggiornamento di questo valore (controllo, ...).