2012-01-04 3 views
0

Je veux déclarer un tableau de chaînes, j'utilisait cette façon de le faireInitialisation de C# Tableau chaîne

string[] matchingFiles = Directory.GetFiles(FilePath, FileNamePattern); 

qui a parfaitement fonctionné, mais maintenant je veux enfermer les Directory.GetFiles appellent à essayer/catch block, mais je ne peux pas non plus avoir la déclaration du tableau de chaînes car il ne sera pas dans la bonne portée pour l'utiliser en dehors du bloc try. Mais si j'essaie ceci:

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

Je n'ai pas initialisé le tableau de chaînes, donc j'ai une erreur. Donc, je me demande quelle est la meilleure pratique dans cette situation, dois-je déclarer le tableau de chaînes en dehors du bloc try? Et si oui, comment?

+1

Ou tout simplement le mettre à null. Le compilateur C# vous demande d'initialiser toutes les variables avant de les utiliser (sauf si elles sont passées en paramètre out). L'initialisation à null est suffisante dans ce cas. –

+2

Aucun de ceux-ci sont votre problème. Le problème est votre nom. Vous définissez matchingActiveLogFiles mais en l'affectant à matchingFiles. .NET met automatiquement par défaut votre tableau de chaînes à zéro si vous ne l'initialisez pas explicitement pendant la définition. – Josh

+0

@Josh mais les règles d'affectation définies C# nécessitent l'initialisation des locales. – phoog

Répondre

1

Cela initialiser votre tableau:

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

Mais je me demande, quelle erreur vous obtenez? Même avec un tableau non initialisé, le code ci-dessus devrait fonctionner. J'ai également remarqué que vous avez "matchingActiveLogFiles" sur la ligne 1 et "matchingFiles" sur la ligne 4. Peut-être que c'est votre problème?

+1

Le compilateur C# devient vraiment en colère quand vous faites des choses comme ce qu'il a démontré. Habituellement, j'affecte simplement n'importe quoi à 'null' avant le bloc' try' et le compilateur semble correct avec. –

0

Bien que je n'aime généralement les méthodes avec sur params, cela semble être un bon candidat pour une méthode Try:

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

Utilisation:

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

Ou bien, tout simplement initialiser votre variable à null:

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

Initialiser en premier:

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

préférable d'initialiser à null; De cette façon, vous créez un tableau de chaînes de longueur nulle uniquement pour le jeter un instant plus tard. – phoog

0

Le problème est votre nom. Vous définissez matchingActiveLogFiles mais en affectant des fichiers correspondants.

3

Le nom est différent pour les tableaux de chaînes, on est matchingActiveLogFiles l'autre est matchingFiles

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

Vous avez raison, bien sûr, mais vous devez toujours attribuer * quelque chose * à 'matchingActiveLogFiles' - soit lorsque vous l'initialisez, soit dans le bloc' catch' - sinon vous obtiendrez une "utilisation de variable locale non affectée" "erreur de compilation lorsque vous essayez de l'utiliser. – LukeH

+0

@LukeH vous n'avez pas besoin de lui assigner quoi que ce soit si vous ne l'utilisez jamais. – phoog

+0

@phoog: C'est vrai, mais l'OP dit qu'il veut * "l'utiliser en dehors du bloc try" *. – LukeH

0

Vous devriez déclarer la variable dans le cadre dans lequel cette variable est nécessaire.

  • Si vous avez seulement besoin de la variable dans le bloc try, placez-le là!
  • Si vous en avez besoin en dehors du bloc try, que voulez-vous que la valeur soit si votre code ne peut pas obtenir le contenu du fichier? Réglez-le à cela en cas d'erreur.
0

vous ne devez pas connaître le nombre exact d'éléments afin d'initialiser un tableau comme

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 
}