“this”的用法;关键字是c#中静态方法的形式化参数

我遇到过几个像下面这样的c#代码实例:

public static int Foo(this MyClass arg)

在这种情况下,我还没有找到this关键字的解释。见解吗?

162206 次浏览

这是一个扩展方法。参见这里的解释

扩展方法允许开发人员向公众添加新方法 一个现有CLR类型的契约,而不必子类化它或 重新编译原始类型。扩展方法有助于混合 灵活的“鸭子类型”支持流行的动态语言 的性能和编译时验证 强类型语言。< / p > 扩展方法支持各种有用的场景,并帮助创建 可能真正强大的LINQ查询框架... .

这意味着你可以打电话

MyClass myClass = new MyClass();
int i = myClass.Foo();

而不是

MyClass myClass = new MyClass();
int i = Foo(myClass);

这允许构造连贯接口,如下所述。

前几天我自己也学过这个:this关键字定义了该方法是继承它的类的扩展。对于你的例子,MyClass将有一个新的扩展方法Foo(它不接受任何参数并返回int;它可以像任何其他公共方法一样使用)。

它们是扩展方法。欢迎来到全新的流利的世界。:)

Scott Gu引用的博客文章解释得很好。

对我来说,这个问题的答案就在那篇文章的以下声明中:

注意上面的静态方法有一个 “this”关键字放在第一个前面 string类型的参数参数。 这告诉编译器 具体的推广方法应该是 添加到类型为"string"的对象中。 在IsValidEmailAddress()中 方法实现,我就可以 访问所有的公众 属性的属性/方法/事件 该方法的实际字符串实例 正在被召唤,并返回 真/假取决于是否是

.邮件是否有效
< p > 除Preet Sangha的解释外: . < br > 智能感知以蓝色箭头显示扩展方法(例如在"Aggregate<>"前面):

enter image description here

你需要一个

using the.namespace.of.the.static.class.with.the.extension.methods;

如果扩展方法与使用它们的代码在不同的名称空间中,则扩展方法将出现并可用。

"this"扩展了参数列表中的下一个类

所以在下面的方法签名“this”扩展了“String”。Line作为方法的常规参数传递给函数。 public static string[] SplitCsvLine(this string line)

. SplitCsvLine(this string line

在上面的例子中,“this”类扩展了内置的“String”类。

如果您可以整洁地弹出一个List<>,也就是说,不仅删除第一个元素,而且还返回它,这不是很方便吗?

List<int> myList = new List<int>(1, 2, 3, 4, 5);

没有扩展方法:

public static class ContainerHelper
{
public static T PopList<T>(List<T> list)
{
T currentFirst = list[0];
list.RemoveAt(0);
return currentFirst;
}
}

调用此方法:

int poppedItem = ContainerHelper.PopList(myList);

使用扩展方法:

public static class ContainerHelper
{
public static T PopList<T>(this List<T> list)//Note the addition of 'this'
{
T currentFirst = list[0];
list.RemoveAt(0);
return currentFirst;
}
}

调用此方法:

int poppedItem = myList.PopList();