0Pricing
C# Academy · Урок

Шаблоны защитных проверок и валидации

Рано проверяйте входные данные с помощью защитных условий, выбрасывайте подходящие исключения и используйте проверки в стиле TryParse для пользовательских данных.

«Шаблоны защитных проверок и валидации» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Зачем нужны защитные проверки

Цель: сделать методы безопасными и понятными.

  • Используйте защитные условия в начале метода
  • Выбрасывайте конкретные исключения (ArgumentNullException, ArgumentOutOfRangeException)
  • Используйте TryParse для пользовательских входных данных
  • Завершайте выполнение при первой ошибке; избегайте глубокой вложенности

Демонстрация ранних защитных проверок

Добавляйте небольшие проверки в начале метода, чтобы проверять аргументы; выбрасывайте конкретные исключения, чтобы вызывающий код понимал причину ошибки.

using System;

// Demo: validate inputs at the top; keep main logic flat.
public class Program
{
  // Compute price with simple rules; guard early.
  public static decimal ComputePrice(string sku, int qty, decimal unitPrice)
  {
    if (sku == null) throw new ArgumentNullException("sku");
    if (sku.Length == 0) throw new ArgumentException("sku must not be empty", "sku");
    if (qty <= 0) throw new ArgumentOutOfRangeException("qty", "qty must be > 0");
    if (unitPrice < 0m) throw new ArgumentOutOfRangeException("unitPrice", "unitPrice must be >= 0");

    // Main logic stays simple
    decimal subtotal = qty * unitPrice;
    if (qty >= 10) subtotal = subtotal * 0.9m; // small bulk discount
    return subtotal;
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ComputePrice("ABC", 2, 5m));   // ok
    try { Console.WriteLine(ComputePrice("", 2, 5m)); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name); }
  }
}

Вспомогательный класс Guard

Вынесите общие проверки в небольшой класс Guard, чтобы тела методов оставались чистыми и единообразными.

using System;

// Minimal static helper for common validations (beginner friendly).
public static class Guard
{
  public static void NotNull(object value, string name)
  {
    if (value == null) throw new ArgumentNullException(name);
  }

  public static void NotNullOrEmpty(string value, string name)
  {
    if (value == null) throw new ArgumentNullException(name);
    if (value.Length == 0) throw new ArgumentException(name + " must not be empty", name);
  }

  public static void InRange(int value, int minInclusive, int maxInclusive, string name)
  {
    if (value < minInclusive || value > maxInclusive)
      throw new ArgumentOutOfRangeException(name, "Expected " + minInclusive + ".." + maxInclusive);
  }
}

public class Program
{
  static int ScoreFor(string userId, int level)
  {
    Guard.NotNullOrEmpty(userId, "userId");
    Guard.InRange(level, 1, 10, "level");
    // pretend logic
    return level * 100;
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ScoreFor("u42", 3));
    try { Console.WriteLine(ScoreFor(null, 3)); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name); }
  }
}

Проверка с помощью TryParse

Для обычных некорректных входных данных предпочитайте методы в стиле TryParse, которые возвращают false, а не выбрасывают исключения.

using System;

// Use TryParse for user-provided text; avoid throwing for normal invalid input.
public class Program
{
  public static bool TryGetPort(string text, out int port)
  {
    port = 0;
    int value;
    if (!int.TryParse(text, out value)) return false;
    if (value < 1 || value > 65535) return false;
    port = value;
    return true;
  }

  public static void Main(string[] args)
  {
    int p;
    Console.WriteLine("8080 -> " + (TryGetPort("8080", out p) ? ("ok " + p) : "invalid"));
    Console.WriteLine("abc -> " + (TryGetPort("abc", out p) ? ("ok " + p) : "invalid"));
  }
}

Исключение или возврат

  • Выбрасывайте исключение при ошибках программиста (неправильное использование API, недопустимое значение null, выход за диапазон)
  • Возвращайте false или результат при обычных ошибках пользователя (некорректный текст)
  • Используйте конкретные типы исключений; указывайте имя параметра
  • Проверяйте снаружи внутрь: сначала выполняйте дешёвые проверки

Рекомендации

Советы:

  • Проверяйте данные на границах (контроллеры, публичные API)
  • Предпочитайте небольшие методы защитных проверок глубокой вложенности
  • Пишите короткие и понятные сообщения об ошибках
  • Записывайте ошибку в журнал один раз на границе, а не в каждой защитной проверке

Значение защитного условия

Быстрая проверка: какое описание лучше всего объясняет защитное условие?

Повторение

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

Часто задаваемые вопросы

Урок «Шаблоны защитных проверок и валидации» бесплатный?

Да — полный текст урока «Шаблоны защитных проверок и валидации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Шаблоны защитных проверок и валидации»?

Рано проверяйте входные данные с помощью защитных условий, выбрасывайте подходящие исключения и используйте проверки в стиле TryParse для пользовательских данных. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.

Сколько времени занимает урок «Шаблоны защитных проверок и валидации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Абстракции журналирования, Debug/Trace
  2. Основы профилирования и трассировки (концепции)
  3. Шаблоны защитных проверок и валидации
← Назад к C# Academy