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()
执行的内容/位置使其很难。也许是我不明白匿名类型的原因?
当a
在ExecuteRazorMethod
中执行时,它执行的正是您作为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变量,以便在执行时可以访问它们。这部分通常称为闭包。