c#中的动作委托

本文关键字: | 更新日期: 2023-09-27 18:17:30

我很难理解c#中的Action委托

我看过这个问题,我理解那里的例子,但在我正在研究的代码库中,它的使用方式我不太明白。这是使用动作委托的方法:

public static string RenderTemplate<T>(string templatePath, T data)
{
    string result = null;
    ExecuteRazorMethod(() =>
    {
         result = Razor.Run(data, templatePath);
    });
    return result;
}

调用ExecuteRazorMethod()将调用以下方法:

private static void ExecuteRazorMethod(Action a)
{
    try
    {
        a();
    }
   .
   .
   .//irrelevant code
   .
}

我不明白当a()被执行时会发生什么。调用什么方法?我试过调试它,a传递到方法的值是:Void <RenderTemplate> b__5

我不明白。我需要知道RenderTemplate中的两个参数实际发生了什么,但不了解a()执行的内容/位置使其很难。也许是我不明白匿名类型的原因?

c#中的动作委托

aExecuteRazorMethod中执行时,它执行的正是您作为a传递给ExecuteRazorMethod的委托。尝试在这段代码中的result = Razor.Run(data, templatePath);行切换断点:

ExecuteRazorMethod(() =>
{
     result = Razor.Run(data, templatePath);
});

您将看到,当a开始执行时,您的断点将到达

该代码将被编译成或多或少与此类似的东西,我希望它现在变得清楚:

[CompilerGenerated]
internal class Closure<T>
{
    public string Result {get; private set;}
    private readonly string _templatePath;
    private readonly T _data;
    public Closure(string templatePath, T data)
    {
      _templatePath = templatePath;
      _data = data;
    }
    public void DelegateMethod()
    {
      Result = Razor.Run(_data, _templatePath);
    }
}
public static string RenderTemplate<T>(string templatePath, T data)
{
    Closure<T> closure = new Closure<T>(templatePath, data);   
    ExecuteRazorMethod(closure);
    return closure.Result;
}
private static void ExecuteRazorMethod<T>(Closure<T> closure)
{
    try
    {
        closure.DelegateMethod();
    }
   .
   .
   .//irrelevant code
   .
}

编译器实际上是从

{ result = Razor.Run(data, templatePath); }

部分。这就是Void <RenderTemplate> b__5方法。记住,匿名类型和方法是编译器的魔法(或者是语法糖,如果你喜欢的话),即c#特性,而不是CLR特性。编译器必须把它们翻译成CLR能理解的东西。

创建委托时,它捕获数据和templatePath变量,以便在执行时可以访问它们。这部分通常称为闭包。

相关文章:
  • 没有找到相关文章