为什么我的外部 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"吗?

为什么我的外部 C# 函数的参数列表中有一个“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关键字。但是,如果要将静态方法转换为扩展方法,则必须:

  1. this 关键字添加到签名
  2. 将方法放入非嵌套public static类中
  3. 使方法的访问修饰符public

Scott Hanselman 有一篇很好的文章,介绍了语法的选择,以及它如何适应现有的 CLR,而对编译器的更改最少。

总之,他得出结论,编译后,静态方法生成的IL代码与扩展方法的代码之间没有区别。this关键字用于指示编译器在扩展方法周围放置一些元数据。

我的猜测是,他们已经选择了this关键字,因为 1.it 已经存在,并且 2. 与其他现有关键字相比,其现有含义最适合扩展方法的上下文。

因为这就是

你定义"扩展"方法的方式。 它让编译器知道应该允许直接在对象上调用此特定方法,它允许您编写如下代码:

GetFormattedErrorMessage(e);

而是作为:

e.GetFormattedErrorMessage();

我不确定为什么您发布的代码以这种方式调用函数。 您应该能够直接在异常对象上调用该函数。 扩展方法本质上是扩展内置类/类型行为的方法,否则您将无法修改这些类/类型。

扩展方法 如前所述,一些链接:

  • 扩展方法 (MSDN)
  • 如何:实现和调用自定义扩展方法(C# 编程指南)
  • 教程

加上通常来自谷歌的数十篇博客文章和其他文档。

"

this"是传递给 Exception 方法的错误,类似于在函数中使用 "this"。它只是指正在传递的异常。