• [译]. NET 6 新增API 下


    介绍

    接下来我将给大家重点介绍一下.Net 6 之后的一些新的变更,文章都是来自于外国大佬的文章,我这边进行一个翻译,并加上一些自己的理解和解释。

    源作者链接:https://blog.okyrylchuk.dev/20-new-apis-in-net-6#heading-a-new-periodictimer

    正文

    Power of 2

    .NET 6 引入了使用 2 的幂的新助手。

    • 'IsPow2' 评估指定值是否为 2 的幂。
    • 'RoundUpToPowerOf2' 如果超过了最大值,即2的30此幂,将设置成最大值,如果这个数的二进制是零的话返回1,即输入0返回1。
    // IsPow2 evaluates whether the specified Int32 value is a power of two.
    Console.WriteLine(BitOperations.IsPow2(128));            // True
    
    // RoundUpToPowerOf2 rounds the specified T:System.UInt32 value up to a power of two.
    Console.WriteLine(BitOperations.RoundUpToPowerOf2(200)); // 256
    
    

    等待异步任务

    您可以更轻松地等待任务异步完成执行。操作超时时抛出“TimeoutException”。

    ⚠️这是不可取消的操作!

    Task operationTask = DoSomethingLongAsync();
    
    await operationTask.WaitAsync(TimeSpan.FromSeconds(5));
    
    async Task DoSomethingLongAsync()
    {
        Console.WriteLine("DoSomethingLongAsync started.");
        await Task.Delay(TimeSpan.FromSeconds(10));
        Console.WriteLine("DoSomethingLongAsync ended.");
    }
    
    // Output:
    // DoSomethingLongAsync started.
    // Unhandled exception.System.TimeoutException: The operation has timed out.
    
    

    新的数学 API

    新方法:

    • SinCos
    • ReciprocalEstimate
    • ReciprocalSqrtEstimate

    新的重载:

    • Min, Max, Abs, Sign, Clamp supports nint and nuint
    • DivRem variants return a tuples
    // New methods SinCos, ReciprocalEstimate and ReciprocalSqrtEstimate
    // Simultaneously computes Sin and Cos
    (double sin, double cos) = Math.SinCos(1.57);
    Console.WriteLine($"Sin = {sin}\nCos = {cos}");
    
    // Computes an approximate of 1 / x
    double recEst = Math.ReciprocalEstimate(5);
    Console.WriteLine($"Reciprocal estimate = {recEst}");
    
    // Computes an approximate of 1 / Sqrt(x)
    double recSqrtEst = Math.ReciprocalSqrtEstimate(5);
    Console.WriteLine($"Reciprocal sqrt estimate = {recSqrtEst}");
    
    // New overloads
    // Min, Max, Abs, Clamp and Sign supports nint and nuint
    (nint a, nint b) = (5, 10);
    nint min = Math.Min(a, b);
    nint max = Math.Max(a, b);
    nint abs = Math.Abs(a);
    nint clamp = Math.Clamp(abs, min, max);
    nint sign = Math.Sign(a);
    Console.WriteLine($"Min = {min}\nMax = {max}\nAbs = {abs}");
    Console.WriteLine($"Clamp = {clamp}\nSign = {sign}");
    
    // DivRem variants return a tuple
    (int quotient, int remainder) = Math.DivRem(2, 7);
    Console.WriteLine($"Quotient = {quotient}\nRemainder = {remainder}");
    
    // Output:
    // Sin = 0.9999996829318346
    // Cos = 0.0007963267107331026
    // Reciprocal estimate = 0.2
    // Reciprocal sqrt estimate = 0.4472135954999579
    // Min = 5
    // Max = 10
    // Abs = 5
    // Clamp = 5
    // Sign = 1
    // Quotient = 0
    // Remainder = 2
    
    

    CollectionsMarshal.GetValueRefOrNullRef

    它返回一个可以就地更新的结构值的引用。它不是用于一般用途,而是用于高性能场景。

    Dictionary<int, MyStruct> dictionary = new()
    {
        { 1, new MyStruct { Count = 100 } }
    };
    
    int key = 1;
    ref MyStruct value = ref CollectionsMarshal.GetValueRefOrNullRef(dictionary, key);
    // Returns Unsafe.NullRef<TValue>() if it doesn't exist; check using Unsafe.IsNullRef(ref value)
    if (!Unsafe.IsNullRef(ref value))
    {
        Console.WriteLine(value.Count); // Output: 100
    
        // Mutate in-place
        value.Count++;
        Console.WriteLine(value.Count); // Output: 101
    }
    
    struct MyStruct
    {
        public int Count { get; set; }
    }
    
    

    配置主机选项

    IHostBuilder 上的新 ConfigureHostOptions API。它使应用程序设置更简单。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureHostOptions(o =>
                {
                    o.ShutdownTimeout = TimeSpan.FromMinutes(10);
                });
    }
    
    

    创建异步范围

    .NET 6 引入了一个新的CreateAsyncScope方法来创建AsyncServiceScope。处置IAsyncDisposable服务时,现有的CreateScope方法会引发异常。CreateAsyncScope提供了一个简单的解决方案。

    await using var provider = new ServiceCollection()
            .AddScoped<Example>()
            .BuildServiceProvider();
    
    await using (var scope = provider.CreateAsyncScope())
    {
        var example = scope.ServiceProvider.GetRequiredService<Example>();
    }
    
    class Example : IAsyncDisposable
    {
        public ValueTask DisposeAsync() => default;
    }
    
    

    加密操作的简化调用模式

    SymmetricAlgorithm上的新方法可在有效负载已在内存中时避免流:

    • DecryptCbc
    • DecryptCfb
    • DecryptEcb
    • EncryptCbc
    • EncryptCfb
    • EncryptEcb
    static byte[] Decrypt(byte[] key, byte[] iv, byte[] ciphertext)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            return aes.DecryptCbc(ciphertext, iv, PaddingMode.PKCS7);
        }
    }
    

    结语

    联系作者:加群:867095512 @MrChuJiu

    公众号

  • 相关阅读:
    codeforces round #433 div2
    bzoj1951
    bzoj3620
    bzoj2286
    bzoj1513
    bzoj4390
    codeforces round 430 div 2
    bzoj3339
    准备实现体积蒙皮
    看牛顿法的改进与验证局部收敛
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/15812268.html
Copyright © 2020-2023  润新知