1.数字分隔符(Digit Separators )

数字分隔符使代码更具可读性。在声明变量时,可以将_添加到单独的数字中。编译器只删除_。以下代码片段在C#7中看起来更具可读性:

In C# 6

long n1 = 0x1234567890ABCDEF; 

In C# 7

long n2 = 0x1234_5678_90AB_CDEF;

In C# 7.2

long n2 = 0x_1234_5678_90AB_CDEF;

2.二进制(Binary Literals )

C#7为二进制文件提供了一个新的文字。二进制文件只能包含va 0和1。现在,数字分隔符变得尤为重要

In C# 7

uint binary1 = 0b1111_0000_1010_0101_1111_0000_1010_0101;

3.Expression-bodied 函数成员(Expression-Bodied Members )

C#6允许表达式方法和属性。使用C#7,表达式主体可以与构造函数,析构函数,本地函数,属性访问器等一起使用。在这里,您可以看到C#6和C#7之间的属性访问器的区别:

In C# 6

private string _firstName;
public string FirstName
{
get { return _firstName; }
set { Set(ref _firstName, value); }
}

In C# 7

private string _firstName;
public string FirstName
{
get => _firstName;
set => Set(ref _firstName, value);
}

4.Out 变量(Out Var)

在C#7之前,必须在使用之前声明out变量。使用C#7,代码减少了一行,因为变量可以声明

使用:

In C# 6

