เปรียบเทียบ Console.Read(), ReadKey(), ReadLine() ใน C#
สามเมธอดหลักสำหรับอ่าน Input จาก Console มีพฤติกรรมและ Use Case ต่างกัน
Console.Read()
- อ่าน **1 ตัวอักษร** (single character)
- คืนค่า
int= Unicode code point (ASCII value) - คืนค่า
-1ถ้า EOF (Ctrl+Z Windows, Ctrl+D Unix) - **Line-buffered** บน Windows ต้องกด Enter ก่อนถึงจะอ่านได้
- ไม่เหมาะสำหรับ Interactive input
Console.Write("Press a key: ");
int code = Console.Read(); // รอ Enter แล้วอ่านตัวแรก
Console.WriteLine($"\nCode: {code}, Char: {(char)code}");
Console.ReadKey()
- อ่าน **1 ปุ่มคีย์บอร์ด** ทันที (ไม่ต้องกด Enter)
- คืนค่า
ConsoleKeyInfostruct - มี property:
Key(ConsoleKey enum),KeyChar(char),Modifiers(Shift, Alt, Ctrl) - Overload
ReadKey(true)- **ไม่แสดง** ตัวอักษรบนหน้าจอ (Password) - เหมาะสำหรับ Menu, Game, Password, Real-time input
// แสดงตัวอักษร
var key = Console.ReadKey();
Console.WriteLine($"\nKey: {key.Key}, Char: {key.KeyChar}, Modifiers: {key.Modifiers}");
// ไม่แสดง (Password)
Console.Write("Password: ");
string password = "";
while (true)
{
var k = Console.ReadKey(true);
if (k.Key == ConsoleKey.Enter) break;
if (k.Key == ConsoleKey.Backspace)
{
if (password.Length > 0) password = password[..^1];
}
else if (!char.IsControl(k.KeyChar))
{
password += k.KeyChar;
Console.Write("*");
}
}
Console.WriteLine($"\nPassword entered: {password}");
Console.ReadLine()
- อ่าน **ทั้งบรรทัด** จนกว่าจะกด Enter
- คืนค่า
string(ไม่รวม newline) - คืนค่า
nullถ้า EOF - มาตรฐานสำหรับ Text Input, Forms, CLI prompts
Console.Write("Name: ");
string name = Console.ReadLine();
Console.WriteLine($"Hello, {name}!");
ตารางเปรียบเทียบครบ
| คุณสมบัติ | Read() | ReadKey() | ReadLine() |
|---|---|---|---|
| คืนค่า | int (code point) | ConsoleKeyInfo | string |
| หน่วยอ่าน | 1 Character | 1 Key press | 1 Line |
| รอ Enter | ใช่ (Windows) | ไม่ | ใช่ |
| Echo ไปหน้าจอ | ใช่ | ใช่ (false) / ไม่ (true) | ใช่ |
| รองรับ Modifier Keys | ไม่ | ใช่ (Shift, Ctrl, Alt) | ไม่ |
| เหมาะสำหรับ | Pipe, Redirect, Legacy | Menu, Game, Password, Hotkey | Text input, CLI, Forms |
| EOF คืนค่า | -1 | N/A (blocking) | null |
ตัวอย่างรวม: เมนูโต้ตอบ
void ShowMenu()
{
Console.Clear();
Console.WriteLine("=== MENU ===");
Console.WriteLine("1. View Data");
Console.WriteLine("2. Add Item");
Console.WriteLine("3. Delete Item");
Console.WriteLine("ESC. Exit");
Console.Write("Select: ");
}
void MainLoop()
{
while (true)
{
ShowMenu();
var key = Console.ReadKey(true);
switch (key.Key)
{
case ConsoleKey.D1: case ConsoleKey.NumPad1:
ViewData(); break;
case ConsoleKey.D2: case ConsoleKey.NumPad2:
AddItem(); break;
case ConsoleKey.D3: case ConsoleKey.NumPad3:
DeleteItem(); break;
case ConsoleKey.Escape:
return;
default:
Console.WriteLine("\nInvalid option. Press any key...");
Console.ReadKey(true);
break;
}
}
}
ข้อควรระวัง
Read()บน Windows Console ไม่ได้ real-time จริง ใช้ReadKey()แทนReadLine()คืนค่า null ตอน EOF - ต้อง null-checkReadKey()บาง Environment ไม่รองรับ (CI/CD, Docker, SSH บางตัว)- Redirect Input/Output:
Read()/ReadLine()ทำงาน,ReadKey()อาจล้มเหลว