C#: Функция в функции возможно?
можно ли объявить метод в другом методе в C#?
например вот так:
void OuterMethod()
{
int anything = 1;
InnedMethod();
void InnerMethod()
{
int PlitschPlatsch = 2;
}
}
7 ответов:
обновление: локальные функции где добавлено в версии 7 C#.
void OuterMethod() { int foo = 1; InnerMethod(); void InnerMethod() { int bar = 2; foo += bar } }в предыдущей версии C# вы должны использовать действий такой:
void OuterMethod() { int anything = 1; Action InnedMethod = () => { int PlitschPlatsch = 2; }; InnedMethod(); }
обновление: C#7 добавлены локальные функции (https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#local-functions)
void OuterMethod() { int foo = 1; InnerMethod(); void InnerMethod() { int bar = 2; foo += bar } }в версиях C# до C#7, Вы можете объявить a
FuncилиActionи получить что-то подобное:void OuterMethod() { int foo = 1; Action InnerMethod = () => { int bar = 2; foo += bar; } ; InnerMethod(); }
да, есть способы. С C# 3.0 у вас есть
Func<T>тип, который делает это.например, я написал это вчера:
var image = Image.FromFile(_file); int height = image.Height; int width = image.Width; double tan = height*1.00/width; double angle = (180.0 * Math.Atan(tan) / Math.PI); var bitmap = new System.Drawing.Bitmap(image, width, height); var g = System.Drawing.Graphics.FromImage(bitmap); int fontsize = 26; // starting guess Font font = null; System.Drawing.SizeF size; Func<SizeF,double> angledWidth = new Func<SizeF,double>( (x) => { double z = x.Height * Math.Sin(angle) + x.Width * Math.Cos(angle); return z; }); // enlarge for width do { fontsize+=2; if (font != null) font.Dispose(); font = new Font("Arial", fontsize, System.Drawing.FontStyle.Bold); size = g.MeasureString(_text, font); } while (angledWidth(size)/0.85 < width);цель состояла в том, чтобы добавить водяной знак к существующему образу. Я хотел сделать размер текста водяного знака около 85% от ширины изображения. Но я хотел наклонить текст водяного знака так, чтобы он был написан под углом. Это выявило необходимость сделать некоторые тригонометрические расчеты на основе углов, и я хотел небольшая функция для выполнения этой работы. Элемент
Funcидеально подходит для этого.приведенный выше код определяет
Func(функция), которая принимаетSizeFи возвращает adouble, для фактической ширины текста, когда он нарисован под заданным углом. ЭтоFunc- это переменная внутри функции, а сама переменная содержит (ссылку на A) функцию. Затем я могу вызвать эту "частную" функцию в области, где я ее определил. Func имеет доступ к другим переменным, которые определяются перед ним, в области его выполнения. Итак,angleпеременная доступна внутри .
если вы хотите вызвать логику, которая возвращает
void, вы можете использоватьAction<T>таким же образом. .NET определяет универсалии Func, которые принимают N аргументов, поэтому вы можете сделать их довольно сложными. В функции как функции VB или C# метод, который возвращает не void; действие как суб VB или на C# метод, который возвращает void.
прошло пять лет с тех пор, как этот вопрос был задан, и теперь C# 7 идет.
он запланирован для включения локальных функций и, по-видимому, уже реализован.
локальные функции (предложение: #259) [в настоящее время в будущей ветке]
The
delegateключевое слово делает.void OuterMethod() { var InnerMethod = delegate() { int PlitschPlatsch = 2; }; int anything = 1; InnerMethod(); }не забывайте, что согласно определения
PlitschPlatschпеременная не будет доступна за пределами InnerMethod.
посмотри анонимные методы. Я думаю, что это то, что вы ищете.
Если вы ищете в основном, чтобы" скрыть "метод, который является просто" помощником"... другой вариант-сделать ваш помощник(ы)
private. Таким образом, они не становятся частью публичного интерфейса класса.это имеет то преимущество, что помощник(ы) может быть повторно использован при необходимости; но он / они не будут "внутренними" для вызывающего метода.