Подтвердить что ты не робот

Что такое дефолт, а почему нет переопределения?

Во время выполнения проверки кода я нашел код, который мог бы сократить потенциальные ошибки, используя шаблон объекта Null. Затем я начал думать: не было бы полезно, если значение по умолчанию для этого бизнес-объекта было нулевым объектом вместо нулевой ссылки?

Поскольку С# предоставляет оператор по умолчанию, я попытался перегрузить его следующим образом:

public static MyObject operator default (MyObject object) 
{
    return MyObject.Null;
}

Это дает мне ошибку: "Ожидается перегружаемый унарный оператор". При дальнейшем копании я обнаружил, что в одной части документов указано, что значение по умолчанию (T) является оператором Primary: Перегружаемые операторы.

И когда вы на самом деле нажимаете на значение по умолчанию (T) на приведенной выше странице, оно говорит, что по умолчанию это ключевое слово.

Кроме того, на этой странице не указано, что значение по умолчанию не является перегружаемым: Перегружаемые операторы (Руководство по программированию на С#).

Я знаю, что это своего рода академический, но я пытаюсь понять язык глубже. Что такое по умолчанию (T)? Это оператор или ключевое слово? И почему это не перегружает (с точки зрения дизайна языка)?

UPDATE: Да, я прочитал спецификацию языка С# 7.5.13, и я знаю, что делает язык. Я пытаюсь понять, почему.

4b9b3361

Ответ 1

Перегрузка default значительно усложнит конструкцию С# и время выполнения. В настоящее время предполагается, что двоичное обнуление любого типа значения допустимо и эквивалентно default этого типа значения. А для ссылок ссылка null всегда действительна и эквивалентна default любого ссылочного типа.

Это позволяет runtime запускать конструкторы на объектах в двоичном нулевом состоянии и получать нормальное поведение.

Ответ 2

Ответ CodeInChaos в основном определяется. Несколько дополнительных мыслей.

Предположим, вы создали массив из тысячи ваших объектов. Должен ли каждый элемент вновь выделенного массива инициализироваться значением по умолчанию? Должен ли оператор вызываться тысячу раз?

Что делать, если оператор возвращает разные значения в разное время?

Что делать, если оператор генерирует исключение?

В этом сценарии можно заметить, что частично инициализированный объект находится в состоянии "pre-default-value"?

Предположим, что MyObject.Null - это поле. Каково значение поля перед запуском оператора по умолчанию? Наблюдается ли это? Можете ли вы перейти в бесконечный цикл, пытаясь установить MyObject.Null в значение по умолчанию, которое является MyObject.Null?

И так далее. Это те вопросы, с которыми приходится сталкиваться разработчикам языка при рассмотрении таких функций. Большую часть времени решение состоит в том, чтобы не выполнять функцию, а не пытаться найти ответы на все эти сложные проблемы.

Спасибо, что указали, что документация недостаточна; Я расскажу об этом менеджеру документации.

Чтобы ответить на ваши дополнительные вопросы:

В С# есть три варианта использования "default".

Оператором "по умолчанию" является оператор. Это оператор, аргументом которого должно быть имя типа, например, оператор typeof или оператор sizeof. Эта функция была добавлена ​​в С# 2.0, потому что она удобна, когда у вас есть генерики в системе типов.

"default" также может использоваться для обозначения случая по умолчанию оператора switch.

И, наконец, "default" может использоваться как часть директивы "препроцессора".

"default" - зарезервированное ключевое слово языка С# и было с С# 1.0.

Ответ 3

Тогда я начал думать: не так ли? полезно, если значение по умолчанию этого бизнес-объект был нулевым объектом вместо нулевой ссылки?

Похоже, ваш проект выиграл бы от использования контейнера IOC, который мог бы добавить экземпляр NullBusinessObject по умолчанию, который делает все, что вы хотите, чтобы он выполнял по умолчанию. Сам С# не предлагает ничего встроенного, что вы могли бы переопределить в этом отношении.

Ответ 4

default(T) обычно "zeros-out" создает нулевую ссылку для классов и обнуленную версию типов значений (struct in С#). default - это ключевое слово в С# и оператор в MSIL. С# не позволяет переопределять значение по умолчанию.