2013-03-15 16 views
6

Ho creato un array Oggetto come questo. Ma per assegnare valore all'oggetto, devo istanziare ogni oggetto in ogni posizione dell'array? Perché ho bisogno di questo?Perché devo istanziare due volte una matrice di oggetti?

Questo è il mio metodo

StageObject[] StageSplitDate = new StageObject[Stages.Rows.Count]; 
      for (int i = 0; i < Stages.Rows.Count; i++) 
      { 
       StageSplitDate[i] = new StageObject(); 
       StageSplitDate[i].StageId = "String Value"; 
       StageSplitDate[i].FromTime = StartTime; 
       StartTime =StartTime.AddMinutes(Convert.ToDouble(10)); 
       StageSplitDate[i].ToTime = StartTime; 
      } 
      return StageSplitDate; 

E classe di oggetti

public class StageObject 
    { 
     public string StageId { get; set; } 
     public DateTime FromTime { get; set; } 
     public DateTime ToTime { get; set; } 
    } 
+0

Il primo passaggio, che definisce la matrice, alloca memoria sufficiente affinché l'array possa contenere gli elementi. Il prossimo passo, assegna il valore reale ad una posizione nell'array. Finché non si assegna un valore a una posizione nell'array, non ha alcun valore, è null. – MadProgrammer

+0

Solo per curiosità, perché ** C# ** è taggato qui? (O_o) – SudoRahul

+3

@ R.J, più simile al motivo Java, a meno che non abbia ora un metodo Convert.ToDouble. –

risposta

3

Devo istanziare ogni oggetto in ogni posizione dell'array?

Non si sta creando un'istanza degli elementi di matrice due volte. Nella prima riga hai istanziato un array StageSplitDate con ogni elemento impostato su null. Per impostazione predefinita, ogni elemento (di tipi di riferimento) viene inizializzato su null. Per utilizzarlo ulteriormente è necessario creare un'istanza di ogni oggetto nell'array, altrimenti si otterrà un'eccezione di riferimento null.

Per C#

Arrays (C# Programming Guide) - MSDN

Il valore predefinito di elementi array numerici sono impostati a zero, e elementi di riferimento sono impostati su null.

(Poiché la questione è stata originariamente etichettato per java)

Per JAVA

4.12.5. Initial Values of Variables

  • Ogni variabile di classe, variabile esempio, o un componente di matrice viene inizializzato con un valore predefinito quando viene creato (§15.9, §15.10):
  • Per tutti i tipi di riferimento (§4.3), il valore predefinito è nullo.
+0

Ma durante la creazione dell'array vengono definiti tutti gli oggetti dell'array. Un array non può avere tipi di dati diversi. Allora perché dovremmo inizializzarlo per ogni oggetto. Non è ben definito mentre dichiara la matrice stessa ??? –

+0

@SubinJacob, questo è il modo in cui il designer del linguaggio lo sceglie, ora pensate se c'è un requisito per istanziare un oggetto con alcuni valori predefiniti, * (ad esempio - manca il costruttore predefinito, invece il costruttore richiede alcuni parametri) *, come sarebbe lo fai allora – Habib

+0

Ya, questo è rito. Ho capito il punto! –

1

StageObject [] = new StageSplitDate StageObject [Stages.Rows.Count];

La dichiarazione di cui sopra fa solo matrice riferimento per StageObject che sono inizializzata con null ma in realtà non initanstiate gli oggetti di StageObject

StageSplitDate [i] = new StageObject();

L'istruzione precedente sta creando oggetto di tipo StageObject e assegna il riferimento StageSplitDate elemento

2

vostro array è un array di riferimenti StageObject. Gli stessi StageObject s non esistono ancora. Essenzialmente ogni voce nella matrice semplicemente "punta" o "si riferisce" a uno StageObject.

Prima di chiamare new StageObject(), ogni elemento dell'array è null, il che significa che non si riferisce a nulla.

1

new StageObject[Stages.Rows.Count] crea un nuovo array di StageObject riferimenti contenenti Stages.Rows.Count riferimenti nulli. Si desidera che ciascun elemento punti a StageObject. Per fare ciò, è necessario creare alcune istanze StageObject.

2

Pensa a un'analogia in cui un array è una libreria. Se vuoi uno scaffale di libri, solo l'acquisto dello scaffale è solo il primo passo; devi quindi comprare ogni libro e metterlo sullo scaffale. Stessa idea qui: allocare l'array ti dà un contenitore vuoto, e quindi devi creare ogni oggetto e metterlo nel contenitore.

Perché è così? Perché un array inizialmente vuoto è spesso quello che vuoi - e anche se non lo è, a meno che il tuo oggetto abbia solo un costruttore no-arg, Java non saprebbe nemmeno come costruire ogni oggetto.

+0

+1 per l'analogia. –

+0

Ma durante la creazione dell'array vengono definiti tutti gli oggetti dell'array. Un array non può avere tipi di dati diversi. Allora perché dovremmo inizializzarlo per ogni oggetto. Non è ben definito mentre dichiara la matrice stessa ??? –

+0

No, ciò che è definito sono un sacco di slot per i riferimenti di array. Sta a te assegnare i valori a quegli slot. – yshavit

Problemi correlati