带有项目的列表返回空

Pow*_*fet 6 .net c# list process

我已经创建了一个简单的List函数,但是如果我循环遍历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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 56

那么这是一个问题:

catch { }
Run Code Online (Sandbox Code Playgroud)

如果出现任何问题,你只会默默地中止.

也许这就是发生了什么?(编辑:是的.见稍后.)

接下来的问题是你的"列表"只会包含一个字符串...这真的是你想要的吗?我怀疑你看到的列表实际上是空的 - 但它将包含一个空字符串.

(作为旁注,我强烈建议您开始遵循.NET命名约定并避免像这样的全局变量.)

编辑:Aargh - 我刚刚意识到你做了什么.你可能实际上得到一个NullReferenceExceptionlist_all_pocesses,您已捕获并忽略.

您的来电pro_hook.Add是在您分配值之前进行的pro_hook.基本上你有一个变量初始化器,它使用一个方法反过来使用变量.不要那样做.如果你在调试器中单步调试代码,你可能会更多地了解正在发生的事情,但基本上你已经为自己创建了一个大意大利面.

为什么不list_all_pocesses回归List<string>?你为什么要使用一个StringBuilder


Len*_*rri 5

嗯......你正在返回一个空的字符串生成器.那是你的问题.您的代码正在执行您要告诉它的操作.:)

 return _list.ToString();
Run Code Online (Sandbox Code Playgroud)


cdh*_*wie -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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Power-Mosfet:因为它*默默地*吞下*所有*异常:你无法判断*什么时候*出了问题。a) 统一处理所有异常几乎总是一个坏主意;b) 吞下异常而不采取任何操作(而不是事件日志记录)几乎总是一个坏主意。同时做这两件事是一个“可怕的”想法。 (10认同)
  • 为什么只给出正确的代码而不进行解释?人们将从中学到什么?空的 catch 块是一件非常糟糕的事情 - 要么将其全部删除,要么确保在捕获任何异常的情况下执行某些操作。 (7认同)
  • 抱歉,但我不得不否决你将“catch { }”留在其中的行为。 (2认同)
  • @亚历克斯:也许吧。这个问题本身就有点奇怪。由于这段代码适用于 OP,我犹豫是否要彻底删除它。但这个问题可能会因为“过于本地化”而被关闭和删除——这个特殊的问题不太可能被其他人遇到,因为它是各种不同和令人震惊的错误的独特交响乐。 (2认同)