C#各个版本中的新增特性详解

序言

自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Framework库的相应支持,也不断的带给我们期待与惊喜。下面我们就对c#一路走到现在,做一个回顾与学习。

C#语言目标与前行

c#的设计目标是有以下几点:

  • 旨在是一种简单,现代,通用的面向对象编程语言。

  • 语言及其实现应该为软件工程原理提供支持,例如强类型检查,数组维度检查,未初始化的变量引用检测以及自动垃圾收集。软件的鲁棒性,耐久性和程序员的生产力很重要。

  • 旨在用于开发适用于分布式环境中部署的软件组件。

  • 便携性对于源代码和程序员非常重要,特别是已经熟悉C和C ++的程序员。

  • 支持国际化是非常重要的。

  • C#适用于为托管和嵌入式系统编写应用程序,从使用复杂的操作系统到非常小的专用功能都非常适用。

  • 虽然C#应用程序在内存和处理能力要求方面是经济的,但是该语言并不打算直接用C或汇编语言直接与性能和尺寸进行竞争。

c#版本

c#版本中添加的功能:

C#2.0 

  • 泛型

  • 部分类型

  • 匿名方法

  • 迭代器

  • 可空类型

  • Getter / setter单独可访问性

  • 方法组转换(代表)

  • Co- and Contra-variance for delegates

  • 静态类

  • Delegate inference

C#3.0 

  • 隐式类型局部变量

  • 对象和收集初始化器

  • 自动实现的属性

  • 匿名类型

  • 扩展方法

  • 查询表达式

  • Lambda表达式

  • 表达树

  • 部分方法

C#4.0 

  • 动态绑定

  • 命名和可选参数

  • Generic co- and contravariance

  • 嵌入式互操作类型(“NoPIA”)

C#5.0 

  • 异步方法

  • Caller info attributes

C#6.0 

  • Compiler-as-a-service(Roslyn)

  • 将静态类型成员导入命名空间

  • 异常过滤器

  • 在Catch和Finally中使用Await

  • 自动属性初始化器

  • 只读属性的默认值

  • Expression-bodied members

  • Null-conditional operators(空条件运算符,简洁检查)

  • 字符串插值

  • nameof operator

  • 字典初始化器

C#7.0 

  • out变量

  • 模式匹配

  • 元组

  • 解构

  • 局部函数

  • 数字分隔符

  • 二进制文字

  • 局部引用和引用返回

  • 扩展异步返回类型

  • 表达式的构造函数和finalizers

  • Expression bodied getters and setters

  • throw表达式

C#7.1 

  • Async main

  • 默认表达式

参考文档:https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#cite_note-roslyn_6-47

c#7.0新特性详解

在2016年Visual Studio “15” Preview 4发布,c# 7.0便开始浮现,现在vs2017已经发布,c#7.0带给我们的惊喜,我们也该一探究竟啦。

C#7.0增加许多新功能,重点是数据,代码简化和性能上。

Out variables

目前在C#中,使用out参数不像我们想要的那么流畅。在使用out参数调用一个方法之前,首先必须声明变量来传递给它。您也不能使用var它们来声明它们,但需要指定完整的类型。

public void PrintCoordinates(Point p)
{int x, y; //必须声明p.GetCoordinates(out x, out y);WriteLine($"({x}, {y})");
}

在c#7中再来看看

public void PrintCoordinates(Point p)
{p.GetCoordinates(out int x, out int y);WriteLine($"({x}, {y})");
}

模式匹配

c#7中

public static void PrintStars(object o)
{if (o is int i)
Console.WriteLine(i + 12); }

以前版本需要转化

public static void PrintStars(object o)
{if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
}

Switch statements with patterns 扩展switch语句使用模式匹配

public static void PrintStars(object o)

        {

            switch (o)

            {

                case Print p:

                    break;

                case int a:

                    break;

                case String b when b=="123":

                    break;

            }

        }        

    }   

    public class Print

    {

        public string PrintName { get; set; }

        public string MoBanPath { get; set; }

        public int Count { get; set; }

    }

