C#新特性记录

时间:2021-12-14 03:44:38

C#6.0新特性条记 Getter专属赋值

可以在结构函数中,给只有get的属性赋初始值。

class Point { public int x { get; } public Point() { x = 1; } }

自动属性初始化

可以给自动属性,赋初始化值

class Point { public int x { get; set; } = 1; }

全局静态

可以设置全局静态,然后直接写静态类的要领。

using static System.Console; namespace FxApp { internal class Program { private static void Main(string[] args) { Read(); } } }

全局枚举

可以设置全局枚举,然后直接写枚举属性

using static System.ConsoleColor; namespace FxApp { internal class Program { private static void Main(string[] args) { var color = Red; } } }

字符串插入

可以使用$来进行字符串插入,替代string.format。全局变量或参数都可插入

internal class Program { public static int x { get; set; } private static void Main(string[] args) { string text = $"{x},{args}"; } }

Expression bodied

可以使用箭头表达式来给要领或属性供给表达式体。注意,表达式体不能有括号。

internal class Program { public string Name => "Chenxy"; public int Sum(int x, int y) => x + y; private static void Main(string[] args) { Program po = new Program(); Console.WriteLine(po.Name); //Chenxy Console.WriteLine(po.Sum(1, 2)); //3 Console.Read(); } }

索引值初始化

可以给调集赋初始化值

internal class Program { IDictionary<int, string> dict = new Dictionary<int, string>() { [1] = "first", [2] = "second" }; private static void Main(string[] args) { Program po = new Program(); foreach (var item in po.dict) { Console.WriteLine(item.Value); } Console.Read(); } }

?.运算符

空值运算符,可以简化判断null的事情

public class Point { public int x { get; } = 1; } internal class Program { public static void Main(string[] args) { Point po = null; //C# 5.0 写法 if (po != null) { Console.WriteLine(po.x); } //C# 6.0 写法 Console.WriteLine(po?.x); Console.Read(); } }

nameof表达式

为了防备重构时忘记改削,可以使用nameof来将一个常量和变量绑定。变量转变时,常量随之转变

internal class Program { public static void Main(string[] args) { string error = string.Empty; //C# 5.0 Console.WriteLine("error"); //error //C# 6.0 Console.WriteLine(nameof(error)); //error Console.Read(); } }

在此代码中,如果转变 error名称,但不改削nameof(error)名称。则会在编译时提示

异常过滤器

可以在try catch中进行判断,来控制是否进入catch。如果hideError为false,则不会进入catch。

public static void Main(string[] args) { bool hideError = false; try { throw new Exception(); } catch (Exception ex) when (hideError) { Console.WriteLine("异常已抛出"); } Console.Read(); }

catch和finally中使用await

可以在catch 和 finally中,使用await。

internal class Program { public async static void Main(string[] args) { HttpClient client = null; try { var result = await client.GetAsync(""); } catch (Exception ex) { var result = await client.GetAsync(""); } finally { var result = await client.GetAsync(""); } Console.Read(); } }

Visual Studio 2017

https://zhuanlan.zhihu.com/p/25626653

C#7.0新特性条记 Out

原先代码中,如果使用Out参数,需要预先界说变量。而C#7中,则可以直接在输出参数中界说变量。

我们也可以直接在参数中,界说var隐式变量。

//VS2015 static void Main(string[] args) { int x; OutMethod(out x); WriteLine($"X:{x}"); Read(); } //VS2017 static void Main(string[] args) { OutMethod(out int x); WriteLine($"X:{x}"); Read(); }

解构

在挪用函数中,可以将参数组合封装到一个类的结构函数中。但是无法通过东西解组成各个构成部分。

通过解构函数,则可以完成这个工作。解构函数可以返回东西的具体确定组件。

例如,我们模拟一个参数组合

public class PathInfo { public string DirectoryName { get; set; } public string FileName { get; set; } public string Extension { get; set; } public PathInfo(string dname, string fname, string extension) { DirectoryName = dname; FileName = fname; Extension = extension; } }

我们需要从nuget加载 System.ValueTuple这样,才可以使用元组进行解构。

我们如果要使用解构,就需要先界说一个解构函数:Desconstruct