Чи може вираз 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 #) :
Основа лямбда заяви може складатися з будь-якої кількості висловлювань; однак на практиці зазвичай не більше двох-трьох.
З 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);
Детальніше про деконструкцію кортежів у документації .