我遇到过几个C#代码实例,如下所示:
public static int Foo(this MyClass arg)
我无法找到this
关键字在这种情况下的含义的解释。任何见解?
答案 0 :(得分:247)
这是扩展方法。请在此处查看explanation。
扩展方法允许开发人员向公众添加新方法 现有CLR类型的合同,无需对其进行子类化 重新编译原始类型。扩展方法有助于混合 动态语言中流行的“鸭子打字”支持的灵活性 今天的性能和编译时验证 强类型语言。
扩展方法支持各种有用的场景,并帮助制作 可能真正强大的LINQ查询框架......
这意味着您可以致电
MyClass myClass = new MyClass();
int i = myClass.Foo();
而不是
MyClass myClass = new MyClass();
int i = Foo(myClass);
这允许构建fluent interfaces,如下所述。
答案 1 :(得分:39)
Scott Gu's quoted blog post很好地解释了。
对我来说,问题的答案在该帖子的以下声明中:
注意上面的静态方法有一个 “this”关键字在第一个之前 string类型的参数参数。 这告诉编译器这个 特殊的扩展方法应该是 添加到“string”类型的对象。 在IsValidEmailAddress()内 方法实现我可以 访问所有公众 属性/方法/事件 该方法的实际字符串实例 被召唤,并返回 是/否取决于是否 是否有效的电子邮件。
答案 2 :(得分:13)
In addition to Preet Sangha's explanation:
Intellisense用蓝色箭头显示扩展方法(例如在“Aggregate<>”前面):
你需要一个
using the.namespace.of.the.static.class.with.the.extension.methods;
要使扩展方法显示和可用,如果它们与使用它们的代码位于不同的命名空间中。
答案 3 :(得分:7)
他们是extension methods。欢迎来到全新的fluent world。 :)
答案 4 :(得分:3)
我前几天刚刚学会了这个:this关键字定义了该方法是继续进行它的类的扩展。因此,对于您的示例,MyClass将有一个名为Foo的新扩展方法(它不接受任何参数并返回int;它可以与任何其他公共方法一起使用)。
答案 5 :(得分:1)
"这"扩展参数列表中的下一个类
所以在下面的方法签名"这个"扩展"字符串"。 Line作为方法的正常参数传递给函数。 public static string [] SplitCsvLine(this String line)
在上面的例子中"这个" class正在扩展内置的" String"类。