“代理属性”是不是很好的风格?

时间:2008-09-17 20:43:08

标签: c# coding-style properties

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

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

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;
    }
}

我有没有被忽视的风险?

6 个答案:

答案 0 :(得分:2)

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

此外,如果您的属性是包含子字符串的格式化字符串,那么您真正想要的是该属性的单独结构/类,而不是滥用基本类型。

答案 1 :(得分:2)

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

我想我会;

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

实际上,字符串中的分隔符并不是该类的一部分,而是一个短暂的细节。明确地引用它,因此,例如,CSV应用程序可以传递逗号,其中制表符分隔的应用程序可以传递选项卡。它会让您的应用更容易维护。此外,它消除了为同一实际数据提供两个getter和setter的令人讨厌的问题。

答案 2 :(得分:1)

定义“好”。它不应该中断(除非你没有正确保证传递给Split()的分隔符永远不允许在单个字符串本身中),但如果IndividualStrings的访问频率高于{{1}你最终会比你应该更频繁地解析ActualProperty。当然,如果反之亦然,那么你表现得很好......如果两者都经常被调用以至于任何不必要的解析或连接都是不可接受的,那么只需存储两者并在值改变时重新解析。

答案 3 :(得分: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 .... ;
}

答案 4 :(得分:0)

好吧,我说你的“套装”是高风险,如果有人不知道他们必须通过已经加入的一系列价值观,或者上面的例子可能会遗漏。如果字符串已包含分隔符,那么该怎么办 - 你要破坏。

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

答案 5 :(得分:0)

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

我至少会删除IndividualStrings属性上的setter,或将其移动到两个方法中:string [] SplitActualProperty()和void MergeToActualProperty(string [] parts)。