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
C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第二部分的更多相关文章
- C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第一部分
基础部分被我分为了2篇,因为实在太多了,但是每一个知识点我都不舍得删除,所以越写越多,这一篇博客整理了4个夜晚,内容有点多建议慢慢看.本章涵盖以下主题: 介绍C# 理解C#的基础知识 使用变量 处理空 ...
- ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0
还没正式登场就死了?不能怪我标题党,是大神Scott在他博客上这么说的,我只是翻译了一下. 在1月20号最新的ASP.NET Community Standup视频中,微软aspnet开发组的大帅哥 ...
- .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 ...
- ASP.NET 5已终结,迎来ASP.NET Core 1.0和.NET Core 1.0 转
作者:yourber 命名是非常困难的事情,微软这次为了和ASP.NET4.6做区分,采用了全新的命名方式ASP.NET Core 1.0,它是一个全新的框架. ASP.NET 在过去的 15 年里是 ...
- [ASP.NET Core 2.0 前方速报]Core 2.0.3 已经支持引用第三方程序集了
发现问题 在将 FineUIMvc(支持ASP.NET MVC 5.2.3)升级到 ASP.NET Core 2.0 的过程中,我们发现一个奇怪的现象: 通过项目引用 FineUICore 工程一切正 ...
- 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0
如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...
- C# 8.0和.NET Core 3.0高级编程 分享笔记三:控制流程和转换类型
控制流程和转换类型 本章的内容主要包括编写代码.对变量执行简单的操作.做出决策.重复执行语句块.将变量或表达式值从一种类型转换为另一种类型.处理异常以及在数值变量中检查溢出. 本章涵盖以下主题: 操作 ...
- 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 ...
- IOS Core Animation Advanced Techniques的学习笔记(二)
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { CGFloat width = 10.0f; //draw a thi ...
随机推荐
- ExpressionHelp2
public static class ExpressionHelp { private static Expression<T> Combine<T>(this Expres ...
- iOS视频硬编码技术
iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...
- Thumb扩展
Thumb扩展 ARM处理器已在嵌入式系统,手持计算机和其系统中得到了最大的应用,在这些系统中,系统对使用有限资源进行大量工作的要求很高.Thumb扩展是为解决资源消耗中的某些方面而创建的,已成为当今 ...
- 单核性能强悍,Core i3 这次又要“默秒全”?
单核性能强悍,Core i3 这次又要"默秒全"? 在 Intel 历代酷睿处理器中,定位主流级的 Core i3 一直以超高性价比.低功耗.低发热的特点受到广大用户的青睐,在市场 ...
- VLAN与三层交换机
VLAN概述与优势 ①分割广播域 物理分割 逻辑分割 ②VLAN的优势 控制广播 增强网络安全性 简化网络管理 VLAN的范围 VlAN ID范围 范围 用途 0,4095 保留 仅限系统使用,用户 ...
- 简单测试 APISIX2.6 网关
Apache APISIX是一个动态的.实时的.高性能的 API 网关.它提供丰富的流量管理功能,例如负载均衡.动态上游服务.金丝雀发布.断路.身份验证.可观察性等.您可以使用 Apache APIS ...
- 四、配置及使用Zabbix监控系统
要求: 沿用练习- - -,使用Zabbix监控平台监控Linux服务器,实现以下目标:1.监控CPU2.监控内存3.监控进程4.监控网络流量5.监控硬盘 方案:通过Zabbix监控平台,添加被监控z ...
- centos7 安装 bbr加速
脚本安装 1 查看内核版本 # [root@os]# uname -a Linux os 3.10.0-1127.13.1.el7.x86_64 x86_64 x86_64 x86_64 GNU/Li ...
- 实验6、Flask API使用示例和拓展
实验介绍 1. 实验内容 Flask 提供了多种API拓展,本节我们主要学习基于RESTful的Flask应用程序设计 2. 实验要点 学习和掌握多种RESTful的设计模式 3.实验环境 Cento ...
- 【NX二次开发】Block UI RGB颜色选择器
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...