C#语言在不断地版本升级中,为我们提供了很多新的语言特性。其中,有很多使用的语言特性,我觉得在实际开发中用起来很方便,能够简化我们的代码,增强可读性,提高开发效率。

小编不才,在这里给大家整理了一些实际开发中用起来感觉不错的C#语言特性。

C# 3.0
1.类型推断 var
在申明变量的时候,我们可以不用指定类型,var类型会帮我们自动推断出变量类型。简化了变量声明

var num = 1;
var str = "hello"; 效果等同于: int num = 1;
string str = "hello";

注意点:var类型变量不支持赋值为NULL

2.扩展方法

扩展方法必须定义在静态类中,通常用this关键字修饰方法参数(this代表当前调用对象)

    public static class StringStatic
{
/// <summary>
/// 获取首字母
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string StringToFirst(this string s)
{
if (string.IsNullOrEmpty(s))
return "";
else
return s.Substring(0, 1);
}
}

如上:为string类型的对象添加了获取首字母的扩展类型。

调用:

var str = "hello";
var strFirst = str.StringToFirst();//strFirst="h"

3.lambda表达式

通过lambda表达式,我们可以以一种更为简洁的方式编写函数处理代码,它形同于一个计算表达式,使用 Lambda运算符=>,该运算符读为“goes to”。

语法:

(input parameters) => {
/*Your statement goes here*/
}

=>运算符左侧为输入参数或者无参数,运算符右侧为表达式体或者语句块,如果是语句块用{}包含。

在LINQ查询中,我们经常使用,比如:

lambda表达式:

//定义list
var list = new List<string>() { "a", "b", "c" };
//使用lambda表达式条件筛选
var str = list.Where(x => x == "a").FirstOrDefault();

lambda语句块:

//定义list
var list = new List<string>() { "a", "b", "c" };
//lambda语句块
list.ForEach(x =>
{
Console.WriteLine(x);
});

lambda表达式在实际开发中已经应用的比较广泛了,代码简洁,开发效率高。给个五星好评,哈哈

C# 4.0
1.元组Tuple

元组可以当成是一个存储多个不同数据类型数据的的集合。当有多个(不同类型)数据临时存储或者作为方法返回值返回时,List和Dictionary已不能满足需求,这个时候我们又不想单独创建一个实体类用来管理集合,那么Tuple可以成为我们不错的选择。

格式:

Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>

Tuple提供了8个成员,默认情况下1-7成员支持直接使用,每个成员可以是不同数据类型,如果成员有8个或者多于8个时可以通过扩展第8个成员的方式,增加成员数量。

比如:

Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T1,T2,...,TRest>>

创建元组

方式1:new

var tuple1 = new Tuple<int, string, string, string, string, string, string, Tuple<string,string>>(1, "2", "3", "4", "5", "6", "7", new Tuple<string, string>("8","9"));

方式2:Create

var tuple2 =Tuple.Create<int, string, string, string, string, string, string, string>(1, "2","3", "4", "5", "6", "7", "8");

注:这里第8个元素,虽然我们创建的是string类型,实际获取到类型是Tuple<string>,效果等同于:

var tuple2 =Tuple.Create<int, string, string, string, string, string, string, Tuple<string>>(1, "2","3", "4", "5", "6", "7", new Tuple<string>("8"));

元组成员调用

tuple1.Item1
tuple1.Item2
...
tuple1.Item7
tuple1.Rest

通过如上方式,分别获取第1-8成员。实际场景中需要我们使用的时候记住成员的位置。

元组在实际开发中场景应用起来比较方便,不需要我们额外的通过实体进行集合管理。通常用于方法有多个数据返回值的场景。

C# 5.0
1.异步编程(async和await)

在越来越多高并发,高性能的应用场景需求下,异步编程在一定程度上成为解决问题的一个突破口,现在.net core框架已经推荐使用Task+async+await进行异步编程,足以见得它的魅力所在。

之前我专门有个文章讲解过async+await异步编程,感兴趣的同学可以了解下,这里就不展开说了。
C# 6.0
1.NULL条件运算符(?.)

运算符"?."用于判断一个对象是否为空。