元组(Tuples)

注意:元组依赖于一组基础类型,不包括在预览4中。要使功能正常工作,您可以通过NuGet轻松获取它们:

  • 右键单击解决方案资源管理器中的项目,然后选择“管理NuGet软件包...”

  • 选择“浏览”选项卡,选中“包含预发行”,然后选择“nuget.org”作为“包源”

  • 搜索“System.ValueTuple”并安装它。

static void Main(string[] args)

        {

            var tuple = (a: 10, b: "123");

            Console.WriteLine($"a:{tuple.a},b:{tuple.b}");

            var result1 = GetS();

            var result = Get();

            Console.WriteLine($"Item1:{result1.Item1},Item2:{result1.Item2},Item3:{result1.Item3}");

            Console.WriteLine($"a:{result.a},b:{result.b},c:{result.c}");

            Console.ReadLine();

        }

        static (string, int, DateTime) GetS()

        {

            return ("abc", 123, DateTime.Now);

        }

        static (string a, int b, DateTime c) Get()

        {

            return (a: "abc", b: 123, c: DateTime.Now);

        }

部函数

简单的说,就是在方法里面写方法然后自己调用。

static void Main(string[] args){Console.WriteLine($"{Get(123)},{Get("abc")},{Get(null)}");Console.ReadLine();}public static string Get(object a){           return GetP();string GetP(){if (a is int v) return v + "";if (a is string b) return b;return "ccc";}}

Literal improvements

C#7.0允许在数字文字中_作为数字分隔符出现

var d = 123_456;
var x = 0xAB_CD_EF;

你可以把它们放在数字之间,以提高可读性。它们对价值没有影响。

另外,C#7.0引入了二进制文字,因此您可以直接指定位模式,而不必以心脏知道十六进制符号。 

var b = 0b1010_1011_1100_1101_1110_1111;

更多c#7.0的特性

到此,我就不在一个个的上演c#7.0的其他功能啦。如果你想深入其他,仔细阅读下面的文档:

请参考文档:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

c#6.0新语言功能详解

以下新功能在VS 2015及17中实现并可用。

ADD:新增,Exists:已存在,N/A:对该语言没有意义,No:不适用此版本。

下面我简述几个新功能,剩下的我会把文档连接拿出来自己观摩。

字符串插值

上面的代码中都有体现。

var s = $"{p.Name} is {p.Age} year{{s}} old";

字典索引初始化

var numbers = new Dictionary<int, string> {[7] = "seven",[9] = "nine",[13] = "thirteen"
};

自动属性初始化

public class Customer
{public string First { get; set; } = "Jane";public string Last { get; set; } = "Doe";
}

using引用静态类

using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{static void Main(){WriteLine(Sqrt(3*3 + 4*4)); WriteLine(Friday - Monday); }
}

更多c#6.0语言新特性

线上代码可执行演示文档连接:http://www.volatileread.com/Wiki/Index?id=1075 效果如下

参考文档:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

c#2.0-5.0参考文档

c#5.0参考文档

连接地址:https://blogs.msdn.microsoft.com/mvpawardprogram/2012/03/26/an-introduction-to-new-features-in-c-5-0/

c#4.0参考文档

连接地址:https://msdn.microsoft.com/en-us/magazine/ff796223.aspx

c#3.0参考文档

连接地址:https://msdn.microsoft.com/en-us/library/bb308966.aspx

c#2.0参考文档

连接地址:https://msdn.microsoft.com/en-us/library/7cz8t42e(v=vs.80).aspx

原文地址:http://www.cnblogs.com/knowledgesea/p/6694979.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019蓝桥杯省赛---java---A---8(修改数组)

