第十六节:语法总结(3)(C#6.0和C#7.0新语法)
一. C# 6.0 新语法
1. 自动属性初始化可以赋值
/// <summary>
/// 自动属性初始化
/// </summary>
public class UserInfor
{
public string userId { get; set; } = ""; public string userName { get; set; } = "lmr"; }
{
Console.WriteLine("------------------------- 1. 自动属性初始化可以赋值----------------------------");
UserInfor uInfor = new UserInfor();
Console.WriteLine($"id={uInfor.userId},userName={uInfor.userName}");
}
2. 字符串嵌入值【$配合{}使用】
特别注意:{}中如果有业务计算需要配合()使用
{
Console.WriteLine("------------------------- 2. 字符串嵌入值【$配合{}使用】----------------------------");
UserInfor uInfor2 = new UserInfor();
Console.WriteLine($"名字为:{uInfor2.userName}");
//代表要输入一个括号{}
Console.WriteLine($"名字为:{{{uInfor2.userName}}}");
//{}中如果有业务计算需要配合()使用
Console.WriteLine($"{(uInfor2.userName != "lmr" ? "小鲜肉" : "老鲜肉")}");
}

3. 可以在命名空间出使用static声明静态类

{
Console.WriteLine($"-------------------------3.可以在命名空间出使用static声明静态类-------------------------");
Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"导入后可直接使用方法: {Pow(4, 2)}");
}
4. 空值运算符(?)
不需要判断是否为空了.
{
Console.WriteLine($"-------------------------4. 空值运算符-------------------------");
int? iValue = ;
Console.WriteLine(iValue?.ToString());//不需要判断是否为空
string name = null;
Console.WriteLine(name?.ToString());
}
5. 对象初始化
可以直接给字典类型通过类似“索引”的形式赋值 (原先是通过Add方法赋值)
{
Console.WriteLine($"-------------------------5. 字典对象初始化-------------------------");
Dictionary<string, string> dicList = new Dictionary<string, string>()
{
[""] = "ypf1",
[""] = "ypf2",
[""] = "ypf3"
};
Dictionary<string, string> dicList2 = new Dictionary<string, string>()
{
{ "","lmr1"},
{ "","lmr2"},
{ "","lmr3"}
};
foreach (var item in dicList)
{
Console.WriteLine("key:{0},value:{1}", item.Key.ToString(), item.Value.ToString());
}
foreach (var item in dicList2)
{
Console.WriteLine("key:{0},value:{1}", item.Key.ToString(), item.Value.ToString());
}
}
6. 异常过滤器增加when判断条件
只有符合when里的条件,才能进入catch,如果不满足的话,直接代码报错,不能抛异常
{
Console.WriteLine("-------------------------6. 异常过滤器增加when判断条件-------------------------");
int epCheck = ;
try
{
int.Parse("ypf");
}
catch (Exception e) when (epCheck > )
{
Console.WriteLine(e.Message);
}
}
7. nameof表达式
把实例转换成同名的字符串
{
Console.WriteLine("-------------------------7. nameof表达式-------------------------");
UserInfor userInfor = new UserInfor();
Console.WriteLine(nameof(userInfor));
}

