Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 | 3 |

 

  Вопрос: VB2005 массивы Добавлено: 08.03.07 19:50  

Автор вопроса:  -=Fenix=-

Ответить

  Ответы Всего ответов: 37  

Номер ответа: 31
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #31 Добавлено: 12.03.07 22:54
Копируется при присваивании, разумеется.

Именно это я и хотел сказать.. Некорректно выразился.. сорри..

Ответить

Номер ответа: 32
Автор ответа:
 Artyom



Разработчик

Вопросов: 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
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #33 Добавлено: 13.03.07 04:40
Прошу заметить.

Я не агитирую за использование структур.
Я агитирую за то чтоб классы использовались там где уместно использовать классы и структуры использовались там где уместно использовать структуры.

Возможно мой пример с UserInfo семантически не совсем верен, я хотел показать техническую сторону этого вопроса, а не архитектурную.

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

Ответить

Номер ответа: 34
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #34 Добавлено: 13.03.07 08:18
A и B - это экземпляры одного и того же объекта.

Вовсе нет... Это утверждение верно только для структур. В случае с классами это не экземпляры одного и того же объекта.. это ссылки указывающие на один и тот же объект. (чувствуешь разницу?) Предположим у нас есть довольный объемный объект.. В случае со структурами при копировании мы получим 2 больших объекта, а с классами у нас так.. и останется 1 объект и будут 2 ссылки на него указывать.
Часто ли тебе приходилось реализовывать ICloneable? И в каких ситуациях? Не знаю... я как то не испытывал в нем необходимости..
А MyArr(10).LastName = "WAZZZZZZZZZZZUP" религия использовать не позволяет?

Кхе.. кхе... как бы это помягче выразиться... религия то позволяет.. но во компилятор против.. (см. посты №8,9)

Ответить

Номер ответа: 35
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #35 Добавлено: 13.03.07 08:27
Во всяком случае при хранении в List такой вариант со структурами не прокатывает.. хотя кто знает.. возможно в массиве это и будет работать..

Ответить

Номер ответа: 36
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #36 Добавлено: 13.03.07 08:45
Во всяком случае при хранении в List такой вариант со структурами не прокатывает

Бу га га.

Разумеется. Потому что структура, возвращённая из property, всегда есть копия оригинала. Что тоже очень удобано и правильно в тех случаях, когда нужно именно такое решение.

Ответить

Номер ответа: 37
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #37 Добавлено: 13.03.07 10:32
В любом случае - не убедили.. Я прислушиваюсь и ценю мнение некоторых людей на этом форуме, и готов признать свою не правоту, если это так... но это не тот случай..
Я не говорю о том, что структура это отстой.. я говорю о том, что область ее применения ограничена очень и очень узким кругом задач. Одним из основных правил использования структур(по рекомендациям MS) является то, что стуктура должна быть неизменна на всем протяжении жизни (после создания через конструктор), что размер структуры не должен превышать 16 байт, и она не должна содержать полей ссылочного типа.. Так зачем мне такая радость нужна в повседневной жизни?

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам