我遇到了如下几个C#代码实例:
public static int Foo(this MyClass arg)
this
在这种情况下,我无法找到关键字含义的解释。有什么见解吗?
我遇到了如下几个C#代码实例:
public static int Foo(this MyClass arg)
this
在这种情况下,我无法找到关键字含义的解释。有什么见解吗?
Answers:
这是一种扩展方法。参见这里的解释。
扩展方法允许开发人员将新方法添加到现有CLR类型的公共合同中,而不必对其进行子分类或重新编译原始类型。扩展方法有助于将当今在动态语言中流行的“鸭子键入”支持的灵活性与强类型语言的性能和编译时验证相结合。
扩展方法可实现各种有用的方案,并有助于实现真正强大的LINQ查询框架...。
这意味着你可以打电话
MyClass myClass = new MyClass();
int i = myClass.Foo();
而不是
MyClass myClass = new MyClass();
int i = Foo(myClass);
这样可以构建如下所述的流畅接口。
Scott Gu引用的博客文章很好地解释了这一点。
对我来说,该问题的答案在该帖子的以下声明中:
请注意,上面的静态方法如何在字符串类型的第一个参数实参之前具有“ this”关键字。这告诉编译器应将此特殊扩展方法添加到“字符串”类型的对象中。然后,在IsValidEmailAddress()方法实现中,我可以访问调用该方法的实际字符串实例的所有公共属性/方法/事件,并根据是否为有效电子邮件返回true / false。
this
方法签名中关键字的实际目的的答案。其他答案只能无奈地说“这是一种扩展方法”。在阅读此答案之前,我从未完全理解扩展方法如何“附加”到它们扩展的类型。谢谢!
除了Preet Sangha的解释之外:
Intellisense还使用蓝色箭头(例如,在“ Aggregate <>”前面)显示扩展方法:
你需要一个
using the.namespace.of.the.static.class.with.the.extension.methods;
如果扩展方法与使用它们的代码位于不同的名称空间中,则扩展方法将显示并可用。