【问题标题】:c# parameterless extension method [duplicate]c#无参数扩展方法
【发布时间】:2014-03-25 12:37:05
【问题描述】:

是否可以创建不带参数的扩展方法?我是使用扩展方法的新手,只见过使用参数的方法。

来自RB Whitaker's C# tutorial

public static class StringExtensions
{
    private static Random random = new Random();

    public static string ToRandomCase(this string text)
    {
        string result = "";

        for (int index = 0; index < text.Length; index++)
        {
            if (random.Next(2) == 0)
            {
                result += text.Substring(index, 1).ToUpper();
            }
            else
            {
                result += text.Substring(index, 1).ToLower();
            }                
        }

        return result;
    }
}

还有来自MSDN

“他们的第一个参数指定方法操作的类型,参数前面是this修饰符。”

这两个,尤其是每个站点上的代码示例(此处仅发布一个)似乎表明扩展方法必须具有至少一个参数,因为该参数用于附加 this 关键字 to,允许该方法注册为它后面的类或类型的扩展。例如,

public static StringExtension(this String a) {/*stuff*/}

(如果是这种情况,那么这也意味着扩展方法中的第一个参数必须接受它正在扩展的类的实例,所以我可能错了。)

【问题讨论】:

  • 你为什么想要一个无参数的扩展方法?那么它会扩展什么?
  • 我认为它会像标准库中不带参数的任何方法一样运行,例如 Console.Read()。这个问题意味着您可以定义一个没有参数的扩展方法,并且(理论上)将其称为 Console.MyExt();但我发现事实并非如此。
  • @Stopforgettingmyaccounts... 注意扩展方法需要一个instance,但是Console是一个类,所以你不能写一个扩展方法用作静态方法,如Console.MyExt()。见Can I add extension methods to an existing static class?
  • 如果类是静态的,那将毫无意义。

标签: c# extension-methods


【解决方案1】:

没错。扩展方法至少需要一个参数,用this修饰符标记。

但是,当使用对您要扩展的类的引用来调用扩展方法时,您不会指定参数:

"foo".StringExtension();

相当于:

StringExtensions.StringExtension("foo");

即使您实际上没有使用方法中的参数,也必须声明它以使用扩展方法提供的语法。

【讨论】:

  • 很好,所以在调用扩展方法的时候,第一个参数是隐藏的?
  • @Stopforgettingmyaccounts... 正确。编译器将 . 左侧的对象作为第一个参数隐式传递给函数。
猜你喜欢
  • 2015-11-16
  • 2016-02-13
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多