Attribute.IsDefaultAttribute调用时机及错误实现的问题验证方法
自定义Attribute中IsDefaultAttribute错误实现的问题分析
错误实现代码
public override bool IsDefaultAttribute() { return this.restricted = false; }
正确实现代码
public override bool IsDefaultAttribute() { return this.Restricted == true; }
错误实现引发功能问题的场景
这个错误的核心是把比较操作写成了赋值操作,会带来两个关键问题:
- 强制篡改属性状态:不管当前实例的
restricted字段原本是什么值,调用IsDefaultAttribute()后都会被强制设为false,直接改变了Attribute实例的原始状态,导致后续对该实例的所有判断都基于被修改后的值。 - 返回错误的默认状态判断结果:
IsDefaultAttribute()的设计目的是告诉.NET框架,当前Attribute实例是否属于「默认实例」(即和无参数构造函数创建的实例状态一致)。错误实现永远返回false(因为赋值表达式this.restricted = false的结果就是false),会导致以下场景出问题:- 使用
Attribute.IsDefined检查类型/成员是否应用了非默认Attribute时,框架会误判所有实例为非默认; - 序列化/持久化Attribute时,原本的默认状态会被错误修改,导致数据不一致;
- 自定义逻辑依赖该方法返回值做判断时,会得到完全错误的结果,比如本该忽略默认属性的逻辑会失效。
- 使用
测试验证方案
a) 验证当前实现存在错误的测试
- 测试默认实例的状态篡改:用无参数构造函数创建Attribute实例(假设默认
Restricted为true),调用IsDefaultAttribute()后,检查Restricted属性是否变为false,同时返回值是否为false——这证明方法不仅返回错误结果,还篡改了实例状态。 - 测试非默认实例的状态篡改:创建一个
Restricted设为true的Attribute实例,调用IsDefaultAttribute()后,检查Restricted是否被改为false,返回值是否为false——正确逻辑下此时应该返回true,以此证明实现错误。 - 测试返回值逻辑错误:创建
Restricted设为false的实例,调用方法后返回false(和正确结果一致),但再把Restricted改回true后调用方法,依然返回false且Restricted被改回false——证明方法的返回逻辑完全错误,不是基于当前状态的判断。
b) 验证修改后代码修复问题的测试
- 测试默认实例的判断正确性:用无参数构造函数创建默认实例(
Restricted为true),调用IsDefaultAttribute()返回true,且Restricted属性值保持true不变。 - 测试不同状态实例的判断正确性:创建
Restricted为true的实例,调用方法返回true;创建Restricted为false的实例,调用方法返回false,且两种情况下实例的Restricted属性值都不会被修改。 - 测试框架API的交互正确性:在某个类/方法上应用该Attribute的默认实例,使用
Attribute.GetCustomAttribute获取实例后,调用IsDefaultAttribute()返回true,且实例状态未被篡改,验证.NET框架能正确识别默认属性状态。
内容的提问来源于stack exchange,提问作者ClickRick
相关产品推荐
相关产品推荐

