我遇到了几个类似以下C#代码的实例:
public static int Foo(this MyClass arg)
我找不到关于this
关键字在这种情况下的解释。有什么见解吗?
我遇到了几个类似以下C#代码的实例:
public static int Foo(this MyClass arg)
我找不到关于this
关键字在这种情况下的解释。有什么见解吗?
MyClass myClass = new MyClass();
int i = myClass.Foo();
与其
MyClass myClass = new MyClass();
int i = Foo(myClass);
如下所述,这允许构建流畅接口(fluent interfaces)。
Scott Gu所引用的博客文章很好地解释了这一点。
对我来说,这个问题的答案在该文章的以下陈述中:
请注意上面的静态方法有一个“this”关键字, 在第一个类型为字符串的参数之前。这告诉编译器, 应将此特定扩展方法添加到“string”类型的对象中。 在IsValidEmailAddress()方法实现中, 我可以访问调用该方法的实际字符串实例的所有公共属性/方法/事件, 并根据其是否有效电子邮件返回true/false。
this
关键字实际用途的答案。其他的回答只是不太有用地说“这是扩展方法”。在阅读了这个答案之前,我从未完全理解扩展方法如何“附加”到它们扩展的类型上。谢谢! - Lews Therin如果你可以整洁地弹出一个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();
除了Preet Sangha的解释外:
Intellisense会显示带有蓝色箭头的扩展方法(例如在"Aggregate<>"前面):
您需要
using the.namespace.of.the.static.class.with.the.extension.methods;
为了让扩展方法出现并可用,即使它们在与使用它们的代码不同的命名空间中。我最近学到了这个知识:this关键字定义了该方法作为其前面类的扩展。因此,对于您的示例,MyClass将具有一个名为Foo的新扩展方法(它不接受任何参数并返回一个int;可以像其他公共方法一样使用)。
"this"扩展了参数列表中的下一个类。
因此,在下面的方法签名中,“this”扩展了“String”。Line作为普通参数传递给该函数的方法。
在上面的示例中,“this”类扩展了内置的“String”类。
"