VS2015预览版中的C#6.0 新功能(一)

VS2015预览版中的C#6.0 新功能(二)

Using static

使用using StaticClass,你可以访问StaticClass类里的static成员而不需要指定类的名字,来看下面的例子

using System.Console;

namespace CSharp6_0
{
class UsingStatic
{
public void PrintMsg(string message)
{
WriteLine(message);
}
}
}

在本例中,通过在一开始声明using System.Console; 在PrintMsg方法中就可以直接访问Console类的WriteLine方法了,而不需要使用Console.WriteLine。

这个语法糖的一个用处就是对于扩展方法,可以只引入一个扩展类中的扩展方法,而不是按命名空间引入整个命名空间的。

索引初始化器

对象和集合初始化器在初始化对象的属性,域或者给集合一组初始元素时,非常方便有效,而对于字典和带有索引器的对象,就不是那么方便。在6.0中,为对象初始化器引入了新的语法来通过索引器根据key设置value,下面是一个例子

    class IndexerIntializer
{
public void Show()
{
var dictionary = new Dictionary<int, string>
{
[] = "first",
[] = "third",
}; Console.WriteLine(dictionary[]);
Console.WriteLine(dictionary[]);//willthrow exception since it is not set.
Console.WriteLine(dictionary[]);
}
}

例子中在创建字典对象时,使用索引初始化器为其第一个元素和第三个元素设置了值.

异常过滤器

F#和VB中都具有异常过滤器,在c#6.0中也加入了这个功能,这样我们就能够写出如下所示的代码

try { … }
catch (MyException e) if (myfilter(e))
{

}

只有if中的myfilter返回true,才会执行对应的catch语句块,否则异常会继续抛出。异常过滤器在需要先catch,然后再throw出去的情况下,非常适用,因为它对异常的stack信息没有改变,在后面的处理中,能够取到异常最初抛出的地方而非重新抛出的地方。来看下面的一个例子

    internal class ExceptionFilter
{
private void ThrowException(string argument)
{
if (argument == null)
{
throw new ArgumentNullException("argument is null");
}
} private bool LogExcetion(Exception ex)
{
Console.WriteLine("Logger: " +ex.Message);
return false;
} public void Show()
{
try
{
ThrowException(null);
}
catch (ArgumentNullException ex) if (LogExcetion(ex))
{
Console.WriteLine("Only print this when the filter return true");
}
}
}

这个ExceptionFilter类有三个方法,其中ThrowException是异常抛出点,LogException是异常过滤函数,Show函数则调用ThrowException函数并使用LogException函数写log。
下面是调用Show函数的执行结果

从截图中可以看出,Show函数的catch块并没有执行,因为LogException函数返回false。异常的stack信息保存完成。

在catch和finally里使用await

在c#5.0中,await关键字是不能在catch和finally语句块中使用的,在6.0中这个限制已经没有了,如下所示你可以把它用在catch和finally语句块中了

    internal class AwaitInCatchAndFinally
{
public async void Show()
{
try
{
await OpenAsync(); // You could do this.
}
catch (Exception e)
{
await ProcessExceptionAsync(e); // Now you can do this …
}
finally
{
await CleanAsync(); //and this
}
} private Task ProcessExceptionAsync(Exception e)
{
return new TaskFactory().StartNew(() => Console.WriteLine("ProcessExceptionAsync: " + e.Message));
} private Task CleanAsync()
{
return new TaskFactory().StartNew(() => Console.WriteLine("CleanAsync is called "));
} private Task OpenAsync()
{
throw new Exception("exception happened.");
}
}

在本例中,await方法用在了catch和finally语句块中,下面是该程序的执行结果

结构体中的无参构造函数

之前struct对构造函数有一下的限制:

  1. 不能显示声明无参的构造函数
  2. 有参构造函数必须为所有的属性赋值

在c#6.0中,可以在struct中声明一个无参构造函数,下面是一个例子

    internal struct StructParameterlessCtor
{
public int CPUCount { get; set; } public string Band { get; set; } public StructParameterlessCtor(int countOfCPU, string band)
{
CPUCount = countOfCPU;
Band = band;
} public StructParameterlessCtor()
{
CPUCount = ;
Band = "DELL";
}
}

这个struct中,有两个构造函数,一个是有参的,一个是无参的,无论是有参还是无参的都必须为所有的属性赋值。这里无参构造函数也可以像下面那样调用有参的构造函数:

        public StructParameterlessCtor() : this(, "DELL")
{
}

struct中的无参构造函数只有在显示使用new运算符时才会被调用, default(StructParameterlessCtor) 和 new StructParameterlessCtor[...] 都不会调用无参构造函数。

VS2015预览版中的C#6.0 新功能(三)的更多相关文章

  1. VS2015预览版中的C#6.0 新功能(二)

    VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...

  2. VS2015预览版中的C#6.0 新功能(一)

    VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...

  3. VS2015预览版体验

    .NET开源了,JAVA颤抖吧... 据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样就太爽啦,上微软官网下载了 ...

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

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

  5. 关于在Visual Studio 2019预览版中的用户体验和界面的变化

    原文地址:https://blogs.msdn.microsoft.com/visualstudio/2018/11/12/a-preview-of-ux-and-ui-changes-in-visu ...

  6. 根据 Power BI Desktop(预览版)中的报表页创建工具提示

    根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...

  7. 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国

    Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...

  8. 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...

  9. .NET 7 预览版2 中的 ASP.NET Core 更新

    .NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...

随机推荐

  1. iOS_SN_沙盒文件操作及位置

    转载:http://blog.csdn.net/hello_hwc/article/details/44916909 沙盒的结构如下所示 一 访问Bundle 注意Bundle只读,不能写入 创建一个 ...

  2. 犯罪团伙 codevs 3554

    这是一道经典的水题,提供两种方法:①深搜  ②并查集 NO.1 深度优先搜索: #include<iostream>#include<cstdio>#include<al ...

  3. Dijkstra算法C#实现及其布线运用

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下是空调布线对Dijkstra算法的运用,采用C#实现. 问题:室内机多台,室外机一台.寻找室内 ...

  4. 那两年炼就的Android内功修养

    http://blog.csdn.net/luoshengyang/article/details/8923485 http://iconsparadise.com/ http://blog.csdn ...

  5. cf A. Jeff and Digits

    http://codeforces.com/contest/352/problem/A #include <cstdio> #include <cstring> #includ ...

  6. 深入浅出Node.js (5) - 内存控制

    5.1 V8的垃圾回收机制与内存限制 5.1.1 Node与V8 5.1.2 V8的内存限制 5.1.3 V8的对象分配 5.1.4 V8的垃圾回收机制 5.1.5 查看垃圾回收日志 5.2 高效使用 ...

  7. Jquery局部打印插件

    局部打印插件 jquery.PrintArea.js js代码 (function ($) {     var printAreaCount = 0;     $.fn.printArea = fun ...

  8. POJ3278 Catch That Cow(BFS)

    Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...

  9. SQL server 中 COUNT DISTINCT 函数

    目的:统计去重后表中所有项总和. 直观想法: SELECT COUNT(DISTINCT *) FROM [tablename] 结果是:语法错误. 事实上,我们可以一同使用 DISTINCT 和 C ...

  10. OpenMeetings(3)----启动顺序解析

    OpenMeetings系统较大,代码量也不小,如果对前端的OpenLaszlo开发不熟悉的话,刚研究代码时,确实有种丈二和尚摸不着头脑的感觉.一番研究之后,终于初步理清了系统的初步动作流程,具体执行 ...