为什么是静态的?和“;this"扩展方法所需要的,以及如何分配它们的内存

本文关键字:何分配 内存 分配 静态 this 为什么 方法 扩展 quot | 更新日期: 2023-09-27 17:51:21

关于扩展方法的几个问题:

  1. 为什么扩展方法是静态的?

  2. 为什么它们需要在静态类中声明?

  3. 这个关键字在扩展方法的参数列表中表示什么?因为它是一个静态类,"this"关键字在这种情况下如何工作?

  4. 这些类型的方法是如何分配内存的?

为什么是静态的?和“;this"扩展方法所需要的,以及如何分配它们的内存

静态方法和非静态方法的唯一区别是非静态方法接收隐式参数this。扩展方法不能在声明该方法的对象的上下文中调用,因此无法向它们传递this引用,因此它们必须是静态的。

你不能在扩展方法中使用关键字this,我希望这回答了你的第三个问题。参数列表中的this关键字仅用于指示此方法扩展的类型。

你对内存分配的问题是什么?扩展方法就像其他静态方法一样,只是调用语法不同。

为什么扩展方法是静态的?

因为不能修改类来添加实例方法。这些都是语法糖,使调用这些方法更好,仅此而已。

为什么它们需要在静态类中声明?

因为我们不打算创建类的实例。这是一个设计决策。为什么要把一些类的实例复杂化,这些类的实例附加了扩展方法,甚至可能无法使用?

this关键字在扩展方法的参数列表中表示什么?因为它是一个静态类,"this"关键字在这种情况下如何工作?

这是一个静态方法。this在此上下文中没有任何意义。签名中的this只是表示正在声明扩展方法的一种方式。

如何为这些类型的方法分配内存?

对这个感到困惑。它们都是静态类上的静态方法。它们像其他(静态)方法一样被"分配",只有一个类型的代码副本。

  1. 我认为这是为了限制可能的错误数量,如果它被声明在非静态类

  2. 它说它的扩展方法。编译器看到了这一点,并允许在声明为this的类型上使用它,而不是作为静态方法使用。

  3. 扩展方法调用只是语法糖。此调用在IL中被转换为普通的静态方法调用。

1,2和4的答案几乎是一样的。扩展方法只是一些特殊语法糖的静态方法。:

public static void DoIt(this string str) {
    // ..
}
"test".DoIt();

实际上与

相同
public static void DoIt(string str) {
    // ..
}
DoIt("test");

前一种方法更容易提供智能感知支持。类必须是静态的限制可能只是一个设计决策,或者可能与性能有关。

第三个问题的答案是,这只是语言设计者选择的语法。c#开发人员习惯于使用this来引用实例对象。他们可以将其命名为blah,但它不会像实例对象那样明显。

在扩展方法中使用this关键字也告诉c#编译器用ExtensionAttribute标记它。程序集的使用者使用此属性查找扩展方法。

这就是它们的定义方式—这个关键字在第一个参数之前,该参数是要调用该方法的对象的实例。为什么ToString()被称为ToString()?为什么static用于static?为什么草是绿色的?我猜他决定在第一个参数前面放一个this,而不是在方法名前面放一个新的关键字"extension"。

编译器生成的

il将代码转换为对静态方法的调用,尽管语法可能看起来像对实例方法的调用。但它不是,它是静态的,它不能访问对象的私有成员。