为什么是静态的?和“;this"扩展方法所需要的,以及如何分配它们的内存
本文关键字:何分配 内存 分配 静态 this 为什么 方法 扩展 quot | 更新日期: 2023-09-27 17:51:21
关于扩展方法的几个问题:
-
为什么扩展方法是静态的?
-
为什么它们需要在静态类中声明?
-
这个关键字在扩展方法的参数列表中表示什么?因为它是一个静态类,"this"关键字在这种情况下如何工作?
-
这些类型的方法是如何分配内存的?
静态方法和非静态方法的唯一区别是非静态方法接收隐式参数this
。扩展方法不能在声明该方法的对象的上下文中调用,因此无法向它们传递this
引用,因此它们必须是静态的。
你不能在扩展方法中使用关键字this
,我希望这回答了你的第三个问题。参数列表中的this
关键字仅用于指示此方法扩展的类型。
你对内存分配的问题是什么?扩展方法就像其他静态方法一样,只是调用语法不同。
为什么扩展方法是静态的?
因为不能修改类来添加实例方法。这些都是语法糖,使调用这些方法更好,仅此而已。
为什么它们需要在静态类中声明?
因为我们不打算创建类的实例。这是一个设计决策。为什么要把一些类的实例复杂化,这些类的实例附加了扩展方法,甚至可能无法使用?
this关键字在扩展方法的参数列表中表示什么?因为它是一个静态类,"this"关键字在这种情况下如何工作?
这是一个静态方法。this
在此上下文中没有任何意义。签名中的this
只是表示正在声明扩展方法的一种方式。
如何为这些类型的方法分配内存?
对这个感到困惑。它们都是静态类上的静态方法。它们像其他(静态)方法一样被"分配",只有一个类型的代码副本。
-
我认为这是为了限制可能的错误数量,如果它被声明在非静态类
-
它说它的扩展方法。编译器看到了这一点,并允许在声明为this的类型上使用它,而不是作为静态方法使用。
-
扩展方法调用只是语法糖。此调用在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将代码转换为对静态方法的调用,尽管语法可能看起来像对实例方法的调用。但它不是,它是静态的,它不能访问对象的私有成员。