简短介绍 C# 6 的新特性 【已翻译100%】

几周前我在不同的地方读到了有关C#6的一些新特性。我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍。它们中的一些可能不会如预期那样神奇,但那也只是目前的更新。

你可以通过下载VS2014或者安装这里针对visual studio2013的Roslyn包来获取它们。

那么让我们看看吧:

1. $ sign

使用它的目的是简化基于索引的字符串,仅此而已。它不是像现在C#的一些动态特性,因为其内部使用了正规的索引功能. 为了编译理解请看下面的示例:

var col = new Dictionary<string, string>()
            {
                $first = "Hassan"
            };

   //Assign value to member
   //the old way:
   col.$first = "Hassan";

   //the new way:
   col["first"] = "Hassan";

2. 异常过滤器:

异常过滤器已经被VB编译器支持了,而现在它也被引入了C#。异常过滤器让你可以为一个catch块指定一个条件. 这个catch块就只会在条件被满足时被执行 , 这是我最喜欢的特性,那么就让我们来看看示例吧:

try
            {
                throw new Exception("Me");
            }
            catch (Exception ex) if (ex.Message == "You")
            {
                // this one will not execute.
            }
            catch (Exception ex) if (ex.Message == "Me")
            {
                // this one will execute
            }

3. catch和finally块中await关键字

据我所知,没有人知道C# 5中catch和finally代码块内await关键字不可用的原因,无论何种写法它都是不可用的。这点很好因为开发人员经常想查看I/O操作日志,为了将捕捉到的异常信息记录到日志中,此时需要异步进行。

try
            {
                DoSomething();
            }
            catch (Exception)
            {
                await LogService.LogAsync(ex);
            }

4. 声明表达式

这个特性允许开发人员在表达式中定义一个变量。这点很简单但很实用。过去我用asp.net做了许多的网站,下面是我常用的代码:

long id;
if (!long.TryParse(Request.QureyString["Id"], out id))
{ }

优化后的代码:

if (!long.TryParse(Request.QureyString["Id"], out long id))
{ }

这种声明方式中变量的作用域和C#使用一般方式声明变量的作用域是一样的。

5. Static的使用

这一特性允许你在一个using语句中指定一个特定的类型,此后这个类型的所有静态成员都能在后面的子句中使用了.

using System.Console;

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            //Use writeLine method of Console class
            //Without specifying the class name
            WriteLine("Hellow World");
        }
    }
}

6. 属性的自动初始化:

C# 6 自动舒适化属性就像是在声明位置的域。这里唯一需要知道的是这个初始化不会导致setter方法不会在内部被调用. 后台的域值是直接被设置的,下面是示例:

public class Person
    {
        // You can use this feature on both
        //getter only and setter / getter only properties

        public string FirstName { get; set; } = "Hassan";
        public string LastName { get; } = "Hashemi";
    }

7. 主构造器:

呼哈哈,主构造器将帮你消除在获取构造器参数并将其设置到类的域上,以支持后面的操作,这一痛苦. 这真的很有用。这个特性的主要目的是使用构造器参数进行初始化。当声明了主构造器时,所有其它的构造器都需要使用 :this() 来调用这个主构造器.

最后是下面的示例:

//this is the primary constructor:
    class Person(string firstName, string lastName)
    {
        public string FirstName { get; set; } = firstName;
        public string LastName  { get; } = lastName;
    }

要注意主构造器的调用是在类的顶部.

时间: 2024-09-17 04:45:35

简短介绍 C# 6 的新特性 【已翻译100%】的相关文章

使用 Protocol Buffers 代替 JSON 的五个原因 【已翻译100%】

在Ruby和Rails开发者中,面向服务(Service-Oriented)架构有一个当之无愧的名声,它是一个缓解程序规模恶性增长的一个强有力的途径,可在大量应用程序中提取关注点.这些新生小巧的服务通常继续使用Rails或Sinatra,并使用JSON在HTTP上通信.尽管JSON作为一个数据相互交换格式,有很多优点:人类可读.可理解,并通常表现出色. 浏览器和JS并不直接处理数据--尤其是遇到内部服务时.我的观点是,结构化格式,例如谷歌的Protocol Buffers,是一个比JSON在编码

50 个 jQuery 插件可将你的网站带到另外一个高度 【已翻译100%】

Web领域一直在发生变化并且其边界在过去的每一天都在发生变化(甚至不能以小时为计),随着其边界的扩展取得了许多新发展.在这些进步之中,开发者的不断工作创造了更大和更好的脚本,这些脚本以插件方式带来更好的终端用户体验,它们比原来更轻量级,还有更强的处理能力. 关键是这些新发展起来的脚本和插件是能构建响应式Web的,而且还不会丧失它们原有的功能特性--除了更优秀和更轻巧(就文件大小而言)之外,它们还不会增加页面加载的时间. 通过浏览文档,掌握JQuery的语法是很容易的.它可以支持选择DOM元素,创

