当前位置: 首页 > news >正文

jsp借书网站开发三河燕郊最新消息

jsp借书网站开发,三河燕郊最新消息,电子政务公开 网站建设,株洲网站搜索优化为什么有此文章首先要说的是我们公司内部技术框架是用 abp.vnext 框架整合而来的#xff0c;我们架构师对于 abp 相关的知识都很了然于胸了。并且这个框架的确很优秀#xff0c;省了我们前期大量基础工作。架构师把主要的架子搭建好了之后#xff0c;把应用层与核心层让我们… 为什么有此文章首先要说的是我们公司内部技术框架是用 abp.vnext 框架整合而来的我们架构师对于 abp 相关的知识都很了然于胸了。并且这个框架的确很优秀省了我们前期大量基础工作。架构师把主要的架子搭建好了之后把应用层与核心层让我们去实现并让我们好熟悉这个框架。就在我们在讨论代码规范相关的东西就说到了值元祖这个点并提议不要在代码中用元组。我当时听了之后觉得疑惑为什么不能用元组呢元组的确很方便啊特别是 C#7.0 之后支持元组解构代码阅读性美观度双双提升。他是说元组在取值的时候会发生装箱会有性能损耗。再者值元组跟之前的 Tuple 不同前者是一个结构体后者则是引用类型在用值元组的时候会不利于垃圾回收具体是说 Ioc 管理的生命周期与我在用的值元组变量的生命周期会有矛盾。在最开始的话我并没有这么考虑因为我心里想着是这样的TupleT 和 ValueTupleT 是泛型的是不会发生装箱的这点在我查看了源代码以及 IL 发现很有意思后面会有提到ValueTupleT 是值对象没错内存分配在栈中但还是属于托管资源CLR 会管理好每个变量的生命周期的会确保值类型变量在当前作用域无任何引用时会释放资源。比如我在程序中是新建的局部变量那么哪怕是这个变量未引用已经引用过后再无引用CLR 都会自动回收这个局部变量。而后我查看 Tuple 和 ValueTuple 的api心情可谓是一波三折啊。所以在有此文章ValueTuple先来看 ValueTuple查看其成员信息如下public struct ValueTuple : IStructuralComparable, IStructuralEquatable, IComparable, IComparableValueTuple, IEquatableValueTuple, ITuple这里面有一个成员信息特别扎眼那就是 ITuple 类因为其他的接口都是跟判断相等性相关的。不在我们这次的讨论范围。我们 F12 到 ITuple 进去看看具体成员信息object? this[int? index] { get; }int? Length { get; }不过我们在暴露出来的 API 中没有看到这两个实现属性说明这个实现类的这这两个属性只是内部实现用的不会给我们开发者用当然我们可以选择强转来使用接口的这两个属性。这从源码也是可以很容易知道的[Nullable(2)] object ITuple.this[int index] {get{if(index ! 0){throw new IndexOutOfRangeException();}return Item1;} } int ITuple.Length {get{return 1;} }当我在官网看到 ValueTuple 有两个属性是实现接口 ITuple 的并且 ITuple.Item[Int32] 返回的是一个 object 对象我下意识的反映就是难道真的会发生装箱么仔细想想其实完全不是这样如果是发生装箱的话那么这个 ValueTuple 泛型就是一个多余的东西那就跟 java 中的泛型擦除效果一样了只是起到了一个编译期的检测作用不能做到实质的性能提升。其实再仔细查看便会发现我们平常引用的 ValueTuple 、Tuple 实例对象引用的 Item1、Item2 等值实际上是字段而不是属性而这些字段在你初始化或用 Tuple.Creat,ValueTuple.Create 函数创建的元组 / 值元组对象时类型以及 Item 的个数以及值就已经确定了。所以根本不会发生装箱。这一点我们从 IL 代码中就能从中得知在看 IL 之前我们先来看与 IL 对应的 C# 代码var t ValueTuple.Create(2, 3); Console.WriteLine(t.Item1); Console.WriteLine(t.Item2); Console.WriteLine($Item1 {t.Item1}, Item2 ${t.Item2});IL 代码.method private hidebysig static void Main (string[] args) cil managed {.maxstack 3.entrypoint.locals init ([0] valuetype [System.Runtime]System.ValueTuple2int32, int32 t)IL_0000: nopIL_0001: ldc.i4.2IL_0002: ldc.i4.3IL_0003: call valuetype [System.Runtime]System.ValueTuple2!!0, !!1 [System.Runtime]System.ValueTuple::Createint32, int32(!!0, !!1)IL_0008: stloc.0IL_0009: ldloc.0IL_000a: ldfld !0 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item1IL_000f: call void [System.Console]System.Console::WriteLine(int32)IL_0014: nopIL_0015: ldloc.0IL_0016: ldfld !1 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item2IL_001b: call void [System.Console]System.Console::WriteLine(int32)IL_0020: nopIL_0021: ldstr Item1 {0}, Item2 ${1}IL_0026: ldloc.0IL_0027: ldfld !0 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item1IL_002c: box [System.Runtime]System.Int32IL_0031: ldloc.0IL_0032: ldfld !1 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item2IL_0037: box [System.Runtime]System.Int32IL_003c: call string [System.Runtime]System.String::Format(string, object, object)IL_0041: call void [System.Console]System.Console::WriteLine(string)IL_0046: nopIL_0047: ret }这样我们就能很清楚的知道元组里面的细节了我们平常取的都是元组 / 值元组的字段并且 Main 函数开头的 managed 标识就代表这是托管资源。值得注意的是 IL_002c 处的装箱只是由于 Console.WriteLine 导致的装箱。元组解构我们知道 C#7 支持了元组结构了可以支持我们对元组字段 Item 进行表意话这样更能提高阅读性和代码美观。那么元组结构跟之前直接引用的字段值变量 Item 有什么区别呢这一点我们也可以直接从 IL 上轻易得知。var (pd, id) ValueTuples.Create(2, 3); Console.WriteLine(pd); Console.WriteLine(id); Console.WriteLine($元组解构Item1 {pd}, Item2 ${id});.method private hidebysig static void Main (string[] args) cil managed {.maxstack 3.entrypoint.locals init ([0] int32 pd,[1] int32 id)IL_0000: nopIL_0001: ldc.i4.2IL_0002: ldc.i4.3IL_0003: call valuetype [System.Runtime]System.ValueTuple2!!0, !!0 CSharpGuide.LanguageVersions._7._0.ValueTuples::Createint32(!!0, !!0)IL_0008: dupIL_0009: ldfld !0 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item1IL_000e: stloc.0IL_000f: ldfld !1 valuetype [System.Runtime]System.ValueTuple2int32, int32::Item2IL_0014: stloc.1IL_0015: ldloc.0IL_0016: call void [System.Console]System.Console::WriteLine(int32)IL_001b: nopIL_001c: ldloc.1IL_001d: call void [System.Console]System.Console::WriteLine(int32)IL_0022: nopIL_0023: ldstr 元组解构Item1 {0}, Item2 ${1}IL_0028: ldloc.0IL_0029: box [System.Runtime]System.Int32IL_002e: ldloc.1IL_002f: box [System.Runtime]System.Int32IL_0034: call string [System.Runtime]System.String::Format(string, object, object)IL_0039: call void [System.Console]System.Console::WriteLine(string)IL_003e: nopIL_003f: ret } 发现了没有这段 IL 与之前的一模一样没任何区别。ITuple如果你想用把元组转换成 ITuple 类型那么取的值就一定会发生装箱因为 Item 是一个 object 类型。我们能从这个类获知这个元组有多少个值能通过索引遍历所有的值。除此之外这个类并没有其他使用场景了。Tuple、ValueTuple 平常的使用完全不用担心 Item 值的装箱因为根本不会发生装箱拆箱。元组解构生成的代码跟之前直接引用元组是没任何区别的。只是编译器增加这么一个功能给 item 命名的功能而已。如果你想要遍历这个元组对象的值的话那么就建议转化成 ITuple 进一步操作。文章同步至https://github.com/MarsonShine/Books/blob/master/CSharpGuide/docs/7.0/TupleVSValueTuple.md
http://wiki.neutronadmin.com/news/188108/

