Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ความแตกต่างระหว่าง Read(), ReadKey() และ ReadLine() ใน C#

เปรียบเทียบ 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)
  • คืนค่า ConsoleKeyInfo struct
  • มี 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)ConsoleKeyInfostring
หน่วยอ่าน1 Character1 Key press1 Line
รอ Enterใช่ (Windows)ไม่ใช่
Echo ไปหน้าจอใช่ใช่ (false) / ไม่ (true)ใช่
รองรับ Modifier Keysไม่ใช่ (Shift, Ctrl, Alt)ไม่
เหมาะสำหรับPipe, Redirect, LegacyMenu, Game, Password, HotkeyText input, CLI, Forms
EOF คืนค่า-1N/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-check
  • ReadKey() บาง Environment ไม่รองรับ (CI/CD, Docker, SSH บางตัว)
  • Redirect Input/Output: Read()/ReadLine() ทำงาน, ReadKey() อาจล้มเหลว