为什么我的外部 C# 函数的参数列表中有一个“this”
本文关键字:有一个 this 列表 参数 外部 我的 函数 为什么 | 更新日期: 2023-09-27 18:35:21
我的代码在操作方法中具有以下内容:
catch (Exception e)
{
log(e);
return Content(ExceptionExtensions.GetFormattedErrorMessage(e));
}
调用的函数如下所示:
public static class ExceptionExtensions
{
public static string GetFormattedErrorMessage(this Exception e)
if (e == null)
{
throw new ArgumentNullException("e");
}
有人可以解释为什么参数列表的开头有一个"this"吗?
这是扩展方法的签名。它们在 中介绍。NET3.5(C#3)。如果没有this
编译器会将其作为静态方法签名。在以下代码中:
public class Foo
{
public void FooBar()
{
}
}
public static class FooEx
{
public static void Bar(this Foo f)
{
f.FooBar();
}
public static void StaticBar(Foo f)
{
f.FooBar();
}
}
您可以像这样调用静态方法:
FooEx.StaticBar(new Foo());
扩展方法如下:
new Foo().Bar();
以及作为静态方法的扩展方法:
FooBar.Bar(new Foo());
因此,要将扩展方法转换为静态方法,您所要做的就是从签名中删除this
关键字。但是,如果要将静态方法转换为扩展方法,则必须:
- 将
this
关键字添加到签名 - 将方法放入非嵌套
public static
类中 - 使方法的访问修饰符
public
Scott Hanselman 有一篇很好的文章,介绍了语法的选择,以及它如何适应现有的 CLR,而对编译器的更改最少。
总之,他得出结论,编译后,静态方法生成的IL代码与扩展方法的代码之间没有区别。this
关键字用于指示编译器在扩展方法周围放置一些元数据。
我的猜测是,他们已经选择了this
关键字,因为 1.it 已经存在,并且 2. 与其他现有关键字相比,其现有含义最适合扩展方法的上下文。
因为这就是
你定义"扩展"方法的方式。 它让编译器知道应该允许直接在对象上调用此特定方法,它允许您编写如下代码:
GetFormattedErrorMessage(e);
而是作为:
e.GetFormattedErrorMessage();
我不确定为什么您发布的代码以这种方式调用函数。 您应该能够直接在异常对象上调用该函数。 扩展方法本质上是扩展内置类/类型行为的方法,否则您将无法修改这些类/类型。
扩展方法 如前所述,一些链接:
- 扩展方法 (MSDN)
- 如何:实现和调用自定义扩展方法(C# 编程指南)
- 教程
加上通常来自谷歌的数十篇博客文章和其他文档。
"
this"是传递给 Exception 方法的错误,类似于在函数中使用 "this"。它只是指正在传递的异常。