C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第二部分

这一篇是接上一篇笔记的第二部分。

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

posted @ 2021-04-26 23:39  杜文龙  阅读(661)  评论(0编辑  收藏  举报