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对构造函数有一下的限制:
- 不能显示声明无参的构造函数
- 有参构造函数必须为所有的属性赋值
在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 新功能(三)的更多相关文章
- VS2015预览版中的C#6.0 新功能(二)
VS2015预览版中的C#6.0 新功能(一) VS2015预览版中的C#6.0 新功能(三) 自动属性的增强 只读自动属性 以前自动属性必须同时提供setter和getter方法,因而只读属性只能通 ...
- VS2015预览版中的C#6.0 新功能(一)
VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...
- VS2015预览版体验
.NET开源了,JAVA颤抖吧... 据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样就太爽啦,上微软官网下载了 ...
- Windows 10 开发人员预览版中的新增功能(转自 IT之家)
Windows 10 开发人员预览版中的新增功能 在Win10预览版中安装工具与SDK后,即可着手创建Windows通用应用或先浏览目前的环境与此前相比都发生了什么变化. 应用建模 文件资源管理器: ...
- 关于在Visual Studio 2019预览版中的用户体验和界面的变化
原文地址:https://blogs.msdn.microsoft.com/visualstudio/2018/11/12/a-preview-of-ux-and-ui-changes-in-visu ...
- 根据 Power BI Desktop(预览版)中的报表页创建工具提示
根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...
- 挑战中英实时语音翻译——Skype Translator 中文预览版登陆中国
Translator 中文预览版登陆中国" title="挑战中英实时语音翻译--Skype Translator 中文预览版登陆中国"> 今天,我们正式宣布在中国 ...
- 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...
- .NET 7 预览版2 中的 ASP.NET Core 更新
.NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进. 以下是此预览版中新增内容的摘要: 推断来自服务的API 控制器操作参数 SignalR 集线器方法的依赖注入 为 ...
随机推荐
- 关于plist文件
一.代码创建plist文件: NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomain ...
- asp.net mvc 删除栏目、栏目下又有子栏目的处理方式
- 初识CLR
眨眼间我已经实习了半年时间并且转正了,身份也正式从一个学生转变为一个职场人,这个博客自从开始实习以来就一直没有更新过= =没错,就是我懒癌晚期,不过不行!一切都要开始走向正轨,此博会继续见证我的成长, ...
- Java 执行终端命令实现,调用执行另外一个Java文件
Test.java package com.journaldev.files; public class Test { public static void main(String[] args) { ...
- PC机安装android apk | adb install -r
PC 下载 *****.apk 通过adb直接安装到android系统
- python之pandas模块
一.pandas模块是基于Numpy模块的,pandas的主要数据结构是Series和DadaFrame,下面引入这样的约定: from pandas import Series,DataFrame ...
- cubieboardtruck安装
1.命令关闭所有led灯 ls /sys/class/leds/*/brightness | xargs -i -n1 echo "echo 0 > {}" | sh 如果需 ...
- 在子jsp页面中调用父jsp中的function或父jsp调用子页面中的function
项目场景: A.jsp中有一个window,window里嵌入了一个<iframe>,通过<iframe>引入了另一个页面B.jsp.在B.jsp中的一个function中需要 ...
- [HDU] 2795 Billboard [线段树区间求最值]
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【转】嵌入式Linux学习笔记
一 嵌入式系统定义: 应用于特定环境的硬件体系. 二 两样非常重要的能力: 1. 掌握各种新概念的能力 2. 调试的能力( 包括软件, 硬件 ) 三 需要的基础知识: 1. 操作系统理论基 ...