相关文章:

  • 网站性能优化方法域名与ip地址的关系
  • 江苏做网站的公司有哪些做临床研究在哪个网站注册
  • 国外网站 dns网站聚合优化
  • anydrag建站专家网站建设系统wordpress搭建网盘
  • 网站通栏设计素材网站建设实验目的
  • 上海汽车网站建设10种营销方法
  • wordpress建博客网站旅游网站建设价格
  • 网站媒体给房开做内容推广徐州市新沂市建设局网站
  • 在微信上做彩票网站有哪些公司建设网站的案例分析
  • 网站建设运营服务商网站源码和模板的区别
  • 动漫制作专业什么电脑最适合如何做好网站针对搜索引擎的seo
  • 商城网站建设天软科技公共法律服务网站平台建设预算
  • 极速建站网站模板中国建设银行余额查询入口
  • 滁州市建设局网站wordpress主题添加设置页面
  • 怎样做免费外贸网站厦门今天刚刚发生的新闻
  • 功能型网站wordpress链接自定义后文章打不开
  • 佛山网站哪家最专业凡科网站建设怎么去掉极速建站
  • win8网站模板白云网站制作
  • 网站开发运行环境有哪些三河建设局网站
  • 建设部网站规范查询纺织网站制作123纺织网
  • 中国建设造价工程协会网站wordpress搜索中文插件
  • 网站建设可以抵扣吗开发板原理图
  • 南京网站制作设计7k7k小游戏在线玩
  • 网站建设j基本步骤农化网站建设
  • 南京网站建设价位本地推广平台有哪些
  • 买完域名网站怎么设计手机软件公司
  • 网站优化页面外贸移动商城网站建设
  • 摄影个人网站模板苏州集团网站制作公司
  • 免费创建app网站著名网站建设公司
  • 专业网站建设效果显著专业的网站建设企业网站