我之前遇到过这个 FxCop 规则,并且对如何解决违规问题并不满意(thread1 https://stackoverflow.com/questions/3324053/why-properties-that-return-arrays-are-prone-to-code-inefficiencies, thread2 https://stackoverflow.com/questions/6596166/fxcop-returning-matrix-as-property-c)。我现在还有另一个案例需要纠正违反规定的行为CA1819 http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28PROPERTIESSHOULDNOTRETURNARRAYS%29; kind.
具体来说,我有一个算法库,可以对曲线 (x,y) 执行一些分析计算,并具有如下公共“输入对象”:
public class InputObject
{
public double[] X { get; set; }
public double[] Y { get; set; }
// + lots of other things well
}
该对象的 X 和 Y 属性在库内的数百个位置使用,通常使用索引。输入对象永远不会被算法改变,但实际上如果是这样也没关系。还,.Length
被频繁调用。这是一个数学图书馆,并且double[]
是其中的一种标准数据类型。无论如何,修复 CA1819 需要做相当多的工作。
我想过使用List<double>
,因为列表支持索引并且与数组非常相似,但我不确定这是否会减慢算法速度,或者 FxCop 是否会对这些列表感到满意。
替代这些的最佳选择是什么double[]
特性?
如果它对外部消费者是只读的,并且消费者不想通过索引访问它,那么最好是拥有类型的公共只读属性IEnumerable<>
使用方法访问器来添加和删除,这样您就不必将数组暴露给其他人来乱搞。
如果您需要访问索引器,请将其公开为类型的只读属性IList<>
并可能返回一个 ReadOnly 实例,其中包含添加和删除的方法。
通过这种方式,您可以保留内部列表的封装并允许消费者以只读方式访问它
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)