我怎么知道某些扩展方法是否“改变”了对象?

时间:2014-08-27 12:55:34

标签: c# .net object extension-methods

随意修改'变异'从标题来看,如果它的措辞选择不好。

我的问题是,相对而言,简单。

采用以下示例:

myCollection.OrderBy(o => o);

我如何知道OrderBy是否会/不会订购myCollection或是否需要转让(以下):

myCollection = myCollection.OrderBy(o => o);

是否需要构建它并在每次遇到我不熟悉的扩展程序时进行检查?

请注意:我不会问这是否会影响myCollection,我已经知道了之前几百次使用它的答案,我问的是我怎么知道。

3 个答案:

答案 0 :(得分:5)

你不能仅仅签名。

您可以做的最好的事情是调查实际代码,例如查看.NET Reference Source。您可以做的另一件事是检查返回类型。如果它与它被调用的那个相同,它可能不会改变它,它很可能返回一个新实例。它是void,它可能会改变内部的东西。

例如,对于您的具体情况,OrderBy:不。见here。它只是'返回new OrderedEnumerable

答案 1 :(得分:2)

一种方法是确定方法或其类是否标记为[Pure]。纯代码不会修改输入值。

答案 2 :(得分:2)

你可以像Steven Liekens所说的那样检查课堂装饰中的Pure属性。但在缺席的情况下,唯一可以确定的方法是:

  • 试验:例如,获取该类的实例并对其进行序列化。使用该方法,然后序列化它。比较结果。可能每次都不准确。

  • 逆向工程方法,希望您拥有源代码。如果你不这样做,你可以使用反射。如果方法有点复杂,这将需要一些判断,但这里的复杂性是主观的。

  • 阅读文档并信任他们 - 如果文档存在。对于.NET Framework类型来说,这是明智的做法,否则就是信仰的运用。