2.1C#新语法

.net Core重难点知识

C#新语法

顶级语句

之前必须有类和类中的Main方法,从C#9.0开始,可以直接在C#文件中编写入口代码,不需要再声明类和方法

//之前的方法
	internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
//顶级语句
	Console.WriteLine("Hello, World!");

一个项目中只能有一个文件具有顶级语句

全局using指令

有些类库在多个文件中都会引用,使用全局using指令可以只写一遍则项目中所有的源码都可以使用了,通常将全局using指令单独写一个C#文件。

global using Mircrosoft.Data.Sqlite;
global using System.Text.Json;

另外,在csproj文件中加入<ImplicitUsings>enable</ImplicitUsings>编译器会根据项目类型自动隐式加上System等常用明明空间的引入。

using声明

//旧的using释放资源,里面有多重嵌套
using (var conn = new SqlConnection(connStr))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "select * from T_Articles";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
            }
        }
    }
}

C#8以后,可以使用using声明如果类型实现了IDisposable或者IAsyncDisposable接口,则当代码离开using声明的变量作用域的时候,自动调用Dispose方法。

using System.Data.SqlClient;
string connStr = "Data Source=.;Initial Catalog=demo1;Integrated Security=True";

using var conn = new SqlConnection(connStr);
conn.Open();
using var cmd = conn.CreateCommand();
cmd.CommandText = "select * from T_Articles";
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
}

要注意使用的时机

//以下是有问题的代码
/*
using var outStream = File.OpenWrite("e:/1.txt");
using var writer = new StreamWriter(outStream);
writer.WriteLine("hello");
string s = File.ReadAllText("e:/1.txt"); //这句会报错,因为此时1.txt仍然被outStream占用
Console.WriteLine(s);*/
{
    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);

简化命名空间声明

之前版本,类必须在命名空间中

namespace ConsoleApp2
{
    class Program
    {
    }
}

在C#10之后,可以不再使用{},文件中所有的类型都是这个命名空间下的成员

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

可空类型

在引用类型后面加上?表示该变量是可以为null

在使用该变量后,vs会给出警告“解引用可能出现空引用”

如果确定变量不会为空,则可以使用!抑制编译器的警告person.number!.ToLower(),但是尽量少用

记录类型

如果两个对象为同一类型,并且属性完全相等,但是他们为不同的对象,使用==比较的话会返回false,可以通过重写Equals、==等来解决,但是比较麻烦。

C#9.0新增记录(record)类型,自动生成Equals,GetHashcode,ToString等方法。

public record Person(string FirstName, string LastName);

编译器会根据Person中的属性定义(括号中),自动生成包含全部属性的构造方法。此时使用new Person()/new Person("张三")是错误的,但是所有的属性是只读的。

Person p1 = new Person("Zack", "Yang");
Person p2 = new Person("Zack", "Yang");
Console.WriteLine(p1);//Person { FirstName = Zack, LastName = Yang }
Console.WriteLine(p1 == p2);// true 此时比较的是两个对象的属性值

定义部分属性可读可写

public record Person(string LastName)
{
    public string FirstName { get; set; }
    public void SayHello()
    {
        Console.WriteLine($"Hello,我是{LastName} {FirstName}");
    }
}

此时LastName仍然是自动生成的可读属性。新建实例:Person s = new Person("y")

提供多个构造函数

public record User(string UserName, string? Email, int Age)
{
    public User(string userName, int age)
        : this(userName, null, age){ }
}
  1. 编译器会自动生成包含这3个属性的构造方法
  2. 自己可以自定义其他的构造方法

总结:recode总是默认生成包含全部属性的构造函数,且属性是只读的

创建副本

User u1 = new User("a","b",19);
User u2 = new User(u1.userName,"c",20);//可以使用这种方法
User u3 = u1 with(Email="test@qq.com");//推荐
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C是计算机科学中的一种编程语言。它是由贝尔实验室的丹尼斯·里奇开发的,并且在1972年首次发布。C语言是一种高级编程语言,但也包含了许多低级编程语言的特性。它的设计目的是为了开发操作系统,并具有高效、灵活和可移植的特点。 C语言被广泛应用于软件开发和系统编程领域。它被称为“程序员的语言”,因为它提供了一系列强大的工具和功能,可以帮助程序员完成各种任务。 C语言具有简洁而直观的语法,使得它容易学习和理解。它的核心概念包括变量、数据类型、运算符、表达式、控制流语句和函数。这些概念可以被组合和组合,以开发复杂的程序。 C语言的优点之一是它的效率。由于它是一种编译型语言,C代码可以被直接编译成机器语言,从而提高了程序的执行速度。此外,C语言还允许程序员直接访问计算机的内存和硬件资源,使得程序的性能更好。 另一个C语言的优点是它的可移植性。C语言的代码可以在不同的操作系统和硬件平台上运行,因为它提供了一套标准的库和规范。这使得开发人员可以在不同的环境中进行开发,并且能够轻松地将代码移植到其他平台上。 总而言之,C语言是一种强大而灵活的编程语言。它在软件开发和系统编程领域中扮演着重要的角色,因为它具有高效、可移植和易用的特点。无论是初学者还是经验丰富的程序员,都可以通过学习和使用C语言开发高质量的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步、步、为营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值