不學 JAVA 換學 C# 之覺得心累 - L1:ch1 Console 類別的輸入和輸出方法

AdSense

介紹

Console 一般又稱主控台控制台,是僅以文字顯示訊息和結果的介面,像是一種特殊的終端機命令提示字元。在 C# 中是 System 命名空間 底下的一個 Class (類別)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

namespace DrawingAShape
{
class DrawingAShape
{
static void Main()
{
Console.WriteLine(" /|");
Console.WriteLine(" / |");
Console.WriteLine(" / |");
Console.WriteLine("/___|");

Console.ReadLine(); //寫這行也可以暫停
//不用一定要寫 ReadKey()
}
}
}

WriteLine、Write 方法

WriteLineConsole 類別 底下的一個 method (方法),可以將 () 中的參數 (這裡是字串),輸出到螢幕,在 () 輸入的參數,是以 "" (雙引號) 包住的字串 (想要輸出到螢幕被使用者閱讀的字串),並且將游標移動到下一行 (換行)。另外 Write 也是常用的同樣功能 method,差別是不換行

所以下面的這行的意思是,在主程式中呼叫 Console 類別底下的 WriteLine 方法,並傳入字串參數,用法是使用 .(點) 連接。

1
Console.WriteLine("Hello");

; 在程式中是句號的意思,一定要加

程式碼的執行順序是:

  1. 呼叫 method (WriteLine)
  2. 傳入參數
  3. 執行 method (WriteLine) 的內部功能 (這邊是在主控台中輸出 Hello)

記得呼叫 method 時,後方一定要加 (),括弧內可能需要,也可能不需要放入參數

ReadLine、ReadKey、Read 方法

在 Windows 系統下,如果在 Main method 只有一行程式碼 Console.WriteLine("Hello");,使用者其實只能看到主控台閃現一下,隨即消失,因為主控台在輸出 Hello 後,程式隨即結束,主控台跟著關閉。因此使用者想要真的看到 Hello,記得在結尾加 ReadLineReadKey

ReadLine 是讀取輸入的一串字串直到按下 enter,ReadKey 是讀取一個字元,程式和主控台必須停下來等使用者輸入後,才會有後續動作,因此畫面停下來的時候,使用者就能看到 Hello。

Mac 系統中,主控台裡自帶一行 Press any key to continue...。所以即使不加 ReadLine ,主控台也會暫停在畫面中,等待使用者輸入,使用者自然也就看得到 Hello 了。但是我的習慣還是會加 ReadLine

這邊要特別注意的是,有另一個叫做 Read 的方法:

  • Console.ReadKey()每次等待輸入新的字元。
  • Console.Read():是從緩衝區之中讀取一個字元,若緩衝區之內,已經有之前輸入過的字,則不會讓使用者輸入新字元,會直接依序讀取之前輸入過的字元;若緩衝區之內沒有字元,則等待輸入新的字元們,直到使用者按下 enter,但是只會讀取第一個字元,其他字元繼續待在緩衝區。

Windows 系統中

使用者輸入字串,按下 enter 之後,其實是將輸入的字串暫存在系統的一塊記憶體空間之中,俗稱緩衝區 (buffer),並且會在結尾做處理。

當呼叫 Console.Read() 時,它其實是從緩衝區之中,逐一讀取一個字元。
如下圖中:

  • 如果使用者輸入 enter:第一次 Read停下,等待使用者輸入,如果使用者輸入 enter,會讀取到 ASCII 為 13 的回車符號 (也就是 enter,\r),第二次 Read 不會停下,直接取讀取到 ASCII 為 10 的換行符號 (也就是 \n)。此時,如果還有下一個 Read,就會停下等使用者輸入,因為 buffer 中已經沒有字元。
  • 如果使用者輸入 r:第一次 Read停下,等待使用者輸入,如果使用者輸入 r -> enter,會讀取到 ASCII 為 114 的 r,第二次 Read 不會停下,直接取讀取到 ASCII 為 13 的 \r,第三次 Read 不會停下,直接取讀取到 ASCII 為 10 的 \n。此時,如果還有下一個 Read,就會停下等使用者輸入,原因同上。
  • 如果使用者輸入 er:第一次 Read停下,等待使用者輸入,如果使用者輸入 er -> enter,會讀取到 ASCII 為 101 的 e,第二次 Read 不會停下,直接取讀取到 ASCII 為 114 的 r,第三次 Read 不會停下,直接取讀取到 ASCII 為 13 的 \r,第四次 Read 不會停下,直接取讀取到 ASCII 為 10的 \n。如果還有下一個 Read,就會停下,原因同上。

所以就算使用者只輸入一次,也並不是每一次的 Read 都會停下來等使用者輸入。


Mac 系統中

每一次的 Read 一定會停下來等使用者輸入,如下圖中:

  • 如果使用者輸入 enter:Read 會讀取到 ASCII 為 10 的換行符號 (也就是 \n)。
  • 如果使用者輸入 r -> enter:Read 會讀取到 ASCII 為 114 的 r,下一個 Read 會停下等待使用者輸入,使用者輸入後,會讀取到 ASCII 為 10 的 \n。

會有這樣的差異是因為,Windows 系統和 Mac 系統在字串結尾,加入不同的符號的關係。

總結

常用來要求使用者輸入或輸出在 Console 螢幕的函式/方法。

命名空間 Namespace: System

Console.Write(指定資料): Writes the text representation of the specified value or values to the standard output stream. (將指定資料顯示在 Console 螢幕上,不換行。)

Console.WriteLine(指定資料): Writes the specified data, followed by the current line terminator, to the standard output stream. (將指定資料顯示在 Console 螢幕上,並且換行。)

Write("An example\n"); 等於 WriteLine("An example");

Console.Read(): Reads the next character from the standard input stream. (從標準輸出流,讀取一個字元。)

Console.ReadKey(): Obtains the next character or function key pressed by the user. The pressed key is displayed in the console window. (從標準輸出流,讀取一個字元。)

Windows 電腦之中,在輸入字元,再按下 enter 之後,其實是將你輸入的字串暫存在系統的一塊記憶體空間之中,俗稱緩衝區 (buffer),當你呼叫 Console.Read() 時,它其實是從緩衝區之中讀取一個字元,若緩衝區之內,已經有之前輸入過的字,就會依序先讀取之前輸入過的字,否則等待輸入新的字元。Console.ReadKey() 則是每次等待輸入新的字元。

Console.ReadLine(): Reads the next line of characters from the standard input stream. (讀取使用者輸入的,一串字元形成的字串,直到輸入 enter 鍵。)