精华内容
下载资源
问答
  • C# 7.0

    千次阅读 2016-09-25 11:07:27
    下面说的C# 7.0功能将在未来发布,首先需要安装Visual Studio 15 Preview 4,听说这个版本安装很快。C# 7.0的功能主要是数据处理,让代码更简洁,让代码性能更高让代码简单这个我觉得不如6.0,性能是Iot,C#速度差,...

    下面说的C# 7.0功能将在未来发布,首先需要安装Visual Studio 15 Preview 4,听说这个版本安装很快。

    C# 7.0的功能主要是数据处理,让代码更简洁,让代码性能更高

    让代码简单这个我觉得不如6.0,性能是Iot,C#速度差,垃圾wr就让C#可以访问内存直接,这个下面没有说

    比较大修改是可以使用Tuples 来多个返回,其实是抄袭了某脚本

    多返回这个在之前也有做,他这样就是小改。

    修改大的有Case 可以判断类型,其实这个使用是我们有类 a,类b、c继承a,这时有用

    如果觉得这个和我一样觉得没用,可以去Visual studio 按反馈喷

    如果好奇他是怎么弄,可以查看https://github.com/dotnet/roslyn

    out 返回值定义

    我们以前要使用out 总是需要在外面定义我们变量。

    
      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在后面,即使他后面有语句

    Tuples

    以前我们需要返回多个有点难,可以使用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,我们需要定义二进制,要是使用原的还是难,我就觉得这个功能好。可以分割,我们二进制容易打着就不对,有了分割可以看出没几个,这样看代码简单,这个功能应该是原先就可得到,现在使用_觉得还是没有用。

    ref returns 返回值

    我们返回的是引用,现在返回可以是值,我们返回数组中的一个值,那么修改这个值,因为放进引用,我们输出数组是修改的值

    
    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/

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    展开全文
  • C# 7.0 Pocket Reference: Instant Help for C# 7.0 Programmers English | 2017 | ISBN-10: 1491988533 | 234 pages | PDF + EPUB + MOBI(conv) | 2 Mb When you need answers for programming with C# 7.0, this ...
  • Essential C# 7.0

    2019-04-19 10:54:53
    Essential C# 7.0 ,C#7.0本质论的英文版,非常清晰的PDF版本,带目录
  • C# 7.0 Pocket Reference

    2018-05-15 17:11:17
    C# 7.0 Pocket Reference.Instant Help for C# 7.0 Programmers
  • C#7.0中新特性汇总

    2020-09-01 18:20:42
    C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善。接下来通过本文给大家介绍C#7.0中新特性汇总,需要的朋友可以参考下
  • Pro C# 7.0

    2019-04-08 18:40:00
    Pro C# 7.0。英文清晰版,非扫描版。下载来的时候,有广告Logo标记,我删除了。 个人下载了几本C#的书,读下来,这本书的大局观比较好,跟着作者,可以顺利的掌握C#的语言特点和内部原理。推荐一下。
  • C#7.0的新特性

    2019-04-07 17:46:15
    C#7.0的新特性
  • Essential C# 7.0, 6th Edition,epub版本,英文 The Comprehensive, Expert Guide to C# Language Programming. Essential C# 7.0 is a well-organized, no-fluff guide to C# 7.0 for programmers at all levels of...
  • 点击上方蓝字关注我们01《C# 7.0核心技术指南 原书第7版》作者:Joseph Albahari/Ben Albahari出版社:机械工业出版社原作名:C# 7.0 in a Nutshell译者:刘夏出版年:2019-9-1页数:1072定价:259.00元ISBN:9787111631347...

    b4a88feb581699df4d25f51833e3e9d0.gif

    点击上方蓝字关注我们

    5d79561889e56bbf284f94da7d5d5761.gif

    01

    f0cca6b59f49ce99e7beb4fa70255a24.png

    《C# 7.0核心技术指南  原书第7版

    作者: Joseph Albahari / Ben Albahari出版社: 机械工业出版社原作名: C# 7.0 in a Nutshell译者: 刘夏出版年: 2019-9-1页数: 1072定价: 259.00元ISBN: 9787111631347

    公众号:小韩同学

    简介:

    本书前三章将集中介绍C#语言。首先介绍基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是C#语言的初学者,请循序渐进地阅读这些章节。

    其余各章则涵盖了.NET Framework的核心功能,包括LINQ、XML、集合、并发、I/O和网络、内存管理、反射、动态编程、特性、安全、应用程序域和原生互操作性等主题。第6章和第7章是后续主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ相关的三个章节好按顺序阅读。其中的一些章节需要一些并发相关的知识,这些知识将在第14章中介绍。

    TIPS /

    获取方式:点击下方蓝色字体联系小编

    需要其他电子图书点击蓝色字体➡电子

    展开全文
  • C# 7.0中解构功能详解

    2020-12-31 09:04:50
     C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[] args) { (var name, var age) = GetUser(); ...
  • C# 7.0 in a Nutshell

    2018-01-09 23:19:20
    C# 7.0 in a Nutshell, 最新C#图书, 浅显易懂,认真学习也很有深度
  • C#7.0新语法

    2020-07-06 08:30:52
    随着vs的更新,vs2017中已经是c#7.0c#7.0又有哪些新特性呢?接下来简单介绍一下。 原文地址:https://www.cjavapy.com/article/38/

    随着vs的更新,vs2017中已经是c#7.0。c#7.0又有哪些新特性呢?接下来简单介绍一下。

    原文地址:https://www.cjavapy.com/article/38/

    展开全文
  • C# 7.0 特性

    2017-03-11 08:58:00
    在昨天WR发布了vs17,vs17可以使用C#7.0,在之前,我写有一篇博客,关于C#7.0,参见:http://lindexi.oschina.io/lindexi/post/C-7.0/ 但是WR砍了一些功能,添加了一些功能。 于是我重新写一篇,关于C# 7.0 <!...

    在昨天WR发布了vs17,vs17可以使用C#7.0,在之前,我写有一篇博客,关于C#7.0,参见:http://lindexi.oschina.io/lindexi/post/C-7.0/

    但是WR砍了一些功能,添加了一些功能。

    于是我重新写一篇,关于C# 7.0

    <!-- &#19979;&#38754;&#35828;&#30340;C# 7.0&#21151;&#33021;&#23558;&#22312;&#26410;&#26469;&#21457;&#24067;&#65292;&#39318;&#20808;&#38656;&#35201;&#23433;&#35013;Visual Studio 15 Preview 4&#65292;&#21548;&#35828;&#36825;&#20010;&#29256;&#26412;&#23433;&#35013;&#24456;&#24555;&#12290; -->

    C# 7.0 可以在 VS 17 使用,这个版本我下载企业版上传百度云,有需要可以到文章最后去[下载](#VS 17 下载)。

    本文主要:C# 7.0 带来的新功能

    • out 返回值定义

    • Tuples

    • 模式匹配

    • ref 返回本地值

    • 内部函数

    • 全部地方可以支持辣么大

    • throw 表达式

    • 广义异步返回类型

    • 数值常量语法

    <!--more-->

    C# 7.0的功能主要是数据处理,让代码更简洁,让代码性能更高

    让代码简单这个我觉得不如6.0,性能WR为了Iot做的。C#速度差,垃圾wr就让C#可以直接访问内存,让速度变快,这个下面没有说

    C# 7.0 最好的是 使用 Tuple 。虽然之前也有,但是现在版本比较好用。实际抄袭了某脚本。

    <!-- &#27604;&#36739;&#22823;&#20462;&#25913;&#26159;&#21487;&#20197;&#20351;&#29992;Tuples &#26469;&#22810;&#20010;&#36820;&#22238;&#65292;&#20854;&#23454;&#26159;&#25220;&#34989;&#20102;&#26576;&#33050;&#26412; --> <!-- &#22810;&#36820;&#22238;&#36825;&#20010;&#22312;&#20043;&#21069;&#20063;&#26377;&#20570;&#65292;&#20182;&#36825;&#26679;&#23601;&#26159;&#23567;&#25913;&#12290; -->

    修改大的有 Case 。模式匹配,可以判断类型,其实这个使用是我们有类 a,类b、c继承a,这时使用就比较好,如何使用在下面会说。

    如果觉得这个功能没有用,可以去 Visual studio 按反馈喷

    <!-- &#22914;&#26524;&#35273;&#24471;&#36825;&#20010;&#21644;&#25105;&#19968;&#26679;&#35273;&#24471;&#27809;&#29992;&#65292;&#21487;&#20197;&#21435;Visual studio &#25353;&#21453;&#39304;&#21943; -->

    如果好奇他是怎么弄,可以查看https://github.com/dotnet/roslyn

    out 返回值定义

    我们以前要使用out 总是需要在外面定义我们变量。

    首先定义一个 变量,使用函数,这样觉得需要多写代码

      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!"); }
    }
    

    == 下面代码被WR删了,以前有说到,现实wr没有做

    如果有返回值我们不需要,可以out *,这样我们就不用知道这个返回值,原先不需要使用我还要想一个变量,然后vs说我这个没有使用,现在我们直接就不给他名

    在我们下面有返回多个,这时不需要的可以用*

    
    public void PrintStars(string s)
    {
        //转换,可以是数字,显示
        if (int.TryParse(s, out *)) { WriteLine("转换成功"); }
        else { WriteLine("转换失败"); }
    }
    

    == 上面代码WR没有做,不需要的返回值是可以使用_

    模式匹配

    模式匹配是包括 is 和 switch ,下面先说 is

    C# 7.0可以使用 is 一部分代替 as

    我们需要判断一个值是否是一个类型,如果是那么赋值,在以前,使用的代码需要两行

        if(o is int)
        {
    
            int i=(int) o;
        }

    还可以使用 as

        int? i = o as int;

    但是在新的C#,可以使用

    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 */ }

    但是 is 的用法在于 switch

    我们在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 顺序很重要,可以看到可以判断类型,但是 case 还可以混合判断。

                    switch (item)
                    {
                        default:
                            throw new InvalidOperationException("unknown item type"); 
    
                        case 0:
                            break;
    
                        case int val:
                            sum += val;
                            break;
    
                        case var @var when (@var != null && (int) (@var) == 45):
                            break;
    
                        //  The order of case clauses now matters!
                        case IEnumerable<object> subList when subList.Any():
                            sum += Sum(subList);
                            break;
    
                        case IEnumerable<object> subList:
                            break;
    
                        case null:
                            break;
                    }

    注意 default 在最后,即使他后面有语句,除非存在语句识别,那么最后会执行他。

    Tuples

    以前我们需要返回多个有点难,可以使用out参数,可以Tuples<string,double>

    我们做了修改,可以使用新的方法,这样我们返回多个就可以直接和某垃圾语言那返回

    
    (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

    这个方法是很好的,不需要和定义的顺序那样。

    对于调用函数,可以使用一个变量,可以使用多个变量

        (string first, string middle, string last) = LookupName(id1);
        var name = LookupName(id1);

    可以看到两个代码,作用一样,但是第一个代码除了使用变量类型,同样可以使用 var

    <!-- &#31532;&#19968;&#20010;first&#23601;&#26159;&#36820;&#22238;&#30340;&#31532;&#19968;&#20010;&#65292;&#25105;&#20204;&#21487;&#20197;&#20351;&#29992;var &#65292;&#22240;&#20026;&#25105;&#20204;&#19981;&#38656;&#35201;&#23450;&#20041;&#31867;&#22411; -->
        (var fist,var midd)=Lookup(id);
    

    如果我们有多个var,那么我们可以简单var (first, middle, last) = LookupName(id1);定义所有变量

    我们不关系第二个返回值,可以使用(var first,*)=Lookup(id);

    除了方法使用,可以在变量使用

                    var sumNew = (first: 1, count: 20);
    

    这样就定义了一个,可以使用他的名称,不使用 item原先的,也就是在定义,给他变量。

    上面代码的意思:可以定义一个包括每项名称的变量,可以在使用时,用定义的变量

                var sumNew = (first: 1, count: 20);
                Console.WriteLine($"first {sumNew.first}  count {sumNew.count}");

    如果不想在定义写变量,那么可以修改var,作为变量

          (int first, int count) sum = ( 1,  20);
          Console.WriteLine($"first {sum.first}  count {sum.count}");

    这里,类型int不能写 var

    如果想不到变量,那么只能使用

                (int , int ) sum = ( 1,  20);
                Console.WriteLine($"first {sum.Item1}  count {sum.Item2}");

    本地函数

    我们可以在函数里面定义函数,这是本地函数

    <!-- &#36825;&#20010;&#22312;&#24456;&#22810;&#22403;&#22334;&#35821;&#35328;&#37117;&#26377; -->
    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);
        }
    }

    以前有些函数只会使用一次,但是他的功能多,所以就把它写成方法,于是一个类就很多这种方法,只会在一个函数使用,但是写成方法,有时候开始看他,会觉得方法很多,不知道哪个方法在哪使用。

    上面说的是那些没使用 vs 企业版的兄弟,其实有了企业版,没有这问题。

    现在可以使用内部函数,在一个函数里定义函数,看上面的代码,写一个斐波纳算法,可以直接使用函数里函数,不需要定义方法。

    这个用法在:迭代,异步

    对于迭代器,抛出异常在使用,不是创建。

    看下这代码

    public static IEnumerable<char> AlphabetSubset(char start, char end)
    {
        if ((start < 'a') || (start > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(start), message: "start must be a letter");
        if ((end < 'a') || (end > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(end), message: "end must be a letter");
    
        if (end <= start)
            throw new ArgumentException($"{nameof(end)} must be greater than {nameof(start)}");
        for (var c = start; c < end; c++)
            yield return c;
    }

    在输入不合法,就会抛出异常,那么抛出异常的时候是什么

        var resultSet = Iterator.AlphabetSubset('f', 'a');
    Console.WriteLine("iterator created");
    foreach (var thing in resultSet)
      {
        Console.Write($"{thing}, ");
      }

    可以看到在 var resultSet = Iterator.AlphabetSubset('f', 'a');不会抛出异常,在 Console.Write($"{thing}, ");抛出异常。

    很难定位到是在哪的异常,出现异常和知道异常的,不在一个地方,这就是之前使用迭代的一个比较难发现的。

    所以做法是新建一个方法迭代

        public static IEnumerable<char> AlphabetSubset2(char start, char end)
    {
        if ((start < 'a') || (start > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(start), message: "start must be a letter");
        if ((end < 'a') || (end > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(end), message: "end must be a letter");
    
        if (end <= start)
            throw new ArgumentException($"{nameof(end)} must be greater than {nameof(start)}");
        return alphabetSubsetImplementation(start, end);
    }
    
    private static IEnumerable<char> alphabetSubsetImplementation(char start, char end)
    { 
        for (var c = start; c < end; c++)
            yield return c;
    }

    这样就可以定位,但是问题是,可能错误调用 alphabetSubsetImplementation ,直接使用 他,不是使用 AlphabetSubset2 ,所以在新的C#,可以使用内部方法

    public static IEnumerable<char> AlphabetSubset3(char start, char end)
    {
        if ((start < 'a') || (start > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(start), message: "start must be a letter");
        if ((end < 'a') || (end > 'z'))
            throw new ArgumentOutOfRangeException(paramName: nameof(end), message: "end must be a letter");
    
        if (end <= start)
            throw new ArgumentException($"{nameof(end)} must be greater than {nameof(start)}");
    
        return alphabetSubsetImplementation();
    
        IEnumerable<char> alphabetSubsetImplementation()
        {
            for (var c = start; c < end; c++)
                yield return c;
        }
    }

    同时,在异步,如果出现异常,也是难以定位,所以可以用内部方法在异步前判断异常

        public Task<string> PerformLongRunningWork(string address, int index, string name)
    {
        if (string.IsNullOrWhiteSpace(address))
            throw new ArgumentException(message: "An address is required", paramName: nameof(address));
        if (index < 0)
            throw new ArgumentOutOfRangeException(paramName: nameof(index), message: "The index must be non-negative");
        if (string.IsNullOrWhiteSpace(name))
            throw new ArgumentException(message: "You must supply a name", paramName: nameof(name));
    
        return longRunningWorkImplementation();
    
        async Task<string> longRunningWorkImplementation()
        {
            var interimResult = await FirstWork(address);
            var secondResult = await SecondStep(index, name);
            return $"The results are {interimResult} and {secondResult}. Enjoy.";
        }
    }

    在使用异步函数前异常,不让开发者使用没有校验的 longRunningWorkImplementation ,这就是内部方法的使用。

    但是可能有兄弟这样写,让我觉得这个语言太垃圾

            public static void A()
            {
                A1();
                void A1()
                {
                    void A2()
                    {
                        void A3()
                        {
    
                        }
                    }
    
                    A2();
                    //A3();
                }
    
                A1();
            }

    改进常量

    我们有比较长数字,那么我们在定义需要比较难知道他是否写对

    我们可以使用,下划线。这样是分割,可以数我们写了多少数字,可以看我们是不是写错

    
    var d = 123_456;
    var x = 0xAB_CD_EF;
    

    我们还可以定义2进制,原来是无法定义

    var b = 0b1010_1011_1100_1101_1110_1111;

    这个主要在二进制好,原先的使用true和false,如果还要使用,是用byte转换,如果Iot,我们需要定义二进制,要是使用原的还是难,我就觉得这个功能好。可以分割,我们二进制容易打着就不对,有了分割可以看出没几个,这样看代码简单,这个功能应该是原先就可得到,现在使用_觉得还是没有用。

    ref returns 返回值

    我们返回的是引用,现在返回可以是值,我们返回数组中的一个值,那么修改这个值,因为放进引用,我们输出数组是修改的值

    
    
    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://docs.microsoft.com/en-us/dotnet/articles/csharp/lambda-expressions

    现在可以在所有地方使用辣么大

        // Expression-bodied constructor
    public ExpressionMembersExample(string label) => this.Label = label;
    
    private string label;
    
    // Expression-bodied get / set accessors.
    public string Label
    {
        get => label;
        set => this.label = value ?? "Default label";
    }

    在很多地方可以扔异常

    以前,异常是定义,所以下面代码出错

                private string _name;
    
            public string Name
            {
                set
                {
                    _name = value??throw new ArgumentException();
    
                }
                get { return Name; }
            }

    不能判断 name 空,同时异常。

    现在可以

    同时可以写

        private ConfigResource loadedConfig = LoadConfigResourceOrDefault() ?? 
        throw new InvalidOperationException("Could not load config");

    广义异步返回类型

    以前 Task<>只能在方法使用

        private async Task<int> loadCache()
    {
        // simulate async work:
        await Task.Delay(100);
        cache = true;
        cacheResult = 100;
        return cacheResult;
    }

    现在可以使用 ValueTask<> 返回数值

        public ValueTask<int> CachedFunc()
    {
        return (cache) ? new ValueTask<int>(cacheResult) : new ValueTask<int>(loadCache());
    }
    private bool cache = false;
    private int cacheResult;
    private async Task<int> loadCache()
    {
        // simulate async work:
        await Task.Delay(100);
        cache = true;
        cacheResult = 100;
        return cacheResult;
    }

    注意使用System.Threading.Tasks.Extension

    这个方法可以直接把数值转ValueTask

    虽然没有用,和之前的看不出有什么用

                public static async ValueTask<int> ValueTask(int[] numbers)
            {
                if (!numbers.Any())
                {
                    return 0;
                }
                else
                {
                    return await Task.Run(() => numbers.Sum());
                }
            }

    https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7

    https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

    VS 17 下载

    VS 17 企业版

    链接:http://pan.baidu.com/s/1skXDc3z 密码:70d6

    如果度盘链接没法使用,请联系我。

    代码 https://github.com/alugili/CSharp7Features

    本文更新在:http://lindexi.oschina.io/lindexi/post/C-7.0/

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

    <script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    转载于:https://www.cnblogs.com/lindexi/p/6949670.html

    展开全文
  • c#7.0高级编程 配套光盘,买书附带的,分享给大家 。
  • c# 7.0 本质论 随书 代码 资源 代码例子 压缩包 光盘
  • Essential C# 7.0 is a well-organized, no-fluff guide to C# 7.0 for programmers at all levels of experience. Reflecting C# 7.0 features and modern programming patterns, it will help you write code that...
  • C# 7.0 in A Nutshell

    2018-03-29 15:33:41
    When you have questions about C# 7.0 or the .NET CLR and its core Framework assemblies, this bestselling guide has the answers you need. Since its debut in 2000, C# has become a language of unusual ...
  • C#入门经典(C# 7.0 Visual.Studio.2017)是英文版的,大家先看一下吧.
  • C# 7.0 .net core 1.0 这是个经典的系统列丛书,这是第八版
  • C#7.0 NutShell_pdf档.rar

    2019-05-28 08:40:21
    C# 7.0 in a Nutshell pdf档电子书,资源共享,人人为我,我为人人
  • C# 5.0 权威指南(中文高清带书签)+最新C# 7.0 非常好的C#学习书箱
  • C# 7.0 Extension Method
  • C# 7.0 Pocket Reference 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或...
  • C#7.0 核心技术指南》读书笔记

    千次阅读 2019-12-02 22:15:59
    C#7.0 核心技术指南》读书笔记(一) ------ 简介 《C#7.0 核心技术指南》读书笔记(二) ------ 基础 《C#7.0 核心技术指南》读书笔记(三) ------ 类 《C#7.0 核心技术指南》读书笔记(四) ------ ...
  • 详解C#7.0新特性

    2019-03-12 15:50:43
    详解C#7.0新特性 1.out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” 。如下所示: 1 var input = ReadLine(); 2 if (int....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,357
精华内容 542
关键字:

c#7.0

c# 订阅