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 ...
随机推荐
- 【七】Kubernetes 探针介绍 - 存活、就绪探针案例测试
一.探针概述 探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载 ...
- GO语言练习---对切片进行排序
对整型切片进行选择排序 package main import "fmt" /*对切片排序*/ func SortSlice(slice []int) { for i := 0; ...
- SQL Server 50道查询训练题,学生Student表
下面这个是题目所用到的数据库! 首先你需要在你的SQL Sever数据库中创建[TestDb]这个数据库,接下来下面这个代码.直接复制在数据库里运行就好了! 1 USE [TestDb] 2 GO 3 ...
- nologin用户执行命令
使用su su -s 是指定shell,这里www用户是nologin用户,是没有默认的shell的,这里指定使用/bin/bash, -c 后面接需要运行的命令, 后面www是用www用户来运行 s ...
- NVIDIA GPU自动调度神经网络
NVIDIA GPU自动调度神经网络 对特定设备和工作负载进行自动调整对于获得最佳性能至关重要.这是有关如何使用自动调度器为NVIDIA GPU调整整个神经网络. 为了自动调整神经网络,将网络划分为小 ...
- TensorRT IRNNv2Layer
TensorRT IRNNv2Layer IRNNv2Layer层实现递归层,如递归神经网络(RNN).门控递归单元(GRU)和长短期记忆(LSTM).支持的类型有RNN.GRU和LSTM.它执行一个 ...
- 强化学习之CartPole
0x00 任务 通过强化学习算法完成倒立摆任务,控制倒立摆在一定范围内摆动. 0x01 设置jupyter登录密码 jupyter notebook --generate-config jupyt ...
- 性能工具之stress工具使用教程(带源码说明)
stress是一个在linux下的压力测试小工具. 我看到有些人用这个工具来描述一些资源耗尽的场景,也有人用它来做混沌测试中.请使用者要注意,这个工具并不是模拟业务问题的,是模拟系统级问题的.所以 ...
- TOP-5错误率
TOP-5错误率是指每幅图像同时用5个类别标签进行预测:如果其中任何一次预测正确,就认为预测正确,如果5次预测的结果都错了,才认为预测错误,这时的分类错误率就是TOP-5错误率.
- 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息
第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...