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

FxCop:返回矩阵作为属性(C#),c#,multidimensional-array,fxcop,nested-lists,C#,Multidimensional Array,Fxcop,Nested Lists,我有一个静态类“Defaults”,它将保存默认矩阵,这些矩阵被转发到一个接口,该接口最终要求double[][]。到目前为止,我只是将返回double[][]s的静态属性放在这个类中 现在,为了使其符合我们公司的编码标准,代码必须符合FxCop的规则,该规则不允许我像以前那样从属性返回锯齿数组。我将返回IList或IEnumerable(如上所述),而不是数组 我认为“足够公平”,所以我实现了返回IList的属性(尽管嵌套类型也不酷)。但是,正如我所说的,我需要使用的界面最终要求使用doubl

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

现在,为了使其符合我们公司的编码标准,代码必须符合FxCop的规则,该规则不允许我像以前那样从属性返回锯齿数组。我将返回
IList
IEnumerable
(如上所述),而不是数组

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

(注:我知道,这是界面的错,但目前我们无法改变。)


编辑:我发现使用
ILists
没有任何帮助,因为它违反了。让FxCop闭嘴的简单方法是将属性设置为内部。无论如何,更好的解决方案如下所述。另一种情况是,可以考虑使用索引属性,这在C语言中是有点混乱的。

< P>我建议,创建一个类<代码>矩阵,接受一个<代码> T[][]/COD>到它的构造函数中,并且可以转换成<代码> T[][]/COD>并使您的属性在<代码>默认值返回一个“代码>矩阵< /代码>实例。可以隐式、显式或使用方法实现转换。

FxCop规则用于防止API用户混淆,并提醒API作者他们是否真的想这样做

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

从链接的规则中:

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

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


这对你来说可能吗?

我想FxCop会抱怨你应该更改Get to a属性:)是的,这有点像脑死亡,但是你可以忽略这种违规行为,希望如此。FxCop不是盲目跟随的东西。嗯,是的,有可能,但我可以(非法)忽略CA1819。事实上:我只是把所有的默认值都设置为内部的,不漂亮,但不管怎样。人们实际上可以通过接口本身访问默认值,因此这个默认值类不必公开。那么,我想说FxCop正在完成它的工作。这个工具的全部要点是强迫你考虑你的公共API。您注意到默认值不应该是公共的,这对您的API更好,并且可以消除FxCop冲突。内部是一个非常强大的概念,应该经常在框架中使用。这绝对不是“不漂亮”。:)更好的是,创建一个矩阵类,然后您可以在将来将其重新用于其他数据类型。是的,听起来不错。下次我要处理这个接口的时候我会考虑的。。。事实上,我自己也要对这些矩阵做些事情——因为这是我目前正在实施的一件相当小的事情。[见Ageek回答中的评论]