第十六节:语法总结(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() ...
随机推荐
- #022 Python 实验课
拍7游戏 描述 “拍7游戏”规则是:一堆人围成一圈,开始时,任意指定一人说出数字“1”后,一圈人按顺时针方向,每人按整数由小到大的顺序一人一个地报出后续数字“2”.“3”......,当遇到为“7”的 ...
- go笔记-值传递、引用传递
eg: func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, ) } func main() { slice : ...
- C#中指针使用总结(转载)
C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...
- iOS开发基础-Plist实现嵌套模型
一.plist文件结构图 说明: title 属性表示该 item 下汽车名字的首字母, cars 属性存放首字母为 title 的汽车, icon 属性存放图片的名称, name 属性存放汽车的名字 ...
- 在SQL Server中如何进行UPDATE TOP .....ORDER BY?
前言 今天在导入数据到系统后需要根据时间排序对刚导入的TOP N条进行数据更新,之前没遇到过UPDATE TOP...ORDER BY,以此作为备忘录. SQL SERVER之UPDATE TOP.. ...
- docker私有镜像仓库搭建
环境:centos7,dockere版本:18.09.0,镜像仓库:v2 docker-registry:192.168.137.101 docker私有仓库服务器 docker-app: 192 ...
- 个人hp笔记本默认设置更改
1.将F1-F12默认的多媒体键(调静音亮度控制声音大小等)改为功能键: (****笔记本型号为惠普****) ·进入BIOS方法:关机状态下,按电源键开机,立刻连续多次点击ESC,看到 F1.F2. ...
- PS绘制飘逸彩色丝带教程
一.新建一个大小适当的图像,点击工具栏上的钢笔工具,使用形状图层来绘制出下图的形状. 二.把形状所在层的填充设为0%,填充设成0是不会影响到图层的,不像不透明度那样会影响图层样式的效果. 三.双击丝带 ...
- DOTween坑点
Sequence相关 如实现一个物体有序列的运动,A->B->C,需要实例化Sequence与实现方法在同一处调用. Sequence m_Sequence; void SequenceM ...
- 更改电脑名称后, Cnario无法播放画面和声音, 开机后停留在桌面, Cnario Player软件界面的停止按钮为蓝色可选状态
症状描述 Cnario Player正常工作期间, 更改了电脑的Windows系统计算机名称(不是登录Windows的用户名), 重启后, 新计算机名生效. 此时Cnario自动启动, 但没有进入播放 ...