2011-01-14 63 views
6

我創建了一個簡單的List函數,但是如果我通過列表循環,它是空的。它不應該!列表中的項目返回空

// List function 
    public class process_hook 
    { 
     public static List<String> pro_hook = new List<String> 
               (new String[] { list_all_pocesses() }); 
     protected static string list_all_pocesses() 
     { 
      StringBuilder _list = new StringBuilder(); 
      foreach (Process i in Process.GetProcesses(".")) 
      { 
       try 
       { 
        foreach (ProcessModule pm in i.Modules) 
        { 
         pro_hook.Add(pm.FileName.ToString()); 
        } 
       } 
       catch { } 
      } 
      return _list.ToString(); 
     } 
    } 


     // call 
     private void button1_Click(object sender, EventArgs e) 
     { 
      foreach (String _list in process_hook.pro_hook) 
      { 
       Console.WriteLine(_list); 
      } 
     } 
+2

請恢復您的代碼回到其中斷狀態,就好像您在您的問題中更正它然後所有您原來的問題的答案是無效的。 @Jon Skeet的答案是迄今爲止最詳細的解釋,並解釋了爲什麼你的原始代碼不能正常工作,而不是給你一個沒有解釋的完整解決方案。 – 2011-01-14 13:57:24

+1

@Piers邁爾斯:回滾,偉大的思想和所有。 – Lazarus 2011-01-14 14:02:00

回答

-3

_list.ToString()不會返回任何有意義的值。嘗試這樣的代替:

public static List<string> pro_hook = list_all_processes(); 

protected static List<string> list_all_processes() 
{ 
    var list = new List<string>(); 

    foreach (Process i in Process.GetProcesses(".")) { 
     try { 
      foreach (ProcessModule pm in i.Modules) { 
       list.Add(pm.FileName); 
      } 
     } catch { } 
    } 

    return list; 
} 
56

嗯,這是開始的一個問題:

catch { } 

如果出現任何錯誤,你只是默默中止

也許這就是發生了什麼? (編輯:是的,見後面。)

接下來的問題是,你的「列表」將只包含一個單一的字符串......這是你真正想要的?我懷疑你看到的列表實際上是空的 - 但它將包含一個空字符串。

(作爲一個方面說明,我會強烈建議你開始下面的.NET命名約定,避免這樣的全局變量。)

編輯:AARGH - 我剛剛意識到你做了什麼。你可能實際上得到了NullReferenceExceptionlist_all_pocesses,你已經發現並忽略了它。

您撥打pro_hook.Add之前,您已將值分配給pro_hook。基本上你已經有了一個變量初始化器,它使用一個方法來反過來使用這個變量。 不要這樣做。如果您在調試器中逐步調試代碼,您可能會對所發生的事情有更多的瞭解,但基本上您已經爲自己創建了一大批意大利麪條。

爲什麼list_all_pocesses只是返回一個List<string>?爲什麼你一直在使用StringBuilder

+0

$ exception \t {「訪問被拒絕」} \t System.Exception {System.ComponentModel.Win32Exception} – honibis 2011-01-14 13:38:12

+0

@honibis:即使沒有,他也會得到一個NullReferenceException。 – 2011-01-14 13:39:36

5

那麼......你正在返回一個空字符串生成器。那是你的問題。你的代碼正在做你說的要做的事情。 :)

return _list.ToString(); 
3
public class process_hook 
{ 
    public static List<string> pro_hook = list_all_pocesses(); 
    protected static List<string> list_all_pocesses() 
    { 
     List<string> list = new List<string>(); 

     foreach (Process i in Process.GetProcesses(".")) 
     { 
      foreach (ProcessModule pm in i.Modules) 
      { 
       list.Add(pm.FileName.ToString()); 
      } 
     } 
     return list; 
    } 
}