2014-08-27 59 views
2

如果这是一个糟糕的措辞选择,可以从标题中随意编辑'mutate'。我如何知道某些扩展方法是否会“突变”对象?

我的问题相对简单。

看看下面的例子:

myCollection.OrderBy(o => o); 

如何知道自己是否OrderBy会/不会为了myCollection还是分配(以下)是必要的:

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

是它的情况下,每次遇到我不熟悉的扩展时,必须构建它并进行检查?

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

+3

查看反射器或类似的参考源(如果可用)中的实现。 – leppie 2014-08-27 12:58:21

+0

此问题不是特定于扩展方法。而且,“如果你给方法一个参考,......”。 “ – 2014-08-27 23:04:54

回答

2

Steven Liekens说,你可以在课堂装修中检查纯属性。但在它的缺席,要知道唯一的办法肯定是:

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

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

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

2

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

+1

”此属性不由当前的分析工具强制执行;只有在确定方法是纯粹的情况下,才应使用此属性。“ – jltrem 2014-08-27 13:04:05

+0

假设最初的开发者完全是这样做的,你可以相信这个方法是纯粹的,否则,最好是提交一个错误报告 – 2014-08-27 13:08:15

5

你不能从签名中知道。

您可以做的最好的方法是调查实际代码,例如通过查看.NET Reference Source。你可以做的另一件事是检查返回类型。如果它与被调用的相同,它可能可能不会更改它,它最有可能返回一个新的实例。它是一个void,那么它可能会改变里面的东西。

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

+0

+1。顺便说一句,OP说他已经知道这个具体案例的答案 - 我认为他想要的东西,他可以用在所有其他案件。 – Renan 2014-08-27 13:06:10

+0

@Ranan:谢谢,这只是一个样本。 – 2014-08-27 13:08:28

相关问题