如何解决我可以在问题中提供的示例中删除属性设置器没有任何问题吗?
| 在我的项目的现有代码中,在许多地方,该属性的声明如下:public long ResourceID
{
get
{
return this.resourceID;
}
set
{
if (this.resourceID != value)
{
this.resourceID = value;
}
}
}
注意:已经声明了“ 1”。
这样不仅声明值类型的属性,还声明引用类型(包括字符串)的属性。
另一个例子:
public Collection<Ability> Abilities
{
get
{
return this.abilities;
}
set
{
if (value == null)
{
throw new ArgumentNullException(\"Abilities\");
}
this.abilities = value;
}
}
据我所知,第一个示例中的setter没有任何意义,并且“ 3”条件在那里毫无意义。因此,我决定更改代码(作为重构的一部分),以使其具有自动属性。 (在第二个示例中,我需要使用setter,因为在那里处理了异常。)
我想从这里的专家那里知道,将现有属性设为自动属性(或至少从setter中删除3条件)是否会造成任何危害?有时,有些细微的东西是开发人员可能不知道的,并且某些更改也会产生副作用。这就是为什么我问这个问题。 (我的库在很多地方都使用过。)
注意:让我知道这是否纯粹是一个作业问题。解决方法
在某些可能会造成危害的极端情况下:
更改为自动实施的属性ѭ5
如果您在任何时候都使用基于字段的序列化(例如ѭ6,),那么在更改为自动实现的属性时,该字段将中断,因为字段名将更改。这也将影响其他任何使用反射来访问(希望是私有的)字段的方案,但是“ 6”是造成混乱的最常见原因。
删除“ 3”测试
对于大多数数据类型(例如ѭ9)等来说将是很好的选择,但是,如果将其与实现自定义相等操作的类型一起使用,则可能会发现先前(与
if
)报告的对象相等时突然交换了引用。不同的参考
第一个是更可能的问题。如果您使用的是BinaryFormatter
,请保留私有字段(然后再删除if
测试)。然后从BinaryFormatter
开始重构代码; p,正在转换:
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。
因此,使用反射来访问字段的代码可能会中断,但是如果您对代码库有控制权,那么这不太可能成为问题。,您所做的是正确的。 if语句是没有意义的。我一直认为代码越少越好,因为代码行与故障数成正比。
public long ResourceID { get; set; }
,您的第一个示例仅在value17ѭ字段的值更改时才设置它。
如果多个线程正在读取值,则删除\“ if \”测试将看到的唯一区别是可能的影响。在这种情况下,他们可能应该使用锁,因此删除测试几乎可以肯定是安全的。
第二个示例阻止调用者将属性值设置为null
。假定该字段已初始化为非null值,并且具有此值,因为它意味着调用者无需检查ѭ18without就可以读取该属性。,通常在这种情况下以及您的解释方式,这都不是问题。
您可以继续并更改所有属性的代码。
public long ResourceID { get; set; }
要么
public long ResourceID
{
get { return this.resourceID; }
set { this.resourceID = value; }
}
但这可能会导致问题
更改财产的价值,
它级联到其他风俗习惯
仅执行的函数调用
如果新值与
旧的。通常在实施自定义事件或什至发生属性更改事件时
使用时也可能会影响
数据上下文类
两种情况都是完全针对特定应用的。
我建议您谨慎对待反应堆。或者,正如您自己编写的那样,HOMEWORK。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。