3

我有一个带有字符串属性的类,它实际上是几个用分隔符连接的字符串。

我想知道拥有这样的代理属性是否是一种好的形式:

public string ActualProperty
{
    get { return actualProperty; }
    set { actualProperty = value; }
}

public string[] IndividualStrings
{
    get { return ActualProperty.Split(.....); }
    set 
    { 
            // join strings from array in propval .... ;
            ActualProperty = propval;
    }
}

有没有我忽略的风险?

4

6 回答 6

2

在我看来,将两个可设置的属性链接在一起是不好的。如果这确实是您想要的,请切换到使用显式 get/set 方法而不是属性。具有不明显副作用的代码以后几乎总是会咬你。尽可能让事情简单明了。

此外,如果您有一个属性是包含子字符串的格式化字符串,那么看起来您真正想要的是该属性的单独结构/类,而不是滥用原始类型。

于 2008-09-17T20:53:25.727 回答
2

似乎数组是真实的数据,而单字符串的东西是一种方便。这很好,但我会说要注意序列化和成员克隆之类的东西,它们将获取和设置两个可写属性。

我想我会的;

  • 将数组保留为属性
  • 提供一个GetJoinedString(string seperator)方法。
  • 提供SetStrings(string joined, string seperator)orParse(string joined, string seperator)方法。

实际上,字符串中的分隔符并不是真正的类的一部分,而是一个短暂的细节。明确引用它,例如,CSV 应用程序可以传递一个逗号,而制表符分隔的应用程序可以传递一个制表符。这将使您的应用程序更易于维护。此外,它消除了为相同的实际数据使用两个 getter 和 setter 的讨厌问题。

于 2008-09-17T22:06:02.663 回答
1

定义“好”。它不应该中断(除非您未能正确保证传递给的分隔符Split()绝不允许在各个字符串本身中使用),但是如果IndividualStrings访问的频率比ActualProperty您最终解析actualProperty的频率要高得多。当然,如果反过来是真的,那么你做得很好......如果两者都被频繁调用以至于任何不必要的解析或连接都是不可接受的,那么只需存储两者并在值更改时重新解析。

于 2008-09-17T20:46:39.347 回答
1

属性旨在成为类的非常简单的成员;获取或设置属性的值应该被认为是没有明显副作用的微不足道的操作。

如果设置属性会导致分配属性以外的类的公共值发生更改,这比基本分配更重要,并且可能不再适合该属性。

“复杂”属性是危险的,因为它违背了调用者的期望。属性被解释为字段(具有副作用),但作为您希望能够分配值然后检索该值的字段。通过这种方式,调用者应该期望能够分配给多个属性并在以后再次检索它们的值。

在您的示例中,我无法为这两个属性分配值并检索它们;一个值会影响另一个值。这打破了对该物业的基本预期。如果您创建一种方法来同时为两个属性分配值并将两个属性设为只读,则更容易理解值的设置位置。

此外,顺便说一句:

从属性返回临时数组通常被认为是不好的做法。数组可能是不可变的,但它们的内容不是。这意味着您可以更改数组中将与对象一起存在的值。

例如:

YourClass i = new YourClass();
i.IndividualStrings[0] = "Hello temporary array!";

这段代码看起来像是在更改IndividualStrings属性中的值,但实际上数组是由属性创建的并且没有分配到任何地方,因此数组和更改将立即超出范围。

public string ActualProperty { get; set; }

public string[] GetIndividualStrings()
{
    return ActualProperty.Split(.....);
}

public void SetFromIndividualStrings(string[] values)
{
    // join strings from array .... ;
}
于 2010-03-06T00:03:04.187 回答
0

好吧,我会说你的“集合”是高风险的,如果有人不知道他们必须传递一个已经连接的值序列,或者你上面的例子可能错过了这一点。如果字符串已经包含分隔符怎么办 - 你会打破。

我确信性能不是很好,具体取决于使用此属性的频率。

于 2008-09-17T20:46:08.300 回答
0

我不确定这种设计的好处是什么。我认为拆分在扩展方法中会更好。

至少,我会删除 IndividualStrings 属性上的设置器,或者将其移动到两种方法中:string[] SplitActualProperty() 和 void MergeToActualProperty(string[] 部分)。

于 2008-09-17T20:47:46.037 回答