欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#10的13个特性

程序员文章站 2022-03-25 08:22:12
常量的内插字符串c# 10 允许使用在常量字符串初始化中使用插值, 如下const string name = "oleg";const string greeting = $"hello, {nam...

C#10的13个特性

常量的内插字符串

c# 10 允许使用在常量字符串初始化中使用插值, 如下

const string name = "oleg";
const string greeting = $"hello, {name}.";

console.writeline(greeting);
// output: hello, oleg.

扩展属性模式

从 c# 10 开始,您可以在适当的模式中引用嵌套的属性或字段, 属性模式变得更具可读性并且需要更少的大括号。

person person = new()
{
    name = "oleg",
    location = new() { country = "pl" }
};

if (person is { name: "oleg", location.country: "pl" })
{
    console.writeline("it's me!");
}

class person
{
    public string name { get; set; }
    public location location { get; set; }
}

class location
{
    public string country { get; set; }
}

如果location为null,则不会匹配模式并返回false。

文件范围的命名空间

c# 10 引入了一种新的命名空间声明方式 - 文件范围的命名空间,减少一个大括号,代码结构更简洁。

namespace filescopednamespace;

class program
{
    static void main(string[] args)
    {
        console.writeline("hello world!");
    }
}

全局 using

一次引用,全局通用

global using system;
global using system.collections.generic;
global using system.linq;
global using system.threading.tasks;

list<int> list = new() { 1, 2, 3, 4 };
int sum = list.sum();
console.writeline(sum);

await task.delay(1000);

同一个解构中的赋值和声明

c# 10 可以在同一个解构中进行赋值和声明。

var rgb = (255, 100, 30);

// initialization & assignment
int r;
(r, int g, int b) = rgb;

console.writeline($"rgb: {r}, {g}, {b}");
// output: rgb: 255, 100, 30

record 类型重写 tostring() 时支持密封

product product = new() { name = "bread" };
console.writeline(product.tostring());
// output: bread

public record product
{
    public string name { get; init; }

    public sealed override string tostring()
    {
        return name;
    }
}

record struct

c# 10 支持 record struct

person me = new() { firstname = "oleg", lastname = "kyrylchuk" };

console.writeline(me);
// output: person { firstname = oleg, lastname = kyrylchuk }

person otherperson = me with { firstname = "john" };
console.writeline(otherperson);
// output: person { firstname = john, lastname = kyrylchuk }

person anotherme = new() { firstname = "oleg", lastname = "kyrylchuk" };
c onsole.writeline(me == anotherme);
// output: true

record struct person
{
    public string firstname { get; init; }
    public string lastname { get; init; }
}

record struct product(string name, decimal price);

struct 字段支持初始化

using system;

person person = new() { name = "oleg" };

console.writeline(person.id + " " + person.name);
// output: 0cc6caac-d061-4f46-9301-c7cc2a012e47 oleg

struct person
{
    public guid id { get; init; } = guid.newguid();
    public string name { get; set; }
}

lambda 表达式的 attributes 支持

c# 9 支持本地函数的 attributes, c# 10 添加了 lambda 表达式的 attributes 支持。

action a = [myattribute] () => { };                
action<int> b =[return: myattribute] (x) => { };  
action<int> c =[myattribute] ([myattribute] x) => { };       


class myattribute : attribute
{ }

lambda 中的显式返回类型

test<int>();

var l1 = string () => string.empty;
var l2 = int () => 0;
var l3 = static void () => { };

void test<t>()
{
    var l4 = t () => default;
}

应用于方法的 asyncmethodbuilder 特性

从 c# 7 开始,您只能将asyncmethodbuilder 特性应用于类型, 在 c# 10 中,您还可以将该特性应用于单个方法。

using system.runtime.compilerservices;

class example
{
    [asyncmethodbuilder(typeof(asyncvoidmethodbuilder))]
    public void examplemethod()
    {
    }
}

结构体中的表达式

c# 10 支持 将 with 表达式和 struct 一起使用

product potato = new() { name = "potato", category = "vegetable" };
console.writeline($"{potato.name} {potato.category}");
// output: potato vegetable

product tomato = potato with { name = "tomato" };
console.writeline($"{tomato.name} {tomato.category}");
// output: tomato vegetable

struct product
{
    public string name { get; set; }
    public string category { get; set; }
}

匿名类型中的表达式

c# 10 支持 将 with 表达式和匿名类型一起使用

var potato = new { name = "potato", category = "vegetable" };
console.writeline($"{potato.name} {potato.category}");
// output: potato vegetable

var onion = potato with { name = "onion" };
console.writeline($"{onion.name} {onion.category}");
// output: onion vegetable

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关标签: C# 10 特性