#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
Funci32 = () => { 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; });
Комментариев нет:
Отправить комментарий