8. 在catch和finally语句块里使用await(暂不介绍,不常用)
9. 在属性或方法上使用Lambada表达式
①:方法针对于只有一行的方法
②:属性通过Lambda的形式进行赋值
public class UserInfor
{
public string userId { get; set; } = ""; public string userName { get; set; } = "lmr"; /// <summary>
/// Lambda类型的方法
/// </summary>
public void LambdaPrint() => Console.WriteLine("我是Lambda类型的方法"); public string userSex => string.Format("男");
}
{
Console.WriteLine("-------------------------9.在属性或方法上使用Lambada表达式-------------------------");
UserInfor userInfor = new UserInfor();
userInfor.LambdaPrint();
Console.WriteLine($"userSex的值为:{userInfor.userSex}");
}
二. C# 7.0 新语法
1. out参数的改进
在C#7.0之前, out参数使用前必须先声明,然后传入方法中,在C#7.0后可以直接在传入方法的时候进行声明。
/// <summary>
/// out参数的改进
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void DoNoting(out int x, out int y)
{
x = ;
y = ;
}
{
Console.WriteLine("--------------------1-out参数的改进------------------------");
SevenEdition s = new SevenEdition();
s.DoNoting(out int x, out int y);
Console.WriteLine(x + y);
}
2. 元组(Tuples)
①:需要通过nuget安装这个System.ValueTuple包
②:元组创建的三种方式:语法糖、Create静态方法、构造函数 (默认情况下是通过Item1、Item2 。。。)
③:指定元祖命名:可以通过左边指定,也可以通过右边指定
④:将元祖应用于方法中返回值,即一个方法可以返回多种不同类型的值,不需要封装实体即可以实现。
/// <summary>
/// 默认元组命名
/// </summary>
/// <returns></returns>
public (int, string, string) TupleWay1()
{
return (, "ypf1", "ypf2");
}
/// <summary>
/// 指定元祖命名
/// </summary>
/// <returns></returns>
public (int m, string n, string k) TupleWay2()
{
return (, "ypf1", "ypf2");
}
{
Console.WriteLine("--------------------2-元组(Tuples)------------------------");
//1. 创建元组的三种形式
Console.WriteLine("--------------------1. 创建元组的三种形式------------------------");
var tuple1 = (, ); //语法糖
var tuple2 = ValueTuple.Create("ypf", "lmr"); //Create静态方法
var tuple3 = new ValueTuple<int, string>(, "ypf12"); //构造函数
Console.WriteLine($"tuple1的两个值为:{tuple1.Item1}和{tuple1.Item2}");
Console.WriteLine($"tuple1的两个值为:{tuple2.Item1}和{tuple2.Item2}");
Console.WriteLine($"tuple1的两个值为:{tuple3.Item1}和{tuple3.Item2}"); //2. 指定元祖命名
Console.WriteLine("--------------------2. 指定元祖命名------------------------");
(int m, string n) tuple4 = (, "erp"); //左边命名
Console.WriteLine($"tuple4的两个值为:{tuple4.m}和{tuple4.n}");
var tuple5 = (one: , two: "spz"); //右边命名
Console.WriteLine($"tuple5的两个值为:{tuple5.one}和{tuple5.two}"); //3. 元祖应用于方法中返回值
Console.WriteLine("--------------------3. 元祖应用于方法中返回值------------------------");
SevenEdition s = new SevenEdition();
//默认命名
var result1 = s.TupleWay1();
Console.WriteLine($"返回值有:{result1.Item1}、{result1.Item2}、{result1.Item3}");
//指定命名
var result2 = s.TupleWay2();
Console.WriteLine($"返回值有:{result2.m}、{result2.n}、{result2.k}"); }

