C#8.0,9.0,10.0常见新语法学习
顶级语句
(1)一个项目最多只能有一个文件具有顶级语句,就是直接写代码,如果存在多个,则会报错,
(2)如果顶级语句和Main共存,则只调用顶级语句
(3)如果没有顶级语句,则必须有Main
简化using声明
简化using声明省去了大括号,使用“using声明”的变量是在离开变量作用域的时候,进行资源回收,但需要注意一些问题:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
using var outStream = File.OpenWrite("sample.txt");
using var writer = new StreamWriter(outStream);
writer.WriteLine("hello,tonight");
string s = File.ReadAllText("sample.txt");
Console.WriteLine(s);
由于outStream和writer在方法执行后,才被释放资源,因此,用File来ReadAllText时候,文件仍然占用,抛出“System.IO.IOException:“The process cannot access the file 'G:\CSharpLeannings\DOTNETCORE\samples\CSharp9Learn\bin\Debug\net6.0\sample.txt' because it is being used by another process.”异常
解决方法是:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
{
using var outStream = File.OpenWrite("sample.txt");
using var writer = new StreamWriter(outStream);
writer.WriteLine("hello,tonight");
}
string s = File.ReadAllText("sample.txt");
Console.WriteLine(s);
人为加一个作用域块,当outStream脱离作用域块时候,调用DisPose方法,释放资源即可。
可为空的引用类型
原因是csproj中,有:
,如果改为false,则没有该警告。
Record
异步编程
async方法中,没有await,则该方法被调用时,前面加个await,会发生什么
如果在异步方法中没有使用 await,则该方法将被视为同步方法,并且在调用它时将按照普通的同步方法进行执行,且编译器会警告。这意味着在没有 await 的情况下,方法将在执行完所有的代码后返回其结果,而不会等待任何异步操作完成。
如果在调用该方法时添加了 await,则当前线程将暂停等待该方法的执行,直到异步操作完成并返回结果。在这种情况下,使用 await 的主要目的是将异步方法的执行交还给调用方,以便调用方可以继续执行其他操作,而不需要等待异步方法完成。
需要注意的是,如果异步方法没有使用 await,则使用 await 调用该方法可能会导致死锁或阻塞线程,因为调用方线程将一直等待方法的返回,而方法本身不会执行异步操作或释放线程,这将导致线程阻塞。因此,应该仅在确保异步方法中包含异步操作的情况下使用 await 调用该方法。