2011-01-14 16 views
6

Ho creato una semplice funzione Elenco ma se faccio un ciclo attraverso l'elenco è vuoto. Non dovrebbe essere!Elenco con voci restituite vuote

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

Per favore, ripristina il codice allo stato non funzionante, come se lo correggessi nella domanda, quindi tutte le risposte alla tua domanda originale non sono valide. @Jon La risposta di Skeet è di gran lunga la più dettagliata e spiega perché il tuo codice originale non funzionava piuttosto che offrirti una soluzione completa senza spiegazioni. –

+1

@Pers Myers: arretrato, grandi menti e tutto il resto. – Lazarus

risposta

-3

_list.ToString() non ha intenzione di restituire qualsiasi valore significativo. Prova invece a fare una cosa del genere:

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

Pensi davvero che il 'catch {}' sia una buona idea? –

+2

Scusate, ma ho dovuto solo votare per lasciare il "catch {}" lì dentro. –

+7

Perché fornire codice corretto senza spiegazione? Cosa imparerà da questo? Il blocco catch vuoto è una cosa davvero brutta da fare - rimuoverlo tutti insieme o fare in modo di fare qualcosa con le eccezioni catturate. –

56

Beh questo è un problema per cominciare:

catch { } 

Se qualcosa va storto, ti basta silenzio abortire.

Forse è quello che sta succedendo? (EDIT: Si. Vedere più avanti.)

Il prossimo problema è che il tuo "elenco" conterrà sempre e solo una singola stringa ... è davvero quello che intendevi? Dubito che la lista che stai vedendo sia effettivamente vuota, ma conterrà una singola stringa vuota.

(Come nota a margine, vorrei fortemente suggerire che si avvia seguendo le convenzioni di denominazione di .NET e di evitare le variabili globali come questo.)

EDIT: Aargh - ho appena capito quello che hai fatto . Probabilmente stai ottenendo uno NullReferenceException in list_all_pocesses, che hai catturato e ignorato.

La chiamata a pro_hook.Add viene effettuata prima di aver assegnato un valore a pro_hook. Fondamentalmente hai un inizializzatore variabile che usa un metodo che a sua volta usa la variabile. Non farlo. Se passi il tuo codice nel debugger, puoi avere un'idea più chiara di cosa sta succedendo, ma in pratica hai creato una grossa palla di spaghetti per te.

Perché non è sufficiente restituire un List<string>? Perché stai usando uno StringBuilder?

+0

$ eccezione \t {"Accesso negato"} \t System.Exception {System.ComponentModel.Win32Exception} – honibis

+0

@honibis: Anche senza questo, otterrà una NullReferenceException. –

+0

Getterà sicuramente un 'NullReferenceException', che finisce per essere ingoiato. Il modo in cui la variabile 'pro_hook' è inizializzata è sbagliata. @bniwredyc lo ha risolto nella sua soluzione. – Thorarin

5

Beh ... stai restituendo un generatore di stringhe vuoto. Questo è il tuo problema. Il tuo codice sta facendo quello che stai dicendo di fare. :)

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' è 'Lista ' ma 'list_all_processes' ha un tipo di ritorno di' stringa' -> questo non verrà compilato. – Richard

+0

@Richard, grazie, mancato quello. – bniwredyc

+1

Spero non ti dispiaccia, ma ho rimosso il prefisso underscore per la variabile locale 'list'. Le linee guida sullo stile .NET non venivano seguite comunque, ma il trattino basso suggerisce una variabile membro. – Thorarin

Problemi correlati