- variable de salida
old: int x, y; // 需要“预声明” p.GetCoordinates(out x, out y); new: p.GetCoordinates(out int x, out int y);
- 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)); }
- 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"); }
- Las mejoras literales permiten usar "_" como separador de números en literales numéricos
var d = 123_456; var x = 0xAB_CD_EF;
- Ref devoluciones y local
int[] array = { 1, 5}; ref int place = ref array[1]; place = 9; Console.WriteLine(array[1]); //这里输出是9
- 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)
- 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 访问器 } }
- 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(); }
Nuevas funciones en C# 7.0
Supongo que te gusta
Origin blog.csdn.net/st75033562/article/details/130969815
Recomendado
Clasificación