写在前面

接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性。在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习。废话不多说,直奔主题。

原文地址:http://www.codeproject.com/Articles/1070659/All-About-Csharp-New-Features

简介

众所周知,c# 6.0 是在visual studio 2015中引入的。在其他的几个版本中同样引入一些特性,比如在c# 3.0中引入了linq,在c# 4.0中引入了动态类型dynamic,在c#5.0中引入async和await等等。

在c# 6.0更多关注了语法的改进,而不是增加新的功能。这些新的语法将有助于我们更好更方便的编写代码。

背景

你可以通过下载visual studio2015或者你已经安装了visual studio2013,然后从这里(https://github.com/dotnet/roslyn)下载roslync包。Roslync是一个开源的并且和visual studio 2015继承的.net 编译器。

以下是c# 6.0的几种改善的新的语法:

1、Using Static:使用static

2、Auto Property Initializers:自动属性初始化

3、Index Initializers:索引初始化

4、String Interpolation:字符串插入

5、Expression Bodied Members

6、Getter Only Auto Properties:只读自动属性

7、Exception Filters:异常过滤器

8、Null Conditional Operators:null条件操作符

9、Declaration Expressions:声明表达式

using static

这是一件在你的编程生涯中非常有用的一个特性。现在你可以通过using 关键字访问类的属性和方法了。实现这个,你只需要在你类的命名空间前using之后static关键字就可以了。

using static System.Console;

当我们使用using引用了System.Console这个类。那么我们就可以访问这个类的所有属性和方法。下面看一个在c# 6.0之前和之后我们是如何做的例子:

Before C# 6.0

using System;
namespace CplusplusNewFeature
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(" C# 6.0新特性");
}
}
}

在c# 6.0之前,如果我们要使用WrilteLine()方法,我们使用Console.WriteLine()。如果没有引用Console这个类,我们是无法访问这个方法的。

C# 6.0中

using System;
using static System.Console;
using static CplusplusNewFeature.MyClass;
namespace CplusplusNewFeature
{
class Program
{
static void Main(string[] args)
{
WriteLine("c# 6.0 新特性");
Hello();
ReadLine();
}
}
static class MyClass
{
public static void Hello()
{
WriteLine("This is static class");
}
}
}

C# 6.0在使用这个类的时候并不需要每次都引用这个类。我们只需要在using中声明这个类,那么我们就可以访问到它。

当然,我们也可以引用其他的类并访问它的成员。

在上面的例子中,我们使用了MyClass类的Hello()方法。

 static class MyClass
{
public static void Hello()
{
WriteLine("This is static class");
}
}

在这里我们使用using引入了命名空间了,如下所示:

using static CplusplusNewFeature.MyClass;

Auto Property Initializers

我们使用属性访问内部成员。属性有setter和getter方法。在c# 6.0之前,我们并不能直接为属性赋值。如果真要这么做,我们只能通过属性对应的字段来初始化。但是c# 6.0提供更灵活的方式。

通过c# 6.0我们可以在定义属性的时候直接为它赋值。

Before C# 6.0

之前我们通过构造函数初始化属性。看下面的例子,在这里我们创建了多个属性,并在构造函数中为他们赋值。

using System;
using static System.Console;
namespace CplusplusNewFeature
{
public class Program
{
static void Main(string[] args)
{
Employee emp = new Employee();
Console.WriteLine("Employee Id is " + emp.EmployeeId);
Console.WriteLine("Employee Full Name is " + emp.FullName);
Console.ReadLine();
}
}
public class Employee
{
public Guid EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; } public string FullName { get; set; }
public Employee()
{
EmployeeId = Guid.NewGuid();
FirstName = "Mukesh";
LastName = "Kumar";
FullName = string.Format("{0} {1}", FirstName, LastName);
}
}
}

C# 6.0中

但是在c#6.0中非常方便,我们不必担心怎么、在哪儿初始化属性值。你可以直接在属性后面通过=asign指定属性的值。这种方式不会引发异常并且可以正常运行。在下面的例子中,我们可以看到EmplyeeId,FirstName,lastName初始化。

using System;
using static System.Console;
namespace CplusplusNewFeature
{
public class Program
{
static void Main(string[] args)
{
Employee emp = new Employee();
WriteLine("Employee Id is " + emp.EmployeeId);
WriteLine("Employee Full Name is " + emp.FullName);
ReadLine();
}
}
public class Employee
{
public Guid EmployeeId { get; set; } = Guid.NewGuid();
public string FirstName { get; set; } = "Mukesh";
public string LastName { get; set; } = "Kumar"; public string FullName { get { return string.Format("{0} {1}", FirstName, LastName); } } }
}

