• C#各个版本中的新增特性详解


    序言

    自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Framework库的相应支持,也不断的带给我们期待与惊喜。下面我们就对c#一路走到现在,做一个回顾与学习。

    C#语言目标与前行

    c#的设计目标是有以下几点:

    • 旨在是一种简单,现代,通用的面向对象编程语言。

    • 语言及其实现应该为软件工程原理提供支持,例如强类型检查,数组维度检查,未初始化的变量引用检测以及自动垃圾收集。软件的鲁棒性,耐久性和程序员的生产力很重要。

    • 旨在用于开发适用于分布式环境中部署的软件组件。

    • 便携性对于源代码和程序员非常重要,特别是已经熟悉C和C ++的程序员。

    • 支持国际化是非常重要的。

    • C#适用于为托管和嵌入式系统编写应用程序,从使用复杂的操作系统到非常小的专用功能都非常适用。

    • 虽然C#应用程序在内存和处理能力要求方面是经济的,但是该语言并不打算直接用C或汇编语言直接与性能和尺寸进行竞争。

    c#版本

    c#版本中添加的功能:

    C#2.0 

    • 泛型

    • 部分类型

    • 匿名方法

    • 迭代器

    • 可空类型

    • Getter / setter单独可访问性

    • 方法组转换(代表)

    • Co- and Contra-variance for delegates

    • 静态类

    • Delegate inference

    C#3.0 

    • 隐式类型局部变量

    • 对象和收集初始化器

    • 自动实现的属性

    • 匿名类型

    • 扩展方法

    • 查询表达式

    • Lambda表达式

    • 表达树

    • 部分方法

    C#4.0 

    • 动态绑定

    • 命名和可选参数

    • Generic co- and contravariance

    • 嵌入式互操作类型(“NoPIA”)

    C#5.0 

    • 异步方法

    • Caller info attributes

    C#6.0 

    • Compiler-as-a-service(Roslyn)

    • 将静态类型成员导入命名空间

    • 异常过滤器

    • 在Catch和Finally中使用Await

    • 自动属性初始化器

    • 只读属性的默认值

    • Expression-bodied members

    • Null-conditional operators(空条件运算符,简洁检查)

    • 字符串插值

    • nameof operator
    • 字典初始化器

    C#7.0 

    • out变量

    • 模式匹配

    • 元组

    • 解构

    • 局部函数

    • 数字分隔符

    • 二进制文字

    • 局部引用和引用返回

    • 扩展异步返回类型

    • 表达式的构造函数和finalizers

    • Expression bodied getters and setters
    • throw表达式

    C#7.1 

    • Async main
    • 默认表达式

    参考文档:https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#cite_note-roslyn_6-47

    c#7.0新特性详解

    在2016年Visual Studio “15” Preview 4发布,c# 7.0便开始浮现,现在vs2017已经发布,c#7.0带给我们的惊喜,我们也该一探究竟啦。

    C#7.0增加许多新功能,重点是数据,代码简化和性能上。

    Out variables

    目前在C#中,使用out参数不像我们想要的那么流畅。在使用out参数调用一个方法之前,首先必须声明变量来传递给它。您也不能使用var它们来声明它们,但需要指定完整的类型。

    public void PrintCoordinates(Point p)
    {
        int x, y; //必须声明
        p.GetCoordinates(out x, out y);
        WriteLine($"({x}, {y})");
    }

    在c#7中再来看看

    public void PrintCoordinates(Point p)
    {
        p.GetCoordinates(out int x, out int y);
        WriteLine($"({x}, {y})");
    }

    模式匹配

    c#7中

    public static void PrintStars(object o)
            {
                if (o is int i) Console.WriteLine(i + 12);
            }

    以前版本需要转化

    public static void PrintStars(object o)
            {
                if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
            }

    Switch statements with patterns 扩展switch语句使用模式匹配

      public static void PrintStars(object o)
            {
                switch (o)
                {
                    case Print p:
                        break;
                    case int a:
                        break;
                    case String b when b=="123":
                        break;
                }
            }        
        }   
        public class Print
        {
            public string PrintName { get; set; }
            public string MoBanPath { get; set; }
            public int Count { get; set; }
        }

    元组(Tuples)

    注意:元组依赖于一组基础类型,不包括在预览4中。要使功能正常工作,您可以通过NuGet轻松获取它们:

    • 右键单击解决方案资源管理器中的项目,然后选择“管理NuGet软件包...”

    • 选择“浏览”选项卡,选中“包含预发行”,然后选择“nuget.org”作为“包源”

    • 搜索“System.ValueTuple”并安装它。

      static void Main(string[] args)
            {
                var tuple = (a: 10, b: "123");
                Console.WriteLine($"a:{tuple.a},b:{tuple.b}");
                var result1 = GetS();
                var result = Get();
                Console.WriteLine($"Item1:{result1.Item1},Item2:{result1.Item2},Item3:{result1.Item3}");
                Console.WriteLine($"a:{result.a},b:{result.b},c:{result.c}");
                Console.ReadLine();
            }
            static (string, int, DateTime) GetS()
            {
                return ("abc", 123, DateTime.Now);
            }
            static (string a, int b, DateTime c) Get()
            {
                return (a: "abc", b: 123, c: DateTime.Now);
            }

    局部函数

    简单的说,就是在方法里面写方法然后自己调用。

    注意:在预览4中,本地函数必须在调用之前声明。这个限制将被松开,所以一旦他们读取的局部变量被明确地分配,就可以调用这个限制。

    static void Main(string[] args)
            {
                Console.WriteLine($"{Get(123)},{Get("abc")},{Get(null)}");
                Console.ReadLine();
            }
    
            public static string Get(object a)
            {           
                return GetP();
                string GetP()
                {
                    if (a is int v) return v + "";
                    if (a is string b) return b;
                    return "ccc";
                }
            }

    Literal improvements

    C#7.0允许在数字文字中_作为数字分隔符出现

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

    你可以把它们放在数字之间,以提高可读性。它们对价值没有影响。

    另外,C#7.0引入了二进制文字,因此您可以直接指定位模式,而不必以心脏知道十六进制符号。 

    var b = 0b1010_1011_1100_1101_1110_1111;

    更多c#7.0的特性

    到此,我就不在一个个的上演c#7.0的其他功能啦。如果你想深入其他,仔细阅读下面的文档:

    请参考文档:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

    c#6.0新语言功能详解

    以下新功能在VS 2015及17中实现并可用。

    ADD:新增,Exists:已存在,N/A:对该语言没有意义,No:不适用此版本。

    下面我简述几个新功能,剩下的我会把文档连接拿出来自己观摩。

    字符串插值

    上面的代码中都有体现。

    var s = $"{p.Name} is {p.Age} year{{s}} old";

    字典索引初始化

    var numbers = new Dictionary<int, string> {
        [7] = "seven",
        [9] = "nine",
        [13] = "thirteen"
    };

    自动属性初始化

    public class Customer
    {
        public string First { get; set; } = "Jane";
        public string Last { get; set; } = "Doe";
    }

    using引用静态类

    using static System.Console;
    using static System.Math;
    using static System.DayOfWeek;
    class Program
    {
        static void Main()
        {
            WriteLine(Sqrt(3*3 + 4*4)); 
            WriteLine(Friday - Monday); 
        }
    }

    更多c#6.0语言新特性

    线上代码可执行演示文档连接:http://www.volatileread.com/Wiki/Index?id=1075 效果如下

    参考文档:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

    c#2.0-5.0参考文档

    c#5.0参考文档

    连接地址:https://blogs.msdn.microsoft.com/mvpawardprogram/2012/03/26/an-introduction-to-new-features-in-c-5-0/

    c#4.0参考文档

    连接地址:https://msdn.microsoft.com/en-us/magazine/ff796223.aspx

    c#3.0参考文档

    连接地址:https://msdn.microsoft.com/en-us/library/bb308966.aspx

    c#2.0参考文档

    连接地址:https://msdn.microsoft.com/en-us/library/7cz8t42e(v=vs.80).aspx

    总结

    接下来是大家最喜欢的总结内容啦,内容有二,如下:

    1、希望能关注我其他的文章。

    2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

  • 相关阅读:
    安装jupyter
    git 查看分支图
    Docker原生健康检查使用
    压力测试指标判定
    Docker限制日志
    docker link 过时不再用了?那容器互联、服务发现怎么办?(2017年文章,建议使用docker network自定义网络)
    Nginx配置TCP服务负载均衡
    【转让】看看有你喜欢的书籍嘛?--都是我翻过的。
    《SOD框架企业级应用数据架构实战》新书简介和预定
    一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源
  • 原文地址:https://www.cnblogs.com/knowledgesea/p/6694979.html
Copyright © 2020-2023  润新知