【问题标题】:FxCop: Returning Matrix as Property (C#)FxCop:将矩阵作为属性返回 (C#)
【发布时间】:2011-07-06 12:12:46
【问题描述】:

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

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

“足够公平”我想,所以我实现了返回IList<IList<double>> 的属性(尽管嵌套类型也很不酷)。但是,正如我所说,我需要使用的接口最后要求double[][] 矩阵。我不知道如何在不显式转换回每个列表的情况下将此列表列表转换为数组数组。当然,我可以,但这会产生大量开销,尤其是因为我什至不访问这些矩阵 - 我只是将它们传递给接口。

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

编辑:我发现使用ILists<IList<double>> 无论如何都无济于事,因为它违反了CA1006。我采取的让 FxCop 闭嘴的简单解决方案是将属性设置为内部。无论如何,更好的解决方案如下所述。或者,可以考虑使用索引属性,不过这在 C# 中有点混乱。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 更好的是,创建一个 Matrix 类,然后您可以在将来将它重用于其他数据类型。
    • 是的,听起来不错。下次我必须处理该接口时,我会考虑它......并且实际上我自己对这些矩阵做一些事情 - 因为这是我目前正在实施的一件相当小的事情。 [见ageektrapped的回答中的cmets]
    【解决方案2】:

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

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

    来自链接的规则:

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

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

    这对你来说可能吗?

    【讨论】:

    • 我认为 FxCop 会抱怨您应该将 Get 更改为属性:)
    • 是的,这有点脑残,但希望人们可以忽略这种违规行为。 FxCop 不是盲目追随的。
    • 嗯,是的,可能,但我可以(非法)首先忽略 CA1819。实际上:我只是将所有默认值设置为内部,不是很漂亮,但无论如何。实际上可以通过接口本身访问默认值,因此这个 Defaults 类没有必要公开。
    • 好吧,那么我会说 FxCop 正在做它的工作。该工具的全部意义在于迫使您考虑您的公共 API。您注意到 Defaults 不应该是公开的,这对您的 API 更好,并消除了 FxCop 违规。内部是一个非常强大的概念,应该在框架中经常使用。这绝对不是“不漂亮”。 :)
    猜你喜欢
    • 2017-11-16
    • 2018-02-25
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2018-12-04
    • 2016-09-27
    • 2014-09-18
    • 2012-11-03
    相关资源
    最近更新 更多