Nuevas funciones en C# 7.0

  1. variable de salida
    old:
    int x, y; // 需要“预声明”
    p.GetCoordinates(out x, out y);
    new:
    p.GetCoordinates(out int x, out int y);
  2. la coincidencia de patrones 
    带模式的 Is 表达式
    if (o is null) return; //常量模式
    
    if (o is int i) return; //类型模式
    
    
    带模式的 Switch 语句shape是Circle、Rectangle的基类
    switch(shape)
    {
        case Circle c:
            WriteLine($"circle with radius {c.Radius}");
            break;
        case Rectangle s when (s.Length == s.Height):
            WriteLine($"{s.Length} x {s.Height} square");
            break;
        case Rectangle r:
            WriteLine($"{r.Length} x {r.Height} rectangle");
            break;
        default:
            WriteLine("<unknown shape>");
            break;
        case null:
            throw new ArgumentNullException(nameof(shape));
    }
  3. Tuple  devuelve múltiples valores de un método
    public Test() 
    {
        var name = FullName();
        Console.WriteLine(name.Item1 + name.Item2 + name.Item3); //输出元组值
                
        //可以用重命名的方式接受参数
        //(var frist, var middle, var last) = FullName();
        
        //var (frist_1, middle_1, last_1) = FullName();
    }
    
    (string, string, string) FullName() //返回多个值(元组)
    {
        return ("1", "2", "3"); 
    }
  4. Las mejoras literales  permiten usar "_" como separador de números en literales numéricos
    var d = 123_456;
    var x = 0xAB_CD_EF;
  5. Ref devoluciones y local
    int[] array = { 1, 5};
    ref int place = ref array[1];
    place = 9;
    Console.WriteLine(array[1]); //这里输出是9
  6. El tipo de devolución de Async aumenta.  Las llamadas a métodos asíncronos en C# deben devolver void, Task o Task<T> c# 7.0 Valor agregadoTask<T>   Task  y  Task<TResult>  son tipos de referencia, por lo que la asignación de memoria tendrá un impacto negativo en el rendimiento ValueTask es una estructura. Esto tiene una ventaja de rendimiento porque ValueTask no tiene objetos en el montón. El uso de ValueTask<T> como tipo de devolución en un método asincrónico puede resultar costoso si los consumidores del método asincrónico usan Task.WhenAll o Task.WhenAny. Esto se debe a que necesita usar el método AsTask para convertir ValueTask<T> en Task<T>, lo que generará una asignación que se puede evitar fácilmente si primero se usa Task<T> en caché. (El paso de parámetros de estructura es una copia superficial)
  7. Más miembros del cuerpo de  expresión Los métodos, las propiedades, etc. del cuerpo de expresión son una gran ventaja en C# 6.0, pero no lo hemos habilitado en todos los miembros. C# 7.0 agrega accesores, constructores y destructores a las listas que pueden tener cuerpos de expresión
    class Person
    {
        private static ConcurrentDictionary<int, string> names = new ConcurrentDictionary<int, string>();
        private int id = GetId();
    
        public Person(string name) => names.TryAdd(id, name); // 构造器
        ~Person() => names.TryRemove(id, out *);              // 析构器
        public string Name
        {
            get => names[id];                                 // get 访问器
            set => names[id] = value;                         // set 访问器
        }
    }
  8. Lanzar expresiones  Lanzar excepciones en expresiones es muy simple: ¡simplemente llame a un método que lo haga por usted! Pero en C# 7.0 permitimos directamente lanzar en una posición específica como una expresión
    class Person
    {
        public string Name { get; }
        public Person(string name) => Name = name ?? throw new ArgumentNullException(nameof(name));
        public string GetFirstName()
        {
            var parts = Name.Split(" ");
            return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException("No name!");
        }
        public string GetLastName() => throw new NotImplementedException();
    }

Supongo que te gusta

Origin blog.csdn.net/st75033562/article/details/130969815
Recomendado
Clasificación