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