Может ли лямбда-выражение C # включать более одного оператора?
(Изменить: как указано в нескольких ответах ниже, в этом вопросе изначально задавались «строки», а не «утверждения».)
Может ли лямбда-выражение C # включать более одного оператора?
(Изменить: как указано в нескольких ответах ниже, в этом вопросе изначально задавались «строки», а не «утверждения».)
Ответы:
(Я предполагаю, что вы действительно говорите о нескольких утверждениях, а не о нескольких строках.)
Вы можете использовать несколько операторов в лямбда-выражении, используя фигурные скобки, но только синтаксис, который не использует фигурные скобки, может быть преобразован в дерево выражения:
// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };
Expression<Func<int, int>> c = x => x + 1;
// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };
Вы можете поместить в лямбда-выражение столько символов новой строки, сколько захотите; C # игнорирует символы новой строки.
Вероятно, вы хотели спросить о нескольких утверждениях .
Несколько операторов можно заключить в фигурные скобки.
Смотрите документацию .
Начиная с C # 7:
Однострочный оператор:
int expr(int x, int y) => x + y + 1;
Многострочный оператор:
int expr(int x, int y) { int z = 8; return x + y + z + 1; };
хотя они называются локальными функциями, я думаю, что это выглядит немного чище, чем приведенное ниже, и фактически то же самое
Func<int, int, int> a = (x, y) => x + y + 1;
Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };
Func<string, bool> test = (name) =>
{
if (name == "yes") return true;
else return false;
}
Из Лямбда-выражений (Руководство по программированию на C #) :
Тело оператора лямбда может состоять из любого числа операторов; однако на практике их обычно не более двух или трех.
С С # 7.0 вы также можете использовать это
Public string ParentMethod(int i, int x){
int calculation = (i*x);
(string info, int result) InternalTuppleMethod(param1, param2)
{
var sum = (calculation + 5);
return ("The calculation is", sum);
}
}
Допустим, у вас есть класс:
public class Point
{
public int X { get; set; }
public int Y { get; set; }
}
С C # 7.0 внутри этого класса вы можете сделать это даже без фигурных скобок:
Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);
и
Action<int, int> action = (x, y) => _ = (X += x, Y += y);
будет так же, как:
Action<int, int> action = (x, y) => { X += x; Y += y; };
Это также может быть полезно, если вам нужно написать обычный метод или конструктор в одной строке или когда вам нужно упаковать более одного оператора / выражения в одно выражение:
public void Action(int x, int y) => (_, _) = (X += x, Y += y);
или
public void Action(int x, int y) => _ = (X += x, Y += y);
или
public void Action(int x, int y) => (X, Y) = (X + x, Y + y);
Подробнее о деконструкции кортежей в документации .