• C#7.0&6.0新特性 — 完整版


    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.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})");
    }
    模式匹配

        以前版本需要转化

    public static void PrintStars(object o)
    {
         if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
    }
        在c#7中
    public static void PrintStars(object o)
    {
        if (
    o is int i
    )
    Console.WriteLine(i + 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;

                }

            }        

        }  

    元组(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);

            }

    部函数

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

    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的特性

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

    c#6.0新语言功能详解

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

    640.webp

    字符串格式化

    上面的代码中都有体现。

    public void Main()
    {
      int i = 1;
      string s = "id";
     
      Console.WriteLine($"{s}-{i}");
    }

    字典索引初始化
    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引用静态类

        If you have a static class, whose members you are using a lot you can now avoid typing the class name everytime by including the class in the using declaration.

    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); 
        }
    }
    Exception Filters

        Exception filters allow you to add additional conditions to exception handlers. We can now write an if a when statement next to a catch block & the catch block will only get executed if the condition returns true. Below is an impractical & silly example to play around with.

    public void Main()
    {
      try
      {   
          throw new Exception("E2");
      }
      catch(Exception ex) when (ex.Message == "E1")
      {
        Console.WriteLine("caught E1");
      }
      catch(Exception ex) when (ex.Message == "E2")
      {
        Console.WriteLine("caught E2");
      }
    }

    Using await in catch and finally blocks

        We can now await functions in catch and finally blocks. This was not allowed prior to C# 6.0

    public void Main()
    {
      BuggyFunctionAsync();
      Console.WriteLine("done!");
      Thread.Sleep(2000);
    }

    public async void BuggyFunctionAsync()
    {
      try { throw new Exception(); }
      catch
      {
        Console.WriteLine("entering catch block");
        await Task.Delay(1000);
        Console.WriteLine("exiting catch block");
      }
      finally
      {
        Console.WriteLine("entering finally block");
        await Task.Delay(1000);
        Console.WriteLine("exiting finally block");
      }
    }

    The nameof Operator

        There are times when we need the name of a variable in string form. nameof operator does just that. It takes a variable and converts the variable name to string.

    public void Main()
    {
      Console.WriteLine(nameof(Account));
      Console.WriteLine(nameof(Account.AccountNumber));
    }

    class Account
    {
      public int AccountNumber{get; set;}
    }

    Null Conditional Operator

    if(node==null || node.Children == null)

        Console.WriteLine("Invalid Node");

    if(node?.Children == null)

        Console.WriteLine("Invalid Code");

     

    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

  • 相关阅读:
    AsyncTask的用法
    关于 android setAnimationStyle 的问题
    android有关bluetooth常用api简介
    Android调用系统Activity选取图像部分区域
    Android 关于ListView几个特别的属性
    Android应用界面动画切换(主要Tabhost中跳转出来的动画效果解决[转]
    ✿Android 3.1 久违的 USB、mtp、rtp
    读《C++沉思录》心得:拷贝构造函数
    Cloud Foundy入门
    HDFS读文件详解
  • 原文地址:https://www.cnblogs.com/vveiliang/p/6707208.html
Copyright © 2020-2023  润新知