比如:

Object?.Tostring() 

Object对象如果不为空,则执行Tostring()方法并返回值;

Object对象如果为空,则直接返回NULL

运算符"?."简化了我们的判空操作,避免了Object为空时使用ToString()报错,效果等同于:

if (Object == null)
return null;
else
return Object.ToString();

2.空合并运算符(??)

语法格式如下:

string str = "adc";
var result = str ?? str.ToUpper();

如果??运算符左侧操作数str结果为NULL,则返回??运算符右侧操作数。

如果??运算符左侧操作数str结果不为NULL,则返回??运算符左侧操作数。

(通俗点就是,左侧不为空就返回左侧数据,为空就返回右侧数据)

3.字符串拼接($)

回想一下我们比较常用的字符串拼接方式。

//+运算符 拼接
string str2 = str1 + "你好";
//字符串格式化拼接
string str3 = string.Format(@"{0},你好", str1);

+运算符连接的方式,每+一次都会生成一个新的string对象,占用内存;

Format字符串格式化,占位符顺序需谨慎;

而C#6.0给我们带来了新的字符串拼接特性,格式如下:

string str4 = $"{str1},你好";

$操作符标记双引号“”中的字符串;其中,中括号{}可用于动态取值。这种形式更为简单且从语法上也更易被接受。

4.lambda表达升级使用

lambda表达式作为函数体,形如:

        /// <summary>
/// 没有返回值函数
/// </summary>
public void ConsoleLog() => Console.WriteLine("没有返回值函数");
/// <summary>
/// 一个简单的有返回值函数
/// </summary>
/// <param name="StudentId"></param>
/// <param name="StandardName"></param>
/// <returns></returns>
public Student GetStudent(int StudentId, string StandardName) => new Student { StandardId = StudentId, StudentName = StandardName };

lambda表达式直接作为函数体,这样代码更为高效简洁。

lambda表达式用作属性

public string TimeString => DateTime.Now.ToString("yyyyMMdd");

同样的方式,lambda表达式用作属性赋值也比较简单。

C# 7.0
1.out类型参数

C#7.0版本之前,我们使用out引用类型作为输出参数,必须要先申明,才能使用。如下:

int intValue = 0;
int.TryParse("100", out intValue);

有时候我可能并不关注这个out输出参数,但是确不得不声明一个变量存储它,烦躁。。。幸运的是7.0为我带来了一丝曙光。

我们可以“使用时内联声明”,无需提前单独声明:

int.TryParse("100", out int intValue);

