【发布时间】:2020-06-25 01:13:56
【问题描述】:
假设我们已经加载了一个函数F,它接收/取出一组args并返回一个result。如果这个F 不作用于args 成员和函数以外的任何东西,如何在运行时检查?意思是没有Console.Writeline,单例(或args 中没有出现的其他东西)。 CodeContracts 库或其他解决方案是否有可能?
假设我们知道[Pure] 属性出现在函数定义中。当我们有 lambda 时,这在很多情况下都很糟糕,但至少它会是一些东西
为什么我看不到 [Pure] 有什么帮助 - 这段代码可以编译:
class Test {
public struct Message {
public string Data;
}
public struct Package {
public int Size;
}
[Pure]
public static List<Package> Decomposse(Message m) {
Console.WriteLine("rrrr"); // This sould not happen
var mtu = 1400;
Package p = new Package{Size = mtu};
return Enumerable.Repeat(p, m.Data.Length / mtu).ToList();
}
}
而且我想消除(或至少检测到该函数调用像Console.WriteLine("rrrr") 这样的东西)
【问题讨论】:
-
我想您必须分析方法体 IL 以查看它是否发生了任何变化。这可能比在编译后进行代码分析更容易(不确定是否存在用于此的工具)。
-
"如何检查一个函数在运行时是否没有副作用(是纯的)?" - 非常困难......当然如果它没有装饰
[Pure]属性,但要证明它是另一回事。 -
@MichaelRandall:假设我们在该函数上有
[Pure]属性-我们如何从调用方检查? -
你能把函数加载为
Expression吗?这将更容易验证,然后编译。但仍然不是微不足道的...... -
@JeremyLakeman:我想使用expressive,但他们没有提供任何简单的方法来表达类类型......也许我最终会选择 Roslyn
标签: c# .net reflection side-effects