Является ли все в .NET объектом? - PullRequest
48 голосов
/ 12 января 2009

Пожалуйста, помогите нам разрешить спор о "Почти" все является объектом ( ответ на вопрос переполнения стека Как новичок, есть ли что-то, что я должен остерегаться, прежде чем изучать C # ). Я думал, что это так, потому что все в Visual Studio, по крайней мере, выглядит как структура. Пожалуйста, опубликуйте ссылку, чтобы она не стала "современным ослом" ( This American Life ).

Обратите внимание, что этот вопрос относится к C #, а не обязательно к .NET, и к тому, как он обрабатывает данные под капотом (очевидно, это все 1 и 0).

Вот комментарии к «все является объектом»:

  • Эх, нет, это не так. - Двоичный Беспорядок
  • Я бы хотел пример ... - scotty2012
  • не все происходит от базовый тип объекта? - Ризель
  • Большинство вещей являются объектами ... - Омар Kooheji
  • Типы значений, целые, двойные, объект ссылки (не объекты их Я) и т. д. не являются объектами. Они могут быть "упакованным", чтобы выглядеть как объекты (например, i.ToString ()) но на самом деле они примитивные типы. Изменить запись на «РЫЧАГ - это все» Я уберу понижающий голос - Бинарный Worrier
  • Я ценю разъяснения. я думаю, что самый низкий уровень, который вы можете взаимодействовать с, скажем, int, в C # есть как структура, которая не является объектом? - http://msdn.microsoft.com/en-us/library/ms173109.aspx - Ризель
  • Не наследует Int32 от ValueType который наследует от объекта? Если так, несмотря на поведение, int является объект. - Крис Фармер
  • Нет, коробочный тип для int наследуется из ValueType, который наследуется от Объект. Они не объекты в традиционный смысл, потому что а) Int это не ссылка на int, это инт. б) целые не мусор собраны. Если вы объявите Int32, тогда это int 4 байта на стек, конец истории - Binary Worrier

Определение объекта: «Объект» как наследник класса System.Object и «Объект» как экземпляр типа против «Объект» как ссылочный тип. "

Ответы [ 17 ]

2 голосов
/ 13 января 2009

Зависит от того, что вы подразумеваете под «всем» и под «объектом». Если вы определите эти два термина, ответ прост: -)

Например, в некоторых языках if-block - это объект, который может передаваться как значение, назначаться переменной и так далее. Это не так в C #, так что, очевидно, не все является объектом в C #.

0 голосов
/ 24 апреля 2009

Обращаясь к семантике, зачем перегружать слово «объект», чтобы оно означало «ссылочный тип», когда у нас уже есть совершенно хороший, недвусмысленный термин для этого -> «Тип ссылки», и когда, перегружая слово » Объект "таким образом мы создаем путаницу, которую демонстрирует этот поток ... то есть несоответствие между фактом, что все типы (включая типы значений) наследуют реализацию, определенную в типе" System.Object ". Понятно, что в лучшем случае это не нужно, а в худшем случае крайне запутанно. Даже тот факт, что документация MS иногда вызывает путаницу по этому вопросу, не является оправданием для распространения путаницы.

Гораздо проще и понятнее просто определить и использовать термин «объект» для обозначения ЛЮБОГО типа, значения или ссылки и фразу «тип ссылки» для описания типов, которые используют переменные-указатели и имеют свои состояние хранится в куче ...

0 голосов
/ 24 апреля 2009

Это обсуждение двух миров: языка и памяти.

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

Если мы говорим о C #, я не понимаю, почему кто-то использовал организацию памяти в качестве аргумента. Конечно, если бы я ответил на этот вопрос кому-то, я бы сказал: «Да, в C # все является объектом, но вы также должны знать, что под капотом он может работать по-разному в зависимости от…»

Это может послужить интересным аргументом, но может также поговорить с некоторыми: в подобном обсуждении можно сказать, что на самом деле нет объектно-ориентированного программирования, есть только процедурное программирование. ЦП понимает объекты? Более того, на самом деле нет программного обеспечения, есть только разные аппаратные состояния:)

Моя точка зрения заключается в том, что некоторые термины не переводятся на другие уровни абстракции, и вам следует придерживаться обсуждения, где оно принадлежит (в данном случае это язык, а не память).

Даже автор этого вопроса заявил: «Обратите внимание, что этот вопрос относится к C # не обязательно .NET и как он обрабатывает данные под капотом (очевидно, это все 1 и 0.)»

0 голосов
/ 13 января 2009

Учитывая, что вопрос относится к объекту в смысле ООП, ответы таковы:

С технической точки зрения ответ: Нет

С догматической точки зрения ответ: Да

Пояснение:

Технически типы значений (примитивы или структуры) не являются объектами, если они не находятся в «коробочной» форме, а потому, что .Net выполняет плавное преобразование типов значений в их аналог Object, выполняя процесс упаковки / распаковки (создания экземпляра класса, который содержит значение и является производным от объекта), что означает, что типы значений могут рассматриваться как объекты и простые значения.

Таким образом, типы значений имеют двойственную природу, они ведут себя как значения и как объекты . Значения в .Net - это объекты, когда они должны быть, и они не являются объектами в остальных случаях.

Правильный ответ, который учитывает технический аспект: «Все в .Net является , как если бы оно было Объектом».

Догматический ответ: «Все есть объект».

0 голосов
/ 12 января 2009

C # has был упомянут как единая система типов. Это означает, что все можно рассматривать как объект. Однако под этим есть два разных типа: типы значений и ссылочные типы. Типы значений можно рассматривать как объект с помощью механизма бокса. Это означает, что создается объект, представляющий значение рассматриваемого типа значения.

0 голосов
/ 12 января 2009

Число 2 не является объектом.

0 голосов
/ 12 января 2009

Типы значений не являются объектами, они подчиняются разной семантике копирования, разной семантике передачи и должны быть заключены в класс (Object), чтобы их можно было так трактовать.

Редактировать: Я думаю, что аргумент несколько расплывчатый, так как вы должны определить, что вы подразумеваете под «объектом». Является ли объект просто чем-то, что наследуется от Object, или это то, что подчиняется семантике использования Object? Или мы говорим о самом общем определении объекта, где оно может содержать данные и операции над этими данными?

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