当我清理项目的代码时,我偶然发现了类中的一个方法,如下(简化)
@Resource
public Environment env;
执行快速搜索后,除了定义之外,搜索结果给了我以下内容:
public static class HelperClass
{
public static void DoStuff(this DifferentClassName obj)
}
显然,我认为它与类中的方法没有任何关系,所以我注释掉了类方法,看看它是否会导致任何错误。令我惊讶的是,搜索结果中的行被删除了。
搜索结果行的片段如下:
varname.DoStuff();
我最初认为这是因为创建了一个新的类实例,但它不应该仍然是该行中的参数吗?任何人都可以解释为什么这些方法相互联系,而方法调用中的参数被省略了吗?
答案 0 :(得分:4)
(this Foo foo)
的方法是 extension methods 。扩展方法具有适用的某些规则(提供的读链接)。
当这些方法属于适当的静态类时 - 例如public
或internal
- 作为扩展方法主题的任何对象实际上都有加载到其API的方法。然后将主题对象假定为第一个参数。
您可以通过两种方式调用扩展方法:
// assuming extension class as follows
public static class Extensions {
// Foo is the subject Type and foo the subject object
public static void DoBarWithFoo(this Foo foo){
// do something with foo
}
}
var foo = new Foo();
// call ...
foo.DoBarWithFoo();
// or ...
Extensions.DoBarWithFoo(foo);