Члены в виде выражений
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy. Урок 14 из 70.
Expression-bodied члены предоставляют краткий синтаксис для членов, содержащих только одно выражение. Вместо написания полных тел методов или свойств с фигурными скобками используется стрелочный синтаксис =>.
Для методов, возвращающих одно выражение, можно заменить всё тело:
// Традиционный метод
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;
}Члены с телом-выражением делают ваш код более читаемым, когда логика проста. Используйте их для простых операций, но придерживайтесь традиционных тел, когда вам нужны несколько инструкций или сложная логика.
Задание
ЛегкоДавайте создадим калькулятор стоимости продукта, демонстрирующий возможности членов, определённых выражениями, для написания чистого и лаконичного кода.
Вы создадите два файла, чтобы организовать свой код:
Product.cs: DefineProductclass в пространстве имёнStore. Этот класс должен демонстрировать различные члены, определённые выражениями:- Свойство auto-implemented
Name(string) иBasePrice(decimal) - Конструктор, определённый выражением, который задаёт оба свойства
- Свойство только для чтения, определённое выражением,
TaxAmount, которое calculates 10% от базовой цены - Свойство только для чтения, определённое выражением,
TotalPrice, которое возвращает базовую цену плюс сумму налога - method, определённый выражением,
GetDiscount(decimal percentage), который возвращает сумму discount (базовая цена, умноженная на percentage и делённая на 100) - method, определённый выражением,
GetFinalPrice(decimal discountPercentage), который возвращает общую цену minus discount
- Свойство auto-implemented
Program.cs: В вашем основном файле создайтеProduct, используя входные значения, а затем выведите разбивку его стоимости.
Вы получите три входных значения:
- Название продукта
- Базовая цена
- Процент discount для применения
Выведите сведения о стоимости в следующем формате:
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}". Это относится в равной степени к базовой цене, налогу, общей цене, discount и итоговой цене.
Не забудьте использовать синтаксис стрелки => для всех членов, содержащих одно выражение. Это сохраняет ваш код чистым и понятным!
Попробуйте сами
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'Необязательные параметрыИменованные аргументыПерегрузка методовПотренируйтесь самостоятельно: Онлайн-компилятор C#