Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример функции на C#: CalculateDiscountedPrice
Классическим примером, демонстрирующим ключевые аспекты функций в C#, является метод расчета цены со скидкой. Рассмотрим его реализацию:
public static decimal CalculateDiscountedPrice(
decimal originalPrice,
decimal discountPercentage,
bool isTaxIncluded = false,
decimal taxRate = 20m)
{
// Валидация входных параметров
if (originalPrice < 0)
throw new ArgumentException("Цена не может быть отрицательной", nameof(originalPrice));
if (discountPercentage < 0 || discountPercentage > 100)
throw new ArgumentException("Скидка должна быть в диапазоне 0-100%", nameof(discountPercentage));
if (taxRate < 0)
throw new ArgumentException("Налоговая ставка не может быть отрицательной", nameof(taxRate));
// Расчет скидки
decimal discountAmount = originalPrice * (discountPercentage / 100);
decimal priceAfterDiscount = originalPrice - discountAmount;
// Учет налога в зависимости от флага
decimal finalPrice;
if (isTaxIncluded)
{
// Если налог уже включен, пересчитываем без его учета
decimal priceWithoutTax = priceAfterDiscount / (1 + taxRate / 100);
finalPrice = priceWithoutTax;
}
else
{
// Если налог не включен, добавляем его
decimal taxAmount = priceAfterDiscount * (taxRate / 100);
finalPrice = priceAfterDiscount + taxAmount;
}
// Округление до 2 знаков после запятой
return Math.Round(finalPrice, 2, MidpointRounding.AwayFromZero);
}
Ключевые элементы функции
1. Сигнатура метода
public— модификатор доступа, делает функцию доступной из других классовstatic— означает, что метод принадлежит классу, а не экземпляруdecimal— тип возвращаемого значения (точный тип для финансовых расчетов)- Имя метода —
CalculateDiscountedPrice(выражает назначение функции)
2. Параметры функции
// Обязательные параметры
decimal originalPrice,
decimal discountPercentage,
// Необязательные параметры со значениями по умолчанию
bool isTaxIncluded = false,
decimal taxRate = 20m
3. Пример использования
class Program
{
static void Main(string[] args)
{
try
{
// Пример 1: Расчет с базовыми параметрами
decimal price1 = CalculateDiscountedPrice(1000m, 15m);
Console.WriteLine($"Цена со скидкой 15%: {price1:C}");
// Пример 2: С указанием всех параметров
decimal price2 = CalculateDiscountedPrice(
originalPrice: 1500m,
discountPercentage: 20m,
isTaxIncluded: true,
taxRate: 18m);
Console.WriteLine($"Цена с налогом включенным: {price2:C}");
// Пример 3: Использование именованных аргументов
decimal price3 = CalculateDiscountedPrice(
discountPercentage: 10m,
originalPrice: 2000m);
Console.WriteLine($"Цена со скидкой 10%: {price3:C}");
}
catch (ArgumentException ex)
{
Console.WriteLine($"Ошибка: {ex.Message}");
}
}
}
4. Важные аспекты реализации
Валидация параметров
Функция включает проверку входных данных — это обязательная практика для production-кода:
- Проверка отрицательных значений
- Валидация диапазонов (скидка 0-100%)
- Использование исключений для индикации ошибок
Финансовые вычисления
- Использование типа
decimalвместоfloatилиdoubleдля точности - Правильное округление с указанием стратегии (
MidpointRounding.AwayFromZero) - Четкая логика учета налога (включен/не включен)
Гибкость через параметры по умолчанию
Необязательные параметры делают функцию более универсальной:
- Можно использовать стандартную налоговую ставку
- Можно явно указать все параметры для специфических случаев
Альтернативная реализация с кортежами
Для более сложных сценариев можно возвращать несколько значений:
public static (decimal discountedPrice, decimal discountAmount, decimal taxAmount)
CalculateDetailedPrice(decimal originalPrice, decimal discountPercentage, decimal taxRate)
{
decimal discountAmount = originalPrice * (discountPercentage / 100);
decimal priceAfterDiscount = originalPrice - discountAmount;
decimal taxAmount = priceAfterDiscount * (taxRate / 100);
decimal finalPrice = priceAfterDiscount + taxAmount;
return (
Math.Round(finalPrice, 2),
Math.Round(discountAmount, 2),
Math.Round(taxAmount, 2)
);
}
Принципы качественной функции
- Единая ответственность — функция делает одну четко определенную задачу
- Читаемость — понятное имя и логичная структура
- Надежность — обработка граничных случаев и ошибок
- Тестируемость — детерминированность и отсутствие скрытых зависимостей
- Документированность (в примере — через XML-комментарии в реальном коде)
Этот пример демонстрирует профессиональный подход к созданию функций в C#, учитывающий требования к безопасности, точности и поддерживаемости кода.