Как использовать анонимные методы в 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 как анонимные методы, поэтому программе не нужно определять функции отдельно. Это делает код более понятным и понятным, хотя третий анонимный метод немного длинный. Если бы эта функция была намного длиннее, было бы лучше поместить ее код в именованный метод, чтобы сделать код более читаемым.
Обычно вы не должны использовать анонимный метод, если метод будет использоваться в нескольких местах, если его код слишком длинный, или если в противном случае было бы менее запутанным использовать именованный метод. Анонимные методы не дают вам каких-либо реальных преимуществ по производительности (в отличие от встроенных макросов, используемых некоторыми языками программирования), поэтому вы должны использовать их только в том случае, если они упрощают понимание кода.
В следующем посте я покажу, как вы можете использовать лямбда-выражения, чтобы упростить определение анонимных методов.
