深度解析.NetFrameWork/CLR/C# 以及C#6/C#7新语法
一:什么是.NetFrameWork/ CLR / C#
1:.NetFramework即架构,它是一个语言开发软件,提供了软件开发的框架,使开发更具工程性、简便性和稳定性,这个框架主要是针对于c#语言的,该框架包含了CLR,VS等编译工具,BCL(基本类库)。
2:c#是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,主要是为.netFramwork框架提供一种编程规范,即是符合CLR中的CLS(通用语言规范)。
3:CLR是Common Language RunTime,公共运行类库。c#语言通过编译会生成IL+Metadata两部分,而CL主要的功能是通过JIT即时编译器把这部分解析成机器识别的代码,即二进制编码,然后再计算机中执行。
二:c# Project运行的整个流程
执行流程:
无论是VB或者C#项目都会依赖于BCL(基础类库),然后通过编译生成IL(中间语言)+Metadata(列表清单),然后通过JIT(Just IN Time )编译成机器二进制码(因为计算机只识别二进制码),然后再在计算机中执行。
三:.NetFrameWork/ CLR / C#对应的版本
注意:并不是每个版本都一一对应的,有的版本升级然后CLR并没有升级,visualStudio是.net开发工具。
下图也能说明vs与c#版本:
四:c#既然是.netFramework的规范,那下面介绍一下c#6以及c#7新的语法
1:c#6的新语法
如图:
具体代码如下:
using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using static System.Math; namespace Test.Project { /// <summary> /// C#6 新语法 /// </summary> public class SharpSix { #region 自动属性初始化(Auto-property initializers) public string Name { get; set; } = "summit"; public int Age { get; set; } = 22; public DateTime BirthDay { get; set; } = DateTime.Now.AddYears(-20); public IList<int> AgeList { get; set; } = new List<int> { 10, 20, 30, 40, 50 }; #endregion public void Show(People peopleTest) { #region 字符串嵌入值(String interpolation) Console.WriteLine($"年龄:{this.Age} 生日:{this.BirthDay.ToString("yyyy-MM-dd")}"); Console.WriteLine($"年龄:{{{this.Age}}} 生日:{{{this.BirthDay.ToString("yyyy -MM-dd")}}}"); Console.WriteLine($"{(this.Age <= 22 ? "小鲜肉" : "老鲜肉")}"); #endregion #region 导入静态类(Using Static) Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}"); Console.WriteLine($"导入后可直接使用方法: {Pow(4, 2)}"); #endregion #region 空值运算符(Null-conditional operators) int? iValue = 10; Console.WriteLine(iValue?.ToString());//不需要判断是否为空 string name = null; Console.WriteLine(name?.ToString()); #endregion #region 对象初始化器(Index Initializers) IDictionary<int, string> dictOld = new Dictionary<int, string>() { { 1,"first"}, { 2,"second"} }; IDictionary<int, string> dictNew = new Dictionary<int, string>() { [4] = "first", [5] = "second" }; #endregion #region 异常过滤器(Exception filters) int exceptionValue = 10; try { Int32.Parse("s"); } catch (Exception e) when (exceptionValue > 1)//满足条件才进入catch { Console.WriteLine("catch"); //return; } #endregion #region nameof表达式 (nameof expressions) Console.WriteLine(nameof(peopleTest)); //获取peopleTest这个字符串 #endregion #region 在cath和finally语句块里使用await(Await in catch and finally blocks) #endregion } #region 在属性/方法里使用Lambda表达式(Expression bodies on property-like function members) public string NameFormat => string.Format("姓名: {0}", "summit"); public void Print() => Console.WriteLine(Name); #endregion } public class People { public int Id { get; set; } public string Name { get; set; } public static async Task Get() { await Task.Run(() => { Thread.Sleep(5000); Console.WriteLine("People.async.Get"); }); Console.WriteLine("People.async.Get after"); } } }
2:c#7的新语法
using System; using System.Collections.Generic; using System.Text; namespace Test.Project { /// <summary> /// c#7新语法 /// </summary> public class SharpSeven { public void Show() { #region out参数 { this.DoNoting(out int x, out int y); Console.WriteLine(x + y); this.DoNoting(out var l, out var m); } //Console.WriteLine(x + y); #endregion #region 模式 this.PrintStars(null); this.PrintStars(3); this.Switch(null); this.Switch("RichardRichard"); this.Switch("Richard"); #endregion #region 元组 { var result = this.LookupName(1); Console.WriteLine(result.Item1); Console.WriteLine(result.Item2); Console.WriteLine(result.Item3); } { var result = this.LookupNameByName(1); Console.WriteLine(result.first); Console.WriteLine(result.middle); Console.WriteLine(result.last); Console.WriteLine(result.Item1); Console.WriteLine(result.Item2); Console.WriteLine(result.Item3); } #endregion #region 局部函数 { Add(3); int Add(int k)//闭合范围内的参数和局部变量在局部函数的内部是可用的,就如同它们在 lambda 表达式中一样。 { return 3 + k; } } #endregion #region 数字分隔号 long big = 100_000; #endregion } /// <summary> /// System.ValueTuple 需要安装这个nuget包 /// </summary> /// <param name="id"></param> /// <returns></returns> private (string, string, string) LookupName(long id) // tuple return type { return ("first", "middle", "last"); } private (string first, string middle, string last) LookupNameByName(long id) // tuple return type { return ("first", "middle", "last"); //return (first: "first", middle: "middle", last: "last"); } /// <summary> /// 具有模式的 IS 表达式 /// </summary> /// <param name="o"></param> public void PrintStars(object o) { if (o is null) return; // 常量模式 "null" if (!(o is int i)) return; // 类型模式 定义了一个变量 "int i" Console.WriteLine(new string('*', i)); } /// <summary> /// 可以设定任何类型的 Switch 语句(不只是原始类型) /// 模式可以用在 case 语句中 /// Case 语句可以有特殊的条件 /// </summary> /// <param name="text"></param> private void Switch(string text) { int k = 100; switch (text) { case "RichardRichard" when k > 10: Console.WriteLine("RichardRichard"); break; case "Richard" when text.Length < 10: Console.WriteLine("Richard"); break; case string s when s.Length > 7://模式 Console.WriteLine(s); break; default: Console.WriteLine("default"); break; case null: Console.WriteLine("null"); break; } } private void DoNoting(out int x, out int y) { x = 1; y = 2; } } }
付费内容,请联系本人QQ:1002453261
本文来自博客园,作者:明志德道,转载请注明原文链接:https://www.cnblogs.com/for-easy-fast/articles/12489972.html