Когда целесообразно использовать члены с выраженным телом? [закрыто]


24

В C # 6 вводятся члены с выражением-выражением, которые позволяют упростить код в методах и свойствах, которые возвращают только результат выражения:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

будет выглядеть так:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Поскольку теперь у нас есть два точно эквивалентных и допустимых синтаксиса, для решения о том, какой из них использовать, необходимо использовать некоторое эмпирическое правило. Когда уместна новая альтернатива?


7
Хм, когда тело члена является выражением?
Йорг Миттаг,

1
Это ответило бы на вопрос «когда можно использовать выражения с выраженными членами».
Асик

7
Не полностью связаны, но вы не можете использовать public override string ToString() => $"{_field1} {_field2}";?
Таоден

3
@JorgWMittag Я бы добавил к этому "... у которого нет побочных эффектов". Объявление метода в функциональном стиле, когда он не является чисто функциональным, вводит в заблуждение.
Жюль

Ответы:


12

Функциональные языки программирования состоят только из выражений, поэтому большинство из них имеют такую ​​функцию с самого начала. Вы используете его, когда у вас есть относительно короткое, часто часто повторяющееся выражение, которое можно заменить еще более коротким, гораздо более значимым именем.

Типичным примером являются предикаты, которые используются в других местах, например:

public static bool isOdd(int num) => (num % 2) == 1;

Если выражение слишком длинное, лучше разделить его на отдельные функции или, возможно, одну функцию с именованными промежуточными результатами. Если оно короткое, но вы не можете придумать хорошее имя, вам лучше просто скопировать выражение, а не создавать ужасное имя типа condition1или что-то в этом роде.


21

Из C # / .NET Little Wonders: члены с выражением в C # 6 :

Итак, вы должны использовать это? Все сводится к стилю. Моя интуиция заключалась бы в том, чтобы ограничить это простыми выражениями и утверждениями, которые можно ясно понять с первого взгляда.

(выделение мое; см. обновление 1 ниже)

Больше из резюме статьи выше:

Таким образом, C # 6 теперь дает нам возможность указывать свойства и методы только для get с выражениями. Это может помочь снизить нагрузку на синтаксис очень простых методов, чтобы сделать ваш код более лаконичным.

Однако, со всеми вещами, используйте свое суждение о том, подходит ли оно для любой конкретной ситуации. Когда выражение очень длинное или сложное, использование синтаксиса всего тела может быть более читабельным.

И еще одна цитата о производительности, потому что проблемы с производительностью также могут сказываться, когда уместно использовать определенную языковую функцию:

Теперь, вы можете спросить, это влияет на производительность во время выполнения? На самом деле ответ - нет . Это просто синтаксический сахар, который расширяется до того же IL, что и полный текст. Он не создает делегата, он просто заимствует синтаксис лямбда-выражения, чтобы упростить написание простых тел, которые приводят к выражению.

(акцент, автор)

Обновление 1: @ JörgWMittag сказал

Это не имеет никакого смысла. "ограничить это простыми выражениями и утверждениями"? А? Он даже не работает с утверждениями, только с выражениями!

Похоже, что первоначальный автор мог ошибиться. Чтобы уточнить, из новой и улучшенной C # 6.0 :

Функции тела выражения - еще одно упрощение синтаксиса в C # 6.0. Это функции без тела оператора. Вместо этого вы реализуете их с помощью выражения, следующего за объявлением функции.

Чтобы было ясно, это не делает метод или свойство выражением . Он использует синтаксис Expression для сокращения строк кода (и количества фигурных скобок).

Моя первоначальная рекомендация остается в силе: используйте ее, когда она делает ваш код очевидным и легче для понимания, а не просто потому, что вы можете его использовать.


2
Это не имеет никакого смысла. "ограничить это простыми выражениями и утверждениями "? А? Он даже не работает с утверждениями, только с выражениями! Я также не уверен, что добавление беспорядка (две скобки и returnключевое слово) может когда-либо привести к большей читабельности. В конце концов, сложное выражение - все то же самое сложное выражение, только похороненное в синтаксическом беспорядке.
Йорг Миттаг,

3
Из того, что я прочитал, члены тела с выражениями не являются выражениями. Это синтаксический сахар. Если спецификация C # не изменилась со времени публикации в блоге, она поддерживает методы с возвращаемыми типами void.
Грег Бургхардт

1
Я могу ошибаться, но я считаю, что побочные эффекты запрещены в выражениях выражений. Поэтому для меня преимущество выражений выражений состоит в том, что вы говорите читателю, что это «выражение» чисто и что нет никаких скрытых побочных эффектов, которые вам, читателю, нужно искать.
Джон

1
@ Джон "запрещено" совершенно не так. Вы можете выполнить все действия, такие как создание действия, в объявлении действий установить переменные-члены и затем вызвать действие. Следовательно, побочные эффекты явно не запрещены. Я бы определенно отговорил их, хотя они упускают смысл синтаксиса выражения.
Мафия

@Mafii. Спасибо. С тех пор я узнал, что вы можете делать «выражения высказываний», которые были описаны как «современные». Для меня, однако, сама идея просто сбивает с толку.
Джон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.