当前位置: 首页 > 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 项目)
  • 【译】JS基础算法脚本:字符串结尾
  • 2017 年终总结 —— 在路上
  • CentOS7 安装JDK
  • ES6系列(二)变量的解构赋值
  • IP路由与转发
  • Java 网络编程(2):UDP 的使用
  • JS 面试题总结
  • JS学习笔记——闭包
  • Just for fun——迅速写完快速排序
  • PAT A1017 优先队列
  • Phpstorm怎样批量删除空行?
  • React Transition Group -- Transition 组件
  • 安装python包到指定虚拟环境
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 力扣(LeetCode)357
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 我这样减少了26.5M Java内存!
  • 学习JavaScript数据结构与算法 — 树
  • 正则与JS中的正则
  • NLPIR智能语义技术让大数据挖掘更简单
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $.ajax,axios,fetch三种ajax请求的区别
  • (2)MFC+openGL单文档框架glFrame
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (十六)Flask之蓝图
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .net core Swagger 过滤部分Api
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core 中的路径问题
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 的程序集加载上下文
  • .NET开发不可不知、不可不用的辅助类(一)
  • .Net下的签名与混淆