官术网_书友最值得收藏!

1.4 控制臺輸入和輸出

本章已多次使用System.Console.WriteLine將文本輸出到命令控制臺。除了能輸出數據,程序還需要能接收用戶輸入的數據。

1.4.1 從控制臺獲取輸入

可用System.Console.ReadLine()方法獲取控制臺輸入的文本。它暫停程序執(zhí)行并等待用戶輸入。用戶按回車鍵,程序繼續(xù)。System.Console.ReadLine()方法的輸出,也稱為返回值,其內容即用戶輸入的文本字符串。代碼清單1.14和輸出1.4是一個例子。

代碼清單1.14 使用System.Console.ReadLine()

輸出1.4

在每條提示信息后,程序都用System.Console.ReadLine()方法獲取用戶輸入并賦給變量。在第二個System.Console.ReadLine()賦值操作完成之后,firstName引用值Inigo,而lastName引用值Montoya。

高級主題:System.Console.Read()

除了System.Console.ReadLine()還有System.Console.Read()方法。但后者返回與讀取的字符值對應的整數,沒有更多字符可用就返回–1。為獲取實際字符,需將整數轉型為字符,如代碼清單1.15所示。

代碼清單1.15 使用System.Console.Read()

注意,除非用戶按回車鍵,否則System.Console.Read()方法不會返回輸入。按回車鍵之前不會對字符進行處理,即使用戶已輸入了多個字符。

C# 2.0新增了System.Console.ReadKey()方法。它和System.Console.Read()方法不同,返回的是用戶的單次按鍵輸入。可用它攔截用戶按鍵操作,并執(zhí)行相應行動,比如校驗按鍵或是限制只能按數字鍵。

1.4.2 將輸出寫入控制臺

代碼清單1.14是用System.Console.Write()而不是System.Console.WriteLine()方法提示用戶輸入名和姓。System.Console.Write()方法不在輸出文本后自動添加換行符,而是保持當前光標位置在同一行上。這樣用戶輸入就會和提示內容處于同一行。代碼清單1.14的輸出清楚演示了System.Console.Write()的效果。

下一步是將通過System.Console.ReadLine()獲取的值寫回控制臺。在代碼清單1.16中,程序在控制臺上輸出用戶的全名。但這段代碼使用了System.Console.WriteLine()的一個變體,利用了從C# 6.0開始引入的字符串插值功能。注意在Console.WriteLine調用中為字符串字面值附加的$前綴。它表明使用了字符串插值。輸出1.5是對應的輸出。

代碼清單1.16 使用字符串插值來格式化

輸出1.5

代碼清單1.16不是先用Write語句輸出"Your full name is",再用Write語句輸出firstName,用第三條Write語句輸出空格,最后用WriteLine語句輸出lastName。相反,是用C# 6.0的字符串插值功能一次性輸出。字符串中的大括號被解釋成表達式。編譯器會求值這些表達式,轉換成字符串并插入當前位置。不需要單獨執(zhí)行多個代碼段并將結果整合成字符串,該技術允許一個步驟完成全部操作,從而增強了代碼的可讀性。

C# 6.0之前則采用不同的方式,稱為復合格式化。它要求先提供格式字符串來定義輸出格式,如代碼清單1.17所示。

代碼清單1.17 使用復合格式化

本例的格式字符串是Your full name is {0} {1}.。它為要在字符串中插入的數據標識了兩個索引占位符。每個占位符的順序對應格式字符串之后的實參。

注意索引值從零開始。每個要插入的實參,或者稱為格式項,按照與索引值對應的順序排列在格式字符串之后。在本例中,由于firstName是緊接在格式字符串之后的第一個實參,所以它對應索引值0。類似地,lastName對應索引值1。

注意,占位符在格式字符串中不一定按順序出現(xiàn)。例如,代碼清單1.18交換了兩個索引占位符的位置并添加了一個逗號,從而改變了姓名的顯示方式(參見輸出1.6)。

代碼清單1.18 交換索引占位符和對應的變量

輸出1.6

占位符除了能在格式字符串中按任意順序出現(xiàn),同一占位符還能在一個格式字符串中多次使用。另外,也可省略占位符。但每個占位符都必須有對應的實參。

注意 由于C# 6.0風格的字符串插值幾乎肯定比復合格式化更容易理解,本書默認使用前者。

1.4.3 注釋

本節(jié)修改代碼清單1.17來添加注釋。注釋不會改變程序的執(zhí)行,只是使代碼變得更容易理解。代碼清單1.19中展示了新代碼,輸出1.7是對應的輸出。

代碼清單1.19 為代碼添加注釋

輸出1.7

雖然插入了注釋,但編譯并執(zhí)行后產生的輸出和以前是一樣的。

程序員用注釋來描述和解釋自己寫的代碼,尤其是在語法本身難以理解的時候,或者是在另辟蹊徑實現(xiàn)一個算法的時候。只有檢查代碼的程序員才需要看注釋,編譯器會忽略注釋,因而生成的程序集中看不到源代碼中的注釋的一絲蹤影。

表1.2總結了4種不同的C#注釋。代碼清單1.19使用了其中兩種。

第10章將更全面地討論XML注釋,以及如何利用它們來生成文檔。屆時會討論各種XML標記。

編程史上確有一段時期,如代碼沒有詳盡的注釋,都不好意思說自己是專業(yè)程序員。然而時代變了。沒有注釋但可讀性好的代碼,比需要注釋才能說清楚的代碼更有價值。如開發(fā)者發(fā)現(xiàn)需要寫注釋才能說清楚代碼塊的功用,則應考慮重構,而不是洋洋灑灑寫一堆注釋。寫注釋來重復代碼本來就講得清的事情,只會使代碼變得臃腫并降低可讀性,還容易過時,因為將來代碼可能更改了但注釋卻沒有來得及更新。

表1.2 C#注釋類型

設計規(guī)范

·不要使用注釋,除非代碼本身“一言難盡”。

·要盡量寫清楚的代碼而不是通過注釋澄清復雜的算法。

初學者主題:XML

XML(Extensible Markup Language,可擴展標記語言)是一種簡單而靈活的文本格式,常用于Web應用程序以及應用程序間的數據交換。XML之所以“可擴展”,是因為XML文檔中包含的是對數據進行描述的信息,也就是所謂的元數據(metadata)。下面是示例XML文件:

文件以header元素開始,描述XML文件版本和字符編碼方式。之后是一個主要的book元素。元素以尖括號中的單詞開頭,比如<body>。結束元素需要將同一單詞放在尖括號中,并為單詞添加正斜杠前綴,比如</body>。除了元素,XML還支持屬性。title="Essential C#"就是XML屬性的例子。注意XML文件包含了對數據(比如“Essential C#”“Data Types”等)進行描述的元數據(書名、章名等)。這可能形成相當臃腫的文件,但優(yōu)點是可通過描述來幫助解釋數據。

主站蜘蛛池模板: 方城县| 河北区| 夏津县| 正定县| 南宁市| 游戏| 孙吴县| 修水县| 剑阁县| 陇南市| 潞城市| 河曲县| 五大连池市| 遵义市| 开远市| 平塘县| 绿春县| 绥芬河市| 泽库县| 隆回县| 乌兰浩特市| 三明市| 固安县| 宽城| 山西省| 神农架林区| 哈尔滨市| 元阳县| 准格尔旗| 乌什县| 忻城县| 义乌市| 车险| 酒泉市| 永宁县| 肇源县| 比如县| 监利县| 焉耆| 新泰市| 大方县|