2016-11-23 5 views
0

私の質問は基本的にC#が配列を初期化する方法です。内部プロパティとしての自己型の配列を持つオブジェクトの初期化:無限の初期化?

具体的には、C#に単語を格納するための大きなツリーデータ構造を作成しています。 nodeオブジェクトとして作成されたこのデータ構造のサブクラスには、int valuenode[] nextsの2つのフィールドがあります。

this.nexts = new node[26]が呼び出されたときに、nodeオブジェクトを初期化しないと、以下のように無限の初期化ループが作成されますか?

/// <summary> 
/// Represents a node object for a letter. 
/// </summary> 
private class node { 
    public int value; 
    internal node[] nexts; 
    public node(bool z, int n = 0, node[] ns = null) { 
     this.value = n; 
     if (z) { 
      if (ns == null) { this.nexts = new node[26]; } 
      else { this.nexts = ns; } 
     } 
    } 
} 

ない場合、これはその配列の各要素は、初期化後に存在するであろうものの状態でそれ自体の配列である性質を持つオブジェクトを初期化するための正しい方法でありますか?もし興味があるならここで

は、クラス全体である:

/// <summary> 
/// Represents a node object for a letter. 
/// </summary> 
private class node { 
    public int value; 
    internal node[] nexts; 
    public node(bool z, int n = 0, node[] ns = null) { 
     this.value = n; 
     if (z) { 
      if (ns == null) { this.nexts = new node[26]; } 
      else { this.nexts = ns; } 
     } 
    } 
    public node operator++(node n) { 
     n.value++; 
     return n; 
    } 
    public node this[int i] { 
     get { 
      if (this.nexts == null) { this.nexts = new node[26]; } 
      return this.nexts[i]; 
     } 
     set { 
      if (this.nexts == null) { this.nexts = new node[26]; } 
      this.nexts[i] = value; 
     } 
    } 
} 
+0

無限再帰が発生するかどうかを知りたい場合は、既に書いたコードを実行します。あなたは数分の1秒で見つけることができます。 – Servy

答えて

1

this.nexts = new node[26]が呼び出された無限の初期化ループを作成し、以下のように、ノードオブジェクトを初期化しませんか?

いいえ、nodeため参照型new node[26]はちょうど26 node参考まで保持することができる配列を作成しているからです。 nodeオブジェクト自体は作成されません。

これが正しくない場合は、プロパティが自己の配列であるオブジェクトを初期化する正しい方法です。初期化後にその配列の各要素がどのような状態になるのでしょうか?

アレイの各要素には、nullという参照が含まれます。

+0

ありがとう、それは物事をクリア!おそらく、 'struct'のプロパティが役に立つかもしれません... –

+0

"ノードが構造体だった場合、無限の再帰を作成します。 "いいえ、そうではありません。 –

+0

確かにそれを修正するのがよいでしょう。この場合、無限再帰を作成したり、構造体に何らかの形で無限再帰を引き起こすことはできません。構造体は明示的な構造体を持つことができないためです。 – Evk