2013-02-07 7 views
22

Questo sembra essere molto stupido e domanda rudimentale, ma ho cercato di google, ma non riusciva a trovare una risposta soddisfacente,modo migliore per creare l'oggetto

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Person(){} 
    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

La mia domanda è se ho classe come questo, qual è il modo migliore per creare un oggetto?

Person p=new Person("abc",15) 

O

Person p=new Person(); 
p.Name="abc"; 
p.Age=15; 

Qual è la differenza tra questi due metodi e qual è il modo migliore per creare oggetti?

+6

solo per aggiungere una terza opzione per il mix : 'Persona p = nuova Persona {Nome =" abc ", Età = 15};' - o una quarta: 'Persona p = nuova Persona (nome:" abc ", età: 15);'. Come dice X.L.Ant: nessuno è automaticamente "migliore" –

risposta

31

decidere se è necessario un oggetto immutabile o meno.

Se si inseriscono le proprietà public nella classe, lo stato di ogni istanza può essere modificato in ogni momento nel codice. Quindi, la classe potrebbe essere simile a questo:

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Person(){} 
    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

In questo caso, avendo un costruttore Person(string name, int age) non è così utile.

La seconda opzione consiste nell'implementare un tipo immutabile. Per esempio:

public class Person 
{ 
    public string Name { get; private set; } 
    public int Age { get; private set; } 

    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

Ora avete un costruttore che imposta lo stato per l'istanza, una volta , al momento della creazione. Notare che ora i setter per le proprietà sono private, quindi non è possibile modificare lo stato dopo la creazione dell'istanza dell'oggetto.

Una best practice consiste nel definire le classi come immutabili ogni volta se possibile. Per comprendere i vantaggi delle classi immutabili ti suggerisco di leggere questo article.

+1

La tua classe immutabile dovrebbe probabilmente avere getter pubblici e setter privati. – Servy

+0

@Servizio giusto! Ho aggiornato la mia risposta – davioooh

+0

A partire da C# 6 è anche possibile eliminare completamente i setter per creare proprietà di sola lettura. Questo garantirà in realtà che non si modificano accidentalmente le proprietà al di fuori di un costruttore. – Kyle

6

Non c'è davvero un modo migliore. Entrambi sono identici, a meno che non si desideri eseguire un'ulteriore elaborazione utilizzando i parametri passati al costruttore durante l'inizializzazione o se si desidera garantire uno stato coerente subito dopo aver chiamato il costruttore. Se è il caso, preferisci il primo.

Tuttavia, per motivi di leggibilità/manutenibilità, evitare di creare costruttori con troppi parametri.

In questo caso, entrambi lo faranno.

+1

Più facile per testare le classi anche se non richiedono parametri nei loro costruttori. – timmy

9

In realtà dipende dalle vostre esigenze, anche se ultimamente ho visto una tendenza per le classi con almeno un costruttore definito.

Il lato positivo della pubblicazione dei parametri in tramite costruttore è che si sa che è possibile fare affidamento su tali valori dopo l'istanziazione. Il rovescio della medaglia è che avrete bisogno di lavorare di più con qualsiasi libreria che si aspetta di essere in grado di creare oggetti con un costruttore nudo.

La mia preferenza personale è di andare con un costruttore nudo e impostare le proprietà come parte della dichiarazione.

Person p=new Person() 
{ 
    Name = "Han Solo", 
    Age = 39 
}; 

Questo aggira la "classe manca nuda costruttore" problema, più riduce la manutenzione (è possibile impostare più cose senza cambiare il costruttore).

+0

È possibile utilizzare un costruttore come quello sopra, ma fare ancora qualcosa con i valori dopo che sono stati dichiarati? Attualmente sto usando quel tipo di costruttore ovunque nel mio programma, ma ora ho bisogno di aggiungere ulteriore logica di costruzione (usando uno dei parametri) - supervisione maggiore. – Sinjai

4

se si pensa meno codice significa più efficiente, in modo da utilizzare costruire funzione è meglio. È inoltre possibile utilizzare il codice come:

Person p=new Person(){ 
Name='abc', 
Age=15 
} 
6

A mio modesto parere, questa è solo una questione di decidere se gli argomenti sono opzionali o meno. Se un oggetto persona non dovrebbe (logicamente) esistere senza nome e l'età, dovrebbero essere obbligatorie nel costruttore. Se sono facoltative, (cioè la loro assenza non è una minaccia per il buon funzionamento dell'oggetto), utilizzare i incastonatori.

Ecco una citazione dalla documentazione di Symfony sulla iniezione costruttore:

Ci sono molti vantaggi di utilizzare l'iniezione del costruttore:

  • Se la dipendenza è un requisito e la classe non può funzionare senza di essa poi iniettare tramite il costruttore assicura che sia presente quando la classe è usata in quanto la classe non può essere costruita senza di essa.
  • Il costruttore è sempre e solo una volta chiamato quando viene creato l'oggetto, in modo da poter essere sicuri che la dipendenza non cambierà durante la vita dell'oggetto.

Questi vantaggi significano che l'iniezione del costruttore non è adatta per lavorare con dipendenze opzionali. È anche più difficile da utilizzare in combinazione con le gerarchie di classi: se una classe utilizza l'iniezione del costruttore, estenderla e sovrascrivere il costruttore diventa problematica.

(Symfony è uno dei più popolari e rispettati framework PHP)

0

Oppure è possibile utilizzare un file di dati per inserire più oggetti di una persona in un elenco o array. È necessario utilizzare System.IO per questo. E hai bisogno di un file di dati che contenga tutte le informazioni sugli oggetti.

Metodo per esso sarebbe simile a questa:

static void ReadFile() 
{ 
    using(StreamWriter writer = new StreamWriter(@"Data.csv")) 
    { 
     string line = null; 
     line = reader.ReadLine(); 
     while(null!= (line = reader.ReadLine()) 
       { 
        string[] values = line.Split(','); 
        string name = values[0]; 
        int age = int.Parse(values[1]); 
       } 
     Person person = new Person(name, age); 
    } 
} 
0

dipende dal vostro requirment, ma il modo più efficace per creare è:

Product obj = new Product 
      { 
       ID = 21, 
       Price = 200, 
       Category = "XY", 
       Name = "SKR", 
      };