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

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

C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第二部分的更多相关文章

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

    基础部分被我分为了2篇,因为实在太多了,但是每一个知识点我都不舍得删除,所以越写越多,这一篇博客整理了4个夜晚,内容有点多建议慢慢看.本章涵盖以下主题: 介绍C# 理解C#的基础知识 使用变量 处理空 ...

  2. ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0

    还没正式登场就死了?不能怪我标题党,是大神Scott在他博客上这么说的,我只是翻译了一下. 在1月20号最新的ASP.NET Community Standup视频中,微软aspnet开发组的大帅哥 ...

  3. .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

    .NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ...

  4. ASP.NET 5已终结,迎来ASP.NET Core 1.0和.NET Core 1.0 转

    作者:yourber 命名是非常困难的事情,微软这次为了和ASP.NET4.6做区分,采用了全新的命名方式ASP.NET Core 1.0,它是一个全新的框架. ASP.NET 在过去的 15 年里是 ...

  5. [ASP.NET Core 2.0 前方速报]Core 2.0.3 已经支持引用第三方程序集了

    发现问题 在将 FineUIMvc(支持ASP.NET MVC 5.2.3)升级到 ASP.NET Core 2.0 的过程中,我们发现一个奇怪的现象: 通过项目引用 FineUICore 工程一切正 ...

  6. 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0

    如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...

  7. C# 8.0和.NET Core 3.0高级编程 分享笔记三:控制流程和转换类型

    控制流程和转换类型 本章的内容主要包括编写代码.对变量执行简单的操作.做出决策.重复执行语句块.将变量或表达式值从一种类型转换为另一种类型.处理异常以及在数值变量中检查溢出. 本章涵盖以下主题: 操作 ...

  8. C# 8.0和.NET Core 3.0高级编程 分享笔记一:C#8.0与NET Core 3.0入门

    在学习C#相关知识的过程中,我们使用Visual Studio Code来入门整个C#. 一.安装Visual Studio Core环境 通过https://code.visualstudio.co ...

  9. IOS Core Animation Advanced Techniques的学习笔记(二)

    - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { CGFloat width = 10.0f; //draw a thi ...

随机推荐

  1. TPS和响应时间之间是什么关系

    在这个图中,定义了三条曲线.三个区域.两个点以及三个状态描述. 三条曲线:吞吐量的曲线(紫色).使用率 / 用户数曲线(绿色).响应时间曲线(深蓝色).三个区域:轻负载区(Light Load).重负 ...

  2. 系统芯片(SOC)架构- Aviral Mittal

    系统芯片(SOC)架构- Aviral Mittal System on Chip Architecture-Aviral Mittal 此技术是在设计片上系统时考虑体系结构级别的因素.同样,范围是围 ...

  3. Python基础_python的数据类型

    一.Python 的标准数据类型 二.以下单个实际举例分析数据类型 2.1 python的数字类型 Int:整型,Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python ...

  4. redis 记一次搭建高可用redis集群过程,问题解决;Node 192.168.184.133:8001 is not configured as a cluster node

    ------------恢复内容开始------------ 步骤 1:每台redis服务器启动之后,需要将这几台redis关联起来, 2: 关联命令启动之后 报错: Node 192.168.184 ...

  5. windows10下JDK9的环境配置

    JDK版本:jdk-9.0.4_windows-x64_bin.exe windows版本:windows10 专业版 64位 需要在系统变量中新建如下3个变量: JAVA_HOME=jdk安装路径J ...

  6. Python批量重命名 工具贴(一)

    说明 由于在处理图片数据和其他数据时,经常需要对数据进行批量重命名操作,每次使用时都需要重写,非常不便,因此记录下重命名代码方便后续使用. 文件结构说明 参数说明: path为输入路径 image_t ...

  7. SpringBoot数据访问(一) SpringBoot整合Mybatis

    前言 SpringData是Spring提供的一个用于简化数据库访问.支持云服务的开源框架.它是一个伞形项目,包含了大量关系型数据库及非关系型数据库的数据访问解决方案,其设计目的是为了使我们可以快速且 ...

  8. Spring Boot WebFlux-03——WebFlux 整合 MongoDB

    第03课:WebFlux 整合 MongoDB 前言 上一课的内容讲解了用 Map 数据结构内存式存储了数据,这样数据就不会持久化,本文我们用 MongoDB 来实现 WebFlux 对数据源的操作. ...

  9. 性能工具之linux三剑客awk、grep、sed详解

    前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...

  10. Kubernetes ConfigMap详解,多种方式创建、多种方式使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 配置是程序绕不开的话题,在Kubernetes中使用ConfigMap来配置,它本质其实就是键值对.本文讲解如何 ...