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

本文关键字:问题 设置 任何 属性 我可以 删除 | 更新日期: 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; }
}
  • 但是它可能会引起问题更改属性的值,它与其他一些习俗相连只被执行的函数调用如果新值不等于旧的。通常当你实现自定义事件或者甚至在属性改变事件的情况下
  • 也可能会影响,使用时期的数据上下文之后类

这两种情况完全是特定于应用程序的。

我建议你反应要小心。或者像你自己写的那样,家庭作业