题目描述 思路分析 不是每次1了&#xff0c;而是直接加相同数字出现过的次数&#xff0c;比如有3个1&#xff0c;第二个1就是1&#xff0c;第三个直接2&#xff0c;而不是两次1&#xff0c;而且每次都记录每次的新值出现的次数&#xff0c;这样循环到新数未出现过为止 代码实…

ASP.NET Core 网站在Docker中运行

Docker作为新一代的虚拟化方式&#xff0c;未来肯定会得到广泛的应用&#xff0c;传统虚拟机的部署方式要保证开发环境、测试环境、UAT环境、生产环境的依赖一致性&#xff0c;需要大量的运维人力&#xff0c;使用Docker我们可以实现一次部署&#xff0c;到处运行。 本文介绍如…

键值存储之外,Redis还有这些用法

转载自 键值存储之外&#xff0c;Redis还有这些用法 Redis是一个强大的内存数据结构存储&#xff0c;包含数据库&#xff0c;缓存和消息代理等多种用途。大多数人经常认为它不过是一个简单的键值存储&#xff0c;但其实它有更多的能力。下面给出一些实例 1.全页面缓存 首先…

2018蓝桥杯省赛---java---C---3(字母阵列)

题目描述 测试数据 FOAIQNALWIKEGNICJWAOSXDHTHZPOLGYELORAUHOHCZIERPTOOJUITQJCFNIYYQHSBEABBQZPNGYQTCLSKZFCYWDGOAIADKLSNGJ GSOZTQKCCSDWGUWAUOZKNILGVNLMCLXQVBJENIHIVLRPVVXXFTHQUXUAVZZOFFJHYLMGTLANQIAOQQILCDCJERJASNCTLYGRMHGF TSDFYTLVIBHKLJVVJUDMKGJZGNNSTPVLCKT…

微软确认5月2日召开新品发布会 8天后就是Build 2017大会

援引外媒 ZDNet 报道&#xff0c;微软计划在 5 月上旬召开新品发布会&#xff0c;重点围绕着 Windows 10 Cloud&#xff0c;并且有望公布关于 Surface Pro 5 的相关信息。今天这条消息已经得到了证实&#xff0c;微软官方宣布将于 5 月 2 日将会在纽约召开发布会&#xff0c;也…

面试进阶之字符串常量池

转载自 面试进阶之字符串常量池 作为最基础的引用数据类型&#xff0c;Java 设计者为 String 提供了字符串常量池以提高其性能&#xff0c;那么字符串常量池的具体原理是什么&#xff0c;我们带着以下三个问题&#xff0c;去理解字符串常量池&#xff1a; 字符串常量池的设计…

java实现人脸识别V3版本开发

有段时间没有写更新公众号了&#xff0c;也许好多人都忘记了自己还关注了这么个公众号。因为这段时间确实是有其他的事比较忙&#xff0c;还有一个原因就是自己在技术方面没有学习新的东西&#xff0c;所以没有可更新的&#xff08;包括博客&#xff09;今天&#xff0c;我决定…

2018蓝桥杯省赛---java---A---7(三体攻击)

题目描述 题目&#xff1a;三体人将对地球发起攻击。为了抵御攻击&#xff0c;地球人派出了 A  B  C 艘战舰&#xff0c;在太空中排成一个 A 层 B 行 C 列的立方体。其中&#xff0c;第 i 层第 j 行第 k 列的战舰&#xff08;记为战舰 (i, j, k)&#xff09;的生命值为 …

23种设计模式彩图

原文地址&#xff1a;http://www.jianshu.com/p/4a02646f7c9d.NET社区新闻&#xff0c;深度好文&#xff0c;微信中搜索dotNET跨平台或扫描二维码关注

JDBC面试问题

转载自 JDBC面试问题 1.什么是JDBC API&#xff0c;何时使用它&#xff1f; Java DataBase Connectivity API允许我们使用关系数据库。JDBC API接口和类是 java.sql和javax.sql包的一部分。我们可以使用JDBC API来获取数据库连接&#xff0c;在数据库服务器中运行SQL查询和…

