我有一个静态类"Defaults",它将保存默认矩阵,这些矩阵将转发到最终要求double[][]
的接口。到目前为止,我只是将返回double[][]
s.的静态属性放在这个类中
现在,为了使其符合我们公司的编码标准,代码必须符合FxCop的规则CA1819,该规则不允许我像以前那样从属性返回锯齿状数组。而不是数组,我将返回IList
或IEnumerable
(如这里所讨论的(。
我认为"很公平",所以我实现了返回IList<IList<double>>
的属性(尽管嵌套类型也不酷(。然而,正如我所说,我需要使用的接口最终需要double[][]
矩阵。。我不知道如何在不显式转换回每个列表的情况下将列表列表列表转换为数组。当然,我可以,但这会产生大量的开销,尤其是因为我甚至不访问这些矩阵——我只将它们传递到接口。
(附言:我知道,这是接口的错,但目前我们无法改变。(
编辑:我发现使用ILists<IList<double>>
无论如何都没有帮助,因为它违反了CA1006。我关闭FxCop的简单解决方案是将属性设置为内部。无论如何,更好的解决方案如下所述。或者,可以考虑使用索引属性,尽管这在C#中有点混乱。
我建议您创建一个类Matrix<T>
,该类在其构造函数中接受T[][]
,并且可以转换为T[][]
,并使您在Defaults
中的属性返回一个Matrix<double>
实例。转换可以隐式、显式或使用方法来实现。
FxCop规则用于防止API用户混淆,并提醒API作者这是他们真正想要做的事情。
将数组作为属性返回可能会使API消费者对内部数据结构造成严重破坏,这可能不是API作者的意图。
来自链接的规则:
属性返回的数组不受写保护,即使该属性是只读的。若要保持数组不可篡改,属性必须返回数组的副本。通常情况下,用户不会理解调用此类属性对性能的不利影响。具体来说,他们可能会将该属性用作索引属性。
他们建议返回数组的方法之一是将Xxx属性更改为GetXxx((方法。
这对你来说可能吗?