2012-05-17 3 views
0

У меня есть функция, рекурсивная на C#, которую я хочу редактировать глобальную переменную (предположим, что она глобальна из-за публики до нее), объявленной вне функции. По какой-то причине я не знаю, что она не может видеть общедоступную переменную внутри этой конкретной функции. Он может видеть это в первой функции в моем коде, но не во втором, где мне нужно получить к нему доступ и изменить его, чтобы сэкономить много времени, открыв много файлов ...Открытая переменная в рекурсивной функции C#

Есть ли причина, по которой это не было бы доступно? и если да, то как я могу обойти это?

Большое спасибо!

public int[] timeInfo = new int[2]; 
    private void ListDirectory(TreeView treeView, string path) 
     {  
      treeView.Nodes.Clear(); 
      var rootDirectoryInfo = new DirectoryInfo(path);  
      treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); 
     } 

    private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) 

    { 

     var directoryNode = new TreeNode(directoryInfo.Name); 

     foreach (var directory in directoryInfo.GetDirectories()) 
      directoryNode.Nodes.Add(CreateDirectoryNode(directory)); 

     foreach (var file in directoryInfo.GetFiles())    
     { 

      int check =0;       
      try     
      { 

       string s = "";      
       s = directoryInfo.FullName + "\\" + file.Name;      
       List<string> row, row2, row3 = new List<string>(); 

       using (StreamReader readFile = new StreamReader(s)) 
       { 

        row = (readFile.ReadLine().Split(',').ToList()); 
        try 
        {       
         row2 = (readFile.ReadLine().Split(',').ToList()); 
         //timeInfo[0] = row2[0]; 
        } 
        catch { check = 1; } 
        try 
        { 
         row3 = (readFile.ReadLine().Split(',').ToList()); 
         //timeInfo[1] = row3[0]; 
        } 

        catch { } 
       } 

       TreeNode[] headerNodes = new TreeNode[row.Count]; 

       for (int i = 0; i < row.Count; i++) 
       { 

        headerNodes[i] = new TreeNode(row[i]); 
        if (check == 1) 
        {      
         headerNodes[i].BackColor = Color.Red; 
         headerNodes[i].ForeColor = Color.White; 
        } 

       } 
       directoryNode.Nodes.Add(new TreeNode(file.Name, headerNodes)); 
      } 
      catch 
      { 
       directoryNode.Nodes.Add(new TreeNode(file.Name)); 
      } 
     }   
     return directoryNode; 
    }  
+0

Что именно вы собираетесь делать с 'timeInfo []', поскольку каждый рекурсивный вызов перезапишет значения –

ответ

6

Вторая функция является статической, и переменная существует только в контексте объекта.

+0

Я чувствую себя идиотом .... вообще не замечал. Старые привычки C++ ... Спасибо! – Axxelsian

+2

Не ... мы все были там. –

5

Метод статический. Переменная - нет. Вы не можете получить доступ к нестатическим (экземплярам) членам класса из статического метода. Публичная переменная в классе не является глобальной. Вы должны сделать его публичным статическим, чтобы сделать его глобальным (не то, что я бы никогда не рекомендовал использовать глобальные переменные), такие как:

public static int[] timeInfo = new int[2]; 
3

Вы должны были бы сделать его статическим, чтобы для статической функции, чтобы увидеть его.

1

Вам нужно определить переменную как статические, так:

public static int[] timeInfo = new int[2]; 
1

Ваша переменная должна быть статичной из-за вашего метода. Поскольку этот метод является статическим, он может видеть только статические переменные.