2012-01-04 46 views
0

は、私が初期化配列

完全に働いた
string[] matchingFiles = Directory.GetFiles(FilePath, FileNamePattern); 

それを行うためのこの方法を使用していたが、今私はDirectory.GetFilesを囲みたいこと/試しに呼び出しますキャッチブロック、しかし、私はまた、文字列配列の宣言を持っていないので、それは正しい範囲でtryブロックの外でそれを使用することはできません。私がしようとした場合でも、この:私は、文字列配列を初期化していない

string[] matchingActiveLogFiles; 
      try 
      { 
       matchingFiles = Directory.GetFiles(FilePath, FileNamePattern); 
      } 
      catch (Exception ex) 
      { 
       //logerror 
      } 

は、私はエラーを持っています。だから私はtryブロックの外側に文字列配列を宣言する必要がありますこの状況で何がベストプラクティスですか?そしてもしそうなら、どのように?

+1

それとも、nullに設定のような配列を初期化するために、アイテムの数を正確に知る必要はありません。 C#コンパイラは、(outパラメータとして渡されない限り)すべての変数を使用する前に初期化する必要があります。この場合、nullへの初期化で十分です。 –

+2

これはあなたの問題ではありません。問題はあなたの命名です。あなたはmatchingActiveLogFilesを定義していますが、matchingFilesに割り当てています。定義中に明示的に初期化しないと、.NETは文字列配列を自動的にnullに設定します。 – Josh

+0

@JoshでもC#の明確な譲渡規則では、ローカルを初期化する必要があります。 – phoog

答えて

1

これはあなたの配列を初期化します:

string[] matchingActiveLogFiles = {}; 
      try 
      { 
       matchingFiles = Directory.GetFiles(FilePath, FileNamePattern); 
      } 
      catch (Exception ex) 
      { 
       //logerror 
      } 

しかし、私は思ったんだけど、あなたはどのようなエラーを取得していますか?初期化されていない配列であっても、上記のコードは動作するはずです。また、1行目に「matchingActiveLogFiles」、4行目に「matchingFiles」があることに気付きました。おそらくそれはあなたの問題ですか?

+1

C#コンパイラは、彼が実演したもののようなことをすると、本当に怒ります。私は通常 'try'ブロックの前に' null 'を代入します。コンパイラはそれで大丈夫です。 –

0

私は、一般的にアウトのparamsを持つメソッドを嫌いますが、これはTry方法のために良い候補のように思える:

bool TryGetMatchingLogFiles(out string[] matchingFiles) 
{ 
    matchingFiles = null; 
    try 
    { 
    matchingFiles = Directory.GetFiles(FilePath, FileNamePattern); 
    return true; 
    } 
    catch (Exception ex) 
    { 
    //logerror 
    return false; 
    } 
} 

使用法:

string[] matchingActiveLogFiles; 
if (TryGetMatchingLogFiles(out matchingActiveLogFiles)) 
{ 
    // Use matchingActiveLogFiles here 
} 

または代わりに、単にnullにあなたの変数を初期化:

string[] matchingActiveLogFiles = null; 
try ... 
1

最初に初期化:

string[] matchingActiveLogFiles = new string[0]; 
+0

nullに初期化する方が良い。この方法で、長さの短い文字列配列を作成して、すぐにそれを破棄します。 – phoog

0

問題はあなたの名前です。あなたはmatchingActiveLogFilesを定義していますが、matchingFilesを割り当てています。

3

名は、文字列配列のために異なっている一つは、他のあなたは、その変数が必要とされているスコープで変数を宣言する必要があり matchingFiles

string[] matchingActiveLogFiles; 
    try 
    { 
     matchingActiveLogFiles = Directory.GetFiles(FilePath, FileNamePattern); 
    } 
    catch (Exception ex) 
    { 
       //logerror 
    } 
+0

あなたはもちろんですが、あなたは 'matchingActiveLogFiles'に* something *を割り当てる必要があります - あなたがそれを初期化するときや' catch'ブロックの中で - そうでなければ、 "割り当てられていないローカル変数の使用"あなたがそれを使用しようとするとエラーをコンパイルします。 – LukeH

+0

@LukeH決して使用しない場合は、何も割り当てないでください。 – phoog

+0

@phoog:本当ですが、OPは「* tryブロックの外で*使用する」と言っています。 – LukeH

0

あるmatchingActiveLogFilesです。

  • 変数がtryブロックに必要な場合は、そこに配置します。
  • tryブロックの外側に必要な場合は、コードがファイルの内容を取得できない場合はどうしたらよいでしょうか?それをエラー時に設定してください。
0

あなたは

string[] matchingActiveLogFiles = {}; 
this is what is called a dynamic array it's totally functional and I've had ZERO issues with declaring arrays this way.. 

List<string> matchingFiles= new List<string>(); 
try 
{ 
    matchingFiles.Add(Directory.GetFiles(FilePath, FileNamePattern)); 
    matchingActiveLogFiles = matchingFiles.ToArray(); 
} 
catch (Exception ex) 
{ 
    //logerror 
}