C#
- 20 ответов
- 0 вопросов
10
Вклад в тег
int tmp = j;
j = j + 1;
j = temp;
IL_0006: ldloc.0 // В стек кладем значение j (оно у нас == 0)
IL_0007: dup // Дублируем в стеке значение j
IL_0008: ldc.i4.1 // Кладем второй аргумент инкремента (он == 1)
IL_0009: add // Складываем два верних значения, результат кладем в стек
IL_000a: stloc.0 // Сохраняем в j результат сложения
IL_000b: stloc.0 // Сохраняем в j 0, который получился при dup
class Program {
static void Main(string[] args) {
SyntaxTree tree = SyntaxTree.ParseText(
@"using System;
namespace HelloWorld {
class Program {
static void Main(string[] args) {
var i = 10 * 20;
String s = t.ToString();
}
}
}");
var comp = Compilation.Create("HelloWorld")
.AddReferences(MetadataReference.CreateAssemblyReference("mscorlib"))
.AddSyntaxTrees(tree);
var model = comp.GetSemanticModel(tree);
new Walker(model).Visit(tree.GetRoot());
Console.ReadKey();
}
class Walker : SyntaxWalker {
private readonly SemanticModel model;
public Walker(SemanticModel model) : base() {
this.model = model;
}
public override void VisitVariableDeclarator(VariableDeclaratorSyntax node) {
var declaredSymbol = (LocalSymbol) model.GetDeclaredSymbol(node);
Console.WriteLine("{0} {1} {2}", declaredSymbol.Type, declaredSymbol.Name, node.Initializer.GetText());
}
}