当前位置: 首页 > 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 项目)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • avalon2.2的VM生成过程
  • C学习-枚举(九)
  • Facebook AccountKit 接入的坑点
  • react-native 安卓真机环境搭建
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 检测对象或数组
  • 深入浏览器事件循环的本质
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 首页查询功能的一次实现过程
  • 微服务入门【系列视频课程】
  • scrapy中间件源码分析及常用中间件大全
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .apk文件,IIS不支持下载解决
  • .gitignore文件设置了忽略但不生效
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net 路由处理厉害了
  • .NET 设计模式初探
  • .Net下的签名与混淆
  • .vimrc 配置项
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [10] CUDA程序性能的提升 与 流
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Angular] 笔记 20:NgContent
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [C#]C#学习笔记-CIL和动态程序集