0

我有一个静态类“默认值”,它应该保存默认矩阵,这些矩阵被转发到最后请求的接口double[][]。到目前为止,我只是将静态属性放在返回double[][]s 的这个类中。

现在要使其符合我们公司的编码标准,代码必须符合 FxCop 的规则CA1819,这不允许我像以前那样从属性返回锯齿状数组。而不是数组,我将返回IListIEnumerable(如这里所讨论的)。

“足够公平”我想,所以我实现了返回的属性IList<IList<double>>(尽管嵌套类型也很不酷)。但是,正如我所说,我需要使用的接口最终要求double[][]矩阵。我不知道如何在不显式转换回每个 list的情况下将此列表列表转换为数组数组。当然,我可以,但这会产生大量开销,特别是因为我什至不访问这些矩阵 - 我只将它们传递给接口。

(PS:我知道,这是接口的错,但目前我们无法改变。)

编辑:我发现使用ILists<IList<double>>done 无论如何都没有帮助,因为它违反了 CA1006。我采取的让 FxCop 闭嘴的简单解决方案是将属性设置为内部。无论如何,更好的解决方案如下所述。或者,可以考虑使用索引属性,但这在 C# 中有点混乱。

4

2 回答 2

2

我建议,您创建一个Matrix<T>接受 aT[][]到其构造函数的类,并且可以将其转换为T[][]并使您的属性Defaults返回一个Matrix<double>实例。转换可以隐式、显式或使用方法实现。

于 2011-07-06T12:15:19.980 回答
0

FxCop 规则的存在是为了防止 API 的用户产生混淆,并提醒 API 作者他们是否真的想要这样做。

将数组作为属性返回可能会导致 API 使用者对内部数据结构造成严重破坏,这可能不是 API 作者的意图。

从链接的规则:

属性返回的数组不受写保护,即使该属性是只读的。为了保持数组防篡改,该属性必须返回数组的副本。通常,用户不会理解调用此类属性对性能的不利影响。具体来说,他们可能将该属性用作索引属性。

他们推荐的返回数组的方法之一是将 Xxx 属性更改为 GetXxx() 方法。

这对你来说可能吗?

于 2011-07-06T12:19:55.410 回答