TGViewer
C# Heppard C# Heppard @csharp_gepard · 1.65K subscribers
Post #127 2.73K
Атрибут DoesNotReturn #решение

Когда мы пишем оптимальный код, мы пытаемся вынести выброс Exception за пределы тела метода, чтобы упростить inline. Типичная ситуация выглядит следующим образом:

public object MyMethod() {
var data = ...
if (data == null) {
Error.MyError("msg");
}
return data;
}

public static Error {
public static void MyError(string msg) {
throw new Exception(msg);
}
}


В этом случае статический анализатор (конечно, при включённом nullable annotations) вежливо подсказывает - data может быть null (см. скриншот). Это правильно и нормально, так как возвращаемое значение метода не отмечено как object?, то есть оно не допускает значение null.

Некоторе, в подобной ситуации, кричат на код ("я знаю что делаю, дурацкая ты железка"), просто делая return data!. Однако, когда код будет меняться и разрастаться, логика первоначального создателя может изменится или утратиться, а криков на код станет больше.

Есть, однако, другое решение, которое я подсмотрел в BCL - атрибут DoesNotReturn. Этот атрибут указывает компилятору, что метод или свойство никогда не возвращает значение. Другими словами, он всегда создаёт исключение (выполнение вызывающего метода прекратится).

Обладая этими нехитрыми знаниями, мы просто добавляем атрибут DoesNotReturn для всех методов, которые выбрасывают ошибку и убираем крики на код. Просто и красиво.

[DoesNotReturn]
public static void MyError(string msg) {
throw new Exception(msg);
}


Более подробно про помощь компилятору можно прочитать тут и тут. Там же много других полезных атрибутов, которые помогут меньше кричать на код, а значит сделать его красивее и понятнее. Кажется, что все эти атрибуты особенно важны для библиотечного кода, тогда как в обычном коде они представляются мало востребованными.
  • 👍 50
  • 🔥 8
  • 🤨 3
More from @csharp_gepard
  1. Mar 13, 2026Ozon Tech Community .NET Meetup 24 марта, лофт Casa Picassa, 19:00 Ищем способы бороться с…
  2. Jan 20, 2026Ещё одна история про память #отдых Судя по комментариям специалистов и ценам на RAM в мага…
  3. Nov 25, 2025FastEnum #скорость Иногда нам нужно не просто быстро, а очень быстро. В этот момент в дело…
  4. Nov 20, 2025UnsafeAccessor #скорость Иногда возникает странное желание изменять приватные поля в класс…
  5. Nov 17, 2025Latency numbers every programmer should know Я всё время теряю эти циферки, особенно когда…
  6. Oct 29, 2025Dictionary.TryGetValue #скорость Уж сколько лет прошло и, вроде, все это знают. Но, тем не…
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 →