0

我正在尝试创建一个包装并与第三方 C API 接口的 .NET API。因此,API 的语义如下:

有一个属性表示二进制文件中的字符串列表。具有零条目列表的此属性之间存在区别,在这种情况下,该属性将被写入具有空列表的文件;并且该列表被完全省略,在这种情况下,该属性将从文件中省略。

在我目前的设计中,我正在使用这样的东西:

public class InfoWrapper
{
    // Use an IList<T> to avoid running afoul of FxCop
    // rule CA1002: Do not expose generic lists.
    public IList<string> ItemsContainer { get; set; }
}

当然,这可以解决问题,让我能够区分“未设置”和“空列表”情况,但真正的问题是它触发了另一个 FxCop 警告 CA2227: Collection properties should be read only。我需要能够允许用户将属性设置为一个null值,如果他们在将其设置为null. DeleteItemsContainer()我可以使用一对方法(例如和)将属性设为只读CreateNewItemsContainer(),但实际上,我需要以相同的方式处理其中的几个属性。为每个属性添加两个方法会使 API 相当混乱。这里有什么更好的方法?

注意我意识到我可以取消 FxCop 警告并完成它,而这些规则只是一组建议。但是,如果可能的话,我希望遵守这些准则。

4

2 回答 2

1

我认为您混淆(或询问)两个问题:返回null与空集合,以及有一个触发 FxCop 警告的公共设置器。null无论类型是Listor ,您都可以返回IList,因此没有问题。

如果您想避免有关公共设置器的 FxCop 警告,您需要将设置器设为私有并提供另一种设置该属性值的方法。您可以IList通过 的构造函数传递一个InfoWrapper,或者如果有意义,只需在构造函数中创建列表并在构造后将所有项目添加到其中。

于 2012-10-30T23:14:53.530 回答
0

首先,该属性必须是只读的,即没有设置器。但即便如此,您也会收到另一个 FxCop 警告,因为用户仍然可以修改集合。

摆脱 FxCop 警告的一种干净方法是将属性的定义从返回 anIList<T>更改为返回IEnumerable<T>.

像这样:

public IEnumerable<string> StringList { get; set; }

如果您可以在没有Count索引器等属性的情况下生活,那么使用IEnumerable有助于确保类用户不会弄乱列表内容。

(顺便说一下,在命名属性时,不推荐使用“String”或“List”一词。“String”不表示属性的语义,“List”暴露了应该封装的集合类型)

于 2012-10-30T23:25:32.323 回答