2011-01-14 13 views
6

Utworzono prostą funkcję listy, ale jeśli przepuszczę przez listę, jest pusta. Nie powinno być!Lista z przedmiotami zwraca pusty

// 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

Powróć z powrotem do stanu zepsutego, tak jak gdyby poprawiono go w pytaniu, wszystkie odpowiedzi na oryginalne pytanie są nieprawidłowe. Odpowiedź @Jon Skeet jest jak dotąd najbardziej szczegółowa i wyjaśniona dlaczego twój oryginalny kod nie działał, zamiast dostarczać kompletne rozwiązanie bez wyjaśnienia. –

+1

@Piers Myers: Odwrócone, świetne umysły i tak dalej. – Lazarus

Odpowiedz

-3

_list.ToString() nie zamierza powrócić żadnej znaczącej wartości. Zamiast tego wypróbuj coś takiego:

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; 
} 
+13

Czy naprawdę uważasz, że "catch {}" jest dobrym pomysłem? –

+2

Przepraszam, ale po prostu musiałem głosować za opuszczeniem "catch {}". –

+7

Dlaczego po prostu podać poprawiony kod bez wyjaśnienia? Czego każdy może się z tego nauczyć? Blokada pustych bloków jest naprawdę złym pomysłem - albo usuń wszystko razem, albo upewnij się, że zrobisz coś z przechwyconymi wyjątkami. –

56

Dobrze jest to problem na początek:

catch { } 

Jeśli coś pójdzie nie tak, będziesz tylko cicho przerwania.

Może to właśnie się dzieje? (EDYCJA: To jest.) Zobacz później.)

Kolejnym problemem jest to, że twoja "lista" zawiera tylko jeden ciąg ... czy to naprawdę zamierzałeś? Wątpię, czy lista, którą widzisz, jest rzeczywiście pusta - ale będzie zawierała pojedynczy pusty ciąg.

(Na marginesie, chciałbym silnie sugerujemy rozpocząć następujące konwencje nazewnictwa .NET i unikać zmiennych globalnych, takich jak ten.)

EDIT: Aargh - Właśnie sobie sprawę, co zrobiłeś . Prawdopodobnie dostaniesz NullReferenceException w list_all_pocesses, którą złapałeś i zignorowałeś.

Twoje połączenie z pro_hook.Add jest wykonywane przed przypisaniem wartości do pro_hook. Zasadniczo masz inicjator zmiennej, który używa metody, która z kolei używa zmiennej. Nie rób tego. Jeśli przejdziesz przez kod w debugerze, możesz uzyskać więcej informacji na temat tego, co się dzieje, ale w zasadzie stworzyłeś dla siebie dużą kulkę spaghetti.

Dlaczego list_all_pocesses nie zwróci tylko List<string>? Dlaczego w ogóle używasz StringBuilder?

+0

$ wyjątek {"Odmowa dostępu"} \t System.Exception {System.ComponentModel.Win32Exception} – honibis

+0

@honibis: Nawet bez tego, dostanie wyjątek NullReferenceException. –

+0

Zdecydowanie wyrzuci "NullReferenceException", który w końcu zostanie połknięty. Sposób zainicjowania zmiennej 'pro_hook' jest niepoprawny. @ bniwredyc naprawił to w swoim rozwiązaniu. – Thorarin

5

Cóż ... zwracasz pustego konstruktora sznurków. To Twój problem. Twój kod robi to, co chcesz. :)

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; 
    } 
} 
+0

' pro_hook' jest 'List ' ale 'list_all_processes' ma typ zwracany' string' -> to się nie skompiluje. – Richard

+0

@Richard, dzięki, tęskniłem za tym. – bniwredyc

+1

Mam nadzieję, że nie masz nic przeciwko, ale usunąłem prefiks podkreślenia dla lokalnej zmiennej 'list'. Wytyczne w stylu .NET nie były przestrzegane, ale podkreślenie sugeruje zmienną składową. – Thorarin

Powiązane problemy