C# 6.0 添加和增强的功能【基础篇】
C# 6.0 是在 visual studio 2015 中引入的。此版本更多关注了语法的改进,让代码更简洁且更具可读性,使编程更有效率,而不是和前几个版本一样增加主导性的功能。
一、静态导入
我们都知道,静态类中的方法是直接通过类名引用的。
例如:(Math 是系统自带的静态类,在程序中可以直接引用)
var num = Math.Sqrt(3*3 + 4*4);//取给定值的平方根
新写法:(分两步)
using static System.Console;
using static System.Math;// 1/2 在命名空间中,统一引用静态类
namespace Test.Test.ConsoleApp
{
class Program
{
static void Main(string[] args)
{
WriteLine(Sqrt(3*3 + 4*4));// 2/2 直接调用方法,不用再带静态类名
}
}
}
using static 指令命名了一种类型,无需指定类型名称即可访问其静态成员和嵌套类型。
using static 仅导入可访问的静态成员和指定类型中声明的嵌套类型。 不导入继承的成员。
二、异常筛选器
从 C# 6 开始,when 可用于 catch 语句中,以指定为执行特定异常处理程序而必须为 true 的条件。 语法为:
catch (ExceptionType [e]) when (expr)
其中,expr 是一个表达式,其计算结果为布尔值。 如果该表达式返回 true,则执行异常处理程序;如果返回 false,则不执行。
具体用法示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Console.WriteLine(MakeRequest().Result);
}
public static async Task<string> MakeRequest()
{
var client = new HttpClient();
var streamTask = client.GetStringAsync("https://localHost:10000");
try
{
var responseText = await streamTask;
return responseText;
}
catch (HttpRequestException e) when (e.Message.Contains("301"))
{
return "Site Moved";
}
catch (HttpRequestException e) when (e.Message.Contains("404"))
{
return "Page Not Found";
}
catch (HttpRequestException e)
{
return e.Message;
}
}
}
三、自动属性初始化表达式
当需要将属性初始化为其类型默认值以外的值时,C# 通过在属性的右括号后设置值达到此目的。
对于 FirstName 属性的初始值,需要设置为空字符串而非 null。 可按如下所示进行指定:
public class Person
{
public string FirstName { get; set; } = string.Empty;
}
或者自行定义存储:
public class Person
{
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _firstName;
}
四、Expression bodied 成员(表达式主体定义 =>)
expression-bodied 方法包含单个表达式,它返回的值的类型与方法的返回类型匹配;或者,对于返回 void 的方法,其表达式则执行某些操作。常规语法:
member => expression;
例如,替代 ToString 方法的类型通常包含单个表达式,该表达式返回当前对象的字符串表示形式。
下面的示例定义 Person 类,该类通过表达式主体定义替代 ToString。 它还定义向控制台显示名称的 DisplayName 方法。
请注意,ToString 表达式主体定义中未使用 return 关键字。
using System;
public class Person
{
public Person(string firstName, string lastName)
{
fname = firstName;
lname = lastName;
}
private string fname;
private string lname;
public override string ToString() => $"{fname} {lname}".Trim();
public void DisplayName() => Console.WriteLine(ToString());
}
class Example
{
static void Main()
{
Person p = new Person("Mandy", "Dejesus");
Console.WriteLine(p);
p.DisplayName();
}
}
五、Null 传播器
仅当操作数的计算结果为非 NULL 时,NULL 条件运算符才对其操作数应用成员访问 或元素访问 ?. 操作;否则,它会返回 NULL。从而避免了空对象的报错:Object reference not set to an instance of an object。
NULL 条件运算符采用最小化求值策略。 也就是说,如果条件成员或元素访问运算链中的一个运算返回 null,则链的其余部分不会执行。
如下示例:
int GetSumOfFirstTwoOrDefault(int[] numbers)
{
// ??(Null 合并操作符): 如果此运算符的左操作数不为 null,则此运算符将返回左操作数,否则返回右操作数
if ((numbers?.Length ?? 0) < 2)
{
return 0;
}
return numbers[0] + numbers[1];
}
Console.WriteLine(GetSumOfFirstTwoOrDefault(null)); // output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new int[0])); // output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new[] { 3, 4, 5 })); // output: 7
六、字符串内插($"{}")
$ 特殊字符将字符串文本标识为内插字符串 。 内插字符串是可能包含内插表达式的字符串文本 。 将内插字符串解析为结果字符串时,带有内插表达式的项会替换为表达式结果的字符串表示形式。
要在内插字符串生成的文本中包含大括号 "{" 或 "}",请使用两个大括号,即 "{{" 或 "}}"。
因为冒号(":")在内插表达式项中具有特殊含义,为了在内插表达式中使用条件运算符,请将表达式放在括号内。
string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.
七、nameof 表达式
nameof 表达式可生成变量、类型或成员的名称作为字符串常量:
Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic
Console.WriteLine(nameof(List<int>)); // output: List
Console.WriteLine(nameof(List<int>.Count)); // output: Count
Console.WriteLine(nameof(List<int>.Add)); // output: Add
var numbers = new List<int> { 1, 2, 3 };
Console.WriteLine(nameof(numbers)); // output: numbers
Console.WriteLine(nameof(numbers.Count)); // output: Count
Console.WriteLine(nameof(numbers.Add)); // output: Add
//在逐字标识符的情况下,@ 字符不是名称的一部分,如以下示例所示:
var @new = 5;
Console.WriteLine(nameof(@new)); // output: new
nameof 表达式在编译时进行求值,在运行时无效。
八、 索引初始化表达式
从本质来看,[xxx] = yyy 这种语法,xxx 可以是任意类型,凡是有索引器支持的类型,均可以使用这种语法。
private static void Main()
{
var dictionary = new Dictionary<int, string>
{
[1] = "Value1",
[2] = "Value2",
[3] = "Value3"
};
}
九、Catch/Finally 块中的 Await
Asyn 方法是一个现在很常用的方法,当使用 async 和 await 时,你或许曾有这样的经历,就是你想要在 catch 块或 finally 块中使用它们,比如当出现一个 exception 而你希望将日志记在文件或者调用一个服务将 exception 信息发送给 server,而这些操作可能很耗时。这种情况下,在 catch 块中的异步方法中使用 await 将会很有帮助。具体语法示例:
public async Task SubmitDataToServer()
{
try
{
}
catch
{
await LogExceptionAsync();
}
finally
{
await CloseConnectionAsync();
}
}
注:暂时整理这些,欢迎指正和补充。
C# 6.0 添加和增强的功能【基础篇】的更多相关文章
- C# 8.0 添加和增强的功能【基础篇】
.NET Core 3.x和.NET Standard 2.1支持C# 8.0. 一.Readonly 成员 可将 readonly 修饰符应用于结构的成员,来限制成员为不可修改状态.这比在C# 7. ...
- C# 9.0 添加和增强的功能【基础篇】
一.记录(record) C# 9.0 引入了记录类型. 可使用 record 关键字定义一个引用类型,以最简的方式创建不可变类型.这种类型是线程安全的,不需要进行线程同步,非常适合并行计算的数据共享 ...
- C# 7.0 添加和增强的功能【基础篇】
C# 7.0 版是与 Visual Studio 2017 一起发布. 虽然该版本继承和发展了C# 6.0,但不包含编译器即服务. 一.out 变量 以前我们使用out变量必须在使用前进行声明,C# ...
- .NET的那些事儿(9)——C# 2.0 中用iTextSharp制作PDF(基础篇) .
该文主要介绍如何借助iTextSharp在C# 2.0中制作PDF文件,本文的架构大致按照iTextSharp的操作文档进行翻译,如果需要查看原文,请点击一下链接:http://itextsharp. ...
- C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌
1. IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...
- WCF学习之旅—WCF4.0中的简化配置功能(十五)
六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...
- 为现有图像处理程序添加读写exif的功能
为现有图像处理程序添加读取exif的功能 exif是图片的重要参数,在使用过程中很关键的一点是exif的数据能够和图片一起存在.exif的相关功能在操作系统中就集成了,在csharp中也似乎有了实现. ...
- 微信小程序0.11.122100版本新功能解析
微信小程序0.11.122100版本新功能解析 新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...
- phpcms 移植【添加相关文章】功能
添加相关文章功能相当有用,移植一个过来基本上可以实现比较复杂的页面内包含分类功能,做二次开发时可以省下不少力气. 用例:如果一个产品,属于一个厂家,而这个厂家是动态添加的,既不是一个分类,而是一个厂家 ...
随机推荐
- Spring源码 02 项目搭建
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- 百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12
Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复 ...
- SpringMvc 如何同时支持 Jsp 和 Json 接口?
后端同学基本都会见过这种场景:在同一个工程中,有些页面使用jsp模版渲染,同时还有其他接口提供Json格式的返回值.为了同时支持这两种场景,我们一般是如何处理的呢? 其实非常简单: 1.在项目中为 S ...
- 大家都能看得懂的源码 - 如何封装 cookie/localStorage/sessionStorage hook?
本文是深入浅出 ahooks 源码系列文章的第九篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 今天来看看 ahooks 是怎么封装 cookie/localSt ...
- Spring Bean 详解
Spring Bean 详解 Ioc实例化Bean的三种方式 1 创建Bean 1 使用无参构造函数 这也是我们常用的一种.在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象.如果类中没有⽆参构造函 ...
- CF1204E Natasha, Sasha and the Prefix Sums (卡塔兰数推理)
题面 题解 把题意变换一下,从(0,0)走到(n,m),每次只能网右或往上走,所以假设最大前缀和为f(n),那么走的时候就要到达但不超过 y = x-f(n) 这条线, 我们可以枚举答案,然后乘上方案 ...
- laravel框架(完整上传到数据库,不提交图片)(以提交员工信息为例)
第一步:使用PHP终端创建一个名为blog的框架 composer create-project --prefer-dist laravel/laravel blog 7.x 创建好之后,在框架中找到 ...
- 华南理工大学 Python第2章课后小测-2
1.(单选)下列符号中,有()个是Python的关键字.(1)if (2)lambda (3)not (4) For (5)None(6)from (7)True (8)fina ...
- Windows客户端DNS工作原理
通常大家对Windows客户端DNS的配置存在多个误区. 误区一,配置1个内网DNS,1个外网DNS.解析内网的时候用内网DNS,解析外网的时候用外网. 电脑怎么知道哪个是内网?哪个是外网?我们内部的 ...
- 2022CSP-J初赛游记
2022年9月16日: 下午,在学校集训,刘洋让我看了一下时间,突然发现,距离初赛就剩2天了...... 晚上,辅导班的老师对我们进行最后的培训,做了2套有道小图灵模拟题,但是做的不理想,很慌. 20 ...