前言:
此刻同学们对“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函数