Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

C#: Создать и вызвать анонимную функцию внутри выражения

#c_sharp #функции


Есть ли способ в C# создать и вызвать анонимную функцию внутри выражения?
Без предварительного объявления переменной-делегата.
Что-то вроде этого:

int i32 = () => { int x = 5; int y = 6; return( x+y ); }();


или 

int i32 = (() => { int x = 5; int y = 6; return( x+y ); })();


или

int32 = this.Invoke( () => { int x = 5; int y = 6; return( x+y ); } );


Работающий вариант #1 от @PashaPash и @Pavel Mayorov:

int i32 = ((Func)(() => { int x = 5; int y = 6; return( x+y ); }))();


Работающий вариант #2 от @Stack:

int i32 = new Func(() => { int x = 5; int y = 6; return (x+y); })();


Работающий вариант #3 от @Stack: (чемпион по краткости, по красоте - для ценителей)

int i32; new Action(() => { int x = 5; int y = 6; i32 = x + y; })();


Ответ на вопрос @Stack "Зачем это надо?:"
Для красоты и компактности, требуется редко, вот пример:

int i1 =  5 +  6;
int i2 =  7 +  8;
int i3 =  ((Func)(() => { int x = 45; int y = 6; return( x*2 + y*3 ); }))();
int i4 =  9 + 10;
int i5 = 11 + 20;
int i6 = new Func(() => { int x; if( CheckState( out x ) ) return( x ); else
return( -1 ) })();
int i7 = new Func(() => { int x = 0; while( CheckSomthing( x )) x++; return(
x ); })();


Вот, ещё один пример из реальной жизни:

            Style s = new Style();
            s.TargetType    = typeof(System.Windows.Controls.ComboBox);
            s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontSizeProperty,
11.0));
            s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.BackgroundProperty,
 ((Func)(() => { Brush b = new SolidColorBrush( Color.FromArgb( 255, 200, 200,
200 )); b.Freeze(); return b; }))() ));
            s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.ForegroundProperty,
Brushes.Black));
            s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontFamilyProperty,
new FontFamily("Arial")));
            s.Setters.Add(new Setter(System.Windows.Controls.ComboBox.FontWeightProperty,
FontWeights.Bold));

    


Ответы

Ответ 1



Это можно сделать вот так: var q = ((Func)(() => { int x = 5; int y = 6; return( x+y ); }))() Это - единственный способ.

Ответ 2



Func i32 = () => { int x = 5; int y = 6; return x + y; }; или так var i32 = new Func(() => { int x = 5; int y = 6; return x + y; }); var res = i32(); // = 11 если сразу надо получить результат, то так var i32 = new Func(() => { int x = 5; int y = 6; return x + y; })(); // = 11 UPDATE Для компактности можно записать так int i1 = 5 + 6; int i2 = 7 + 8; int i32; new Action(() => { int x = 5; int y = 6; i32 = x + y; })(); // i32 = 11 UPDATE Если определить функцию Set, то можно сократить код void Set(Action a) { a(); } int i1 = 5 + 6; int i2 = 7 + 8; int i32; Set(() => { int x = 5; int y = 6; i32 = x + y; });

Комментариев нет:

Отправить комментарий