2011-01-14 74 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; 
    } 
}