第十六节:语法总结(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() ...
随机推荐
- Luogu P5296 [北京省选集训2019]生成树计数
Luogu P5296 [北京省选集训2019]生成树计数 题目链接 题目大意:给定每条边的边权.一颗生成树的权值为边权和的\(k\)次方.求出所有生成树的权值和. 我们列出答案的式子: 设\(E\) ...
- 【Git】+安装+使用+配置
Git安装及使用: https://www.cnblogs.com/ximiaomiao/p/7140456.html Git下载地址: http://git-scm.com/download/win ...
- 通过C#学Proto.Actor模型》之Remote
Proto.Actor中提供了基于tcp/ip的通迅来实现Remote,可以通过其Remot实现对Actor的调用. 先来看一个极简单片的远程调用. 码友看码: 引用NuGet包 Proto.Acto ...
- VirtualBox修改UUID实现虚拟硬盘的重复利用
其实,记录这个是为了留给自己看.每次用每次查,已经老到什么东西都记不住了.本次查询是从这里(VirtualBox 修改UUID实现虚拟硬盘复制)获得帮助的,感谢. 在VirtualBox把一个已经使用 ...
- vc图像合成
本程序下载地址: 上一篇讲述了tiff格式图片拆分成多张图片, 这篇博客讲述如何把多张任意格式的图片合成为一张图片. 图像合成仍然需要借助Cximage图像库,合成函数为Mixfrom, 函数原型为: ...
- 调参必备---GridSearch网格搜索
什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...
- Mysql完整约束性
一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY ...
- 软工+C(1): 题目设计、点评和评分
// 下一篇:分数和checklist 如何设计题目 教学中的一个问题是老师出题太简单了,题目设计一开始上来就不紧凑,我认为一个好的课程应该上来就给你紧凑感,而不是先上来"轻松2-3周&qu ...
- 软件工程(GZSD2015) 第二次作业文档模板
题目: (此处列出题目) 需求分析: 基本功能 基本功能点1 基本功能点2 ... 扩展功能(可选) 高级功能(可选) 设计 设计点1 设计点2 ... 代码实现 // code here 程序截图 ...
- centos7 docker安装
Docker分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器.插件等 社区版按照stable和edge两种 ...