2011-01-14 38 views
6

Tôi đã tạo một hàm Danh sách đơn giản nhưng nếu tôi Lặp qua Danh sách thì nó trống. Nó không nên!Danh sách có các mục trả về trống

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

Xin hãy lui mã của bạn trở lại trạng thái bị phá vỡ của nó như là nếu bạn khắc phục nó trong câu hỏi của bạn thì tất cả các câu trả lời cho câu hỏi ban đầu của bạn không hợp lệ. Câu trả lời của @Jon Skeet là đến nay chi tiết nhất và giải thích tại sao mã ban đầu của bạn không hoạt động thay vì chỉ cung cấp cho bạn một giải pháp hoàn chỉnh mà không cần giải thích. –

+1

@Piers Myers: Quay trở lại, tâm trí tuyệt vời và tất cả những điều đó. – Lazarus

Trả lời

-3

_list.ToString() sẽ không trả lại bất kỳ giá trị có ý nghĩa. Hãy thử một cái gì đó giống như thay vì điều này:

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

Bạn có thực sự nghĩ rằng 'catch {}' là một ý tưởng hay không? –

+2

Xin lỗi, nhưng tôi đã phải bỏ phiếu cho bạn để rời khỏi "catch {}" trong đó. –

+7

Tại sao chỉ cần cung cấp mã đã sửa mà không cần giải thích? Ai sẽ học được điều này? Khối catch rỗng là một điều thực sự xấu để làm - hoặc là loại bỏ tất cả cùng nhau hoặc đảm bảo bạn làm điều gì đó với bất kỳ trường hợp ngoại lệ bị bắt. –

56

Vâng đây là một vấn đề để bắt đầu với:

catch { } 

Nếu bất cứ điều gì sai, bạn sẽ chỉ âm thầm hủy bỏ.

Có thể đó là những gì đang xảy ra? (EDIT: Đó là. Xem sau.)

Vấn đề tiếp theo là "danh sách" của bạn sẽ chỉ bao giờ chứa một chuỗi duy nhất ... đó có thực sự là những gì bạn dự định không? Tôi nghi ngờ rằng danh sách bạn đang xem thực sự trống - nhưng nó sẽ chứa một chuỗi rỗng.

(Như một mặt lưu ý, tôi sẽ mạnh đề nghị bạn nên bắt đầu sau công ước NET đặt tên và tránh các biến toàn cục như thế này.)

EDIT: Aargh - Tôi vừa mới nhận ra những gì bạn đã làm . Có thể bạn đang thực sự nhận được một số NullReferenceException trong số list_all_pocesses mà bạn đã phát hiện và bỏ qua.

Cuộc gọi của bạn tới pro_hook.Add được thực hiện trước khi bạn chỉ định giá trị cho pro_hook. Về cơ bản bạn đã có một initializer biến trong đó sử dụng một phương pháp mà lần lượt sử dụng biến. Đừng làm vậy. Nếu bạn bước qua mã của bạn trong trình gỡ lỗi, bạn có thể hiểu rõ hơn về những gì đang diễn ra, nhưng về cơ bản bạn đã tạo ra một quả cầu spaghetti lớn cho chính mình.

Tại sao không list_all_pocesses chỉ cần trả lại List<string>? Tại sao bạn sử dụng một số StringBuilder?

+0

$ exception \t {"Truy cập bị từ chối"} \t System.Exception {System.ComponentModel.Win32Exception} – honibis

+0

@honibis: Ngay cả khi không có điều đó, anh ta sẽ nhận được một NullReferenceException. –

+0

Nó chắc chắn sẽ ném một 'NullReferenceException', mà kết thúc bị nuốt. Cách biến 'pro_hook' được khởi tạo là sai. @ bniwredyc đã sửa nó trong giải pháp của anh ấy. – Thorarin

5

Vâng ... bạn đang trả về trình tạo chuỗi rỗng. Đó là vấn đề của bạn. Mã của bạn đang làm những gì bạn đang nói nó làm. :)

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' là 'List ' nhưng 'list_all_processes' đã trả về kiểu' string' -> điều này sẽ không biên dịch. – Richard

+0

@Richard, cảm ơn, đã bỏ lỡ điều đó. – bniwredyc

+1

Hy vọng bạn không phiền, nhưng tôi đã xóa tiền tố gạch dưới cho biến 'list' cục bộ. Các nguyên tắc kiểu .NET không được theo sau, nhưng dấu gạch dưới gợi ý biến thành viên. – Thorarin

Các vấn đề liên quan