DotNet7编程基础
VScode简单配置
列出当前系统上安装的所以dotNet版本
dotnet --list-sdks
新建一个globaljson文件来控制项目使用的dotnet版本,这里我用的是7.0.408版本,版本信息可从上面的 --list-sdks命令获取
dotnet new globaljson --sdk-version 7.0.408
生成默认的C#运行文件
dotnet new console
nameof(变量名称)
//nameof 将会输出变量的名称.
using System.Data.Common;
double heightInMetres=1.88;
Console.WriteLine($"The Variable {nameof(heightInMetres)} has the value {heightInMetres}.");
The Variable heightInMetres has the value 1.88.
逐字字符串
逐字字符串必须加上@符号作为前缀。
因为字符串变量在存储文本时,可能就包含了转义字符串,这时候你直接打印这个变量,可能会把这个转义字符串打印出来。但是如果我要的字符串不要他转义之后的结果,此时逐字字符串就派上用场了。
示例
string filePath=@"C:\televisions\tony\braviatxt"
按照示例这样在要打印字符串最前方加上一个@即可。
原始内插字符串字面值
定义
可将使用花括号{}的内插字符串与原始字符串字面值相混合。通过在字面值的开头添加一定数量的美元符号,可指定指示替换表达式的花括号的数量。任何小于此值的花括号都被视为原始内容。
示例
var person =new {FirstName="Alice",Age=56};
string json = $$"""
{
"first_name":"{{person.FirstName}}",
"age":{{person.Age}},
"calculation",
"{{{1+2}}}"
}
"""
输出结果
{
"first_name":"Alice",
"age":56,
"calculation", "{3}"
}
其实用一句话来说就是$数对于的花括号数对应替换表达式,而多于或者少于 $数量的花括号就是普通的花括号,其中多出来的花括号最多只能多1个,超过了系统将提示 :
内插原始字符串字面量的开头没有足够的 \"$\" 字符以允许将这么多连续的左大括号作为内容。[CS9006]
精确计算和比较小数
double
double
是一种采用64位IEEE 754标准的浮点数类型,主要用于科学计算和工程领域。由于它是基于二进制的,所以它并不适合进行精确的十进制数运算。double
类型可以提供大约15-16位的十进制精度,但在表示非常大或非常小的数时,它可以提供非常宽的范围。
- 使用场景:适用于需要大范围数值但不需要完全精确结果的计算,如物理学和其他科学计算。
- 精度问题:由于浮点数的表示方式,某些十进制小数无法精确表示,例如,0.1或者0.2这样的简单十进制小数在二进制浮点数中是无限循环小数,无法精确表示。
decimal
decimal
是一种128位的数据类型,主要设计用于财务计算,其中需要非常高的精度。decimal
类型可以提供至少28-29位的有效十进制精度,非常适合执行精确计算,如财务、货币和计量学领域的计算。
- 使用场景:适用于需要高精度十进制数计算的场景,特别是财务和货币计算。
- 精度优势:能够精确表示大多数十进制小数,避免了
double
类型中常见的精度问题。
反正说白了就是一旦涉及到要精度高的,比如货币运算以及研制两个小数之间是否等于我们直接采用decimal类型,值得注意的是在C#中我们使用decimal类型我们需要在每个数字的末尾加个m/M以表示我们使用的是decimal类型的
decimal和double的代码直观样例
//Double
Console.WriteLine("Using double:");
double a =0.1;
double b=0.2;
if(a+b==0.3)
{
Console.WriteLine($"{a}+{b} equals {0.3}");
}
else
{
Console.WriteLine($"{a}+{b} does NOT equal {0.3}");
}
//decimal
Console.WriteLine("Using decimal:");
decimal c =0.1M;
decimal d=0.2M;
if(c+d==0.3M)
{
Console.WriteLine($"{c}+{d} equals {0.3}");
}
else
{
Console.WriteLine($"{c}+{d} does NOT equal {0.3}");
}
代码样例输出
Using double:
0.1+0.2 does NOT equal 0.3
Using decimal:
0.1+0.2 equals 0.3
可以看到由于精度关系,我们使用double类型的时候0.1+0.2!=0.3,而当我们使用decimal的时候0.1+0.2=3
按位置顺序进行格式化输出
int numberOfApples=12;
decimal pricePerApple=0.35M;
Console.WriteLine(
format:"{0} apples cost {1:C}", //这个C代表的是货币符号,他辉哥根据电脑的设定的语言来输出对应的国家的货币符号
numberOfApples, //对应上行代码的0
pricePerApple * numberOfApples); //对应上行代码的1
使用[[DotNet7编程基础#原始内插字符串字面值|内插字符串]]进行格式化
Console.WriteLine($"{numberOfApples} apples cost {pricePerApple
* numberOfApples:C}");
const string firstname ="Omar";
const string lastname="Rudberg";
const string fullname =$"{firstname}{lastname}";
Console.WriteLine(fullname);
输出结果将会将字符串变量firstname和lastname拼接起来。这种方式的格式化输出,firstname和lastname必须是声明
了常量(const),否则将会报错。
格式字符串
完整的语法如下:
{index [,alignment] [:formatString]}
这里要对以上参数做一个解析:
其中index 是一个 C# 表达式,比如一个变量或者一个计算式。随你定
alignment 是一个可选项,它表示如何调整表达式的字符串表示形式的宽度。如果它是正数,则表示右对齐;如果它是负数,则表示左对齐。
formatString 也是一个可选项,它指定如何格式化表达式的值。例如,数字可以被格式化为货币、十进制、百分比等。
测试样例
string applesText="Apples";
int applesCount=1234;
string bananasText="Bananas";
int bananasCount=56789;
Console.WriteLine(
format:"{0,-10} age={1,6:N0}",
arg0:"name",
arg1:"Count"
);
Console.WriteLine(
format:"{0,-10} {1,6:N0}",
arg0:applesText,
arg1:applesCount
);
Console.WriteLine(
format:"{0,-10} {1,6:N0}",
arg0:bananasText,
arg1:bananasCount
);
样例输出
name age= Count
Apples 1,234
Bananas 56,789
获取用户的输入
ReadLine()方法将会等待用户输入文本此后用户每按Enter键,用户的输入内容将作为字符串值返回
测试样例
Console.Write("Type your fitst 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}.");
这里我要对上面第二行和第四行语句中的 ? ! 作出解释:
在默认情况下,在.NET6及后续版本中,启用了可空性检查,因此C#编译器会给出两个警告,因为ReadLine方法可能返回空值而不是字符串值。对于firstName变量,在字符串之后追加一个?,这告诉编译器,我们可能期望一个null值,所有它的警告将会消失。 而对于age变量来说,在语句末尾的分号之前追加一个!。这称为null-forgiving操作符,因为它告诉编译器,在这种情况下,ReadLine是不会返回null,因此可以让系统停止显示警告。
输出样例
Type your fitst name and press ENTER: Kun
Type your age and press ENTER:22
Hello Kun, you look good for 22.
为项目的所有代码文件导入相关的库
首先我们打开Formatting.csproj文件(这里我的文件名称叫Formatting,你需要根据你设定的文件名查找,反正是csproj的后缀名就对了),
获取用户的关键输入
我对于这个特定的理解是:这个操作能让操作人员知道用户输入的内容是如何输入的,比如是否按了组合键。
代码样例
Write("Press any key combination:");
ConsoleKeyInfo key = ReadKey();
WriteLine();
WriteLine("Key: {0}, char:{1}, Modifiers: {2}",
arg0:key.Key,
arg1:key.KeyChar,
arg2: key.Modifiers
);
样例输出
Press any key combination:I
Key: I, char:I, Modifiers: Shift
其实我们这个输出我们就可以看到了,获取到的key默认是大写字母,keychar获取到的是实际输入的键的值(区分大小写),Modifiers则代表了输入键遭到了谁的修改:例如我们按键盘i的同时我们按住shift,此时我们小写的i将会变成大写的I,而是什么导致i=》I的呢?当然就是这个shift键了,所以modifiers显示shift。
VScode中C# 的命令行参数输入
如何在VScode中输入命令行参数arg呢???其实很简单,接下来我将给予回答。
在网上搜了一圈发现都是要我在.vscode文件中的launch.json文件中输入那么一串代码,我去试了一下,但是没成功,哎,后面翻了书本,发现根本不需要这么麻烦,我们只需要按照以下代码方式运行即可:
dotnet run hello world
跟在run 后面的hello 和world 其实就是两个命令行参数了!!!
使用object类型存储数据
概念
object
是C#中所有类型的基类
// object类型储存
object height =1.88;
object name ="Amir";
string namecopy= (string)name;//显式转换,不显式转换会报错
Console.WriteLine($"{name} is {height} metres tall.");
^e21b05
样例输出
Amir is 1.88 metres tall.
注意细节
//int length1 = name.Length;
int length2=((string)name).Length;//必须要转成string类的具体数据类型 ,否则单独的object调用Length编译器不知道调用的是什么类型的数据。
Console.WriteLine($"{name} has {length2} charcters.");
就像object类型转回原始数据类型需要显式转换一样object调用长度函数依旧需要对name类型进行转换,否则编译器不知道其调用的是string类型的长度函数还是别的类型的长度函数。
动态存储类型(dynamic
关键字)
dynamic
类型在编译时不检查类型,并允许在运行时改变类型。
测试样例
dynamic something = "Ahmed";
something = 12;
something = new[] { 3, 5, 7 };
Console.WriteLine($"Length is {something.Length}");`
推断局部变量的类型(var
关键字)
使用
var
关键字可以让编译器自动推断变量的类型,简化代码编写。
测试样例
var population = 67_000_000; // 推断为int
var weight = 1.88; // 推断为double
var price = 4.99M; // 推断为decimal`
面向类型的new
实例化对象
C# 9引入的目标类型
new
表达式允许在实例化对象时省略类型名称,前提是这个类型已经通过变量声明指明。
测试样例
XmlDocument xml3 = new();
Person kim = new();
kim.BirthDate = new(1967, 12, 26);
获取和设置类型的默认值(default
关键字)
使用
default
关键字可以获取任何类型的默认值。
测试样例
Console.WriteLine($"default(int) = {default(int)}"); // 输出:default(int) = 0 Console.WriteLine($"default(bool) = {default(bool)}"); // 输出:default(bool) = False`
声明赋值后将变量重置为默认值
声明变量并赋值后,可以使用
default
关键字将其重置为默认值。
测试样例
int number = 13; Console.WriteLine($"number has been set to: {number}");
number = default; // 重置为默认值
Console.WriteLine($"number has been reset to its default: {number}");
样例输出
number has been set to: 13
number has been reset to its default:0
可以看到int的默认值系统设定是0所以我们给number复制default的时候其值变为0.
推荐阅读: