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 ...
随机推荐
- 在Linux服务器,搭建K8s服务【脚本篇】
前言 好久没有写博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用.文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举,方便 ...
- 修改mysql中数据库存储主路径
一.首先把mysql的服务先停掉. 二.更改MySQL配置文件My.ini中的数据库存储主路径 打开文件夹C:\ProgramData\MySQL\MySQL Server 5.7中的my.ini文件 ...
- Navicat Premium 15 linux 安装与激活 ArchLinux 2021
查看了很多教程花了半小时才弄好可真不容易 参考https://github.com/orginly/navicat-keygen 下载地址 http://www.navicat.com.cn/down ...
- Tensor基本理论
Tensor基本理论 深度学习框架使用Tensor来表示数据,在神经网络中传递的数据均为Tensor. Tensor可以将其理解为多维数组,其可以具有任意多的维度,不同Tensor可以有不同的数据类型 ...
- 视频动作定位的分层自关注网络:ICCV2019论文解析
视频动作定位的分层自关注网络:ICCV2019论文解析 Hierarchical Self-Attention Network for Action Localization in Videos 论文 ...
- 10分钟用JS实现微信 "炸屎"大作战
大家好,我是秋风,近日,微信又发布了新功能(更新到微信8.0.6).最火热的非"炸屎"功能莫属了,各种群里纷纷玩起了炸屎的功能. 不知道大家是否经历过那样一个时候,小时候(我是说很 ...
- NX二次开发】Block UI 选择特征
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- React开发中react-route-dom使用BrowserRouter部署到服务器上刷新时报404的问题
React项目部署中遇到的问题 react开发中react-route使用BrowserRoute路径在iis服务器上刷新时报404的问题 解决:在发布的项目根目录添加web.config配置文件 在 ...
- 懒人 IDEA 插件推荐:EasyCode 一键帮你生成所需代码
Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. 1.安装(EasyCode) 我这里的 ...
- 「模拟8.23」one递推,约瑟夫
前置芝士约瑟夫问题 这样大概就是板子问题了 考场的树状数组+二分的60分暴力??? 1 #include<bits/stdc++.h> 2 #define int long long 3 ...