C#中的扩展方法:为什么这样做?

时间:2010-08-20 22:16:38

标签: c# static extension-methods this legacy-code

我有点困惑为什么这不会给出错误。我发现这个代码深入到一些过时的遗留软件中,并且很惊讶它看起来有用。

public static string CleanFileName(this string fileName)
{
  return CleanFileName(fileName, 64);
}

public static string CleanFileName(this string fileName, int maxLength)
{
  //some logic
}

我对扩展方法的体验是这样称呼它:

fileName.CleanFileName(64);

这只能起作用,因为它也是静态方法吗?这是常见的做法,还有一些我还没有看到过的东西,还是一段过时的遗留代码,我应该用火来杀死它?

2 个答案:

答案 0 :(得分:10)

可以选择性地调用扩展方法,就好像“this”修饰符甚至不存在一样(也称为常规静态方法)。这样做的可读性较差,但语法上有效。

另一个答案是误导,因为“它的工作原理是因为方法调用是在与其重载相同的类型内进行的。”暗示关于扩展方法的一些事你可以调用扩展方法作为普通的静态方法,而不管你碰巧在哪个类中。但是通过下面的评论,听起来混淆的是这个类是否需要合格。并且在那种情况下,Nathan是正确的,因为调用是在与重载相同的类中发生的,因为调用类名称可以被省略。

答案 1 :(得分:6)

它的工作原理是因为对CleanFileName(string, int)的调用是在与CleanFileName(string)相同的类型中进行的,这允许以标准方法语法而不是扩展方法语法进行调用。因此,在扩展方法之前不需要字符串实例前缀。

从语义上讲,static string Foo(this string foo, int bar) { }可以Foo(string, int)string.Foo(int)的形式调用。