zoukankan      html  css  js  c++  java
  • 13 个 C# 10 特性

    原文链接:https://blog.okyrylchuk.dev
    原文作者:Oleg Kyrylchuk
    译: 等天黑

    常量的内插字符串

    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
    
    
  • 相关阅读:
    微信公众号平台接口开发:基础支持,获取微信服务器IP地址
    微信公众号平台接口开发:基础支持,获取access_token
    微信公众号平台接口开发:发送客服消息
    asp.net权限认证篇外:集成域账号登录
    asp.net权限认证:OWIN实现OAuth 2.0 之简化模式(Implicit)
    asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
    asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
    asp.net权限认证:OWIN实现OAuth 2.0 之客户端模式(Client Credential)
    window配置ftp服务,代码客户端上传下载文件
    制作OpenStack使用的windows镜像
  • 原文地址:https://www.cnblogs.com/myshowtime/p/15747663.html
Copyright © 2011-2022 走看看