3. 局部函数
即在{}中声明一个函数,只有{}中能使用
{
Console.WriteLine("--------------------3-局部函数------------------------");
DoSome();
void DoSome()
{
Console.WriteLine("我是局部函数");
}
}
4. 模式的比较和匹配
①:is的新模式。
首先补充一个概念:拆箱和装箱
拆箱是将引用类型→值类型 (object ,class均为引用类型)
装箱是将值类型→引用类型
案例:有一个object类型的变量a,如果它是int类型,则+10赋值给m,并输出m的值,下面看新老用法比较。
{
Console.WriteLine("--------------------4-模式比较(is)------------------------");
object a = ;
//老写法
if (a is int)
{
int b = (int)a; //拆箱
int c = b + ;
Console.WriteLine($"老写法c的值为:{c}");
}
//新写法
if (a is int m) //这里的a直接拆箱为m
{
int c = m + ;
Console.WriteLine($"新写法c的值为:{c}");
}
}
②:switch-case中可以自定义参数类型
传统情况,所有的case中必须是同类型的;而在C# 7.0 新版本中,case中可以不同类型,即Swich中可以传入任何类型,然后通过case中进行对应匹配,这就叫做模式匹配。
/// <summary>
/// 单一类型
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public dynamic SwitchWay1(string m)
{
dynamic data;
switch (m)
{
case "ypf1":
data = m + "lmr1";
break;
case "ypf2":
data = m + "lmr2";
break;
default:
data = "spz00000";
break;
}
return data;
} /// <summary>
/// 多种类型
/// </summary>
/// <param name="m"></param>
/// <returns></returns>
public dynamic SwitchWay2(object m)
{
dynamic data;
switch (m)
{
case int a when a > :
data = a + ;
break;
case int b:
data = b + ;
break;
case String c:
data = c + "mmmmmmmmmmmmmmm";
break;
default:
data = "spz00000";
break;
}
return data;
}
{
Console.WriteLine("--------------------4-模式匹配(switch-case)------------------------");
SevenEdition sE = new SevenEdition();
//老用法
var data1 = sE.SwitchWay1("ypf1");
Console.WriteLine($"类型为:{data1.GetType()},值为:{data1}");
//新用法
var data2 = sE.SwitchWay2();
Console.WriteLine($"类型为:{data2.GetType()},值为:{data2}");
var data3 = sE.SwitchWay2();
Console.WriteLine($"类型为:{data3.GetType()},值为:{data3}");
var data4 = sE.SwitchWay2("ypf1");
Console.WriteLine($"类型为:{data4.GetType()},值为:{data4}");
}

5. 数字文本语法的改写
比如10000000 可以写成10_000_000 ,方便识别。
{
Console.WriteLine("--------------------5-数字文本语法的改写------------------------");
long a = ;
long b = 10_000_000;
Console.WriteLine($"a的值为:{a},b的值为:{b}");
}

6. 补充一些特殊地方也可以写异常表达式 (不详细测试了)
比如:条件表达式(? :)、null合并运算符(??)、一些Lambda
eg:private string _name = GetName() ?? throw new ArgumentNullException(nameof(GetName));

第十六节:语法总结(3)(C#6.0和C#7.0新语法)的更多相关文章
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- 第一百二十六节,JavaScript,XPath操作xml节点
第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
- 第十六节、基于ORB的特征检测和特征匹配
之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...
- 第四百一十六节,Tensorflow简介与安装
第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询
第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...
- 第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点
第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题
- 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍
第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...
随机推荐
- java-----理解java的三大特性之多态
的java提高篇(四)-----理解的java的三大特性之多态 面向对象编程有三大特性:封装,继承,多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外 ...
- apache https配置【转】
博文来源:apache https配置 参考博文:apache.nginx配置自签名证书 1. 确认是否安装ssl模块 是否有mod_ssl.so文件 2. 生成证书和密钥 linux下 步骤1: ...
- RabbitMQ广播:direct模式
一. 消息的广播需要exchange:exchange是一个转发器,其实把消息发给RabbitMQ里的exchange fanout: 所有bind到此exchange的queue都可以接收消息,广播 ...
- ASP.NET MVC5学习系列——身份验证、授权
一.什么是身份验证和授权 人们有时对用户身份验证和用户授权之间的区别感到疑惑.用户身份验证是指通过某种形式的登录机制(包括用户名/密码.OpenID.OAuth等说明身份的项)来核实用户的身份.授权验 ...
- CVS简单介绍
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Jerome_s/article/details/27990707 CVS - Concurrent Ver ...
- c# 7.0 6.0 新语法
1.参考地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/exploration/csharp-7?tutorial-step=5 ...
- MySQL中的float和decimal类型有什么区别
decimal 类型可以精确地表示非常大或非常精确的小数.大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性.该类型对于必须避免舍入错误的应用程序( ...
- BOS判断字段为空
- centos7之zabbix3.2的fping监控
zabbix通过fping检测主机网络状态 fping的官方网站:http://www.fping.org/ 官网指定的github的地址:https://github.com/schweikert/ ...
- centos值cron-计划任务
一.crond简介 crond是Linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具.并且会自动启动cro ...