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

本文概述了从 C# 2.0 到 C# 7.0 的主要新特性,包括泛型、匿名方法、元组、模式匹配等,并详细介绍了 C# 7.0 在数据处理、代码简化和性能提升方面的重要更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/vveiliang/p/6707208.html

C# 指南 作者:Bill Wagner,olprod,OpenLocalizationService 本文内容 C# 指南提供了许多有关 C# 语言的资源。此网站面向许多不同的受众群体。你可能希望探索本指南的不同部分,具体视你的编程经验或 C# 语言和 .NET 使用经验而定。 对于从未接触过编程的开发者: 请从快速入门部分着手。这些快速入门可让你在浏览器中交互式浏览 C# 语言。从这里你可以转到教程部分。这些教程介绍了如何从头开始创建 C# 程序。其中分步介绍了如何创建程序。同时还解释了语言概念以及如何自行生成 C# 程序。如果希望先阅读概述内容,请尝试阅读C# 语言介绍。其中介绍了 C# 语言的概念。阅读完这一部分后,你将会对 C# 语言有一个基本的了解,可以尝试阅读各个教程或自行生成一些程序。 对于刚开始接触 C# 的开发者: 如果以前从事过开发工作,但是刚开始接触 C#,请阅读C# 语言介绍。其中涵盖了该语言的基本语法和结构,你可以通过&ldquo;语言介绍部分&rdquo;将 C# 与你用过的其他语言进行比较。还可以浏览教程,尝试生成基本的 C# 程序。 对于 C# 经验丰富的开发者: 如果之前用过 C#,应先阅读此语言最新版本中新增的功能。请参阅C# 中的新增功能,了解当前版本中的新功能。 C# 指南的结构 C# 指南分为多个部分。可以按顺序阅读,也可以直接跳到最感兴趣的部分。一些部分主要侧重于 C# 语言方面。另一些部分介绍了端到端方案,展示了可以使用 C#.NET Framework 创建的几种类型程序。 入门 此部分介绍了在首选平台上创建 C# 开发环境需要安装的程序。此部分下的各个主题介绍了如何在不同的受支持环境中创建首个 C# 程序。 C# 快速入门 C# 快速入门是为新手开发人员提供的互动教程,可让他们使用读取&ndash;求值&ndash;打印循环 (REPL) 接口在浏览器中探索和学习 C# 语言。完成互动课程后,可以通过在自己的计算机上练习相同的课程来提高你的编码技能。 教程 此部分介绍了各种端到端方案,其中包括说明和代码。其中演示了为什么首选特定的惯用做法、最适用于不同方案的 C# 功能,以及常见任务的参考实现。如果最佳学习方式是查看代码,请先阅读此部分。还可以下载所有代码,然后在你自己的环境中进行尝试。 C# 教程 此部分概述了 C# 语言。其中介绍了 C# 程序的构成元素以及此语言的各项功能。同时演示了所有 C# 语法元素的小示例,并讨论了主要的 C# 语言主题。 C# 中的新增功能 概述了在最新语言版本中添加的新功能以及 C# 语言的历史。 C# 编程指南 提供有关如何使用 C# 语言结构的信息和实例。 演练 提供指向使用 C# 的编程演练和每个演练的简要概述的链接。 语言参考 此部分收录了 C# 语言参考资料。此类资料有助于你了解 C# 语法和语义。它还包含关于以下内容的参资料:类型、运算符、特性、预处理器指令、编译器开关、编译器错误和编译器警告。 C# 语言规范 指向最新版 C# 语言规范的链接。 请参阅 Visual C# 和 Visual Basic 入门 .NET 开发 C# 示例 编译:Tuesday[104979058] 位于深圳于香港之间. UTC: 2018-10-28 04:00:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值