FxCop:将矩阵作为属性返回(C#)

时间:2011-07-06 12:12:46

标签: c# multidimensional-array fxcop nested-lists

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

的类中

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

“足够公平”我想,所以我实现了属性以返回IList<IList<double>>(尽管嵌套类型也是非冷却的)。但是,正如我所说,我需要处理的接口最终要求double[][]矩阵。我不知道如何将这个列表列表放入数组而不显式转换回来每个清单。当然,我可以,但这会产生大量的开销,特别是因为我甚至不访问那些矩阵 - 我只将它们传递给接口。

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

FxCop规则可以防止API用户的混淆,并提醒API作者是否真的想要这样做。

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

来自链接的规则:

  

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

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

这可能吗?