Как System.Int32 может наследоваться от System.Object
От: BodyaSurgut  
Дата: 23.06.13 10:26
Оценка:
Если структуры не могут наследоваться от классов... хотя это наследование косвенное, т.е типы значений наследуются от ValueType, но все же... Как класс "перетекает" в структуру?
Re: Как System.Int32 может наследоваться от System.Object
От: koodeer  
Дата: 23.06.13 12:23
Оценка: :))
Здравствуйте, BodyaSurgut, Вы писали:

BS>Если структуры не могут наследоваться от классов... хотя это наследование косвенное, т.е типы значений наследуются от ValueType, но все же... Как класс "перетекает" в структуру?


Имхо, причина в том, что кое-кому очень хотелось продекларировать принцип: всё является объектом. Вот и притянули за уши значимые типы к object. С тех пор и задаются такие вопросы, ибо на самом деле неоднозначность и путаница.

На мой взгляд, лучше было бы сделать две иерархии: у одной корнем является object — для ссылочных типов, у другой — некий valuetype — для значимых типов. И сделать специальные команды/операторы для приведения одного к другому — это заметно уменьшило бы количество вопросов по упаковке/распаковке.


Честно говоря, навевает тоску и уныние, когда несвязанные наборы данных непременно стараются увязать в одну иерархию. Примером является xml: в документе один корень, и мы вынуждены пихать всё в него.
Иерархические базы данных, когда-то очень распространённые, давно потеряли пальму первенства, потому что стала очевидной их ограниченность в большинстве случаев хранения данных, но этот пример не был принят в расчёт при проектировании CLR. Вот и имеем, что имеем.
Re[2]: Как System.Int32 может наследоваться от System.Object
От: Nikolay_Ch Россия  
Дата: 23.06.13 17:24
Оценка:
Здравствуйте, koodeer, Вы писали:

K>На мой взгляд, лучше было бы сделать две иерархии: у одной корнем является object — для ссылочных типов, у другой — некий valuetype — для значимых типов. И сделать специальные команды/операторы для приведения одного к другому — это заметно уменьшило бы количество вопросов по упаковке/распаковке.

А как в такой ситуации обеспечить нормальное хранение разнотипных типов в одном массиве или списке? Сейчас это можно объявить как Object и не мучиться.

K>Честно говоря, навевает тоску и уныние, когда несвязанные наборы данных непременно стараются увязать в одну иерархию. Примером является xml: в документе один корень, и мы вынуждены пихать всё в него.

K>Иерархические базы данных, когда-то очень распространённые, давно потеряли пальму первенства, потому что стала очевидной их ограниченность в большинстве случаев хранения данных, но этот пример не был принят в расчёт при проектировании CLR. Вот и имеем, что имеем.
А что сейчас в "первенстве"? Никогда особо не слышал о первенстве "иерархических" баз данных. Как было сто лет назад, так и сейчас — реляционные рулят.
Re[3]: Как System.Int32 может наследоваться от System.Object
От: Jack128  
Дата: 23.06.13 17:29
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>А как в такой ситуации обеспечить нормальное хранение разнотипных типов в одном массиве или списке? Сейчас это можно объявить как Object и не мучиться.


А можно пример когда тебе было необходимо в одном списке хранить value и ссылочные типы ??
Re[4]: Как System.Int32 может наследоваться от System.Object
От: Nikolay_Ch Россия  
Дата: 23.06.13 17:33
Оценка:
Здравствуйте, Jack128, Вы писали:

J>А можно пример когда тебе было необходимо в одном списке хранить value и ссылочные типы ??

Я заранее не знаю типы данных, которые мне придут на вход.
Универсальные методы, которые могут принимать на вход разные типы.
Re[3]: Как System.Int32 может наследоваться от System.Object
От: koodeer  
Дата: 23.06.13 18:43
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>А как в такой ситуации обеспечить нормальное хранение разнотипных типов в одном массиве или списке? Сейчас это можно объявить как Object и не мучиться.


