我可以在问题中提供的示例中删除属性设置器(没有任何问题)
本文关键字:问题 设置 任何 属性 我可以 删除 | 更新日期: 2023-09-27 17:50:33
在我的项目的现有代码中,在一些地方的属性是这样声明的:
public long ResourceID
{
get
{
return this.resourceID;
}
set
{
if (this.resourceID != value)
{
this.resourceID = value;
}
}
}
注意:private long resourceID
已经被声明。
不仅值类型的属性,引用类型(包括string)的属性也是这样声明的。
另一个例子:
public Collection<Ability> Abilities
{
get
{
return this.abilities;
}
set
{
if (value == null)
{
throw new ArgumentNullException("Abilities");
}
this.abilities = value;
}
}
据我所知,第一个例子中的setter没有任何意义,if
条件也没有意义。所以我决定改变代码(作为重构的一部分),使它们成为Auto-Properties。(在第二个例子中,我需要setter,因为那里处理了异常。)
我想从这里的专家那里知道,是否会使现有的属性自动属性(或至少从setter中删除if
条件)造成任何伤害?有时候有些微妙的事情是开发者可能没有意识到的,有些改变也会产生副作用。这就是我问这个问题的原因。(我的图书馆在很多地方使用。)
注意:如果这纯粹是一个家庭作业问题,请告诉我。
转换:
private long resourceID;
public long ResourceID
{
get
{
return this.resourceID;
}
set
{
this.resourceID = value;
}
}
为:
public long ResourceID { get; set; }
不会造成任何伤害,保证。
删除if语句可能会造成伤害。例如,在WPF中,当使用MVVM模式并实现INotifyPropertyChanged接口时,在实际设置值之前检查值是否发生了变化通常是一种好做法。删除此检查将触发通知发送到UI,无论值是否更改。所以这将是一个突破性的变化。
我只能想到一种你可能遇到的问题(而且是可以解决的):
如果您使用ORM或其他外部工具,它们可能依赖于命名约定来查找属性/字段。因此,第三方dll可能正在寻找一个不再存在的resourceId字段。
因此,使用反射来访问字段的代码可能会中断,但如果您可以控制代码库,那就不太可能成为问题。
在一些边缘情况下这可能会造成伤害:
更改为自动实现的属性{get;set;}
如果您在任何地方使用基于字段的序列化(例如,BinaryFormatter
),那么当更改为自动实现的属性时,这将中断,因为字段名称将更改。这也会影响使用反射访问(希望是私有的)字段的任何其他场景,但BinaryFormatter
是这里最常见的混乱原因。
删除if
测试
对于大多数数据类型(如long
等)都很好,但是,如果您将它与实现自定义相等操作的类型一起使用,您可能会发现,当之前(与if
)对象报告为不同引用
第一个问题更可能出现。如果您使用BinaryFormatter
,那么保留私有字段(可能会删除if
测试)。然后开始重构你的代码,远离BinaryFormatter
;p
你所做的是正确的。if语句没有意义。我一直认为代码越少越好,因为代码的行数与错误的数量成正比。
public long ResourceID { get; set; }
您的第一个示例仅在resourceID
字段的值发生更改时设置该字段。
删除"if"测试的唯一区别是,如果多个线程正在读取该值,可能会产生影响。在这种情况下,他们可能应该使用锁,所以删除测试几乎肯定是安全的。
第二个示例阻止调用者将属性值设置为null
。假设该字段被初始化为非空值,这意味着调用者可以读取属性而无需检查null
。
通常在这种情况下,以及您如何解释,它不应该是一个问题。你可以直接改变所有属性的代码;
public long ResourceID { get; set; }
或
public long ResourceID
{
get { return this.resourceID; }
set { this.resourceID = value; }
}
- 但是它可能会引起问题更改属性的值,它与其他一些习俗相连只被执行的函数调用如果新值不等于旧的。通常当你实现自定义事件或者甚至在属性改变事件的情况下
- 也可能会影响,使用时期的数据上下文之后类
这两种情况完全是特定于应用程序的。
我建议你反应要小心。或者像你自己写的那样,家庭作业