string n = "";
int result;
if (string.TryParse(n, out result)
{
Console.WriteLine($"Converting to a number was successful:{result}");
}

In C# 7

string n = "";
if (string.TryParse(n, out var result)
{
Console.WriteLine($"Converting to a number was successful:{result}");
}

5.非尾随命名参数(Non-Trailing Named Arguments )

使用C#7.2,支持非尾随命名参数。有关详细信息,请参阅命名参数和可选参数
In C# 7.0

if (Enum.TryParse(weekdayRecommendation.Entity, ignoreCase:true,result: out DayOfWeek weekday))

{
  reservation.Weekday = weekday;
}

In C# 7.2

if (Enum.TryParse(weekdayRecommendation.Entity, ignoreCase:true,out DayOfWeek weekday))
{
  reservation.Weekday = weekday;
}

6.只读结构(Readonly Struct )

结构应该是只读的(有一些例外)。使用C#7.2,可以使用readonly修饰符声明结构,因此编译器会验证结构是否未更改。编译器也可以使用此保证不复制将其作为参数传递的结构,而是将其作为引用传递:

In C# 7.2

public readonly struct Dimensions
{
public double Length { get; }
public double Width { get; }
public Dimensions(double length, double width)
{
Length = length;
Width = width;
}
public double Diagonal => Math.Sqrt(Length * Length + Width
* Width);
}

7.In 修饰参数(In Parameters )

C#7.2还允许带有参数的in修饰符。这可以保证传递的值类型不会改变,它可以通过引用传递以避免副本:

In C# 7.2

static void CantChange(in AStruct s)
{
  // s can't change
}

8.private protected 访问修饰符

C#7.2添加了一个新的访问修饰符:private protected。访问修饰符protected internal允许访问该成员(如果已使用)来自同一程序集中的类型,或来自派生自该类的另一个程序集中的类型。对于private protected,如果类派生自基类并且在同一个程序集中,则只允许使用AND而不是OR访问。

使用C#7.1,定义了一个默认文字,与默认运算符相比,它允许更短的语法。默认运算符总是需要重复类型,现在不再需要了。

In C# 7.0

int x = default(int);
ImmutableArray<int> arr = default(ImmutableArray<int>);

In C# 7.1

int x = default;
ImmutableArray<int> arr = default;

10.本地函数(Local Functions )

在C#7之前,无法在方法中声明函数。你可以创建一个lambda表达式并调用它,如C#6代码片段所示:

In C# 6

public void SomeFunStuff()
{
  Func<int, int, int> add = (x, y) => x + y;
  int result = add(, );
  Console.WriteLine(result);
}

使用C#7,可以在方法中声明本地函数。只能在方法范围内访问本地函数:

In C# 7

public void SomeFunStuff()
{
  int add(int x, int y) => x + y;
  int result = add(, );
  Console.WriteLine(result);
}

11.元组(Tuples )

低于 C# 7.0 的版本中也提供元组,但它们效率低下且不具有语言支持。 这意味着元组元素只能作为 Item1 和 Item2 等引用。C# 7.0 引入了对元组的语言支持,可利用更有效的新元组类型向元组字段赋予语义名称。在C#7中,元组是语言的一部分,你可以定义成员的名字:

in C# 6

var t1 = Tuple.Create(, "astring");
int i1 = t1.Item1;
string s1 = t1.Item2;

In C# 7

var t1 = (n: , s: "magic");
int i1 = t1.n;
string s1 = t1.s;

12.推断元组元素名称(Inferred Tuple Names )

此功能是对 C# 7.0 中引入的元组功能一次小型增强。 在初始化元组时,许多时候,赋值操作右侧的变量名与用于元组元素的名称相同,元组元素的名称可通过在 C# 7.1 中初始化元组时使用的变量进行推断:

In C# 7.0

int count = ;
string label = "Colors used in the map";
var pair = (count: count, label: label);

In C# 7.1

int count = ;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"

13.析构元组(Deconstructors )

在某些时候,你可能想要解包从方法返回的元组的成员。 可通过为元组中的每个值声明单独的变量来实现此目的。 这种解包操作称为析构元组

In C# 7

var p1 = new Person("Tom", "Turbo");
(string firstName, string lastName) = p1;

14.模式匹配(Pattern Matching )

通过模式匹配,is运算符和switch语句增强了三种模式:const模式,类型模式和var模式。以下代码段显示

使用is运算符的模式。匹配的第一次检查与常量42匹配,第二次匹配检查Person对象,第三次匹配检查具有var模式的每个对象。使用类型和var模式,可以为强类型访问声明变量:

In C# 7

public void PatternMatchingWithIsOperator(object o)
{
  if (o is )
  {
  }
  if (o is Person p)
  {
  }
  if (o is var v1)
  {
  }
}

使用switch语句,可以对case子句使用相同的模式。如果模式匹配,您还可以声明要强类型的变量。您还可以使用何时在条件上过滤模式:

public void PatternMatchingWithSwitchStatement(object o)
{
  swtich (o)
  {
    case :
    break;
    case Person p when p.FirstName == "Katharina":
    break;
    case Person p:
    break;
    case var v:
    break;
  }
}

注:使用 when 关键字来指定模式的其他规则。

15.Throw表达式(Throw Expressions )

抛出异常只能通过声明来实现;在表达中是不可能的。因此,当使用构造函数接收参数时,需要额外检查null以抛出ArgumentNullException。使用C#7,可以在表达式中抛出异常,因此当左侧为空时,可以使用合并运算符抛出ArgumentNullException

In C# 6

private readonly IBooksService _booksService;
public BookController(BooksService booksService)
{
  if (booksService == null)
  {
    throw new ArgumentNullException(nameof(b));
  }
  _booksService = booksService;
}

In C# 7

private readonly IBooksService _booksService;
public BookController(BooksService booksService)
{
  _booksService = booksService ?? throw new ArgumentNullException(nameof(b));
}

16.异步Main方法

在C#7.1之前,Main方法总是需要声明为void类型。用C#7。1,Main方法也可以是Task类型,并使用async和await关键字:
In C# 7.0

static void Main()
{
  SomeMethodAsync().Wait();
}

In C# 7.1

async static Task Main()
{
  await SomeMethodAsync();
}

17.条件Ref表达式

以下代码片段声明方法GetNumber以返回对int的引用。这条路,调用者可以直接访问数组中的元素,并可以更改其内容:

In C# 7.0

int[] _numbers = { , , , ,  };
public ref int GetNumber(int index)
{
return ref _numbers[index];
}

In C# 7.2

变量 r 是对 arr 或 otherArr 中第一个值的引用。

ref var r = ref (arr != null ? ref arr[] : ref otherArr[]);

扩展:

1.使用C#7.2,可以将readonly修饰符添加到ref返回。调用者接收引用但不允许更改它:

In C# 7.2

int[] _numbers = { , , , ,  };
public ref readonly int GetNumber(int index)
{
return ref _numbers[index];
}

2.ref Struct (在C#7.2之前,C#可以创建引用类型(类)和值类型(结构)。但是,当发生装箱时,结构也可以存储在堆上。用C#7.2,可以声明只允许在堆栈上使用的类型:ref struct)

In C# 7.2

ref struct OnlyOnTheStack
{
}

C# 更多语法糖请参阅微软官方文档.https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/index

What's new in C# 7.0的更多相关文章

  1. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  2. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  3. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  4. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  5. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  6. Elasticsearch 5.0 中term 查询和match 查询的认识

    Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...

  7. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  8. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  9. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  10. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

随机推荐

  1. SQL中如何使用方向键——lrwrap

    Linux alias命令用于设置指令的别名. 用户可利用alias,自定指令的别名.若仅输入alias,则可列出目前所有的别名设置.alias的效力仅及于该次登入的操作.若要每次登入是即自动设好别名 ...

  2. Matlab 图像平移、旋转、缩放、镜像

    今天学习了用Matlab实现对图像的基本操作.在Matlab中,图像是按照二维矩阵的形式表示的.所以对图像的操作就是对矩阵的操作. 对图像进行缩放.平移.旋转,都可以转化为矩阵的运算. 关于变换矩阵的 ...

  3. Qt使用boost库

    1.在官网下载boost库 boost_1_70_0.zip 2.将你的Qt的工具目录(有gcc.exe)设置环境变量.(比如F:\Qt592\Tools\mingw530_32\bin) 3.在命令 ...

  4. Web聊天室的实现

    Tornado普通方式实现聊天室 普通的http方式连接的话,基本思路是前端页面通过JS重复连接后端服务器. 核心文件:app.py #!/usr/bin/env python # -*- codin ...

  5. IntelliJ-svn配置与使用

    目录 IntelliJ-svn配置与使用 SVN的配置 版本控制主要操作按钮 版本控制相关的常用设置 Version Control窗口 @(目录) IntelliJ-svn配置与使用 SVN的配置 ...

  6. .NET CORE添加引用包

    一 .添加服务端引用 1.直接右键添加项目引用,添加后再csproj文件中如下②,也可以直接用这种格式写入csproj文件中 2.直接右键添加DLL引用,添加后再csproj文件中如下③,也可以直接用 ...

  7. 如何区分进程和线程ps -eLf

    方式 使用ls /proc/pid/task/ 查看线程 使用ps -eLf命令/ps aux -L/ps aux -el 使用pstree 进程和线程 进程是资源分配的最小单位 线程是cpu时间片分 ...

  8. python:序列化与反序列化(json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  9. go context源码解析

    go 的context贯穿整个goroutine的运行控制的中枢,可以实现执行的生命周期的控制. Context是一个接口,他派生了context.emptyCtx(TODO),cancelCtx,t ...

  10. 高级UI-Palette

    Google推出的Palette是用来调色的,正如其汉语意思一样,可以用来显示颜色,在显示图片的时候,会配合图片的色调来显示,这样就显得很融合,其实Palette可以分析出图片中的很多特性,例如主色调 ...