下面说的C# 7.0功能将在将来发布,首先须要安装Visual Studio 15 Preview 4,据说这个版本安装很快。git
C# 7.0的功能主要是数据处理,让代码更简洁,让代码性能更高github
让代码简单这个我以为不如6.0,性能是Iot,C#速度差,垃圾wr就让C#能够访问内存直接,这个下面没有说数组
比较大修改是可使用Tuples 来多个返回,实际上是抄袭了某脚本ide
多返回这个在以前也有作,他这样就是小改。函数
修改大的有Case 能够判断类型,其实这个使用是咱们有类 a,类b、c继承a,这时有用性能
若是以为这个和我同样以为没用,能够去Visual studio 按反馈喷3d
若是好奇他是怎么弄,能够查看https://github.com/dotnet/roslyncode
咱们之前要使用out 老是须要在外面定义咱们变量。blog
public void PrintCoordinates(Point p) { int x, y; // 在外面定义 p.GetCoordinates(out x, out y); WriteLine($"({x}, {y})"); }
在7.0咱们可使用在out定义咱们变量,这样看起来不是在一个区域,可是能够减小个人代码继承
public void PrintCoordinates(Point p) { p.GetCoordinates(out int x, out int y); WriteLine($"({x}, {y})"); }
在out定义类型,定义能够用var
看到这我才说这样有用,若是咱们开始没有肯定咱们返回的是什么,而后直接定义,须要修改地方多,可是若是咱们使用Var就可让咱们定义修改少,通常在写就须要先想咱们须要用什么,不要老是改
若是咱们使用一个返回为bool,那么能够在{使用out的值
public void PrintStars(string s) { //转换,能够是数字,显示 if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); } else { WriteLine("Cloudy - no stars tonight!"); } }
若是有返回值咱们不须要,能够out *,这样咱们就不用知道这个返回值,原先不须要使用我还要想一个变量,而后vs说我这个没有使用,如今咱们直接就不给他名
在咱们下面有返回多个,这时不须要的能够用*
C# 7.0可使用is一部分代替as
咱们须要判断一个值是不是一个类型,若是是那么赋值
o is int i
那么咱们就能够直接使用i
在咱们一个判断,若是咱们存在了object o是int,那么咱们就使用int i=(int)o;
若是咱们object不是int,那么转换object o是string,string s=(string)o;
int.TryParse(s,out i);
咱们能够简化,判断是否是int,若是是给i,这时就返回true
而后判断是否是string,是就转,成功使用i
if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }
咱们在Case能够选择类型
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)); }
case顺序很重要,default在后面,即便他后面有语句
之前咱们须要返回多个有点难,可使用out参数,能够Tuples
(string, string, string) LookupName(long id) // tuple return type { ... // 返回多个数据,咱们在数据拿到多个数据 return (first, middle, last); // tuple literal }
var names = LookupName(id);
咱们这样用第一返回值:names.Item1和原来几乎不改,这样对于返回值很差,由于咱们难以去记
咱们要给他一个好记的
(string first, string middle, string last) LookupName(long id)
咱们使用第一个names.first,这样使用就不会难,可使用咱们须要的名字
返回可使用return (first, middle, last);,若是定义了名称,可使用
return last:last,first:first
咱们可使用多个var来返回
(string first, string middle, string last) = LookupName(id1);
第一个first就是返回的第一个,咱们可使用var ,由于咱们不须要定义类型(var fist,var midd)=Lookup(id);
若是咱们有多个var,那么咱们能够简单var (first, middle, last) = LookupName(id1);
咱们不关系第二个返回值,可使用(var first,*)=Lookup(id);
咱们能够在函数里面定义函数,这是本地
这个在不少垃圾语言都有
public int Fibonacci(int x) { if (x < 0) throw new ArgumentException("Less negativity please!", nameof(x)); return Fib(x).current; //下面本地函数 (int current, int previous) Fib(int i) { if (i == 0) return (1, 0); var (p, pp) = Fib(i - 1); return (p + pp, p); } }
咱们有比较长数字,那么咱们在定义须要比较难知道他是否写对
咱们可使用,下划线,这样是分割,能够数咱们写了多少数字,能够看咱们是否是写错
var d = 123_456; var x = 0xAB_CD_EF;
咱们还能够定义2进制,原来是没法定义
var b = 0b1010_1011_1100_1101_1110_1111;
这个主要在二进制好,原先的使用true和false,若是还要使用,是用byte转换,若是Iot,咱们须要定义二进制,要是使用原的仍是难,我就以为这个功能好。能够分割,咱们二进制容易打着就不对,有了分割能够看出没几个,这样看代码简单,这个功能应该是原先就可获得,如今使用_以为仍是没有用。
咱们返回的是引用,如今返回能够是值,咱们返回数组中的一个值,那么修改这个值,由于放进引用,咱们输出数组是修改的值
public ref int Find(int number, int[] numbers) { for (int i = 0; i < numbers.Length; i++) { if (numbers[i] == number) { return ref numbers[i]; // return the storage location, not the value } } throw new IndexOutOfRangeException($"{nameof(number)} not found"); } int[] array = { 1, 15, -39, 0, 7, 14, -12 }; ref int place = ref Find(7, array); place = 9; // 修改 WriteLine(array[4]); // 9
https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/