Domanda

Quando ho iniziato a lavorare con i linguaggi di programmazione orientati agli oggetti, mi è stata insegnata la seguente regola:

Quando dichiari un campo in una classe, non inizializzarlo ancora.Fatelo nel costruttore.

Un esempio in C#:

public class Test
{
    private List<String> l;

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

Ma quando recentemente qualcuno mi ha chiesto perché farlo, non sono riuscito a trovare una ragione.Non ho molta familiarità con il funzionamento interno di C# (o di altri linguaggi di programmazione, del resto, poiché credo che ciò possa essere fatto in tutti i linguaggi OO).

Allora perché È fatto questo?È sicurezza?Proprietà?

È stato utile?

Soluzione

  • Se si dispone di più costruttori, si potrebbe desiderare di inizializzare un campo per diversi valori

  • Quando si inizializza il campo nel costruttore, non ci può essere confusione su quando esattamente viene inizializzato per quanto riguarda il resto del costruttore. Questo può sembrare banale con una singola classe, ma non così tanto quando si dispone di una gerarchia di ereditarietà con il codice di costruttore di esecuzione a ogni livello e l'accesso ai campi della superclasse.

Altri suggerimenti

Il compilatore C # avrà qualsiasi membro intialization non-statico che si fa in linea e spostarlo nel costruttore per voi. In altre parole questo:

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

viene compilato a questo:

class Test
{
    Object o;

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

Non sono sicuro di come compilatori per altri linguaggi di gestire questo, ma per quanto riguarda C # è interessato è una questione di stile e si è liberi di fare a seconda di quale si desidera. Si prega di notare che i campi statici vengono gestite in modo diverso: leggere questo articolo per maggiori informazioni su tale .

Uno dei motivi per farlo è che mette tutto il codice di inizializzazione in un unico posto, il che è comodo per gli altri che leggono la tua classe.Detto questo non lo faccio proprio per due motivi principali.(1) Utilizzo TDD/Unit testing per definire il comportamento della mia classe.Se vuoi sapere cosa fa il costruttore senza parametri, dovresti davvero leggere i test che ho creato sul costruttore senza parametri.(2) Con C# 3.0, in genere utilizzo le proprietà automatiche e l'inizializzazione in linea con un costruttore senza parametri per creare un'istanza dell'oggetto.Questo è molto più flessibile e mette la definizione delle proprietà esattamente in linea con il punto in cui viene utilizzato il codice.Ciò sovrascriverebbe qualsiasi inizializzazione nel costruttore, quindi raramente ne inserisco qualcuno.Naturalmente, questo vale solo per C#.

Ex.(di 2)

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

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

       public Foo() { }
  }

a volte il costruttore ha dei parametri che vengono utilizzati per l'inizializzazione delle variabili interne. Per esempio dimensioni di matrici

Non ho sentito un motivo valido per non offrire entrambe le opzioni. Ho il sospetto che la vera ragione ha a che fare con la semplificazione della struttura del linguaggio dal punto di vista di analisi. Questo è particolarmente vero nei linguaggi C-derivato in cui l'analisi di un'istruzione di assegnazione richiede il 75% delle regole di sintassi della lingua. Mi sembra che gli permette e definendo come avrebbe funzionato con precisione sarebbe bello. Sono d'accordo con commenti di Michael per l'aumento della complessità, come si inserisce eredità e più costruttori, ma solo perché si aggiunge una funzione non significa che si deve usare. Io voterei per supportare sia, anche se il mio voto in realtà non aggiungere fino a molto.

mi piace sempre pensare della classe come una fabbrica per gli oggetti, e il costruttore come la fermata finale sulla linea di produzione. I campi dichiarati nella classe sono modelli descirbing l'oggetto, ma il progetto non saranno realizzati in un oggetto prima di un tale oggetto viene ordinato tthrough una chiamata al costruttore ... Inoltre, come qualcuno ha sottolineato, facendo tutti i tuoi Inizializzazioni in il vostro costruttore migliorerà la leggibilità, così come wil prevedere dinamicità in inizializzazione (non potrebbe essere un costruttore senza parametri hai a che fare con).

Inoltre, in alcune lingue il costruttore può essere utilizzato per il ripristino di un oggetto a uno stato originale, che è il motivo per cui sarà poi necessario instatiate l'oggetto nel costruttore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top