Как использовать анонимные методы в C#

Мой предыдущий пост Использование предопределенные типы делегатов Action, Func и EventHandler в C# объясняют, как использовать предопределенные общие типы делегатов Func, Action и EventHandler для построения четырех функций F (x, y). Он использует следующий код для определения функций и вызова их.

// x ^ 2 + x * y - y = 0
private float F1(float x, float y)
{
    return (x * x + x * y - y);
}

// y - 1 / x ^ 2 = 0
private float F2(float x, float y)
{
    return (y - 1 / (x * x));
}

// y - 3 * Cos (x) / x
private float F3(float x, float y)
{
    double temp = y - Math.Pow(x * x, 1.0 / 3.0);
    return (float)(x * x + temp * temp - 1);
}

// Нарисуем соответствующий граф.
private float F4(float x, float y)
{
    return (float)(y - 3 * Math.Cos(x) / x);
}

private void radF1_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(F1);
}

private void radF2_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(F2);
}

private void radF3_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(F3);
}

private void radF4_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(F4);
}

Код сначала определяет четыре функции F1, F2, F3 и F4. Четыре обработчика CheckBox управления

Тот факт, что их имена F1, F2, F3, а F4 является подсказкой о том, что сами функции сами по себе не имеют смысла. Они в основном определены, переданы в DrawGraph, а затем забыли.

Поскольку функции не используются в других частях программы, вы можете заменить эти функции анонимными методами. Анонимный метод - это в основном делегат, который ссылается на некоторый код, который не имеет имени. Вы можете сохранить делегат в переменной делегата или передать его методу в качестве параметра.

Синтаксис анонимного метода:

delegate(parameters) { ...code... })

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

Следующий код показывает, как этот пример сообщения использует анонимные методы для обработки событий CheckedChanged.

// Нарисуем соответствующий граф.
private void radF1_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(delegate(float x, float y) {return x * x + x * y - y; });
}

private void radF2_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(delegate(float x, float y) { return (y - 1 / (x * x)); });
}

private void radF3_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(delegate(float x, float y)
        {
            double temp = y - Math.Pow(x * x, 1.0 / 3.0);
            return (float)(x * x + temp * temp - 1);
        });
}

private void radF4_CheckedChanged(object sender, EventArgs e)
{
    DrawGraph(delegate(float x, float y)
        { return (float)(y - 3 * Math.Cos(x) / x); });
}

В этой версии обработчики событий передают четыре функции методу DrawGraph как анонимные методы, поэтому программе не нужно определять функции отдельно. Это делает код более понятным и понятным, хотя третий анонимный метод немного длинный. Если бы эта функция была намного длиннее, было бы лучше поместить ее код в именованный метод, чтобы сделать код более читаемым.

Обычно вы не должны использовать анонимный метод, если метод будет использоваться в нескольких местах, если его код слишком длинный, или если в противном случае было бы менее запутанным использовать именованный метод. Анонимные методы не дают вам каких-либо реальных преимуществ по производительности (в отличие от встроенных макросов, используемых некоторыми языками программирования), поэтому вы должны использовать их только в том случае, если они упрощают понимание кода.

В следующем посте я покажу, как вы можете использовать лямбда-выражения, чтобы упростить определение анонимных методов.

Источник: http://csharphelper.com/blog/2017/11/use-anonymous-methods-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector