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

网站建设如何建设计网页通常使用什么语言

网站建设如何建,设计网页通常使用什么语言,类似于建设通的网站,网站建设重点在之前的文章中我们介绍了 C# 中的 只读结构体#xff08;readonly struct#xff09;[1] 和与其紧密相关的 in 参数[2]。今天我们来讨论一下从 C# 8 开始引入的一个特性#xff1a;可变结构体中的只读实例成员#xff08;当结构体可变时#xff0c;将不会改变结构体状态的… 在之前的文章中我们介绍了 C# 中的 只读结构体readonly struct[1] 和与其紧密相关的 in 参数[2]。今天我们来讨论一下从 C# 8 开始引入的一个特性可变结构体中的只读实例成员当结构体可变时将不会改变结构体状态的实例成员声明为 readonly。引入只读实例成员的原因简单来说还是为了提升性能。我们已经知道了只读结构体readonly struct和 in 参数可以通过减少创建副本来提高代码运行的性能。当我们创建只读结构体类型时编译器强制所有成员都是只读的即没有实例成员修改其状态。但是在某些场景比如您有一个现有的 API具有公开可访问字段或者兼有可变成员和不可变成员。在这种情形下不能将类型标记为 readonly 因为这关系到所有实例成员。通常这没有太大的影响但是在使用 in 参数的情况下就例外了。对于非只读结构体的 in 参数编译器将为每个实例成员的调用创建参数的防御性副本因为它无法保证此调用不会修改其内部状态。这可能会导致创建大量副本并且比直接按值传递结构体时的总体性能更差因为按值传递只会在传参时创建一次副本。看一个例子您就明白了我们定义这样一个一般结构体然后将其作为 in 参数传递public struct Rect {public float w;public float h;public float Area{get{return w * h;}} } public class SampleClass {public float M(in Rect value){return value.Area value.Area;} } 编译后类 SampleClass 中的方法 M 代码运行逻辑实际上是这样的public float M([In] [IsReadOnly] ref Rect value) {Rect rect value; //防御性副本float area rect.Area;rect value; //防御性副本return area rect.Area; } 可变结构体中的只读实例成员我们把上面的可变结构体 Rect 修改一下添加一个 readonly 方法 GetAreaReadOnly如下public struct Rect {public float w;public float h;public float Area{get{return w * h;}}public readonly float GetAreaReadOnly(){return Area; //警告 CS8656 从 readonly 成员调用非 readonly 成员 Rect.Area.get 将产生 this 的隐式副本。} } 此时代码是可以通过编译的但是会提示一条这样的的警告从 readonly 成员调用非 readonly 成员 Rect.Area.get 将产生 this 的隐式副本。翻译成大白话就是说我们在只读方法 GetAreaReadOnly 中调用了非只读 Area 属性将会产生 this 的防御性副本。用代码演示一下编译后方法 GetAreaReadOnly 的方法体运行逻辑实际上是这样的[IsReadOnly] public float GetAreaReadOnly() {Rect rect this; //防御性副本return rect.Area; } 所以为了避免创建多余的防御性副本而影响性能我们应该给只读方法体中调用的属性或方法都加上 readonly 修饰符在本例中即给属性 Area 加上 readonly 修饰符。调用结构体中的只读实例成员我们将上面的示例再修改一下public struct Rect {public float w;public float h;public readonly float Area{get{return w * h;}}public readonly float GetAreaReadOnly(){return Area;}public float GetArea(){return Area;} }public class SampleClass {public static float CallGetArea(Rect vector){return vector.GetArea();}public static float CallGetAreaIn(in Rect vector){return vector.GetArea();}public static float CallGetAreaReadOnly(in Rect vector){//调用可变结构体中的只读实例成员return vector.GetAreaReadOnly();} } 类 SampleClass 中定义三个方法第一个方法是以前我们常见的调用方式;第二个以 in 参数传入可变结构体调用非只读方法可能修改结构体状态的方法;第三个以 in 参数传入可变结构体调用只读方法。我们来重点看一下第二个和第三个方法有什么区别还是把它们的 IL 代码逻辑翻译成易懂的执行逻辑如下所示public static float CallGetAreaIn([In] [IsReadOnly] ref Rect vector) {Rect rect vector; //防御性副本return rect.GetArea(); }public static float CallGetAreaReadOnly([In] [IsReadOnly] ref Rect vector) {return vector.GetAreaReadOnly(); } 可以看出CallGetAreaReadOnly 在调用结构体的只读成员方法时相对于 CallGetAreaIn 调用结构体的非只读成员方法少创建了一次本地的防御性副本所以在执行性能上应该是有优势的。只读实例成员的性能分析性能的提升在结构体较大的时候比较明显所以在测试的时候为了能够突出三个方法性能的差异我在 Rect 结构体中添加了 30 个 decimal 类型的属性然后在类 SampleClass 中添加了三个测试方法代码如下所示public struct Rect {public float w;public float h;public readonly float Area{get{return w * h;}}public readonly float GetAreaReadOnly(){return Area;}public float GetArea(){return Area;}public decimal Number1 { get; set; }public decimal Number2 { get; set; }//...public decimal Number30 { get; set; } }public class SampleClass {const int loops 50000000;Rect rectInstance;public SampleClass(){rectInstance new Rect();}[Benchmark(Baseline true)]public float DoNormalLoop(){float result 0F;for (int i 0; i loops; i){result CallGetArea(rectInstance);}return result;}[Benchmark]public float DoNormalLoopByIn(){float result 0F;for (int i 0; i loops; i){result CallGetAreaIn(in rectInstance);}return result;}[Benchmark]public float DoReadOnlyLoopByIn(){float result 0F;for (int i 0; i loops; i){result CallGetAreaReadOnly(in rectInstance);}return result;}public static float CallGetArea(Rect vector){return vector.GetArea();}public static float CallGetAreaIn(in Rect vector){return vector.GetArea();}public static float CallGetAreaReadOnly(in Rect vector){return vector.GetAreaReadOnly();} } 在没有使用 in 参数的方法中意味着每次调用传入的是变量的一个新副本; 而在使用 in 修饰符的方法中每次不是传递变量的新副本而是传递同一副本的只读引用。DoNormalLoop 方法参数不加修饰符传入一般结构体调用可变结构体的非只读方法这是以前比较常见的做法。DoNormalLoopByIn 方法参数加 in 修饰符传入一般结构体调用可变结构体的非只读方法。DoReadOnlyLoopByIn 方法参数加 in 修饰符传入一般结构体调用可变结构体的只读方法。使用 BenchmarkDotNet 工具测试三个方法的运行时间结果如下| Method | Mean | Error | StdDev | Ratio | |-------------------:|--------:|---------:|---------:|------:| | DoNormalLoop | 1.978 s | 0.0140 s | 0.0125 s | 1.00 | | DoNormalLoopByIn | 3.363 s | 0.0280 s | 0.0262 s | 1.70 | | DoReadOnlyLoopByIn | 1.032 s | 0.0200 s | 0.0187 s | 0.52 | 从结果可以看出当结构体可变时使用 in 参数调用结构体的只读方法性能高于其他两种; 使用 in 参数调用可变结构体的非只读方法运行时间最长严重影响了性能应该避免这样调用。总结当结构体为可变类型时应将不会引起变化即不会改变结构体状态的成员声明为 readonly。当仅调用结构体中的只读实例成员时使用 in 参数可以有效提升性能。readonly 修饰符在只读属性上是必需的。编译器不会假定 getter 访问者不修改状态。因此必须在属性上显式声明。自动属性可以省略 readonly 修饰符因为不管 readonly 修饰符是否存在编译器都将所有自动实现的 getter 视为只读。不要使用 in 参数调用结构体中的非只读实例成员因为会对性能造成负面影响。相关链接https://mp.weixin.qq.com/s/wwVZbdY7m7da1nmIKb2jCA C# 中的只读结构体 ↩︎https://mp.weixin.qq.com/s/L73y4zdJmeT7zGTwGEJDZg C# 中的 in 参数和性能分析 ↩︎作者 技术译民  出品 技术译站https://ITTranslator.cn/END
http://www.pierceye.com/news/849283/

