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

.NET/C# 避免调试器不小心提前计算本应延迟计算的值

延迟计算属性的值,应该很多小伙伴都经常使用。比如在属性的 get 方法中判断是否已初始化,如果没有初始化则立即开始初始化。

但这样的写法存在一个很大的问题——如果你使用 Visual Studio 调试,当你把鼠标划到对象的实例上的时候,属性就会立刻开始进行初始化。而此时对你的代码来说可能就过早初始化了。我们不应该让调试器非预期地影响到我们程序的执行结果。

本文介绍如何避免调试器不小心提前计算本应延迟计算的值。


方法是在属性上添加一个特性 DebuggerBrowsableAttribute

private Walterlv _foo;

[DebuggerBrowsable(DebuggerBrowsableState.Never)]
public Walterlv Walterlv => _foo ?? (_foo = new Walterlv());

public bool IsInitialized => !(_foo is null);

当指定为不再显示的话,在调试器中查看此实例的属性的时候就看不到这个属性了,也就不会因为鼠标划过导致提前计算了值。

当然,如果你希望为你的类型定制更多的调试器显示方式,可以参考我的另一篇博客:

  • C#/.NET 调试的时候显示自定义的调试信息(DebuggerDisplay 和 DebuggerTypeProxy) - walterlv

参考资料

  • Lazy.cs

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 的字符串暂存池
  • 如何为 Win32 的打开和保存对话框编写文件过滤器(Filter)
  • C# 中新增类型的命名空间只需部分与其他命名空间名称相同即可破坏源码兼容性
  • 使用 ProcessMonitor 找到进程所操作的文件的路径
  • MSBuild 在编写编译任务的时候判断当前是否在 Visual Studio 中编译
  • git 配置错误导致无法推送远端仓库?本文介绍各种修复方式
  • WPF 很少人知道的科技
  • WPF 程序的编译过程
  • 制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)
  • .NET 的程序集加载上下文
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • Windows 10 解决无法完整下载安装语言包(日语输入法无法下载使用)
  • 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目)
  • CAP理论的例子讲解
  • Linux CTF 逆向入门
  • Map集合、散列表、红黑树介绍
  • Netty源码解析1-Buffer
  • Python 反序列化安全问题(二)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • spring security oauth2 password授权模式
  • 那些被忽略的 JavaScript 数组方法细节
  • 一起参Ember.js讨论、问答社区。
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Java性能优化之JVM GC(垃圾回收机制)
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #14vue3生成表单并跳转到外部地址的方式
  • (1)bark-ml
  • (9)STL算法之逆转旋转
  • (bean配置类的注解开发)学习Spring的第十三天
  • (ros//EnvironmentVariables)ros环境变量
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (待修改)PyG安装步骤
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (九十四)函数和二维数组
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • **CI中自动类加载的用法总结
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core 中的路径问题
  • .NET Core引入性能分析引导优化
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • @RequestMapping用法详解
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [2021 蓝帽杯] One Pointer PHP
  • [2669]2-2 Time类的定义
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [c++] 自写 MyString 类
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [dart学习]第四篇:函数