TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #2197 2.33K
День 1818. #ЗаметкиНаПолях
Создаём Защитные Предложения

Защитные предложения (Guard Clause) в .NET — это простые проверки данных или условий в начале функции или метода.

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

Обычно проверка входных данных выглядит примерно так:
public class Person
{
public string Name { get; private set; }
public Person(string name)
{
if (string.IsNullOrEmpty(name))
throw new ArgumentException(
"Имя не может быть пустым.",
nameof(name));

Name = name;
}
}

Здесь всё просто. Спорный вопрос про выброс исключения в случае невалидных данных, но сейчас не об этом. Что здесь не так? В принципе, всё нормально, кроме читаемости кода. А что, если проверок будет больше?

Создадим статический метод для проверки условий.
public static class Ensure
{
public static void NotNullOrEmpty(
string? value,
[CallerArgumentExpression("value")]
string? paramName = null)
{
if(string.IsNullOrEmpty(value))
throw new ArgumentException(
"Значение не может быть пустым",
paramName);
}
}

Здесь вместо того, чтобы постоянно передавать имя параметра, для которого выдаётся исключение, мы используем атрибут CallerArgumentExpression, передавая ему имя нужного параметра. Во время выполнения это значение будет прочитано и присвоено атрибуту paramName.

Теперь работа по проверке условий и выбросу исключений ложится на отдельный класс, а код проверяемого класса проще:
public Person(string name)
{
Ensure.NotNullOrEmpty(name);

//…
}


Многие разработчики уже создали качественные библиотеки для этой же цели.
Вот некоторые из них:
- Ardalis
- Dawn
- Throw

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

Источник: https://stefandjokic.tech/posts/how-to-create-dotnet-custom-guard-clause
  • 👍 24
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →