2015-05-18 19 views
9

Lambda gövdesindeki x referansının, bir değişken yerelden lambda'nın kendisine değil, x dış değişkeninin kapanmasına neden olduğunu tespit edebilir miyim (roslyn kullanarak)?Roslyn ile koddaki kapatmalar nasıl algılanır?

var x = "foo"; 
var a = string[0]; 
a.Any(i => i == x); 
+3

fazla 'bir serbest/çekilen değişken olması halinde x' bazı kapak sınıfının bir alan olacaktır. – leppie

+3

[RoslynClrHeapAllocationAnalyzer] 'a bir göz atın (https://github.com/mjsabby/RoslynClrHeapAllocationAnalyzer). Bellek ayırmalarını ve kapanışları analiz eder. –

+1

@YuvalItzchakov bağlantı için teşekkürler, ben şimdi "SemanticModel" dan alabildiğim 'DataFlowAnalysis 'nesnesinin' Yakalanan 'özelliği kontrol etmek gerekiyor açık olduğunu açık. – Seldon

cevap

4

Yup. DataFlowAnalysis API'sini kullanabilirsiniz.

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 
} 
İlgili konular