2013-08-27 33 views
7

Tôi đã từng nhìn thấy mã nguồn của ứng dụng winform và mã có một Console.WriteLine();. Tôi hỏi lý do cho điều đó và tôi được cho biết rằng đó là vì mục đích gỡ lỗi.Mục đích của Console.WriteLine() trong Winforms

Xin cho biết bản chất của Console.WriteLine(); trong một winform là gì và khi nào tôi đã thử sử dụng nó, nó không bao giờ viết bất cứ điều gì.

+0

Bạn đã kiểm tra cửa sổ Đầu ra chưa? (Mặc dù, thành thật mà nói, tác giả nên sử dụng Debug. */Trace. *) –

+4

Thay đổi loại dự án Winform của bạn thành Console Application ('project/properties/application/output type') và thử lại. Tất cả trong một :) – I4V

+0

Dòng mã đó có lẽ là tạm thời. Tôi đoán nó đã được đặt ở đó chỉ vì vậy các nhà phát triển có thể thiết lập một điểm break cho gỡ lỗi. – Crispy

Trả lời

12

Nó ghi vào Bảng điều khiển.

Người dùng cuối sẽ không nhìn thấy nó, và thành thật mà nói nó sạch hơn nhiều để đặt nó vào một bản ghi thích hợp, nhưng nếu bạn chạy nó thông qua VS cửa sổ Console sẽ cư trú.

2

Nó sẽ không thực hiện bất cứ điều gì trừ khi Console được chuyển hướng để nói cửa sổ Output. Thực sự, họ nên tận dụng Debug.WriteLine để thay thế.

Lợi ích của Debug.WriteLine là nó được tối ưu hóa khi xây dựng ở chế độ Release.

LƯU Ý: như được chỉ ra bởi Brad Christie và Haedrian, rõ ràng nó thực tế sẽ ghi vào cửa sổ Console trong Visual Studio khi chạy ứng dụng Windows Forms. Bạn học được điều gì mới mỗi ngày!

4

Winforms chỉ là các ứng dụng giao diện điều khiển hiển thị cửa sổ. Bạn có thể hướng thông tin gỡ lỗi của mình đến ứng dụng bảng điều khiển.

Như bạn có thể thấy trong ví dụ bên dưới, có một lệnh đính kèm cửa sổ chính rồi bơm thông tin cho nó.

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace MyWinFormsApp 
{ 
    static class Program 
    { 
     [DllImport("kernel32.dll")] 
     static extern bool AttachConsole(int dwProcessId); 
     private const int ATTACH_PARENT_PROCESS = -1; 

     [STAThread] 
     static void Main(string[] args) 
     { 
      // redirect console output to parent process; 
      // must be before any calls to Console.WriteLine() 
      AttachConsole(ATTACH_PARENT_PROCESS); 

      // to demonstrate where the console output is going 
      int argCount = args == null ? 0 : args.Length; 
      Console.WriteLine("nYou specified {0} arguments:", argCount); 
      for (int i = 0; i < argCount; i++) 
      { 
       Console.WriteLine(" {0}", args[i]); 
      } 

      // launch the WinForms application like normal 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
} 

Dưới đây là tài nguyên cho ví dụ này: http://www.csharp411.com/console-output-from-winforms-application/

+0

"Winforms chỉ là các ứng dụng giao diện điều khiển hiển thị cửa sổ" - Tôi cầu xin không đồng ý và thậm chí là vững chắc. Có hai loại ứng dụng trong Windows: các ứng dụng GUI tạo cửa sổ và các ứng dụng giao diện điều khiển không phải GUI, chạy trong bảng điều khiển chế độ ký tự, các ứng dụng nổi tiếng nhất là cmd.exe và Powershell. Ứng dụng Console * có thể * tạo cửa sổ bằng cách gọi API thích hợp và ứng dụng GUI * có thể * đọc và ghi stdin và stdout dưới dạng ứng dụng giao diện điều khiển, nhưng điều đó không có nghĩa là chúng không phải là hai động vật hoàn toàn khác nhau. Và có, như những người khác chỉ ra, Console.WriteLine() trong một ứng dụng GUI không phải là cách được đề nghị. –

+0

@LucVdV nếu bạn không đồng ý, sau đó đăng câu trả lời của riêng bạn để cộng đồng hưởng lợi từ. Nó sẽ hữu ích hơn sau đó bình luận về câu trả lời từ 4 năm trước lol. –

+0

Tôi chỉ ra một lỗi trong câu trả lời của bạn, mà không đi xa đến mức bỏ phiếu cho nó. Nếu bạn thích một downvote, chỉ cần nói như vậy. –

3

Bạn sẽ không thực sự sử dụng nó bình thường nhưng nếu bạn đã đính kèm một điều khiển hoặc sử dụng AllocConsole, nó sẽ hoạt động như thế nào trong bất kỳ ứng dụng giao diện điều khiển khác và đầu ra sẽ hiển thị ở đó.

Để gỡ lỗi nhanh, tôi thích Debug.WriteLine nhưng để có giải pháp mạnh mẽ hơn, lớp Trace có thể thích hợp hơn.

+1

Tôi chỉ sử dụng chế độ chờ cũ Debug.Print - đầu ra đi tới Cửa sổ ngay lập tức hoạt động để tìm lỗi mã đơn giản. – rheitzman