Вопрос: VB2005 массивы | Добавлено: 08.03.07 19:50 |
Автор вопроса: ![]() |
Ответы | Всего ответов: 37 |
Номер ответа: 31 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #31 | Добавлено: 12.03.07 22:54 |
Копируется при присваивании, разумеется.
Именно это я и хотел сказать.. Некорректно выразился.. сорри.. |
Номер ответа: 32 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #32 | Добавлено: 13.03.07 04:34 |
Хм.. Ну растолкуй тогда в чем преимущество структуры?
Я несколькими постами выше привел объемную цитату (не поленился набирать блин, но не оценили увы) из Фаулера, там четко и ясно написано для чего используются структуры. И чем копирование структуры со всеми ее полями быстрее копирования просто ссылки?
Ты правда не понимаешь? Вот код со структурами. Structure UserInfo Public Name As String End Structure Dim A As UserInfo Dim B As UserInfo B = A A.Name="Artyom" B.Name="Unknown" При этом A - это один объект, B - другой, в каждом лежит соответствующий Name. Два разных объекта. Пишем аналогичный код для классов Class UserInfo Public Name As String End Class Dim A As New UserInfo Dim B As UserInfo B = A A.Name="Artyom" B.Name="Unknown" В итоге получаем: A и B - это экземпляры одного и того же объекта. Оба объекта имеют одно и то же значение поля Name - "Unknown" Разницу ощущаем? ![]() Мне не нужно чтоб две переменные ссылались на один и тот же объект. В данном конкретном случае мне нужно чтоб было 2 объекта с абсолютно разными данными. Чтоб получить то что мне нужно, мне прийдется писать следующее: Class UserInfo
Implements ICloneable Public Name As String Public Function Clone() As Object Implements System.ICloneable.Clone Dim Result As New UserInfo Result.Name = Me.Name Return Result End Function End Class Dim A As New UserInfo Dim B As UserInfo B = CType(A.Clone, UserInfo) A.Name = "Artyom" B.Name = "Unknown" Думаю, дальнейшие комментарии излишни. Даже если взять банальный пример: В массиве имеем 100 структур, и нам необходими изменить в них какое то поле.. Что в итоге получится? Вместо того, чтобы тупо изменить исходный объект, у нас будет 100 раз создаваться копия этой структуры, затем мы ее изменяем и снова загоняем в массив..
А MyArr(10).LastName = "WAZZZZZZZZZZZUP" религия использовать не позволяет? |
Номер ответа: 33 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Вопросов: 130 Ответов: 6602 |
Профиль | Цитата | #33 | Добавлено: 13.03.07 04:40 |
Прошу заметить.
Я не агитирую за использование структур. Я агитирую за то чтоб классы использовались там где уместно использовать классы и структуры использовались там где уместно использовать структуры. Возможно мой пример с UserInfo семантически не совсем верен, я хотел показать техническую сторону этого вопроса, а не архитектурную. Для того чтоб хранить информацию о пользователе, нужно использовать класс. Для того чтоб хранить дату, нужно использовать структуру. Для того чтоб хранить поток данных, нужно использовать класс. Для того чтоб хранить информацию о цвете, нужно использовать структуру |
Номер ответа: 34 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #34 | Добавлено: 13.03.07 08:18 |
A и B - это экземпляры одного и того же объекта.
Вовсе нет... Это утверждение верно только для структур. В случае с классами это не экземпляры одного и того же объекта.. это ссылки указывающие на один и тот же объект. (чувствуешь разницу?) Предположим у нас есть довольный объемный объект.. В случае со структурами при копировании мы получим 2 больших объекта, а с классами у нас так.. и останется 1 объект и будут 2 ссылки на него указывать. Часто ли тебе приходилось реализовывать ICloneable? И в каких ситуациях? Не знаю... я как то не испытывал в нем необходимости.. А MyArr(10).LastName = "WAZZZZZZZZZZZUP" религия использовать не позволяет?
Кхе.. кхе... как бы это помягче выразиться... религия то позволяет.. но во компилятор против.. (см. посты №8,9) |
Номер ответа: 35 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #35 | Добавлено: 13.03.07 08:27 |
Во всяком случае при хранении в List такой вариант со структурами не прокатывает.. хотя кто знает.. возможно в массиве это и будет работать.. |
Номер ответа: 36 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 1876 ![]() |
Профиль | Цитата | #36 | Добавлено: 13.03.07 08:45 |
Во всяком случае при хранении в List такой вариант со структурами не прокатывает
Бу га га. Разумеется. Потому что структура, возвращённая из property, всегда есть копия оригинала. Что тоже очень удобано и правильно в тех случаях, когда нужно именно такое решение. |
Номер ответа: 37 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #37 | Добавлено: 13.03.07 10:32 |
В любом случае - не убедили.. Я прислушиваюсь и ценю мнение некоторых людей на этом форуме, и готов признать свою не правоту, если это так... но это не тот случай..
Я не говорю о том, что структура это отстой.. я говорю о том, что область ее применения ограничена очень и очень узким кругом задач. Одним из основных правил использования структур(по рекомендациям MS) является то, что стуктура должна быть неизменна на всем протяжении жизни (после создания через конструктор), что размер структуры не должен превышать 16 байт, и она не должна содержать полей ссылочного типа.. Так зачем мне такая радость нужна в повседневной жизни? |
|