这样是不是感觉一身轻松ღ( ´・ᴗ・` )

2.ValueTuple元组

C#4.0的时候新增了特性元组Tuple,但是用过的同学会觉得有些不足:

1)Tuple 成员的可读性差,只能通过Item1,Item2..坐标式的方式读取成员 。

2)Tuple 是引用类型,大量频繁的使用占内存。

于是C#7.0马上推出了ValueTuple类型元组,很显然它解决了上述两种不足。

1)ValueTuple 支持用名称定义成员。

2)ValueTuple 是值类型。

我们先来看看如何使用ValueTuple

创建的简单ValueTuple

            // 语法糖创建元组
var tuple1 = (1, 2);
// Create创建元组
var tuple2 = ValueTuple.Create(1, 2);
// new 运算符创建元组
var tuple3 = new ValueTuple<int, int>(1, 2);

调用成员:这种方式和Tuple的使用基本一样,调用成员也是通过item1,item2...的方式。

创建的指定名称的ValueTuple

            // 左边指定字段名称
(int first, int second) tuple1 = (1, 2);
// 右边指定字段名称
var tuple2 = (first: 1, second: 2);

调用成员:可通过定义的成员名称获取,tuple1.first  / tuple1.second,可读性更高。

C#8.0

1.NULL合并并赋值(??=)

C# 8.0 引入了 null 合并赋值运算符??=,是C#6.0中的空合并运算符(??)的升级

当左操作数计算为 null 时,才能使用运算符 ??= 将其右操作数的值分配给左操作数。

List<int> numbers = null;
int? i = null; numbers ??= new List<int>();
numbers.Add(i ??= 17);
numbers.Add(i ??= 20); Console.WriteLine(string.Join(" ", numbers)); // output: 17 17
Console.WriteLine(i); // output: 17

值得推荐的C#不同版本语言特性的更多相关文章

  1. C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系

    C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...

  2. 阿里巴巴资深技术专家雷卷:值得开发者关注的 Java 8 后时代的语言特性

    作者 | 阿里巴巴资深技术专家  雷卷,GitHub ID @linux-china 导读:在 Python.JavaScript 等一众编程语言崛起风靡之际,一代霸主 Java 风采虽不及当年,但仍 ...

  3. 值得推荐的C/C++框架和库

    值得推荐的C/C++框架和库 [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看 ...

  4. 为什么《Dive into Python》不值得推荐

    2010 年 5 月 5 日更新:我翻译了一篇<<Dive Into Python>非死不可>作为对本文观点的进一步支持和对评论的回复,请见:http://blog.csdn. ...

  5. 值得推荐的C/C++框架和库 (真的很强大) c

    http://m.blog.csdn.net/mfcing/article/details/49001887 值得推荐的C/C++框架和库 (真的很强大) 发表于2015/10/9 21:13:14 ...

  6. 值得推荐的C/C++开源框架和库

    值得推荐的C/C++开源框架和库  转自:http://www.cnblogs.com/lidabo/p/5514155.html   - 1. Webbench Webbench是一个在Linux下 ...

  7. 【转载】值得推荐的C/C++框架和库

    原文:值得推荐的C/C++框架和库 值得学习的C语言开源项目 Libevent libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施.其以高效出名,它可以将IO事件,定时 ...

  8. 值得推荐的10本PHP书籍(转)

    值得推荐的10本PHP书籍(转) 一.总结 一句话总结: 二.值得推荐的10本PHP书籍 本篇文章的目的是想较全面地推荐10本PHP书籍,暂不讨论Linux/NGINX/Mysql等其他丛书. 前言 ...

  9. 【转】 值得推荐的C/C++框架和库 (真的很强大)

    [转] 值得推荐的C/C++框架和库 (真的很强大) 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个 ...

  10. Pro ASP.NET MVC –第四章 语言特性精华

    C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...

随机推荐

  1. Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备

    [声明]由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害 ...

  2. 用php脚本给html中引用的js和css路径打上版本

    比如 <link rel="stylesheet" type="text/css" href="./css/globel.css"&g ...

  3. 通过smtp协议简单实现邮件发送

    使用到的类: ①SmtpClient--发送邮件的类(using System.Net.Mail;) ②MailMessage--初始化邮件的类 ③ NetworkCredential--身份验证的类 ...

  4. Qt编写自定义控件大全(liudianwu)

    http://www.cnblogs.com/feiyangqingyun/p/6128288.html http://www.qtcn.org/bbs/read-htm-tid-62279.html

  5. JAVA循环结构示例

    本文章主要是帮助大家学习循环结构.学习循环时,最重要的是理清思路,那些最经典算法实际中我们并不会单拿出来用,而是会用到当时做这个算法时的思想.如果把这个思路想明白了,那么实际中用到他的时候自然而然就想 ...

  6. win10+ubuntu双系统安装方案

    网上有很多教程,大多是win7,win8的,我折腾了一天,今天终于都安装好了,折腾的够呛,很多人都说挺简单的,嗯其实的确很简单,很多人回复说安装不成功,很有可能就是电脑安全权限的问题,我用的是华硕的电 ...

  7. SpringBoot 2.0 mybatis mapper通用类

    <!---mybatis通用类包含mybatis和连接池 mybatis和连接池就不需要引入--> <dependency> <groupId>tk.mybatis ...

  8. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——BarcodeView控件的使用方式,.Net移动开发

    BarcodeView控件 一.          样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个BarcodeView控件到窗体界面 ...

  9. 多线程编程——java

    1.进程和线程 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号 ...

  10. Java实现基于桶式排序思想和计数排序思想实现的基数排序

    计数排序 前提:待排序表中的所有待排序关键字必须互不相同: 思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值 ...