本文来聊聊 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 类型的更多相关文章

  1. dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标

    大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...

  2. dotnet 读 WPF 源代码笔记 渲染收集是如何触发

    在 WPF 里面,渲染可以从架构上划分为两层.上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令.上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GF ...

  3. Vue学习笔记:提升开发效率和体验的常用工具

    Vetur 用途: 语法高亮 标签补全,模板生成 Lint检查 格式化 vs code环境配置文件 文件-->首选项-->搜索veture(找不到需要自行安装)-->在setting ...

  4. DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率

    前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...

  5. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

  6. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...

  7. atitit.提升开发效率---mda 软件开发方式的革命--(2)

    atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...

  8. 读Flask源代码学习Python--config原理

    读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因   莫名其妙在第一份工作中使用了从来没有接 ...

  9. 《深入浅出WPF》笔记——绘画与动画

    <深入浅出WPF>笔记——绘画与动画   本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...

  10. atitit.提升研发效率的利器---重型框架与类库的区别与设计原则

    atitit.提升研发效率的利器---重型框架与类库的区别与设计原则 1. 框架的意义---设计的复用 1 1.1. 重型框架就是it界的重武器. 1 2. 框架 VS. 库 可视化图形化 1 2.1 ...

随机推荐

  1. selenium 自动化常用操作

    from selenium import webdriver from selenium.webdriver.common.keys import Keys import random import ...

  2. C#文件加密解密

    加密后内容 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...

  3. C# Image 图片缩放 截取

    从大图中截取一部分图片 /// <summary> /// 从大图中截取一部分图片 /// </summary> /// <param name="fromIm ...

  4. 基于quartus的高级时序分析

    基于quartus的高级时序分析 一.派生时钟和异步存储器 派生时钟就是和独立时钟存在频率或者相位关系的时钟,异步存储器就是具有存储读写异步功能的存储器.在时序分析中,这两个部分的静态时序分析是需要设 ...

  5. archlinux virtualbox 启用usb支持

    参照 https://linux.cn/article-15287-1.html 1.安装virtualbox扩展包 (1)从archlinuxcn社区库安装 sudo pacman -S virtu ...

  6. #树形dp,树链剖分#CF442D Adam and Tree

    题目 初始有一个点 1,每次新加入点 \(2\sim n+1\),给这条边染上新的颜色, 并且一种颜色只能出现在一条路径上,使得每个点到根节点的路径上颜色种类数尽量少 每次询问输出每个点到根节点路径上 ...

  7. HarmonyOS账号服务,畅行鸿蒙生态所有应用与服务

    账号对于用户来说并不陌生,在购买新设备或者使用新应用的时候,用户常常会被引导注册或者登录账号,账号就是用户在这些设备或应用内的通行证.根据华为上半年的一项统计,整体上中国网民人均下载App量在68个, ...

  8. 报名启动丨HMS Core. Sparkle应用创新论坛

    图形领域将迎来哪些技术新进展?时下热门的3D.AR/VR和数字人等创新技术又会给应用开发带来哪些新的启发?以上问题,将在7月15日HMS Core. Sparkle应用创新论坛揭晓,赶快点击链接报名参 ...

  9. 最新CAMX-python融合技术应用与大气污染来源解析方法

    大气污染问题既是局部.当地的,也是区域的,甚至是全球的.本地的污染物排放除了对当地造成严重影响外,同时还会在动力输送作用下,极大地影响下风向地区的大气环境状况.数值模式模拟是分析大气污染物时空分布和成 ...

  10. HarmonyOS 设备管理开发:USB 服务开发指导

      基本概念 USB服务是应用访问底层的一种设备抽象概念.开发者根据提供的USB API,可以获取设备列表.控制设备访问权限.以及与连接的设备进行数据传输.控制命令传输等. 运作机制 USB服务系统包 ...