Хорошо, теперь перейдем к волшебному слову C # -without-null
class View
{
Model model;
public View(Model model)
{
Console.WriteLine("my model : {0}, thing : {1}", this.model, this.model.thing);
this.model = model;
}
}
Что напечатано на консоли?
- Ничего особенного при доступе к неинициализированному объекту не генерируется: Хорошо, назовите это NullReferenceException и это текущий мир.
- Он не строится, пользователю нужно было указать значение при объявлении модели, см. Последний пункт, поскольку он дает тот же результат.
- Некоторое значение по умолчанию для модели и какое-то значение по умолчанию для вещи: Хорошо, раньше с null у нас, по крайней мере, был способ узнать, был ли экземпляр правильным, теперь компилятор генерирует странные двойники, которые ничего не содержат, но все еще недействительны как модель объекты...
- Что-то, определяемое типом объектов: лучше, поскольку мы могли бы определить конкретное недопустимое состояние для каждого объекта, но теперь каждый объект, который может быть недопустимым, должен независимо реализовать это вместе со способом идентификации этого состояния вызывающей стороной ...
Так что в основном для меня это, похоже, ничего не решает, чтобы удалить нулевое состояние, поскольку возможно недопустимое состояние все равно нужно управлять ...
О, купите путь, какое значение будет по умолчанию для интерфейса? Да, и абстрактный класс, что произойдет, когда метод будет вызван со значением по умолчанию, которое определено в абстрактном классе, но которое вызывает другой абстрактный метод? .... .... Зачем усложнять модель, это снова вопросы множественного наследования!
Одним из решений было бы полностью изменить синтаксис, чтобы перейти на полнофункциональный, где нулевой мир не выходит, только Maybes, когда вы хотите, чтобы они существовали ... Но это не C-подобный язык и многопарадигмальность из .Net будет потеряно.
Чего может не хватать, так это оператора с нулевым распространением, способного возвращать null в model.Thing
, когда модель имеет значение NULL, например model.?.Thing
Ну и напоследок ответим на ваш вопрос:
- Текущая библиотека классов развивалась после фиаско Microsoft-Java, и C # был создан как «улучшенная Java», поэтому изменение системы типов для удаления нулевых ссылок было бы большим изменением. Им уже удалось ввести ценностные типы и убрать ручной бокс!
- Как видно из введения типа значения, Microsoft много думает о скорости ... Тот факт, что значение по умолчанию для всех типов соответствует нулевой заливке, действительно важен, например, для быстрой инициализации массива. В противном случае инициализация массивов справочных значений потребовала бы особого внимания.
- Без нулевого взаимодействия с C было бы невозможно, поэтому, по крайней мере, на уровне MSIL и в небезопасном блоке им нужно позволить выжить.
- Microsoft хотела использовать фреймворк для VB6 ++, удалив
Nothing
, как он называется в VB, радикально изменил бы язык, пользователям уже потребовались годы, чтобы переключиться с VB6 на VB.Net, такое изменение парадигмы могло быть фатальным для языка.
person
Julien Roncaglia
schedule
01.03.2011
Nullable
ничего не упрощает. К сожалению, проверки на null (хотя в некоторых случаях это удобно, но, возможно, усложняет ситуацию!). Он ограничен только типами значений и не имеет языковой поддержки для сопоставления с образцом: он все еще должен быть защищен ошибочными условными выражениями, если необходимо проверить нулевое состояние (например, когда просто получить значение или значение по умолчанию или ?? т работать). - person   schedule 01.03.2011null
существует в основных языках объектно-ориентированного программирования (C ++, Java, C #, Python, Obj-C, JavaScript, даже Scala и т. Д.) - но в этих языках нет ничего, что требовалоnull
- я подозреваю большая часть из-за 1) того, как работает язык X или 2) того, как работает язык X (нет, потому что это необходимая причина). Его можно было бы полностью заменить подходящим типом Option / Maybe на уровне языка (но тогда это был бы совершенно другой язык, но все же мог быть объектно-ориентированный объектно-ориентированный полиморфный подтип. !). Также рассмотритеNULL
в не-OO-C. - person   schedule 01.03.2011null
сам по себе является полезным понятием только постольку, поскольку он запрограммирован в памяти как таковой - необходимость знать, что чего-то не хватает, действительно полезно. Однако идиоматическая поддержка концепцииnull
... гораздо менее полезна для современного статически типизированного языка. В Java была предпринята попытка ввести@notnull
, который указывает (imoho), что ничто не является общей проблемой типа, не решаемой с помощьюnull
- person   schedule 06.03.2011