C#6.0 在 2015 年7月随着.NET Framework 4.6 一同发布,后期发布了.NET Framework 4.6.1,4.6.2。

一、自动属性初始化(Auto-property initializers)

public class Account
{
public string Name { get; set; } = "summit";
    public int Age { get; private set; } = 22;
    public IList<int> AgeList { get; set; }= new List<int> { 10, 20, 30, 40, 50 };
}

二、字符串嵌入值(String interpolation)

在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错。

新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符,而且支持智能提示。

tip:如果想输出{或}符号,写两个即可,如$"{{"。

Console.WriteLine($"年龄: {account.Age}  生日: {account.BirthDay.ToString("yyyy-MM-dd")} ");
string t2 = $"{account.Age}_ {account.BirthDay.ToString("yyyy-MM-dd")}";
Console.WriteLine($" {(account.Age<=22?"小鲜肉":"老鲜肉")} ");

三、导入静态方法(Using Static)

可用于导入单个类的静态方法。

using static System.Math;

还可以使用 using static 为具有静态和实例方法的类导入类的静态方法。

using static System.String;

在 LINQ 查询中可以通过导入 Enumerable 或 Queryable 来导入 LINQ 模式。

using static System.Linq.Enumerable;

四、空值条件运算符(Null-conditional operators)

检查变量是否为null,如果不为null那就执行。

老的语法,简单却繁琐。

public static Point FromJson(JObject json)
{
if (json != null &&
json["X"] != null &&
json["X"].Type == JTokenType.Integer &&
json["Y"] != null &&
json["Y"].Type == JTokenType.Integer
)
{
return new Point((int)json["X"], (int)json["Y"]);
}
return null;
}

?.和?[运算符化简成

public static Point FromJson(JObject json)
{
if (json?["X"]?.Type == JTokenType.Integer &&
json?["Y"]?.Type == JTokenType.Integer
)
{
return new Point((int)json["X"], (int)json["Y"]);
}
return null;
}

?.还有一个比较大的用处在触发事件的时候

if (onChanged != null)
{
onChanged(this, args);
}

现在可以改写成这样

OnChanged?.(this, args);

五、索引初始化集合(Index Initializers)

这种方式可以给字典或其他对象通过索引赋值初始化.

IDictionary<int, string> dict = new Dictionary<int, string>() {[1]="first", [2]="second" } ;
foreach(var dic in dict)
{
Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
}

//output:
//key: 1 value:first
//key: 2 value:second

六、异常过滤器(Exception filters)

如果用于异常筛选器的表达式计算结果为 true,则 catch 子句将对异常执行正常处理。 如果表达式计算结果为 false,则将跳过 catch 子句。

try {
//异常抛出
}
catch (MyException ex) when ex.Status == MyExceptionStatus.A{
//do something
}
catch (MyException ex) when ex.Status== MyExceptionStatus.B{
//do something
}
catch (Exception caught) {
//do something
}

实例:

public static async Task<string> MakeRequest()
{
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
using (HttpClient client = new HttpClient(webRequestHandler))
{
var stringTask = client.GetStringAsync("https://docs.microsoft.com/en-us/dotnet/about/");
try
{
var responseText = await stringTask;
return responseText;
}
catch (System.Net.Http.HttpRequestException e) when (e.Message.Contains("301"))
{
return "Site Moved";
}
}
}

七、nameof表达式 (nameof expressions)

nameof 表达式的计算结果为符号的名称。 每当需要变量、属性或成员字段的名称时,这是让工具正常运行的好办法。 nameof 的其中一个最常见的用途是提供引起异常的符号的名称。

在对方法参数进行检查时经常这样写:

private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException("account");
}

如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.

private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException(nameof(account));
}

八、在cath和finally语句块里使用await(Await in catch and finally blocks)

