扩展方法在 C# 中的工作原理
本文关键字:工作 方法 扩展 | 更新日期: 2023-09-27 18:35:34
我不完全确定如何确定方法是否是扩展方法。我阅读了以下指南:
-
该方法必须位于静态类中(例如"IntExtensions")。
-
该方法必须是"公共静态的"(例如
public static int Half(this int source)
)
我对扩展方法的问题是:
- 我不明白我们怎么知道该方法正在扩展哪个类。是前面有
this
的类吗?所以在上面的例子中它会是字符串吗? - 包含该方法的静态类扮演什么角色?整个语法似乎非常混乱。
- 我不能将不同类的许多不同的扩展方法分组在同一类下(这似乎没有意义,因为我只想扩展 1 个类)例如:
/
public static class IntExtensions
{
// method has to be static, first parameter is tagged with the 'this'
// keyword, the type of the parameter is the type that is extended.
public static int Half(this int source)
{
return source / 2;
}
public static string foo( this string s)
{
//some code
}
}
- 扩展
方法要扩展的类型紧跟在签名中的
this
关键字之后,因为这是方法将在其上执行的对象的实例。扩展方法必须是静态的,因为没有要调用它们的类实例(而是传递实例)。使用静态类可确保所有方法也是静态的。
是的,你可以。不过,正如你所说,这并没有多大意义。然后,该类的使用者将公开给所有类型的所有扩展方法,而不是与单个类型相关的方法(这就是为什么我通常按它们操作的类型来组织我的扩展方法类)。
我不明白我们怎么知道该方法正在扩展哪个类。是前面有
this
的类吗?
是的。它始终是方法的第一个参数。您不能使用 this
装饰任何其他参数。(事实上,this
存在,它告诉编译器您正在尝试编写扩展方法。
包含该方法的静态类扮演什么角色?整个语法似乎非常混乱。
它只是一个"容纳"扩展方法的类。扩展方法通常不使用编写它们的类的任何其他成员,尽管它们可以。(例如,扩展方法可以在包含它的静态类中使用私有静态字段。
在许多方面 - 包括这个 - 扩展方法只是一个普通的静态方法。它必须在顶级静态非泛型类中,并且第一个参数不能out
或ref
,但是一旦满足这些条件,就方法实现而言,它只是一个普通的方法。就调用方而言,就如何调用该方法而言,它是"特殊的"。(请注意,也可以以与任何其他静态方法相同的方式调用它。
我不能在同一类下为不同的类分组许多不同的扩展方法(这似乎没有意义,因为我只想扩展 1 个类)
是的,你可以。这通常不是一个好主意,但你绝对可以这样做。
该方法正在扩展哪个类。是前面有
this
的类吗?所以在上面的例子中,它会是string
?
是的。
包含该方法的静态类扮演什么角色?整个语法似乎非常混乱。
请参阅扩展方法(C# 编程指南):
因此,该类在代码中,使用实例方法语法调用扩展方法。但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。
必须是静态的,因为编译器不会创建该类的实例。
我不能在同一类下为不同的类分组许多不同的扩展方法
是的,你可以。
1)是的,它是"this"之后的类型
2) 方法必须始终在类中。它不能位于非静态类中,或者它是一个成员,并且需要该类类型的对象才能运行。所以唯一的选择是静态类,可以从任何地方调用它。
3)是的,您可以随心所欲地对它们进行分组。