深度解析.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;
        }
    }
}

转载:https://www.cnblogs.com/loverwangshan/p/11228409.html

posted @ 2020-03-13 23:45  明志德道  阅读(402)  评论(0编辑  收藏  举报