Обновить

Комментарии 23

Меня, честно говоря, пугают последние изменения в шарпе. Вместо того, чтобы стимулировать людей писать код с большим количеством переменных, где в любом месте можно поставить breakpoint и легко его продебажить, зачем-то идут в сторону уменьшения количества кода.

А потом ты такой сидишь и смотришь на метод с expression body, который вызывает другой метод, которому в параметры передаётся результат ещё какого-то метода, да теперь ещё и у которого в параметры передаётся строка с интерполяцией, где теперь ещё и многострочное выражение. И во всём этом хаосе где-то случается exception, а ты даже не понимаешь, как его продебажить...

В начале казалось, что работают над читабельностью кода, но похоже что последние изменения чистый маркетинг. Чтоб потом можно было сказать, что поднять сервер можно в "две строчки" и пофиг, что в этих строчках будет сотня вызовов и десятки функций. Скоро введут иероглифы, чтоб одним символом вызвать какую то встроенную конструкцию...

По крайней мере в райдере можно несколько брейкпоинтов в одной строке ставить (на каждое выражение)

Хотите много кода - пишите на Java.

myMethod(string param1!!, string megaparam!!, string megaparam3!!, string megaparam4!!)

Выглядит и читается крайне плохо. Лучшего синтаксиса они похоже не нашли.

myMethod(string! param1, string! megaparam, string! megaparam3, string! megaparam4)  

Хотя когда то давно было предложение расширить синтаксис для code contracts вот так:

myMethod(string param1, string megaparam, string megaparam3, int megaparam4)
	require param1 not null, megaparam not null, megaparam4 > 0
{
}

Да в чем проблема-то была с [NonNull] string myParam? Все эти символы выглядят все хуже и хуже (привет оператору "летающая тарелка").

Кроме того есть ??. Почему его нельзя было расширить и сюда тоже? Почему нельзя вставить свое исключение после !!. Почему наконец именно два !! а не один и не три?

Выглядит плохо. Полезность под вопросом.

А в чем польза рантайм проверки на null при наличии возможности проверки перед компиляцией?

Может 2 потому что 1 уже занят?

Учитывая что они в разных грамматических контекстах используются, можно было бы и переиспользовать

https://endjin.com/blog/2022/02/csharp-11-preview-parameter-null-checking

Тут разъяснение почему это не может быть частью типа.

По хорошему это должно быть расширяемо.

А вообще неясно какую реальную проблему это решает.

Из примера разве что нельзя писать сегодня кратко f(a!! => a.b());

И проверки на null будут в начале метода как полагается до всей логики, а не как пишут некоторые:

this._a = a ?? throw new Exception();

this._b = b ?? throw new Exception();

Так чем отличается

string param1!!

[nonnull ]string param1!!

[nonnull ]string param1

[nonnull ]string? param1!!

[nonnull ]string? param1

string? param1!!

Атрибут и знак вопроса (или его отсутствие) - это советы для IDE, которая будет выдавать предупреждение, если в коде написать вызов с нулевым переметром. Но при этом на рантайм они никак не влияют.

Забавно то, что в коде, с которым мне приходилось иметь дело, для string самая частая проверка это IsNullOrEmpty, а не просто на null и тут получается, что для string параметров все равно if писать придется.

А еще есть массивы, которые проверяют не только на null, но и на Length>0, а так же элементы массива на null + если массив строк, то и IsNullOrEmpty :)

"Проверка Parameter на null" — эта же вещь нужна только если <Nullable>disable</Nullable>, так ведь?

Эта штука нужна если вы пишете библиотеку с публичным API. Вы ведь не можете полагаться на то, что у пользователя вашей библиотеки будут выставлены нужные вам настройки компиляции!

Если библиотека написана на C# 11 с включёнными nullability, то публичное API будет сформировано с учётом этого, нет?

Если библиотека написана на C# 11 с включёнными nullability, то у вас нет никаких гарантий что использующая библиотеку программа будет написана на C# 11 со включёнными nullability.

Самоисполняющееся пророчество, очень удобно. Да и не вижу большой пользы от замены NullReferenceException на ArgumentException - аджайловые пацаны ничего не кэтчат, а параноики кэтчат всё. Вообще, эксепшены давно пока включить в сигнатуру метода, тогда бы было меньше всего проблем.

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


Самоисполняющееся пророчество, очень удобно.

Где именно вы видите пророчество, и в чём заключается его самоисполнение?

Вы утверждаете что автору библиотеки с nullability стоит переживать о том что её могут использовать без nullability => выглядит как минус новых версий C# для тех кто еще не перешел => снижает заинтересованность в переходе на них => снижает количество проектов на них => приводит к высокой вероятности того самого использования библиотеки из не nullability контекста

Честно говоря, я долго не мог понять проблему, пока не прочитал про nullable references.
Теперь кажется понял, но чтобы убедиться: если библиотека написана на C# 11 с включёнными nullability, а программа — без nullability, то при использовании библиотечного кода, если я положу null в notnull-тип, покажется предупреждение?

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
www.skillfactory.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Skillfactory School