2013-03-15 18 views
6

このようなオブジェクト配列を作成しました。しかし、オブジェクトに値を割り当てるには、配列のすべての位置で各オブジェクトをインスタンス化する必要がありますか?なぜ私はこれが必要なのですか?なぜオブジェクト配列を2回インスタンス化する必要がありますか?

は、これは私の方法である

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; 

とオブジェクトクラス

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

アレイを定義する最初のステップでは、配列を要素として保持するのに十分なメモリを割り当てます。次のステップでは、実際の値を配列内の位置に代入します。配列内の位置に値を代入するまで、値はありません。それはnullです。 – MadProgrammer

+0

ちょうど好奇心から、なぜ** C#**はここにタグ付けされていますか? (O_o) – SudoRahul

+3

@ R.J、それは今Convert.ToDoubleメソッドを持っていない限り、なぜJavaに似ています。 –

答えて

3

配列の各位置で各オブジェクトをインスタンス化する必要がありますか?

配列要素を2回インスタンス化していません。最初の行では、すべての要素がnullに設定された配列StageSplitDateをインスタンス化しました。 デフォルトでは、各配列(参照型の)要素はnullに初期化されます。これをさらに使用するには、配列内の各オブジェクトもインスタンス化する必要があります。そうしないと、null参照例外が発生します。

C#

Arrays (C# Programming Guide) - MSDN

数値配列要素のデフォルト値についてはゼロに設定され、基準要素がをnullに設定されています。各クラスの変数、インスタンス変数、または配列成分を使用して初期化されているJAVA

4.12.5. Initial Values of Variables

  • について

    (質問は、もともとJava用のタグ付けされたので)

    作成時のデフォルト値(15.9、§15.10):

  • すべての参照タイプ(§4.3)の場合、デフォルト値はnullです。
+0

しかし、配列を作成する際に、配列内のすべてのオブジェクトが定義されています。配列は異なるデータ型を持つことはできません。それでは、オブジェクトごとに初期化する必要があります。それは配列自体を宣言している間によく定義されていますか? –

+0

@SubinJacobは、言語設計者が選択する方法で、デフォルトの値*を持つオブジェクトをインスタンス化する必要があると考えています(たとえば、コンストラクタにパラメータが必要です)。あなたはそれをします。 – Habib

+0

ええ、これは儀式です。私はポイントを得ました!類推のために –

1

StageObject [] StageSplitDate =新しいStageObject [Stages.Rows.Count]。

上記のステートメントは、ヌルでintializedさStageObjectための基準アレイを作る実際StageObject

StageSplitDate [I] =新しいStageObject()のオブジェクトをinitanstiateありません。

上記のステートメントは、タイプStageObjectのオブジェクトを作成し、StageSplitDate素子

2

あなた配列がStageObject参照の配列された参照を割り当てています。 StageObject自体はまだ存在しません。本質的には、アレイ内の各エントリはStageObjectに単に「指し示す」または「指す」だけである。

new StageObject()に電話する前に、各配列要素はnullです。つまり、何も意味しません。

1

new StageObject[Stages.Rows.Count]Stages.Rows.Countヌル参照を含むStageObject参照の新しい配列を作成します。各要素がStageObjectを指すようにします。そのためには、StageObjectインスタンスを作成する必要があります。

2

配列が本棚である場合の類推を考えてください。あなたが本の棚を望むならば、棚を買うだけでは最初のステップです。あなたはそれぞれの本を買って棚に置く必要があります。ここでも同じ考え方です:配列を割り当てることで空のコンテナが得られます。その後、各オブジェクトを作成してコンテナに配置する必要があります。

なぜこのようなのですか?初期の空の配列はしばしばあなたが望むものです。たとえそうでなくても、オブジェクトに引数なしのコンストラクタしかない場合、Javaは各オブジェクトの構築方法を知らないでしょう。

+0

+1。 –

+0

しかし、配列を作成する際には、配列内のすべてのオブジェクトが定義されます。配列は異なるデータ型を持つことはできません。それでは、オブジェクトごとに初期化する必要があります。それは配列自体を宣言している間によく定義されていますか? –

+0

いいえ、定義されているのは、配列参照のための一連のスロットです。これらのスロットに値を割り当てるのはあなた次第です。 – yshavit

関連する問題