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

使用内插字符串进行格式化

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的后缀名就对了),

.NET7学习笔记(基础语法篇)第一弹

获取用户的关键输入

我对于这个特定的理解是:这个操作能让操作人员知道用户输入的内容是如何输入的,比如是否按了组合键。

代码样例


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类型转换回原始数据类型时,需要使用[[#^e21b05|显式转换]]。

    测试样例

// 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.