2011-01-14 15 views
6

He creado una función de lista simple, pero si paso por la lista, está vacía. No debería ser!La lista con elementos devuelve vacío

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

Por favor revertir el código a su estado roto como si lo corrigiera en su pregunta, entonces todas las respuestas a su pregunta original no son válidas. La respuesta de @Jon Skeet es de lejos la más detallada y explica por qué su código original no funcionaba en lugar de solo darle una solución completa sin explicación. –

+1

@Piers Myers: retrocedido, grandes mentes y todo eso. – Lazarus

Respuesta

-3

_list.ToString() no va a devolver ningún valor significativo. Intente algo como esto en su lugar:

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

¿De verdad crees que 'catch {}' es una buena idea? –

+2

Disculpa, pero solo tuve que bajarte el voto por dejar el "catch {}" allí. –

+7

¿Por qué solo da el código corregido sin explicación? ¿Qué aprenderá alguien de esto? El bloque catch vacío es realmente malo, ya sea eliminarlo todo o asegurarse de hacer algo con las excepciones detectadas. –

56

Bueno, esto es un problema para empezar:

catch { } 

Si algo va mal, vas a silencio aborto.

Quizás eso es lo que está pasando? (EDITAR: Sí. Ver más adelante.)

El siguiente problema es que su "lista" solo contendrá una sola cadena ... ¿es eso realmente lo que pretendía? Dudo que la lista que estás viendo esté realmente vacía, pero contendrá una sola cadena vacía.

(Como nota al margen, me fuertemente sugieren que se inicia siguiendo las convenciones de nomenclatura de .NET y evitar las variables globales como esta.)

EDIT: Aargh - Me acabo de dar cuenta de lo que has hecho . Probablemente obtenga un NullReferenceException en list_all_pocesses, que ha capturado e ignorado.

Su llamada a pro_hook.Add se realiza antes de que haya asignado un valor a pro_hook. Básicamente, tienes un inicializador variable que usa un método que a su vez usa la variable. No hagas eso. Si revisa su código en el depurador, puede hacerse una idea de lo que está sucediendo, pero básicamente ha creado una gran bola de espagueti para usted.

¿Por qué no list_all_pocesses acaba de devolver un List<string>? ¿Por qué estás usando un StringBuilder en absoluto?

+0

$ excepción \t {"Acceso denegado"} \t System.Exception {System.ComponentModel.Win32Exception} – honibis

+0

@honibis: Incluso sin eso, obtendrá una NullReferenceException. –

+0

Definitivamente arrojará una 'NullReferenceException', que termina siendo tragada. La forma en que se inicializa la variable 'pro_hook' es incorrecta. @bniwredyc lo solucionó en su solución. – Thorarin

5

Bueno ... estás devolviendo un generador de cadenas vacío. Ese es tu problema. Tu código está haciendo lo que le estás diciendo que haga. :)

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' es 'List ' pero 'list_all_processes' tiene un tipo de retorno de' string' -> esto no se compilará. – Richard

+0

@Richard, gracias, lo perdí. – bniwredyc

+1

Espero que no te importe, pero eliminé el prefijo de subrayado para la variable 'list' local. Las pautas de estilo .NET no se siguieron de todos modos, pero el guión bajo sugiere una variable miembro. – Thorarin

Cuestiones relacionadas