Index Initializers

c#6.0提供了一种新的初始化集合的方式。你可以创建想字典,hashtable一样的集合。众所周知,字典是键值对形式的,并且为对应的key指定value。在c#6.0之前,我们有很多不同的方式去创建键值对。看一下下面的在c#中c#6.0之前怎么使用键值对字典的。

using System;
using System.Collections.Generic;
namespace CplusplusNewFeature
{
public class Program
{
static void Main(string[] args)
{
Dictionary<int, string> myDictionary = new Dictionary<int, string>() {
{, "Mukesh Kumar" },
{, "Rahul Rathor" },
{, "Yaduveer Saini" },
{, "Banke Chamber" }
}; foreach (var item in myDictionary)
{
Console.WriteLine("The " + item.Key + " Number Employee is " + item.Value + "\n");
}
Console.ReadLine();
}
}
}

In c#6.0

但是在c#6.0中,我们可以逻辑上为索引为1的指定“Mukes Kumar”的值,其它的以此类推。你可以看看下面的这个例子,将消除你所有的疑虑。

using System;
using System.Collections.Generic;
using static System.Console;
namespace CplusplusNewFeature
{
public class Program
{
static void Main(string[] args)
{
Dictionary<int, string> myDictionary = new Dictionary<int, string>()
{
[] = "Mukesh Kumar",
[] = "Rahul Rathor",
[] = "Yaduveer Saini",
[] = "Banke Chamber"
}; foreach (var item in myDictionary)
{
WriteLine("The " + item.Key + " Number Employee is " + item.Value + "\n");
}
ReadLine();
}
}
}

总结

之前也看过这方面的文章,没动手实现过,今天尝试了下,发现非常的方便。

c# 6.0新特性(一)的更多相关文章

  1. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?

    来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...

  2. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

  3. Visual Studio 2015速递(1)——C#6.0新特性怎么用

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  4. atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性

    atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性   1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...

  5. 背水一战 Windows 10 (1) - C# 6.0 新特性

    [源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...

  6. C# 7.0 新特性2: 本地方法

    本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  7. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  8. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

  9. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  10. C#发展历程以及C#6.0新特性

    一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...

随机推荐

  1. Linux 安装 redis

      环境:centos7 参考:http://blog.csdn.net/lk10207160511/article/details/50364088 步骤如下: 安装redis: 打开终端 输入 s ...

  2. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  3. mysql sql获取上条插入id,update影响行数

    1.获取上条插入数据 LAST_INSERT_ID(); 2.获取update影响行数. ROW_COUNT(); mysql> UPDATE t -> SET address = 'be ...

  4. NFS(Network File System)服务配置和使用

    Sun公司开发NFS (Network File System)之初就是为了在不同linux/Unix系统之间共享文件或者文件夹.可以在本地通过网络挂载远程主机的共享文件,和远程主机交互.NFS共享存 ...

  5. 【ASP.NET 问题】System.InvalidOperationException: 对象的当前状态使该操作无效 【大量表单数据提交】错误解决

    出现的问题描述: 当页面的数据量比较大时,出现异常,详细信息: System.InvalidOperationException: 对象的当前状态使该操作无效 问题的原因:出现这个异常的原因是因为微软 ...

  6. 利用WinPcap模拟网络包伪造飞秋闪屏报文

    起因 不知道从什么时候开始,同事开始在飞秋上发闪屏振动了,后来变本加厉,成了每日一闪.老闪回去也比较麻烦,作为程序猿呢,有没有什么偷懒的办法呢?(同事负责用户体验,不大懂编程).然后尝试了以下思路: ...

  7. java 16 -11 ArrayList存储自定义对象并增强for遍历

    需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for     C:增强for LinkedList,Vector,Colleciton,List ...

  8. android app多渠道分发打包

    1.  美团多渠道包的方法论 1) maven编译多次 2) apktool一次包,解开重新打  (个人倾向于这个) 3) http://tech.meituan.com/mt-apk-packagi ...

  9. localStorage和sessionStorage区别

    localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. 他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现) ...

  10. 04JavaIO详解_DataInputStream(属于过滤l流)

    DataInputStream这个类是二进制读写的.并且 是过滤流,会一层套一层的.这里就是装饰者模式. public class DataStream1 { public static void m ...