這一篇是接上一篇筆記的第二部分,
2.5深入研究控制臺應用程式
前面創建并使用了基本的控制臺應用程式,下面更深入地研究它們,
控制臺應用程式是基于文本的,在命令上運行的,它們通常執行需要撰寫腳本的簡單任務,例如編譯檔案或加密組態檔的一部分,
2.5.1向用戶顯示輸出
控制臺應用程式執行的兩個最常見的任務是寫入和讀取資料,前者使用WriteLine方法來輸出資料,但是,如果不希望行的末尾有回車符,那么可以使用Write方法,
1.使用編號的位置引數進行格式化
生成格式化字串的一種方法是使用編號的位置引數,
諸如Write和WriteLine的方法就支持這一特性,對于不支持這一特性的方法,可以使用string型別的Format方法對string 引數進行格式化,
(1)向Chapter02檔案夾和作業區新添加一個名為Formatting的控制臺應用程式專案,
(2)在Main方法中添加如下陳述句,宣告一些數值變數并將它們寫入控制臺:
int numberOfApples=12;
decimal pricePerApple=0.35M;
Console.WriteLine(format:"{0} numberOfApples costs{1:C}",
arg0:numberOfApples,
arg1:pricePerApple*numberOfApples);
string formatted =string.Format(
format:"{0} apples costs {1:C}",
arg0:numberOfApples,arg1:pricePerApple*numberOfApples);
Console.WriteLine(formatted);
觀察輸出內容,
2.使用內插字串進行格式化
C#6.0及后續版本有一個方便的特性叫做內插字串,以$為前綴的字串可以在變數或運算式的名稱兩邊使用花括號,從而輸出變數或運算式在字串中相應為止的當前值,
(1)在Main方法的底部輸入如下陳述句:
Console.WriteLine($"{numberOfApples} apples costs {pricePerApple*numberOfApples:C}");
(2)運行控制臺應用程式并查看結果,輸入和上面的最后一個是一樣的,
對于短格式的字串,內插字串更容易閱讀,但是對于一行代碼需要跨多行顯示,這可能比較棘手,
2.5.2理解格式字串
可以在逗號或冒號之后使用格式字串對變數或運算式進行格式化,
N0格式的字串表示有千位分隔符且沒用小數點的數字,而C格式的字串表示貨幣,貨幣格式將由當前執行緒決定,例如,如果在英國的個人計算機上運行這段代碼,會得到英鎊,此時把都逗號作為千位分隔符;但如果在德國的個人計算機上運行這段代碼,會得到歐元,此時把圓點作為千位分隔符,
每個格式項都有一個對其選項,這在輸出值表時非常有用,其中一些值可能需要在字符寬度內左對齊或右對齊,值的對其處理是整數,正整數右對齊的,負整數是左對齊的,
例如,為了輸出一張水果表以及每類水果有多少個,你可能希望將左對齊到某一8字符長的列中,并將格式化為數字的計數值右對齊到另一6字符長的列中,列的小數位數為0.
(1)在Main方法的底部輸入如下陳述句:
Console.WriteLine(format:"{0,-8} {1,6:N0}",arg0:"Name",arg1:"Count" );
Console.WriteLine(format:"{0,-8} {1,6:N0}",arg0:applesText,arg1:applesCount);
Console.WriteLine(format:"{0,-8} {1,6:N0}",arg0:bananasText,arg1:bananasCount);
(2)運行控制臺應用程式,注意對其后的效果,輸出如下所示:
Name Count
Apples 1,234
Bananas 56,789
2.5.3從用戶那里獲取文本輸入
可以使用ReadLine方法從用戶那里獲取文本輸入,ReadLine方法會等待用戶輸入一些文本,然后用戶以按Enter鍵,用戶輸入的任何內容都將作為字串值回傳,
(1)在Main方法中輸入如下陳述句,詢問用戶的姓名和年齡,然后輸出用戶輸入的內容:
Console.Write("Type your first name and press Enter: ");
string firstName=Console.ReadLine();
Console.Write("Type your age and press Enter:");
string age=Console.ReadLine();
Console.WriteLine($"Hello {firstName},you look good for{age}.");
(2)運行控制臺應用程式,
(3)輸入姓名和年齡,輸出如下所示:
Type your first name and press Enter: duwenlong
Type your age and press Enter:30
Hello duwenlong,you look good for30.
2.5.4匯入名稱空間
注意,與第一篇中的第一個應用程式不同,這里沒用在Console之前輸入System,這是因為System是名稱空間,類似于型別的地址,System.Console.WriteLine告訴編譯器在System名稱空間的Console型別中查找WriteLine方法,為了簡化代碼,dotnet new console命令在代碼檔案的頂部添加了一條陳述句,告訴編譯器始終在System名稱空間中查找沒用加上名稱空間前綴的型別,如下所示:
using System;
我們稱這種操作為匯入名稱空間,匯入名稱空間的效果是,名稱空間中的所有可用型別都對程式可用,而不需要輸入名稱空間前綴,在撰寫代碼時名稱空間將以智能感知的方式顯示,
2.5.5 簡化控制臺的使用
在C#6.0及更高版本中,可以使用using陳述句進一步簡化代碼,然后就不需要在整個代碼中輸入Console型別了,可以使用Visual Studio Code 的Replace特性來洗掉以前撰寫的Console型別,
(1)在Program.cs檔案的頂部添加一條陳述句來靜態匯入System.Console類,如下所示:
using static System.Console;
(2)在代碼中選擇第一個Console,確保選擇了單詞Console之后的句點,
(3)導航到Edit|Replace,注意出現了覆寫提示框,輸入想要的內容以替換Console,
(4)單擊Replace All按鈕以替換全部的Console,然后單擊右上角的十字按鈕已關閉覆寫提示框,
2.5.6獲取用戶的重要輸入
可以使用ReadKey方法從用戶哪里獲得重要輸入,ReadKey方法會等待用戶輸入一些文本,然后用戶一按Enter鍵,用戶輸入的任何內容都將作為字串值回傳,
(1)在Main方法中輸入如下陳述句,要求用戶按任意組合鍵,然后輸出相關資訊:
Write("Press any key combination:");
ConsoleKeyInfo key=ReadKey();
WriteLine();
WriteLine($"Key: {key.Key},Char: {key.KeyChar},Modifiers: {key.Modifiers}");
當我使用不同按鍵比如單個按鍵、組合鍵、功能鍵的時候,得到的結果是不一致的,可以嘗試以下,
2.5.7獲取引數
Main方法中的string[] args引數是什么? 它們是用于向控制臺應用程式傳遞引數的陣列,下面看它們具體是如何作業的,
命令列引數由空格分隔,其他字符被視為引數值的一部分,要在實參值中包含空格,請將實參值括在單引號或雙引號內,
假設我們希望能夠在命令列中輸入前景色和背景色的名稱以及終端視窗的大小,為此,可以從args陣列中讀取顏色和數字,而args陣列總是被傳遞給控制臺應用程式的Main方法,
(1)為控制臺應用程式專案創建一個名為Arguments的新檔案夾,并將其添加到Chapter02作業區中,
(2)添加一條陳述句以靜態匯入Ssytem.Console型別,再添加一條陳述句以輸出傳遞給應用程式的引數數量,如下所示:
WriteLine($"There are {args.Length} arguments.");
foreach (var item in args)
{
WriteLine(item);
}
(3)輸出結果顯示了這四個引數的詳細資訊,如下所示:
There are 4 arguments.
firstarg
second-arg
third:Arg
fourth arg
2.5.8使用引數設定選項
現在,這些引數將允許用戶為輸出視窗的背景、前景選擇顏色,并指定輸出視窗的寬度和高度,必須匯入System名稱空間,這一編譯器才知道ConsoleColor和Enum型別,
(1)添加陳述句以警告用戶,如果它們不輸入完四個引數就決議這些引數,并使它們設定控制臺的顏色和尺寸,將發出警告,如下所示:
if(args.Length<4)
{
WriteLine("You must specify two colors and dimensions,e.g.");
WriteLine("dotnet run red yellow 80 40");
return;
}
ForegroundColor =(ConsoleColor)Enum.Parse(enumType:typeof(ConsoleColor),value:args[0],ignoreCase:true);
BackgroundColor=(ConsoleColor)Enum.Parse(enumType:typeof(ConsoleColor),value:args[1],ignoreCase:true);
WindowWidth=int.Parse(args[2]);
WindowHeight=int.Parse(args[3]);
(2)在終端視窗輸入以下命令:
dotnet run red yellow 50 10
在windows 上這個可以正常作業,觀察以下我們修改的內容,但是在其他系統上可能會出現問題,使用Try-Catch來包裹我們設定尺寸的的代碼,用來兼容不同的系統的顯示處理,
try
{
WindowWidth=int.Parse(args[2]);
WindowHeight=int.Parse(args[3]);
}
catch(PlatformNotSupportedException)
{
WriteLine("The Current platform does not support changing the size of a console window.");
}
2.6 實踐
.2.6.1聯系數字的大小和范圍
創建一個名為Exercise02的控制臺應用程式專案,輸出以下每種數字型別使用的記憶體位元組數,以及他們可能具有的最小值和最大值:sbyte、byte、short、ushort、int、uint、long、ulong、float、double和decimal,
這里代碼就不貼啦,因為我也沒有做呢,練習一下:
我創建了一個C#相關的交流群,用于分享學習資料和討論問題,歡迎有興趣的小伙伴:QQ群:542633085
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/280593.html
標籤:.NET Core
