2011-12-20 11 views
4

次のコードスニペットを見てください。私は "this.directories.Add(新しいディレクトリ);でnullreferenceexceptionを取得しています;"再帰は、 "unwinds"するまで動作しているように見えます。この時点で、 "new directory(s)"はnullのようです。私はなぜこのように振る舞っているのか分からないので、再帰がコンストラクタにあるので特別なルールがあるかもしれないと思った。助けてください。コンストラクタでの再帰

namespace AnalyzeDir 
{ 
    class directory 
    { 
     public string[] files; 
     public ArrayList directories; 
     public string mypath; 
     public string myname; 

     public directory(string mp) 
     { 
      mypath = mp; 
      myname = mypath.Substring(mypath.LastIndexOf("\\")); 
      files = Directory.GetFiles(mypath); 
      fillDirectoriesRescursive(); 
     } 
     public void fillDirectoriesRescursive() 
     { 
      string[] dirpaths = Directory.GetDirectories(mypath); 

      if (dirpaths != null && (dirpaths.Length > 0)) 
      { 
       foreach(string s in dirpaths) 
       { 
         this.directories.Add(new directory(s)); 
       } 
      } 
     } 
+1

これは疑問とは関係ありませんが、将来参照するためには、.NETクラスとメソッド名を大文字で始めるのが普通です。つまり、 'Directory'と' FillDirectoriesRecursive'です。 –

答えて

7

directoriesを初期化していません。

私は、コンストラクタでこれをしないで、代わりにメソッド呼び出しに移動することをお勧めします。それは、「暗黙の挙動」に戻ります。ここでは、プロパティアクセサーの内部に大きな複雑な外部システムロジックを持つべきではありません。

非常に古い構成体ArrayListも使用しています。代わりにICollection<directory>を使用することをおすすめします。より多くの型安全性とそのすべて。

+0

大変ありがとうございました!特にdjacobsonやinstaにとっては、文体的な問題を修正するためにもそうです。私はここに新しいですが、私はすでに愛を感じる! – dmil

1

directoriesは初期化されていません。