Хорошо, теперь переходите к волшебному слову 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 будет потеряна.
Чего не хватает, так этораспространяющий нуль оператор, способный возвращать ноль в model.Thing
, когда модель нулевая, например model.?.Thing
Да, и на всякий случай ответ на ваш вопрос:
- Текущая библиотека классов развивалась после того, как разгром Microsoft-Java и C # был построен как «лучше-Java», поэтому изменение системы типов для удаления нулевых ссылок было бы большим изменением.Им уже удалось ввести типы значений и убрать ручную упаковку!
- Поскольку введение типов значений показывает, что Microsoft много думает о скорости ... Тот факт, что значение по умолчанию для всех типов соответствует нулевой заливке, действительно важендля быстрой инициализации массива, например.В противном случае для инициализации массивов эталонных значений потребовалась бы особая угроза.
- Без нулевого взаимодействия с C было бы невозможным, поэтому, по крайней мере, на уровне MSIL и в небезопасном блоке им нужно было бы выжить.
- Microsoft хотела использовать каркас для удаления VB6 ++
Nothing
, так как он вызывается в VB, радикально изменил бы язык, пользователям потребовались годы, чтобы переключиться с VB6 на VB.Net, такое изменение парадигмы могло бытьфатально для языка.