惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - bartholomew

new作为修饰符时的使用,以及接口的显式实现 关键词:应用程序扩展,通配符应用程序映射 Silverlight 2 Beta 1在Firefox下显示时的一点小问题~ Visual Studio也有调试禁区?! 关于SQL Server 2005的版本号 使用动态SQL的一点小技巧 通过本地IIS SMTP服务器发送邮件时提示“邮箱不可用”的解决办法 使用System.Net.Mail.SmtpClient发送邮件时出现的乱码问题 写代码的心情 在XP上安装SQL Server 2000、Visual studio .net 2003、Visual studio 2005、SQL Server 2005…… XPS M1210到了~~~~ 在dell的网上订购了XPS M1210,耐心等待中…… 关于邮件群发 关于Dotnet中的线程池 Dotnet中强行关闭多线程应用程序的所有线程 工作之余,自省~ 创建某控件的线程之外的其他线程试图调用该控件引发的问题 古怪的ConfigurationManager类 多线程编程中Join与WaitOne的区别
对PropertyGrid控件中PropertyValueChanged事件的探讨
bartholomew · 2006-11-03 · via 博客园 - bartholomew

PropertyGrid控件的PropertyValueChanged事件看似很简单,就是属性值被更改时触发该事件。

但是在做一些较复杂的应用时我发现一个问题,如果某个属性项的数据类型为引用类型,比如说是一个自定义的类,那么编译器是如何判断这个项是否更改了呢?

起初,我想当然的认为编译器是用Equals函数来判断的,Equals函数的默认实现仅支持引用相等,但我们在这里显然要求的是值相等,就是说要判断引用类型的实例的各项公有属性的值是否都相等。按照这个思路,我在我的自定义类型里重写了Equals函数。

然而,在后面的调试中我发现编译器还是没有按照我写的Equals函数的实现去判断这个属性项的值是否改变,那么,到底是怎么回事呢?

我把目光投向了PropertyValueChanged事件的具体实现,通过利用Reflector跟踪代码发现,编译器在这一步进行判断时用的是!=,而!=操作符是静态实现的,这样的话,对!=操作符不管怎样重写都没用,因为最终编译器在这一步调用的都是object类型的!=,也就相当于Equals函数的默认实现~~~~~~

到这里,我悲哀的发现,我只有认命了,不知道是不是因为MS的程序员在编写这部分代码时偷了懒还是怎么的,竟然用的是静态的!=而不是可以重写的Equals,也许因为!=比较好写吧,但也就让我等没有了可以扩展的空间……

后记:放弃在自定义类型本身做手脚之后,我转而考虑在PropertyGrid控件上动脑筋,终于找到一个办法,比较笨且无奈,但实用,就是只要发现该属性项的值变了,就重新new一下,哈哈~