龙空技术网

C# 本地函数

秋风技术 396

前言:

此刻同学们对“javaisempty函数”可能比较关心,姐妹们都需要了解一些“javaisempty函数”的相关资讯。那么小编在网络上汇集了一些有关“javaisempty函数””的相关知识,希望看官们能喜欢,咱们一起来了解一下吧!

前言

前一段时间在看.Net Core 3.0与.Net Core 2.0在性能测试对比,发现在3.0相对2.0有了很大的提升,在对比ConcurrentDictionary中与.NetFramework源码对比,发现本地函数这个相对新的语法.对于长期使用VS2008的我来说,这个语法是真的很新了(2019年写).

VS2019在更新到16.2.5(Windows版本),VS For Mac 最新版本也同步支持了,一个好的功能,根据类型导入命名空间(未引用dll的时候),这个功能在Java(Idea中)很早之前就有了。

本地函数(c# 7.0)

看ConcurrentDictionary(.Net Core 3.0)中的IsEmpty函数源码:

public bool IsEmpty{    get    {        // 第一次调用内部的本地函数,未加锁,验证不为真的时候        if (!AreAllBucketsEmpty())        {            return false;        }        int acquiredLocks = 0;        try        {                        // 加锁            AcquireAllLocks(ref acquiredLocks);            return AreAllBucketsEmpty();   // 再次调用本地函数        }        finally        {            // 释放锁            ReleaseLocks(0, acquiredLocks);        }        //在函数内部,定义本地函数,可以在当前函数内部,进行多次调用        bool AreAllBucketsEmpty()        {            int[] countPerLock = _tables._countPerLock;            for (int i = 0; i < countPerLock.Length; i++)            {                if (countPerLock[i] != 0)                {                    return false;                }            }            return true;        }    }}

在<<performance-improvements-in-net-core-3-0>> 一文中,看到ConcurrentDictionary<TKey, TValue>,和 ConcurrentQueue<T> 中的IsEmpty在.Net Core 2.1 和 .Net Core 3.0性能对比相差是很大的。在看过源码中,可以看到主要是在锁处理,第一次判断字典内元素是否为空是没有加锁的,当然是在CLR应该也是做了不少优化。

本地函数,在项目中使用还是很好的.

数字文本语法改进(7.0),只是语法糖

//数字文本改进//下面这样,更容易使用和读取int num = 100_000_000;   //数字中的下划线,在编译的时候,由编译器自动剔除Console.WriteLine($"num={num}");

查看生成后的代码:

IL_0000: nopIL_0001: ldc.i4 100000000   //查看编译之后il代码,可以看到数字中的下划线已经在编译的时候自动剔除了IL_0006: stloc.0IL_0007: ldstr "num={0}"IL_000c: ldloc.0IL_000d: box [mscorlib]System.Int32IL_0012: call string [mscorlib]System.String::Format(string,  object)IL_0017: call void [System.Console]System.Console::WriteLine(string)

这个语法糖,在项目中没见使用过,属于存在感不强的.

更好用的using(c# 8.0)

//using { xxx} 可以去掉大括号{} using FileStream stream = new FileStream("hello.txt", FileMode.OpenOrCreate);string str = "0x5A4D"; //测试数据byte[] buffer = Encoding.UTF8.GetBytes(str);stream.Write(buffer, 0, buffer.Length);List<int> list = new List<int>();for (int i = 0; i < 100; i++){    list.Add(i + 1);}Console.WriteLine(list[9]);Console.WriteLine("Hello World!");//多次使用usingusing var con = new SqlConnection("");

上边的代码,查看编译成后的代码,大括号(作用域)自动加上

using (FileStream fileStream = new FileStream("hello.txt", FileMode.OpenOrCreate)){    byte[] bytes = Encoding.UTF8.GetBytes("0x5A4D");    fileStream.Write(bytes, 0, (int)bytes.Length);    List<int> nums = new List<int>();    for (int i = 0; i < 100; i = checked(i + 1))    {        nums.Add(checked(i + 1));    }    Console.WriteLine(nums[9]);    Console.WriteLine("Hello World!");    using (SqlConnection sqlConnection = new SqlConnection(""))    {    }}

可以通过编译后的代码,发现using 新的用法也只是个语法糖.对于文件和数据库连接还是使用using管理方便,在项目中遇到使用文件后,没有关闭,出现占用的异常.

个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

标签: #javaisempty函数