相关文章:

  • 班级网站自助建设功能没有充值入口的传奇
  • 杭州网站seo免费网站建设
  • 好看的网站设计网站开发龙岗网站建设
  • 物流如何做网站wordpress qq互联插件
  • 权威发布李建济南做seo排名
  • 六安网站建设 220广州安尔捷做的网站好吗
  • 企业网站写好如何发布wordpress免插件生成地图
  • 公司 网站 苏州链接下载
  • 网站页面设计素材网站做权重的方法
  • 网站优化标题怎么做宿迁房产网备案查询
  • 建设企业官方网站的流程秦皇岛网站备案
  • 北京网站优化前景建设银行包头分行网站
  • 南京江宁区住房建设局网站电商交流平台有哪些
  • 查询网站流量排名做网站 我们的工人怎么写
  • 龙岗-网站建设深圳信科免备案的网站空间
  • 360网站推广官网软件安徽海外网络推广
  • c# asp.net网站开发书考试网站怎么做的
  • 网站开发 技术路线融资融券配资网站建设
  • 建设网站如国家高新技术企业证书
  • 网站服务是什么网站建设投标书报价表
  • 商业网站开发与设计宝塔面板wordpress安装
  • 学交互设计网站企业网站建设要多久
  • 免费情感网站哪个好有没有帮忙做标书的网站
  • 申请域名需要多久大连seo顾问
  • 舟山外贸建站公司做文案选图片素材的网站
  • 网站开发从何学起公司网站在哪里做
  • 无锡网站制作哪家有名金华安全网站建设怎么收费
  • dw做响应式网站重庆黄埔建设集团网站
  • 做系统那个网站好wordpress添加返回顶部
  • 站网站推广汕头网站建设和运营