C#6.0新特性的尝试
由于项目升级到了.NetFramework 4.6.1,开发工具转向了vs2015,趁机尝试下C#6.0.结果在网上搜的一些教程总结的不是太完整,有的代码随着vs正式版的发布也有所修改.那些个教程也没更新.
所以把自己学习到的记录一下.
1.自动属性初始化(Auto-property initializers)
public class Account{public string Name { get; set; } = "summit";public int Age { get; set; } = 22;public IList<int> AgeList{get;set;} = new List<int> { 10,20,30,40,50 };}
对于只读属性也可以这样直接初始化(C#5.0不支持),也可以直接在构造函数里初始化
public class Customer
{public string Name { get; }public Customer(string first, string last){Name = first + " " + last;}
}
2.字符串嵌入值(String interpolation)
在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.
Console.WriteLine($"年龄:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"年龄:{account.Age}");
Console.WriteLine($"{(account.Age<=22?"小鲜肉":"老鲜肉")}");
如果想输出{或}符号,写两个即可,如$"{{".
注意这个$符号,网上的N多教程都是没有这个东东的.是直接"\{ account.Age \}",这种方式在新版本里已经被抛弃了.
3.导入静态类(Using Static)
像之前使用Math这个静态类的时候要先导入System命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.
using static System.Math;//注意这里不是命名空间哦Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"导入后可直接使用方法: {Pow(4,2)}");
注意这里是using static ...
如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的.
4.空值运算符(Null-conditional operators)
之前写过无数个这样的判断代码
if (*** != null)
{//不为null的操作
}
return null;
现在使用可以简化这样方式.
var age = account.AgeList?[0].ToString();Console.WriteLine("{0}", (person.list?.Count ?? 0));
如果account.AgeList为空则整个表达式返回空,否则后边的表达式的值.
5.对象初始化器(Index Initializers)
这种方式可以给字典或其他对象通过索引赋值初始化.
IDictionary<int, string> dict = new Dictionary<int, string>() {[1]="first",[2]="second"
};
foreach(var dic in dict)
{Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
}output:
key: 1 value:first
key: 2 value:second
6.异常过滤器(Exception filters)
private static bool Log(Exception e)
{Console.WriteLine("log");return true;
}
static void TestExceptionFilter()
{try{Int32.Parse("s");}catch (Exception e) when (Log(e)){Console.WriteLine("catch");return;}
}当when()里面返回的值不为true,将持续抛出异常,不会执行catch里面的方法.
7.nameof表达式 (nameof expressions)
在对方法参数进行检查时经常这样写:
private static void Add(Account account)
{if (account == null)throw new ArgumentNullException("account");
}如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.
使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-! 不知道翻译的对不对)
private static void Add(Account account)
{if (account == null)throw new ArgumentNullException(nameof(account));
}
8.在cath和finally语句块里使用await(Await in catch and finally blocks)
c#5.0里是不支持这么写.Resource res = null;
try
{res = await Resource.OpenAsync(…); // You could do this.…
}
catch(ResourceException e)
{await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{if (res != null) await res.CloseAsync(); // … and this.
}
9.在属性里使用Lambda表达式(Expression bodies on property-like function members)
public string Name =>string.Format("姓名: {0}", "summit");public void Print() => Console.WriteLine(Name);
10.在方法成员上使用Lambda表达式
static int LambdaFunc(int x, int y) => x*y;public void Print() => Console.WriteLine(First + " " + Last);
关于C#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速.
最后附上github上关于c#6.0的相关介绍链接:点我点我
转载于:https://www.cnblogs.com/summit7ca/p/5319647.html
C#6.0新特性的尝试相关推荐
- mysql8.0创建属性,MySQL 8.0新特性 — 管理端口的使用简介
前言 下面这个报错,相信大多数童鞋都遇见过:那么碰到这个问题,我们应该怎么办呢?在MySQL 5.7及之前版本,出现"too many connection"报错,超级用户root ...
- Redis 6.0 新特性 ACL 介绍
Redis 6.0 新特性 ACL 介绍 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实 ...
- [翻译] C# 8.0 新特性
原文: Building C# 8.0 [译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"] C# 的下一个主要版本是 8.0.我们已经为它 ...
- hadoop3.0新特性介绍
hadoop3.0新特性介绍 1. 基于jdk1.8(最低版本要求) 2. mr采用基于内存的计算,提升性能(快spark 10倍) 3. hdfs 通过最近black块计算,加快数据获取速度(块大小 ...
- Android5.0,6.0,7.0,8.0新特性整理
背景 Android5.0(Android Lollipop)是谷歌公司2014年10月发布的全新安卓系统,至今已经两年多.然而由于国产手机对安卓ROM的深度定制或修改,以及手机厂商.芯片制造商.运营 ...
- Android6.0新特性
1.大量漂亮流畅的动画 安卓6.0系统增加了大量漂亮的过度动画,可以从视觉上减少卡顿感,给用户带来流畅的体验.说到过渡动画,以前可是苹果手机的拿手好戏,现在安卓大有赶超iOS的趋势. 2.相机新增专业 ...
- Android 4.0新特性(中文)
Android 4.0新特性(中文) 转自http://www.eoeandroid.com/thread-103300-1-1.html android4.0 SDK发布有一段时间了,在eoe上找到 ...
- Android5.0,6.0,7.0新特性整理
背景 Android5.0(Android Lollipop)是谷歌公司2014年10月发布的全新安卓系统,至今已经两年多.然而由于国产手机对安卓ROM的深度定制或修改,以及手机厂商.芯片制造商.运营 ...
- Android5.0 6.0 7.0新特性
原文链接:http://blog.csdn.net/haovip123/article/details/54618642 背景 Android5.0(Android Lollipop)是谷歌公司201 ...
- mysql3819错误,MySQL 8.0新特性 ― 检查性约束的使用简介
前言 在MySQL 8.0版本中,引入了一个非常有用的新特性 ― 检查性约束,它可以提高对非法或不合理数据写入的控制能力:接下来我们就来详细了解一下. 检查性约束 创建.删除与查看 (1)可以在建表时 ...
最新文章
- TCP三次握手与四次断开
- 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc
- FormView用法
- LeetCode-3. 无重复字符的最长子串
- 结构化数据传输协议xml、json、protobuf比较
- *第七周*数据结构实践项目三【负数把整数赶出队列】
- Trained Tesseract on 瘦金体 successfully!!
- 周日历插件weeklyCalendar,可添加日历提醒
- 如何注册PayPal账户
- 二项式展开 matlab,二项式造句_造句大全
- Mybatis Generator配置文件
- Visual Paradigm简单教程(2):绘制序列图
- 地理信息系统矢量数据的组织形式 第一章:二维空间对象数据模型
- java龙世界禁忌之恋灵魂大殿_《龙世界-禁忌之恋》完美图文攻略
- Twitter Storm: DRPC学习
- Commander入门
- 我们不再是冷暖自知的个体
- 实践是检验真理的唯一标准2 - 脱壳篇03
- 哈佛的学生都在看这种视频,每天15分钟,英语水平暴增!
- 名悦集团:新能源汽车保养做好这三步,用车无忧