Члены в виде выражений
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 14 из 70.
Члены Expression-bodied предоставляют лаконичный синтаксис для членов, содержащих only одно expression. Вместо написания полных тел для method или свойств с фигурными скобками вы используете стрелочный синтаксис =>.
Для методов, которые возвращают одно выражение, вы можете заменить всё тело целиком:
// Традиционный метод
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;
}Вы также можете использовать тело выражения (expression body) для геттеров и сеттеров свойств по отдельности:
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 члены делают ваш код более читаемым, когда логика проста. Используйте их для простых операций, но придерживайтесь традиционного тела метода, когда вам требуется несколько инструкций или сложная логика.
Задание
ЛегкоДавайте создадим калькулятор стоимости продуктов, который продемонстрирует возможности членов с методом реализации через выражение (expression-bodied members) для написания чистого и лаконичного кода.
Вы создадите два файла для организации вашего кода:
Product.cs: Определите классProductв пространстве именStore. Этот класс должен демонстрировать различные членов с реализацией через выражение:- Автоматически реализуемое свойство
Name(string) иBasePrice(decimal) - Конструктор с реализацией через выражение (expression-bodied), который устанавливает значения обоих свойств
- Свойство только для чтения
TaxAmountс реализацией через выражение, которое рассчитывает 10% от базовой цены (base price) - Свойство только для чтения
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.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00Форматируйте каждое денежное значение ровно до двух знаков после запятой — например, value.ToString("F2") или $"{value:F2}". Это относится к базовой цене, налогу, итоговой сумме, скидке и финальной цене.
Не забудьте использовать синтаксис стрелки => для всех членов, которые содержат одно выражение. Это делает ваш код чистым и читаемым!
Попробуйте сами
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());
// Создать объект Product, используя входные значения
Product product = new Product(name, basePrice);
// Вычислить сумму скидки с помощью метода GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// Вычислить итоговую цену с помощью метода GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// Вывести детали ценообразования в требуемом формате:
Console.WriteLine($"Product: {product.Name}");
Console.WriteLine($"Base Price: {product.BasePrice:F2}");
Console.WriteLine($"Tax (10%): {product.TaxAmount:F2}");
Console.WriteLine($"Total Price: {product.TotalPrice:F2}");
Console.WriteLine($"Discount ({discountPercentage}%): {discountAmount:F2}");
Console.WriteLine($"Final Price: {finalPrice:F2}");
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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'Необязательные параметрыИменованные аргументыПерегрузка методов