2018蓝桥杯省赛---java---A---9(倍数问题)

题目描述 代码实现 package lanqiao;import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args){Scanner scanner new Scanner(System.in);int n scanner.ne…

HTML5知识点总结

 HTML5基础&#xff1a; 一、HTML&#xff1a; Hyper Text MarkUp Language(超文本标记语言)。 二、W3C&#xff1a; 1.world wide web consortium(万维网联盟)&#xff0c;成立于1994年&#xff0c;WEB技术领域最权威和最具影响力的国际中立性技术标准机构。 2.w3c标准包括&…

漫画:什么是鸡尾酒排序

转载自 漫画&#xff1a;什么是鸡尾酒排序 那么&#xff0c;鸡尾酒排序又是何方神圣呢&#xff1f;我们这一期将会详细讲述。 让我们首先来回顾一下冒泡排序的思想&#xff1a; 冒泡排序的每一个元素都可以像小气泡一样&#xff0c;根据自身大小&#xff0c;一点一点向着数…

2018蓝桥杯省赛---java---A---10(付账问题)

题目描述 思路分析 用贪心算法&#xff0c;要使标准差最小&#xff0c;则需要将每个人需付的钱接近于平均值。如果有人的钱低于当前平均值a1&#xff0c;则需要将这人的钱全部支付&#xff0c;此人不够的钱需让其他人付&#xff0c;然后可以计算剩余人所需付钱的平均值a2&…

想要学习设计模式,你得先会看类图,一张图读懂UML

虚线箭头指向依赖&#xff1b; 实线箭头指向关联&#xff1b; 虚线三角指向接口&#xff1b; 实线三角指向父类&#xff1b; 空心菱形能分离而独立存在&#xff0c;是聚合&#xff1b; 实心菱形精密关联不可分&#xff0c;是组合&#xff1b;

数据库的这些性能优化,你做了吗

转载自 数据库的这些性能优化&#xff0c;你做了吗 在互联网项目中&#xff0c;当业务规模越来越大&#xff0c;数据也越来越多&#xff0c;随之而来的就是数据库压力会越来越大。 我们可能会采取各种方式去优化&#xff0c;比如之前文章提到的缓存方案&#xff0c;SQL优化…

青客宝团队Consul内部分享ppt

Consul 是一个支持多数据中心&#xff0c;分布式&#xff0c;高可用的服务发现和配置共享系统。由 HashiCorp 公司使用 Go 语言开发&#xff0c;基于Raft协议。部署起来非常容易&#xff0c;只需要极少的可执行程序和配置文件&#xff0c;具有绿色、轻量级的特点。 Consul是支持…

2018蓝桥杯省赛---java---C---9(小朋友崇拜圈)

题目描述 思路分析 数组来储存小朋友们的崇拜对象&#xff0c;然后下标1就是对应的小朋友座号&#xff0c;写一个方法找出每一个小朋友的崇拜圈大小&#xff0c;然后找出最大的崇拜圈即可 代码实现 package lanqiao;import java.util.*;public class Main {public static vo…

漫画:什么是时间复杂度

转载自 漫画&#xff1a;什么是时间复杂度 时间复杂度的意义 究竟什么是时间复杂度呢&#xff1f;让我们来想象一个场景&#xff1a; 某一天&#xff0c;小灰和大黄同时加入了一个公司...... 一天过后&#xff0c;小灰和大黄各自交付了代码&#xff0c;两端代码实现的功能…

Visual Studio 和 Team Foundation Server 产品维护及周期策略

1 适用于 Visual Studio 和 Team Foundation Server 2012 - 2017 这些产品遵循 Microsoft 10 年支持生命周期策略&#xff08;5 年主流支持和 5 年扩展支持&#xff09;&#xff0c;起始日期为主要产品版本向全球 (RTW) 发布的日期。 例如&#xff0c;Visual Studio 2017 于 20…