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