Здравствуйте, vmpire, Вы писали:
V>Вот на возвращаемые значения аннотаия [NotNull] с предупреждением компилятора бы не помешала (хоть и не спасла бы).
V>А какие-то средства языка или типы специально для этого — не нужно, будет только больше путаницы.
Вот в таком виде мне это нравится намного больше!
Вместо загромождения кода "атрибутами для бестолковых индусов", будет две вещи: [NotNull] для возвращаемых значений + компилятор будет проверять, что переменная получает non-null инициализацию перед использованием.
В моей практике я весьма редко огребаю NRE, чаще капризничают конструкторы с неправильными аргументами.
К слову, упомянутая string.Substring — пример, за который можно увольнять практически сразу — какая-то бестолочь вместо пары проверок выхода за границы И КОРРЕКЦИИ ГРАНИЦ, предпочла капризно бросаться иксепшенами, портя кровь практически 100% разработчиков. Пример:
var s = UserInput();
var FirstTwoLetters = s.Substring(0, 2);
if (FirstTwoLetters == "RU") ...
Вот скажите, ну не всё равно, ЧТО там ввёл юзер и какой длины? Важно то, что даже если он ввёл что-то некорректное, мы УМЕЕМ обрабатывать этот случай. Сейчас же ты, вместо бизнес задач, вынужден танцевать вокруг идиота, писавшего substring, чтоб не дай бог ты не запросил длину больше, чем строка! Катастрофа, полундра, собирайте весь коллектив, будем разбирать, зачем Володька сбрил усы!
Это как раз пример того, чего мы ДОЛЖНЫ избежать, занимаясь non-null магией — чтобы юзерский код не превращался в месконечную мешанину проверок там, где их спокойно можно опустить.