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 2017https://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