C # тип пустоты - безопасность - PullRequest
5 голосов
/ 12 сентября 2009

Я просто новичок в программировании на C # (из C ++)

Мой вопрос: В C # каждый тип наследуется от Object Почему «void» не работает? Может ли это вызвать некоторые проблемы безопасности RT / type или это просто семантика / синтаксис?

(я знаю, что int / char и т. Д. Используется "базовый тип" и бокс / распаковка - мой вопрос относится к пустоте)

Спасибо

Ответы [ 5 ]

11 голосов
/ 12 сентября 2009

В C # void - это ключевое слово, которое используется в двух контекстах:

  • В контексте сигнатур методов void указывает на отсутствие возвращаемого типа; это не относится к типу "void", который может наследоваться от object.

    (В отражении всегда следует указывать тип возврата. По этой причине в каркасе есть тип System.Void, но void и System.Void нельзя использовать взаимозаменяемо.)

  • В небезопасном контексте void* - это тип указателя на неизвестный тип. Как упоминалось в сообщении в блоге , связанном с @ Colin Mackay , типы указателей не наследуются от object, хотя их можно преобразовать в один.

8 голосов
/ 12 сентября 2009

Не все наследует от Объекта - это обычный миф. Интерфейсы не наследуются от Object.

См. Это для более подробной информации: http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx

1 голос
/ 12 сентября 2009

В отличие от C ++, C # позволяет ключевому слову void только указывать, что метод не имеет возвращаемого типа.

В C # ключевое слово void недопустимо в качестве параметра метода. Однако в C ++ void можно использовать для указания «универсального» указателя.

Одно предостережение к этому правилу - это использование небезопасного кода , которое обычно не требуется в C #.

РЕДАКТИРОВАТЬ: Вопреки тому, что опубликовали некоторые другие, есть разница между void и System.Void. В дополнение к структуре System.Void есть ключевое слово void. Ключевое слово используется, чтобы указать, что у метода нет возвращаемого типа. System.Void, с другой стороны, используется в отражении, чтобы спросить, какой тип возвращает метод (могут быть другие варианты использования System.Void, но я не знаю ни о каком).

C # void ключевое слово
C ++ void ключевое слово

0 голосов
/ 12 сентября 2009

Void - это Тип, но методы, которые возвращают void, ничего не помещают в стек. System.Void объявлен как структура, поэтому он также должен наследовать от объекта, но обрабатывается по-другому. Это станет более понятным, если вы посмотрите на код IL, после вызова метода, возвращающего void, нет инструкции pop, которая обычно используется для удаления неиспользуемых возвращаемых значений из стека.

РЕДАКТИРОВАТЬ: На самом деле, я проверил. Если я объявляю метод как возвращающий System.Void, я получаю сообщение об ошибке, в котором говорится, что System.Void нельзя использовать из кода C #. Но попробуйте следующее:

typeof(object).IsAssignableFrom(typeof(void))
typeof(System.ValueType).IsAssignableFrom(typeof(void))

, который вернет true, поэтому void наследуется от объекта и System.ValueType (т.е. struct)

0 голосов
/ 12 сентября 2009

Пустота не является типом объекта. Это тип ничего. По крайней мере, в C #, единственный раз, когда вы используете слово void как тип возвращаемого значения функции, так что это означает, что функция ничего не возвращает. Несуществование чего-либо не может происходить ни от чего. Единственное место, где его можно использовать, находится в небезопасном контексте, ссылаясь на указатели, которые также не являются производными от Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...