dotnet 读 WPF 源代码笔记 提升调试效率的 NamedObject 类型
本文来聊聊 WPF 那些值得称赞的设计中的 NamedObject 类型。在 WPF 中,有很多值得我学习的设计开发思想,其中就包括本文将要介绍的 NamedObject 类型。此类型的定义仅仅只是为了方便调试,而没有具体的业务功能
在 WPF 的 WindowsBase 程序集里面就定义了 WPF 的很多基础类型,例如咱都在用的 DependencyObject 等类型。本文的 NamedObject 也正是定义在 WindowsBase 程序集里面众多的类型之一,代码就放在 src\Microsoft.DotNet.Wpf\src\WindowsBase\MS\Internal\NamedObject.cs
文件里面
这是一个代码量很少的类型,如下面的内容,就是 NamedObject 的全部代码
internal class NamedObject
{
public NamedObject(string name)
{
if (String.IsNullOrEmpty(name))
throw new ArgumentNullException(name);
_name = name;
}
public override string ToString()
{
if (_name[0] != '{')
{
// lazily add {} around the name, to avoid allocating a string
// until it's actually needed
_name = String.Format(CultureInfo.InvariantCulture, "{{{0}}}", _name);
}
return _name;
}
string _name;
}
按照 dotnet 里面的常用设计,咱的 ToString 方法大多数都是用来调试使用,或者序列化使用。而 NamedObject 类型没有序列化的需求,因此就剩下一个调试的功能了。可以看到 NamedObject 没有任何的属性定义,也没有任何的方法。实际除了调试以外,就和 object 对象是一个功能。其实这是对的,这就是专门用来辅助调试的类型
为什么需要定义 NamedObject 类型来做调试辅助?原因是在 WPF 中,有某些地方的逻辑需要用到一个空的 Object 对象,而此对象不是用来做类里面的内部锁的信息,此空对象将会在框架层传输。在框架层传输一个空的对象无疑会让开发者在调试时感觉到无从下手,原因其实和空异常差不多。假定在某个业务逻辑里面,收到了其他模块发生过来的一个非预期的对象,刚好这个对象是一个空的 object 对象,此时请问这个空的 object 对象是什么,是由哪个模块创建的
为了构建出一个稳固的 UI 框架,或者为了方便后续像我这样水平一般的开发者可以参与到框架的开发,古老的 WPF 框架开发大佬们就定义了 NamedObject 对象。如名字一样,这个类型仅仅只是一个带命名的 object 对象而已。但一个带命名的 object 对象就相当于给代码加上了单位,可以极大提升框架开发调试遇到一个空对象时了解这是由哪个模块创建的
如 NamedObject 被 DependencyProperty 使用时的例子,在 DependencyProperty 里面,如果咱有某个未定义的依赖属性,或者说在绑定或属性转换器里面失败时返回一个未定义的属性时,按照最佳实践,咱应该返回 DependencyProperty 的 UnsetValue 属性
在其他业务端或 WPF 框架内收到了一个 Object 的时候,如何可以了解到这是 DependencyProperty 的 UnsetValue 属性,而不是开发者用户在业务层自己创建的某个对象?假定咱的 DependencyProperty 的 UnsetValue 属性采用空 object 对象,那么意味着调试时需要通过 VisualStudio 的创建对象 Id 的功能,通过给 DependencyProperty 的 UnsetValue 属性创建 Id 才能通过 Id 判断对象是否相同
无疑,如果只有一次两次需要如此调试,那还可以。如果每次调试框架时都需要执行如上步骤,通过 VisualStudio 的创建对象 Id 的功能才能进行调试,那小心键盘被 WPF 框架开发者砸了
古老的 WPF 框架开发大佬们给 DependencyProperty 的 UnsetValue 属性的定义如下
public static readonly object UnsetValue = new NamedObject("DependencyProperty.UnsetValue");
此时的优势在于当我拿到一个 object 对象的时候,可以在 VisualStudio 里面快速看到此对象是一个带命名的 DependencyProperty.UnsetValue
对象,此时就可以快速了解到此对象的创建者以及业务意图
值得我学习的是,不要轻易在对外公开的传递的对象,使用 object 对象,而是给此对象一个确切的定义类型。如果可以的话,再给这个确切的定义类型附加一句用来辅助调试的话,如 "DependencyProperty.UnsetValue"
这个字符串。这样可以方便在框架层进行调试时,了解传输的对象的创建者,以及开发者的意图
当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建
dotnet 读 WPF 源代码笔记 提升调试效率的 NamedObject 类型的更多相关文章
- dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标
大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...
- dotnet 读 WPF 源代码笔记 渲染收集是如何触发
在 WPF 里面,渲染可以从架构上划分为两层.上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令.上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GF ...
- Vue学习笔记:提升开发效率和体验的常用工具
Vetur 用途: 语法高亮 标签补全,模板生成 Lint检查 格式化 vs code环境配置文件 文件-->首选项-->搜索veture(找不到需要自行安装)-->在setting ...
- DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率
前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...
- atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表
atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...
- atitit.提升开发效率---mda 软件开发方式的革命--(2)
atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...
- 读Flask源代码学习Python--config原理
读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因 莫名其妙在第一份工作中使用了从来没有接 ...
- 《深入浅出WPF》笔记——绘画与动画
<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...
- atitit.提升研发效率的利器---重型框架与类库的区别与设计原则
atitit.提升研发效率的利器---重型框架与类库的区别与设计原则 1. 框架的意义---设计的复用 1 1.1. 重型框架就是it界的重武器. 1 2. 框架 VS. 库 可视化图形化 1 2.1 ...
随机推荐
- 你是怎么理解ES6中Module的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体). 两个基本的特征:外 ...
- 记录--用 Vue 实现原神官网的角色切换效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 为了更好的了解原神角色,我模仿官网做了一个角色切换效果,在做的过程当中也总结了一些技术点. 为了让大家更好的体验,我兼容了 PC 端 ...
- 记录--组件库的 Table 组件表头表体是如何实现同步滚动?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用 Vue 3 组件库 Naive UI 的数据表格组件 DataTable 时碰到的问题,NaiveUI 的数据表格组件 Da ...
- Python 如何通过网易163邮箱自动发送邮件
一.发送邮件的前提是必须开通发件服务器获取对应授权密码. 二.对应代码如下所示 import smtplib from email.mime.text import MIMEText from ema ...
- [Java]基本数据类型与引用类型赋值的底层分析的小结
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17969159 出自[进步*于辰的博客] 目录 1.关于 ...
- KingbaseES Json 系列三:Json数据操作函数一
KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSO ...
- KingbaseES V8R3集群部署案例之---通用机无ssh环境脚本部署集群
案例说明: 在一些通用机的生产环境,不允许主机之间通过ssh通讯,或者不允许root用户建立ssh互信或登录.默认KingbaseES V8R3集群通用机环境部署需要建立数据库用户及root用户,在集 ...
- OpenHarmony将携新成果亮相HDC2022
第四届华为开发者大会 2022(Together)将于11月4日-6日在东莞召开,OpenAtom OpenHarmony(以下简称"OpenHarmony")将携新生态成果亮相 ...
- 搜索引擎优化指南:SEO关键字、长尾关键字、短尾关键字以及反向链接
内容 SEO SEO 代表"搜索引擎优化".它是一种数字营销策略,旨在提高网站或网页在搜索引擎未付费结果中的在线可见性.通常,网站在搜索结果页面中排名越高,或在搜索结果列表中显示的 ...
- 【FAQ】关于无法判断和区分用户与地图交互手势类型的解决办法
一. 问题描述 当用户通过缩放手势.平移手势.倾斜手势和旋转手势与地图交互,控制地图移动改变其可见区域时,华为地图SDK没有提供直接获取用户手势类型的API. 二. 解决方案 华为地图SDK的地图相机 ...