提问人:kpozin 提问时间:5/11/2009 更新时间:7/27/2023 访问量:176808
在 C 语言中静态方法的形式参数中使用“this”关键字#
Use of "this" keyword in formal parameters for static methods in C#
问:
我遇到了几个 C# 代码实例,如下所示:
public static int Foo(this MyClass arg)
在这种情况下,我无法找到关键字含义的解释。有什么见解吗?this
答:
这是一种扩展方法。有关说明,请参阅此处。
扩展方法允许开发人员向公众添加新方法 现有 CLR 类型的协定,而不必对其进行子类化,或者 重新编译原始类型。扩展方法有助于将 动态语言中流行的“鸭子类型”支持的灵活性 今天,随着性能和编译时验证 强类型语言。
扩展方法支持各种有用的方案,并有助于使 可能是真正强大的 LINQ 查询框架......。
这意味着您可以调用
MyClass myClass = new MyClass();
int i = myClass.Foo();
而不是
MyClass myClass = new MyClass();
int i = Foo(myClass);
这允许构建如下所述的流畅界面。
评论
前几天我自己才学到这个:this 关键字定义该方法是进行该方法的类的扩展。因此,在您的示例中,MyClass 将有一个名为 Foo 的新扩展方法(它不接受任何参数并返回一个 int;它可以与任何其他公共方法一起使用)。
Scott Gu 引用的博客文章很好地解释了这一点。
对我来说,这个问题的答案在那篇帖子的以下陈述中:
请注意上面的 static 方法如何具有 第一个之前的“this”关键字 字符串类型的参数。 这告诉编译器,这 特定的扩展方法应该是 添加到“string”类型的对象中。 在 IsValidEmailAddress() 中 方法实现 然后我可以 访问所有公众 属性/方法/事件 该方法的实际字符串实例 被召唤,又回来了 true/false,取决于它是否是 电子邮件是否有效。
评论
this
除了 Preet Sangha 的解释之外:
Intellisense 用蓝色箭头显示扩展方法(例如,在“Aggregate<>”前面):
你需要一个
using the.namespace.of.the.static.class.with.the.extension.methods;
如果扩展方法与使用它们的代码位于不同的命名空间中,则扩展方法将显示并可用。
“this”扩展了参数列表中的下一个类
因此,在下面的方法签名中,“this”扩展了“String”。Line 作为方法的普通参数传递给函数。 public static string[] SplitCsvLine(此字符串行)
在上面的示例中,“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();
修饰符 this 在参数前的用法是关于扩展方法的。
有关更详细的说明和示例,请参阅我的 CSDN 博客。
评论