Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to attach static methods to classes rather than to instances of a class?

If I have a method for calculating the greatest common divisor of two integers as:

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

What would be the best way to attach that to the System.Math class?

Here are the three ways I have come up with:

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

// Lame...

var gcd = a.GCD(b);

and:

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);

and:

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);

The desired syntax is Math.GCD since that is the standard for all mathematical functions.

Any suggestions? What should I do to get the desired syntax?

like image 987
John Gietzen Avatar asked Nov 29 '22 04:11

John Gietzen


2 Answers

You cannot. Extension methods are just syntactic sugar for calling a static function and passing an instance of a particular type. Given that, they operate only on instances, as they must be defined by passing a this parameter of the type you want to attach to.

like image 81
Adam Robinson Avatar answered Dec 05 '22 18:12

Adam Robinson


I would prefer the one with RationalMath. You really don't need extension methods here, because their aim is to mimic instance methods of objects of you can't modify. But here one should use plain old static method.

like image 28
Andrey Avatar answered Dec 05 '22 16:12

Andrey