Resource res = null;
try
{
res = await Resource.OpenAsync(…); // You could do this.

}
catch(ResourceException e)
{
await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{
if (res != null) await res.CloseAsync(); // … and this.
}

九、Lambda表达式在属性、方法中应用

1、在属性里使用Lambda表达式

注意属性是没有()的

public string Name => string.Format("姓名: {0}", "summit");

2、在方法成员上使用Lambda表达式

public void Print() => Console.WriteLine(Name);
static int LambdaFunc(int x, int y) => x*y;

原Point类代码较多:

public class Point
{
public int X { get; set; } public int Y { get; set; } public Point(int x, int y)
{
X = x;
Y = y;
} public double Dist
{
get { return Math.Sqrt(X * X + Y * Y); }
} public override string ToString()
{
return String.Format("({0}, {1})", X, Y);
}
}

运用属性初始化和方法Lambda简化后的Point类是这样的:

public class Point
{
public int X { get; } = 2;
public int Y { get; set; } = 1;
public double Dist => Sqrt(X * X + Y * Y);
public override string ToString() => $"({X}, {Y})";
}

C# 6.0 中的新增功能(.NET Framework 4.6 与 Visual Studio 2015 )的更多相关文章

  1. C# 7.0 中的新特性((.NET Framework 4.7 与 Visual Studio 2017 ))

    C#7.0 于 2017年3月 随 .NET 4.7 和 VS2017 发布. 一. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了 ...

  2. .net framework 4.5 在Visual studio 2015中丢失

    解决办法:从另一台C:\Program Files(x86)\Reference Assemblies\Microsoft\.NetFramework 成功的环境中copy .net4.5 文件夹到错 ...

  3. ADO.NET 中的新增功能

    ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...

  4. .NET Framework3.0/3.5/4.0/4.5新增功能摘要

    Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...

  5. .NET平台系列14 .NET5中的新增功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...

  6. WPF4.5 中的新增功能和增强功能的信息

    本主题包含有关 Windows Presentation Foundation (WPF) 版本 4.5 中的新增功能和增强功能的信息. 本主题包含以下各节: 功能区控件 改善性能,当显示大时设置分组 ...

  7. .NET Framework 4.5、4.5.1 和 4.5.2 中的新增功能

    .NET Framework 4.5.4.5.1 和 4.5.2 中的新增功能 https://msdn.microsoft.com/zh-cn/library/ms171868.aspx

  8. Windows 10 开发人员预览版中的新增功能(转自 IT之家)

    Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...

  9. .NET 4.0中的缓存功能

    # .NET 4.0中的缓存功能 .Net 4.0中有3种,System.Runtime.Caching,System.Web.Caching.Cache,Output.Cache.下面分别对这三者进 ...

随机推荐

  1. idea2018.1.1版激活码到2020.7

    N757JE0KCT-eyJsaWNlbnNlSWQiOiJONzU3SkUwS0NUIiwibGljZW5zZWVOYW1lIjoid3UgYW5qdW4iLCJhc3NpZ25lZU5hbWUiO ...

  2. [gRPC] 在 .NET Core 中创建 gRPC 服务端和客户端

    gRPC 官网:https://grpc.io/ 1. 创建服务端 1.1 基于 ASP.NET Core Web 应用程序模板创建 gRPC Server 项目. 1.2 编译并运行 2. 创建客户 ...

  3. 继承 多态 封装 Python面向对象的三大特性

    1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析.  那这个也可以被称为封装. 2. 继承: 两个 ...

  4. win7系统的CMD窗口切换目录--小计

    经常使用win7系统的CMD窗口,需要切换到工作目录,方法如下: 1. Win + R 2. 在命令行输入 cmd 出现如下: C:\Users\admin> 3. 在以上输入 D: (表示切换 ...

  5. Linux 打包和压缩

    常用的打包压缩方式 windows常用rar mac常用zip linux常用tar.gz 打包/解包 tar是linux中最常用的备份工具,此命令可以把一系列的文件打包到一个大文件中,也可以把一个打 ...

  6. kubernetes 实践四:Pod详解

    本篇是关于k8s的Pod,主要包括Pod和容器的使用.Pod的控制和调度管理.应用配置管理等内容. Pod的定义 Pod是k8s的核心概念一直,就名字一样,是k8s中一个逻辑概念.Pod是docekr ...

  7. 【LEETCODE】54、数组分类,简单级别,题目:605、532

    数组类,简单级别完结.... 不容易啊,基本都是靠百度答案.... 希望做过之后后面可以自己复习,自己学会这个解法 package y2019.Algorithm.array; /** * @Proj ...

  8. 【LEETCODE】43、1002. Find Common Characters

    package y2019.Algorithm.array; import java.util.*; /** * @ProjectName: cutter-point * @Package: y201 ...

  9. ArcGIS 字段计算器 Python 坑

    最近要处理个简单数据,一个字段中为文本类型,包含各种描述.要求是包含平方米的数值提取出来,变成数值,如果包含多个,则把各个值累加起来. 比如 字段值为 “非法占用100平方米” 处理后结果为 100 ...

  10. [洛谷P5431]【模板】乘法逆元2

    题目大意:给定$n(n\leqslant5\times10^6)$个正整数$a_i$,和$k$.求:$$\sum_{i=1}^n\dfrac{k^i}{a_i}\pmod p$$题解:$$令P=\pr ...