当前位置: 首页 > 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 项目)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • centos安装java运行环境jdk+tomcat
  • css属性的继承、初识值、计算值、当前值、应用值
  • docker-consul
  • gops —— Go 程序诊断分析工具
  • mysql_config not found
  • Python中eval与exec的使用及区别
  • SegmentFault 2015 Top Rank
  • Webpack 4 学习01(基础配置)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 第2章 网络文档
  • 翻译:Hystrix - How To Use
  • 分布式熔断降级平台aegis
  • 一些关于Rust在2019年的思考
  • puppet连载22:define用法
  • scrapy中间件源码分析及常用中间件大全
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #pragma once
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • @Autowired和@Resource的区别
  • [<MySQL优化总结>]
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Bada开发]初步入口函数介绍
  • [BZOJ3757] 苹果树
  • [Foreman]解决Unable to find internal system admin account
  • [JMS 3] ActiveMQ实现简单的helloworld
  • [POJ2411]Mondriaan's Dream
  • [vue element-ui]JAVA POST请求
  • [Windows编程] 利用dxdiag获取用户机器硬件及OS信息
  • [毕业设计源代码]精品基于SSM的线上点餐系统[包运行成功]
  • [翻译]Gallery Server Pro ----用于分享相片,视频,音频及其他媒体的ASP.NET相册[Carol]...
  • [翻译]——SQL Server使用链接服务器的5个性能杀手
  • [附源码]Java计算机毕业设计SSM电力公司员工安全培训系统
  • [深圳]盛情邀请1月25日下午嵌入式技术培训