通过 Doctype 启用浏览器模式 【已翻译100%】(2/2)

doctype嗅探(也叫doctype转换) 现代浏览器使用doctype嗅探来决定text/html文档的引擎模式.这意味着模式的选择是基于HTML文档开始的文档类型声明(或缺少).(这不适于使用XML文档类型的文档.) 文档类型声明(doctype)是SGML的语法伪造,SGML是个旧式的标记框架,HTML5之前的HTML就是依据其定义的.HTML4.01规范中,文档类型声明描述的是HTML的版本信息.尽管名字叫"文档类型声明"且HTML 4.01规范所描述的是关于"版本

10 个迅速提升你 Git 水平的提示 【已翻译100%】

最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用Git提供的功能. 注:本文中,一些命令包含了方括号中的部分内容(例如:git add -p [file_name]).在这些示例中,你将插入必要的数字.标示符等等,如果没有方括号. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题

OpenSSL 项目路线图 【已翻译100%】(1/2)

本文档旨在描绘出OpenSSL项目的路线图.它是一个会日臻完善的在线文档.它应该被设定理想的目标和里程碑日期. OpenSSL 项目当前看起来越来越迟滞和封闭.本路线图将尝试通过设定一些带有具体里程碑日期的目标来解决这个问题. 目前的问题 OpenSSL项目目前正面面临一些问题,它们是: 1.RT积压 开放以来的相当长的一段时间,RT的已经积压到了一个显著的数量. 这些问题中的大部分事实上已经被处理了,所以应该被关闭,但是却没有被记录在系统中.而大多数都尚未被关注. 2.不完整/错误的文档 Op

MariaDB: 选择性二进制日志事件 【已翻译100%】

作为MariaDB一系列有趣特性的第一篇文章,我们从选择性跳过复制binlog事件开始.MariaDB 5.5和10支持此特性. 默认情况下使用MySQL标准复制功能时,所有事件都记录在二进制日志中,并复制到所有从机(可以过滤掉一些模式).但使用此特性,可以在从机上跳过一些事件的复制,即使这些事件是被写入到二进制日志中的.在二进制日志中保存那些事件对于时间点恢复来说总是有用的. 的确,当不需要复制一个事件时,我们通常会设置 sql_log_bin = 0 ,该事件就会被跳过:既不会写入binlo

OpenSSL 项目路线图 【已翻译100%】(2/2)

平台被放入二级平台支持清单的必要条件包括: 现实需要,例如,一个被广泛部署和使用的平台 供应商支持 对开发团队有用,例如,开发团队需要一个合适的环境,来在其中测试构建并处理RT项和问题 开发团队成员需要, 例如,团队中至少有一人愿意为这个平台负责 此外二级列表将尽可能小,以避免开发团队过于分散. 二级平台仍然待定,但会基于上述标准.对于每一个首要/二级平台,我们应该至少有一个持续集成的框架以及一个我们可以访问,用来测试和调试的开发机器. 我们会从供应商或者社区处寻求访问这些平台的支持. 二级平台

为什么 Docker 在引领虚拟化和云计算的新浪潮 【已翻译100%】

又是一年的OSCON之际,今年的技术领域关注在人们热烈讨论的云基础建设.其中更有趣的是刚开始起步的Docker,这是一个超轻量化容器应用,充满潜力. 我对Docker的服务副总裁James Turnbull非常着迷,他将会在大会上带来一场Docker的速成班.除了探究Docker是什么之外,我们还将导论云,开源贡献和得到一份真正的工作. 您曾经出版过关于不同linux方面的著作.您开始是如何探索linux的呢?是什么让您对linux如此热衷呢? 我想我第一次接触linux是在Debian刚发布不

MySQL 5.6 的 GTIDs : 新复制协议和中断复制的新方法 【已翻译100%】

MySQL5.6有很多新的特性,其中很多人都感兴趣的一条就是全局事务序号功能(GTIDs).而大家都对这一特性很感兴趣的原因也很好理解,即:本来重新连接从服务器和一个新的主服务器一直是件很麻烦的事,然而在启用GTIDs功能之后就变得简单易行.可是,GTIDs的使用不单单是用单独的标识符替换旧的二进制日志文件/位置,它也采用了新的复制协议.假如你还不太明白这些,那你可以在这篇文章里学点什么.复制协议:新的 VS 旧的 旧的协议往往简单直接即:首先从服务器上在一个特定的偏移量那里连接到一个给定的二进