Список с элементами возвращается пустым - PullRequest
6 голосов
/ 14 января 2011

Я создал простую функцию 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);
            }
        }

Ответы [ 4 ]

56 голосов
/ 14 января 2011

Ну, это проблема для начала:

catch { }

Если что-то пойдет не так, вы просто молча прекратите.

Может быть, это то, что происходит? (РЕДАКТИРОВАТЬ: Это. См. Позже.)

Следующая проблема заключается в том, что ваш «список» будет содержать только одну строку ... это действительно то, что вы хотели? Я сомневаюсь, что список, который вы видите, на самом деле пуст - но он будет содержать одну пустую строку.

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

РЕДАКТИРОВАТЬ: Aargh - я только что понял, что вы сделали. Вы, вероятно, на самом деле получаете NullReferenceException в list_all_pocesses, который вы поймали и проигнорировали.

Ваш звонок на pro_hook.Add сделан до того, как вы присвоите значение pro_hook. По сути, у вас есть инициализатор переменной, который использует метод, который в свою очередь использует переменную. Не делайте этого. Если вы перебираете свой код в отладчике, вы можете получить больше представления о том, что происходит, но в основном вы создали для себя большой шар спагетти.

Почему list_all_pocesses просто не возвращает List<string>? Почему вы вообще используете StringBuilder?

5 голосов
/ 14 января 2011

Ну ... ты возвращаешь пустой строитель строк.Это твоя проблема.Ваш код делает то, что вы говорите.:)

 return _list.ToString();
3 голосов
/ 14 января 2011
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;
    }
}
0 голосов
/ 14 января 2011

_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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...