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