Конечно, значимые типы должны приводиться к object'у. Просто было бы логично иметь две иерархии, тогда и вопросов бы меньше возникало: было бы ясно, что кастование из одного типа в другой (упаковка/распаковка) — дополнительная не бесплатная операция.


N_C>А что сейчас в "первенстве"? Никогда особо не слышал о первенстве "иерархических" баз данных. Как было сто лет назад, так и сейчас — реляционные рулят.


До появления реляционных были иерархические БД. Как только появились РСУБД, иерархические сразу же почти исчезли. Ибо иерархия нужна редко. После этого, внезапно, стал активно пиариться иерархический xml как единственно верный способ хранения данных... Вот и пихают в него что попало, даже не иерархические данные, к сожалению.
Re[4]: Как System.Int32 может наследоваться от System.Object
От: Nikolay_Ch Россия  
Дата: 23.06.13 18:59
Оценка:
Здравствуйте, koodeer, Вы писали:

N_C>>А как в такой ситуации обеспечить нормальное хранение разнотипных типов в одном массиве или списке? Сейчас это можно объявить как Object и не мучиться.

K>Конечно, значимые типы должны приводиться к object'у. Просто было бы логично иметь две иерархии, тогда и вопросов бы меньше возникало: было бы ясно, что кастование из одного типа в другой (упаковка/распаковка) — дополнительная не бесплатная операция.
Так и сейчас все так и есть. Есть Object и есть ValueType... Последний — приводится к Object.
Re: Как System.Int32 может наследоваться от System.Object
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.06.13 10:26
Оценка: +1 -1
Здравствуйте, BodyaSurgut, Вы писали:

BS>Если структуры не могут наследоваться от классов... хотя это наследование косвенное, т.е типы значений наследуются от ValueType, но все же... Как класс "перетекает" в структуру?

1. Класс никак не перетекает в структуру.
2. Структуры (и прочие value типы) автоматически приводятся к ссылочным типам при боксинге.


На самом деле, автоматический боксинг дотнета скрывает от прикладного программиста деталь реализации, которая и вызывает такие затруднения. В Java, к примеру, боксинг делается вручную. И там для значимых типов есть их ссылочные аналоги, например Integer для int. Первый — наследуется от Object, второй — нет.
В дотнете оба "типа" имеют одно имя: System.Int32. Смысл имени типа зависит от контекста использования.
Когда создаётся переменная на стеке, или когда объявляется поле структуры или класса, или когда value-тип используется в качестве параметра метода, подразумевается "value" часть этого дуализма.
А когда нужна ссылка на object, то среда автоматически создаёт экземпляр "теневого" ссылочного типа в куче.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как System.Int32 может наследоваться от System.Object
От: drol  
Дата: 24.06.13 11:11
Оценка: 70 (1)
Здравствуйте, Sinclair, Вы писали:

S>В Java, к примеру, боксинг делается вручную.


Делался. Раньше. Уже много-много лет как в Java тоже автоматический боксинг.
Re[4]: Как System.Int32 может наследоваться от System.Object
От: achp  
Дата: 24.06.13 11:37
Оценка:
Здравствуйте, Jack128, Вы писали:

J>А можно пример когда тебе было необходимо в одном списке хранить value и ссылочные типы ??


http://msdn.microsoft.com/en-us/library/828t9b9h.aspx
Re[3]: Как System.Int32 может наследоваться от System.Object
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.06.13 15:24
Оценка:
Здравствуйте, drol, Вы писали:



D>Делался. Раньше. Уже много-много лет как в Java тоже автоматический боксинг.

Ухты, круто. Я её с 2002 года не видел
А сравнение строк починили? Или всё также отцы заменяют код наивных вьюношев типа if(domainName == "rsdn.ru") на if("rsdn.ru".Equals(domainName))?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как System.Int32 может наследоваться от System.Object
От: drol  
Дата: 25.06.13 14:28
Оценка: :))
Здравствуйте, Sinclair, Вы писали:

S>А сравнение строк починили?


А там и не надо ничего чинить. Это в C# сделано неправильно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.