首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用Roslyn检测代码中的闭包?

如何用Roslyn检测代码中的闭包?
EN

Stack Overflow用户
提问于 2015-05-18 18:26:09
回答 2查看 518关注 0票数 9

我能检测到(使用roslyn) lambda body中的x引用是外部变量x的闭包,而不是lambda本身的局部变量吗?

代码语言:javascript
复制
var x = "foo";
var a = string[0];
a.Any(i => i == x);
EN

回答 2

Stack Overflow用户

发布于 2015-05-20 03:36:15

是啊。您可以使用DataFlowAnalysis接口。

代码语言:javascript
复制
var tree = CSharpSyntaxTree.ParseText(
    @"
class C{
void M(){
    var x = ""foo"";
    var a = new string[0];
    var testing = a.Any(i => i == x);
}
} 
");
var Mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);

var lambda = tree.GetRoot().DescendantNodes().OfType<LocalDeclarationStatementSyntax>().Last();

var dataFlowAnalysis = model.AnalyzeDataFlow(lambda);
var capturedVariables = dataFlowAnalysis.Captured;

foreach(var variable in capturedVariables)
{
    //Do something
}
票数 5
EN

Stack Overflow用户

发布于 2015-05-21 10:28:56

https://github.com/mjsabby/RoslynClrHeapAllocationAnalyzer/blob/master/ClrHeapAllocationsAnalyzer/DisplayClassAllocationAnalyzer.cs#L58

(1)获取语义模型

(2)检查AnonymousMethodExpressionSyntax / SimpleLambdaExpressionSyntax / ParenthesizedLambdaExpressionSyntax

(3)将该节点传递给SemanticModel上的AnalyzeDataFlow扩展方法

(4)遍历.Captured属性

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30300753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档