首页 > 编程语言 >C#新语法

C#新语法

时间:2024-07-20 22:51:46浏览次数:11  
标签:string C# 语法 Person 编译器 类型 using

要脑子有什么用,它只会想你。 --zhu
顶级语句(C#9.0)
1、直接在C#文件中编写入口方法的代码,不用类,不用Main。经典写法仍然支持,可以反编译了解一下。
2、同一个项目中只能有一个文件具有顶级语句。

namespace p4_1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

变成下面:

Console.WriteLine("Hello, World!");

3、顶级语句中可以直接使用await语法,也可以声明函数。

string f = await File.ReadAllTextAsync("d/1.txt");

而不用 async task

全局USING 指令(C#10.0)
1、将global修饰符添加到using前,这个命名空间就应用到整个项目,不用重复using。
2、通常创建一个专门用来编写全局using代码的C#文件。
3、如果csproj中启用了enalbe,编译器会自动隐式增加对于System、System.Linq等常用命名空间的引入,不同各类型项目引入的命名空间也不一样。

Using资源管理问题
1、复习:实现了IDisposible接口的对象可以用using进行管理。
2、问题:如果一段代码中有很多非托管资源需要被释放,代码存在多个嵌套using语句。

Using声明(C#8)
在实现了IDisposible/IAsyncDisposable接口的类型变量声明加上using,当代码执行离开变量的作用域时,对象就会被释放。

using SqlConnection conn = new SqlConnection ();

using声明陷阱

using var outStream = File.OpenWrite("e:/1.txt");
using var writer =new StreamWriter(outStream);
writer.WriteLine("hello");
string s= File.ReadAllText("e:/1.txt");
Console.WriteLine(s);

会报错文件被占用,因为两个using都没有离开作用域,不会Disposible掉。
可以写成

{
  using var outStream = File.OpenWrite("e:/1.txt");
  using var writer =new StreamWriter(outStream);
}

文件范围的命名空间声明(C#10)
1、之前版本的C#中,类型必须定义在namespace中。
2、

namespace TMS.Admin;
class Teacher
{
  public int Id{get;set;}
  public string Name{get;set;}
}

可空的引用类型(C#8)
1、复习:C#数据类型分为值类型和引用类型两种,值类型的变量不可以为空,而引用类型变量可以为空。
2、问题:如果不注意检查引用类型变量是否可空,就有可能造成程序中出现NullReferenceException异常。
3、csproj中enable启用可空引用类型检查。
4、在引用类型后添加“?”修饰符来声明这个类型是可空的。对于没有添加“?”修饰符的引用类型的变量,如果编译器发现存在为这个变量赋值null的可能性的时候,编译器会给出警告信息。

public string? Name {get;set;}

5、使用!抑制警告(不用滥用)
如果程序员确认被访问的变量、成员确实不会出现为空的情况,也可以在访问为空的变量、成员的时候加上!来抑制编译器的警告。

记录(RECORD)类型(C#9)
1、C#中的运算符默认是判断两个变量指向的是否是同一个对象,即使两个对象内容完全一样,也不相等。可以通过重写Equals方法、重写==运算符等来解决这个问题,不过需要开发人员编写非常多的额外代码。
2、在C#9.0增加了记录(record)类型的语法,编译器会为我们自动生成Equals、GetHashcode等方法。

public record Person(string FirstName,string LastName);
Person p1 = new Person(3,"张三",18);

原理探究
1、编译器会根据Person类型中的属性定义,自动为Person类型生成包含全部属性的构造方法,因此,我们编写new Person()、new Person("zhang")这两种写法都是不可以的。也会生成Tostring方法和Equals等方法。
2、通过反编译看背后原理。避record就是一个普通的类。
3、record数据类型为我们提供了为所有属性赋值的构造方法,所有属性都是只读的,而且对象可以进行值相等性比较,并且提供了可读性强的ToString()返回值。在需要编写一些不可变类并且需要进行对象值比较的对象时候,record可以帮我们把代码的编写难度大大降低。
4、可以实现部分属性只读的、而部分属性可以读写。
5、默认生成的构造方法的行为不能修改,我们可以为类型提供多个构造方法,然后其他构造方法通过this调用默认的构造方法。
6、推荐使用只读属性的类型。这样所有属性都为只读类型叫做“不可变类型“,可以让程序逻辑简单,减少并发访问、状态管理等的麻烦。

标签:string,C#,语法,Person,编译器,类型,using
From: https://www.cnblogs.com/zhusichen/p/18312892

相关文章

  • UE富文本框RichTextBlock的内容设置不同的字体颜色
    一、新建富文本样式行1.新建数据表 2.选择富文本样式行 二、添加样式 三、应用1.设置样式 2.包裹字体 四、效果展示 可根据自己的样式去包裹文本。......
  • Libtorch与QTOpenCV 和 Point Cloud Library 一起使用时出现错误
    我正在尝试在项目中使用libtorch、qt小部件、点云库(pcl)和opencv。对于这个项目,我使用的是cmake列表。问题是当我同时使用所有四个库时,libtorch会抛出错误。如果我使用libtorch、opencv和qt,一切正常,如果我使用pclqt和opencv,一切也都很好。我得到的错误列在下面:/libto......
  • Linux C++ 065-设计模式之组合模式
    LinuxC++065-设计模式之组合模式本节关键字:Linux、C++、设计模式、组合模式相关库函数:概念组合模式(CompositePattern),又叫做部分-整体模式,使得用户对单个对象和组合对象的使用具有一致性。它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理......
  • Linux C++ 066-设计模式之访问者模式
    LinuxC++066-设计模式之访问者模式本节关键字:Linux、C++、设计模式、访问者模式相关库函数:概念在访问者模式(VisitorPattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模......
  • 基于 Mockito 框架的 Mock 测试
    1.什么是Mock测试Mock通常是指,在测试一个对象A时,我们构造一些假的对象(一般是不容易构造或者不容易获取的对象,比如测试类所依赖的实现类、第三方接口、数据库操作对象)来模拟与A之间的交互,这些对象被称为Mock对象,而Mock对象的行为是我们事先设定且符合预期。通过......
  • Docker Compose 安装
    1、下载docker-composesudocurl-L"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname-s)-$(uname-m)"-o/usr/local/bin/docker-compose最新版docker-compose下载sudocurl-L"https://github.com/docker/compose/release......
  • React函数式组件---Hooks
            这里先简单复习一下函数式组件:没有自己的this,没有实例对象,不能使用三大属性中的state和refs,仅能用props;不能使用生命周期!1.ReactHook/Hooks是什么?(1).Hook是React16.8.0版本增加的新特性/新语法(2).可以让你在函数组件中使用state以及其他的React......
  • 使用 selenium 在 python 中打开 chrome 中的链接
    通过此链接https://bancadatistatisticaoas.inail.it/analytics/saw.dll?Dashboard&PortalPath=%2Fshared%2FBDS%2F_portal%2FINF_Definiti_Industria_e_Servizi我需要单击“FCostruzioni”,然后单击F41COSTRUZIONIED埃迪菲西。这是我的代码,但它不起作用。我做错了......
  • CF140E New Year Garland
    题意有\(m\)种小球,用这些小球装饰一棵\(n\)层的圣诞树,每层需要放置\(a_i\)个小球。在每一层中,相邻球颜色不同,且相邻两层球颜色集合不同,求装饰圣诞树的方案数,答案对\(p\)取模。\(1\len,m\le10^6,2\lep\le10^9,1\lea_i\le5000,\sum_{i=1}^na_i\le10^7\qquad\tex......
  • Java学习日历(static,工具类,继承)
    staticstatic表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量。特点:被该类所有对象共享不属于对象,属于类随着类的加载而加载,优先于对象存在调用方式:类名调用(推荐)对象名调用工具类帮助我们做一些事情的,但是不描述任何事物的类类名见名知意私有化构造方法......