将静态方法附加到类而不是类的实例的最佳方法是什么?

Joh*_*zen 3 .net c# math extension-methods language-features

如果我有一个计算两个整数的最大公约数的方法:

public static int GCD(int a, int b)
{
    return b == 0 ? a : GCD(b, a % b);
}
Run Code Online (Sandbox Code Playgroud)

将它附加到System.Math类的最佳方法是什么?

以下是我提出的三种方式:

public static int GCD(this int a, int b)
{
    return b == 0 ? a : b.GCD(a % b);
}

// Lame...

var gcd = a.GCD(b);
Run Code Online (Sandbox Code Playgroud)

和:

public static class RationalMath
{
    public static int GCD(int a, int b)
    {
        return b == 0 ? a : GCD(b, a % b);
    }
}

// Lame...

var gcd = RationalMath.GCD(a, b);
Run Code Online (Sandbox Code Playgroud)

和:

public static int GCD(this Type math, int a, int b)
{
    return b == 0 ? a : typeof(Math).GCD(b, a % b);
}

// Neat?

var gcd = typeof(Math).GCD(a, b);
Run Code Online (Sandbox Code Playgroud)

所需的语法是Math.GCD因为它是所有数学函数的标准.

有什么建议?我该怎么做才能获得所需的语法?

Ada*_*son 11

你不能.扩展方法只是用于调用静态函数和传递特定类型实例的语法糖.鉴于此,它们仅在实例上运行,因为它们必须通过传递this要附加的类型的参数来定义.

  • @John,你有点困难!您无法扩展System.Math.您已经知道了以下选项:int上的扩展方法,或者您自己的静态(无论)Math类.而且,正如亚当指出的那样,如果您选择My.Math,那么无论何时需要,您都必须完全符合System.Math的要求.就个人而言,我会选择一个名为MathUtility的静态数学实用程序类. (5认同)
  • @John:同样,任何版本的C#(或任何其他.NET语言)都无法满足您的要求.除了"你做不到"之外,你的问题没有答案. (2认同)
  • @John:我们要进入圈子.您想要的语法是`System.Math.GCD`.我说这是不可能的.你说你知道的.我问你为什么问这个问题.你说得到你知道的语法是不可能的.??? =利润. (2认同)

And*_*rey 6

我更喜欢那个RationalMath.你真的不需要这里的扩展方法,因为他们的目的是模仿你无法修改的对象的实例方法.但是这里应该使用普通的旧静态方法.