Члены в виде выражений
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 14 из 70.
Члены в виде выражений обеспечивают краткий синтаксис для членов, содержащих только одно выражение. Вместо написания полных тел методов или свойств с фигурными скобками используется синтаксис со стрелкой =>.
Для методов, которые возвращают одно выражение, вы можете заменить все тело:
// Традиционный метод
public int Add(int a, int b)
{
return a + b;
}
// Метод с телом-выражением
public int Add(int a, int b) => a + b;Этот синтаксис работает и для свойств только для чтения, с которыми вы уже кратко ознакомились:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Вы также можете использовать тела выражений для геттеров и сеттеров свойств по отдельности:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Даже конструкторы могут использовать этот синтаксис, если они содержат одну инструкцию:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Члены с телом-выражением делают ваш код более читаемым, когда логика проста. Используйте их для простых операций, но придерживайтесь традиционных тел, когда вам требуется несколько инструкций или сложная логика.
Задание
ЛегкоДавайте создадим калькулятор стоимости товаров, который продемонстрирует возможности членов, возвращающих выражение (expression-bodied members), для написания чистого и лаконичного кода.
Вы создадите два файла для организации вашего кода:
Product.cs: Определите классProductв пространстве именStore. Этот класс должен демонстрировать различные члены, возвращающие выражение:- Автоматически реализуемые свойства
Name(string) иBasePrice(decimal) - Конструктор, возвращающий выражение, который устанавливает оба свойства
- Свойство только для чтения, возвращающее выражение,
TaxAmount, которое рассчитывает 10% от базовой цены - Свойство только для чтения, возвращающее выражение,
TotalPrice, которое возвращает базовую цену плюс сумму налога - Метод, возвращающий выражение,
GetDiscount(decimal percentage), который возвращает сумму скидки (базовая цена, умноженная на процент и деленная на 100) - Метод, возвращающий выражение,
GetFinalPrice(decimal discountPercentage), который возвращает общую стоимость за вычетом скидки
- Автоматически реализуемые свойства
Program.cs: В основном файле создайте объектProduct, используя входные значения, а затем выведите разбивку его стоимости.
Вы получите три входных значения:
- Название продукта
- Базовая цена
- Процент скидки для применения
Выведите детали ценообразования в следующем формате:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Например, если входные данные — Laptop, 1000 и 15, вывод должен быть следующим:
Product: Laptop
Base Price: 1000
Tax (10%): 100
Total Price: 1100
Discount (15%): 150
Final Price: 950Не забудьте использовать синтаксис стрелки => для всех членов, которые содержат одно выражение. Это делает ваш код чистым и читаемым!
Шпаргалка
Члены с телом-выражением используют синтаксис со стрелкой => для членов, содержащих одно выражение, предоставляя краткую альтернативу традиционным телам методов и свойств.
Методы с телом-выражением:
// Традиционный метод
public int Add(int a, int b)
{
return a + b;
}
// Метод с телом-выражением
public int Add(int a, int b) => a + b;Свойства только для чтения с телом-выражением:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Геттеры и сеттеры свойств с телом-выражением:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Конструкторы с телом-выражением:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Используйте члены с телом-выражением для простых операций. Для нескольких операторов или сложной логики используйте традиционные тела.
Попробуйте сами
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// TODO: Создайте объект Product, используя введенные значения
// TODO: Рассчитайте сумму скидки, используя метод GetDiscount
// TODO: Рассчитайте итоговую цену, используя метод GetFinalPrice
// TODO: Выведите детали ценообразования в требуемом формате:
// Product: {Name}
// Base Price: {BasePrice}
// Tax (10%): {TaxAmount}
// Total Price: {TotalPrice}
// Discount ({percentage}%): {discountAmount}
// Final Price: {finalPrice}
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов