我可以在问题中提供的示例中删除属性设置器(没有任何问题)吗?

| 在我的项目的现有代码中,在许多地方,该属性的声明如下:
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。

要回复问题请先登录注册