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 集线器方法的依赖注入 为 ...
随机推荐
- JAVA与JSON的序列化、反序列化
package com.linkage.app.memcache; import java.util.HashMap;import java.util.Map.Entry; import net.sf ...
- 华为oj 计算字符个数
练手而已 #include <stdio.h> #include <string.h> int main(void) { char string[200]={'\0'}; in ...
- call()与apply()传参需要注意的一点
call()与apply()是用来改变函数体内的this指向,第一个参数是调用函数的母对象,他是调用上下文,函数体内通过this来获得对它的引用,换句话说就是第一参数===函数中的this. 但是如下 ...
- jquery 自动实现autocomplete+ajax
来公司也差不多一个半月了,一直做点小东西,现在在做公司的出货系统,也只是做来锻炼锻炼的. 好了 不废话了 下面是实现 jquery插件 autocomplete+ajax 自动实现.也是刚学,勿喷. ...
- js中的console
console.log 是我们在调试代码的时候经常用到的一个方法,也可能也是很多人用的关于console的唯一方法,其实console对象下有很多不错的方法,现在记录总结于此. log.info. ...
- 设置ubuntu Android sdk环境变量
cd /etc/ sudo gedit profile 在后面把tools和platform-tools的路径追加进去即可 PATH=$PATH:/home/android_sdk/tools 然后再 ...
- python保留指定文件、删除目录其他文件的功能(1)
由于给客户的发布版本上客户改动了些代码和图片,我们这边给他们更新publish都是增量更新(开发提供更新指定的文件,我们提取出来给客户进行覆盖更新),但有时需要更新的文件较多导致不得不一个一个的进行查 ...
- MS Build参考
以下链接很详细的讲述了Build方面相关的知识,顺带连Link的参数都解释了,以后不知道就来这里查一查了. http://msdn.microsoft.com/zh-CN/library/ee8624 ...
- 可变参数列表-Java SE5新特性(转)
Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持 ...
- Find the largest multiple of 3 解答
Question Given an array of non-negative integers. Find the largest multiple of 3 that can be formed ...