что является альтернативой перегрузке метода, чтобы сделать код немного менее повторяющимся C # - PullRequest
0 голосов
/ 29 апреля 2018

Я застрял с перегрузкой метода, и я хотел бы знать, как игрушка может упростить или переделать так, чтобы я мог сделать ее одной функцией

Я хотел бы знать Как бы я мог упростить это ->

    print(5);
    print(5.5);
    print("5");  

    static void print (int x)
    {
        Console.WriteLine(x);
    }
    static void print (string x)
    {
        Console.WriteLine(x);
    }
    static void print (double x)
    {
        Console.WriteLine(x);
    }

На что-то вроде этого ->

    print(5);
    print(5.5);
    print("5");  

    static void print (int x, string y, double, z)
    {
        Console.WriteLine(x);
    }

Ответы [ 4 ]

0 голосов
/ 29 апреля 2018

Вы действительно можете принять тип объекта в качестве параметра, как упоминалось ранее. Я сам предпочитаю более элегантное решение с использованием дженериков:

static void print<T>(T x) {
    Console.WriteLine(x);
}
0 голосов
/ 29 апреля 2018

Сделайте ваш параметр общим object:

static void print (object o)
{
    ConSole.WriteLine(o);
}

это будет косвенно вызывать o.ToString.

0 голосов
/ 29 апреля 2018

Иногда вы можете избежать множественных перегрузок, если используете только общие элементы разных типов, которые, по вашему мнению, должны обрабатываться по-разному. В вашем примере вам совсем не нужны перегрузки, поскольку все типы, которые вы хотите обработать, имеют метод ToString, который они наследуют от object. Таким образом, вы можете просто написать:

void print(object o)
{
    Console.WriteLine(o.ToString());
}

Предположим, что вы хотите обрабатывать числа и строки по-разному, вы также можете использовать тот факт, что int неявно приведен к double. Так что нет необходимости в отдельной перегрузке int, если она будет делать то же самое, что и на double:

void print(double d)
{
    Console.WriteLine("I am a number " + d.ToString());
}

print(1);
print(1.0); // both works

Таким образом, цель всегда состоит в том, чтобы найти общий базовый класс / интерфейс или неявное преобразование типов, чтобы избежать избыточных перегрузок методов.

0 голосов
/ 29 апреля 2018

Вы просто сделали это, но вызов вашей функции будет выглядеть так:

print(5, 5.5, "5");

Ваша функция будет выглядеть так:

static void print (int x, string y, double z)
{
    Console.WriteLine(x);
    Console.WriteLine(y);
    Console.WriteLine(z);
}
...