转自:马克康
cnblogs.com/markkang/archive/2020/05/22/12928528.html
在微软的Build 2020开发者大会上,微软解释了即将添加的C#9.0的一些主要特性。
I. init属性访问器
对象初始化是一种非常灵活和可读的创建对象的格式,尤其是创建树嵌入对象。简单的例子
新人
{
FirstName= "Scott ",
姓氏=“猎人”
}
最初,为了初始化对象,我们必须编写一些属性,在构造函数的初始调用中,我们可以通过给属性的setter赋值来实现这一点。
publicclassPerson
{
publicstringFirstName { get设置;}
publicstringLastName { get设置;}
}
第二,初始化属性访问器和只读字段
因为init访问器只能在初始化期间调用,所以只能在构造函数中初始化的只读字段现在可以在属性中而不是构造函数中初始化。构造函数被省略。
publicclassPerson
{
privatereadonlystringfirstName;
privatereadonlystringlastName
publicstringFirstName
{
get= >;名字;
init =>。firstName =(值??throwNewargumentNullException(name of(First name)));
}
publicstringLastName
{
get= >;姓氏;
init =>。lastName =(值??throwNewargumentNullException(name of(LastName)));
}
}
三.记录
四.带着表情
varotherPerson =具有{ LastName = "Hanselman"}的人;
5.基于价值的平等
如果不喜欢默认为Equals重写的字段和字段比较行为,可以重写。你只需要仔细了解基于值的等式在记录中是如何工作的,特别是涉及到继承的时候,后面会提到。
除了基于值的Equals,还有一个基于值的GetHashCode的覆盖。
不及物动词数据成员
这使得记录语句看起来美观、清晰、直观。如果确实需要私有字段,可以显式添加私有修饰符。
privatestringfirstName
七.位置记录
您可以在记录中指定构造函数和析构函数(注意它们不是析构函数)。
publicdata classPerson
{
stringFirstName
stringLastName
publicPerson( stringfirstName,stringlastName)
= >;(名字,姓氏)=(名字,姓氏);
公共失效解构(超越域名,超越域名)
= >;(名字,姓氏)=(名字,姓氏);
}
你也可以用更简洁的语法表达同样的内容。
public data CLaSS person(StringFirstName,StringLastName);
该方法用初始化、构造函数和解构函数声明开放的自动属性,不同于第6条第1款中用大括号声明的方法。现在,您可以编写以下代码:
varperson = newPerson( "Scott "," Hunter ");//位置构造
var(f,l)= person;//位置解构
九.表达与继承
众所周知,基于等值和价值无损变化的方法,在与继承交织时,是很有挑战性的。接下来,我们添加一个继承记录类学生来说明我们的例子:
public data CLaSS person { StringFirstName;stringLastName}
public data class student:Person { Intid;}
接下来,我们通过创建一个学生来说明with表达式的使用,但是将它存储在Person变量中:
person person = new Student { first name = " Scott ",LastName = "Hunter ",ID = getnew ID };
otherPerson=具有{ LastName= "Hanselman"}的人;
然而,平等有一个特殊的挑战,即如果比较两种不同类型的人会发生什么?我们不能让其中一个来决定适用哪个平等:平等应该是语义上的,所以无论两个对象哪个先来,解构都应该是一样的。换句话说,他们必须就适用的平等达成一致。
这个问题的例子如下:
personal Person 1 = new Person { first name = " Scott ",last name = " Hunter " };
Personperson2 =新学员{ FirstName= "Scott ",LastName = "Hunter ",ID = GetNewid };
usingSystem
classProgram
{
staticvoidMain()
{
控制台。写线(“你好世界!”);
}
}
这对于初学者来说是不可抗拒的,但是会让代码凌乱,堆积很多,增加缩进量。在C#9.0中,您可以选择用以下代码在顶层编写您的主程序:
usingSystem
控制台。写线(“你好世界!”);
十二.增强型模式匹配
C#9.0增加了几个新的模式。如果您想了解以下代码片段的上下文,请参考模式匹配教程:
public static decimal CalculateToll(目标车辆)= > gt;
车辆开关
{
...
当总重量级>时交货卡车测试;5000=>。10.00m + 5.00m,
当t . GrossWeightClass & lt3000=>。10.00米-2.00米,
送货卡车_ = >;10.00米,
_ = >;抛出新车型异常(“未知车型”,车辆名称))
};
交货卡车t当t.GrossWeightClass开关
{
>。5000=>。10.00m + 5.00m,
& lt3000=>。10.00米-2.00米,
_ = >;10.00米,
},
这里是>:5000和
3.逻辑模式
最后,可以将模式与逻辑运算符and、or、and结合起来,不做详细解释,避免表达式运算符带来的混乱。例如,上面嵌入的开关可以按升序排序,如下所示:
交货卡车t当t.GrossWeightClass开关
{
& lt3000=>。10.00米-2.00米,
>。= 3000and<。= 5000=>。10.00米,
>。5000=>。10.00m + 5.00m,
},
在中间情况下,和用于组合两个关系模式以形成表示区间的模式。
not模式的常用是会用在null常量模式上,就像not null一样。例如,我们需要根据是否为空,来划分一个未知的案件处理代码段:
不为null=>。thrownewArgumentException( $“未知车辆类型:{车辆}”,车辆名称)),
null=>。thrownewArgumentNullException(车辆名称)
在包含is表达式的if条件语句中不使用它也很方便,而且它将替换重双括号:
if(!(e isCustomer)) {...}
你可以这样写:
if(e isnotCustomer) {...}
十三.增强的目标类型
点p =新(3,5);
2.目标是打字的吗??然后呢?:
有时候,条件表达式??然后呢?:分行没有明显的共享类型。目前这种情况会失败,但是在C#9.0中,如果每个分支都可以转换成目标类型,这种情况是允许的。
人人=学生??客户;//共享基本类型
int?结果= b?0:null;//可空值类型
十四.支持协变返回值
有时,在子类的重写方法中返回更具体的返回类型更有用,这不同于父类的方法定义。C# 9.0支持这种情况。
抽象类动物
{
public abstractfood GetFood();
...
}
类别老虎:动物
{
publicatoverrideate GetFood()= >;...;
}
1.《lastname Build 2020上公布的C# 9.0新特性》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《lastname Build 2020上公布的C# 9.0新特性》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1106076.html