Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByVal vs. ByRef / 22 сообщений из 22, страница 1 из 1
18.05.2010, 14:41
    #36634160
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Ну коли на форуме тихо пока....

Решился показать себя полным чайником и спросить про субж в контексте вызовов процедур и функций.
Собственно, я знаю, в чем разница, я понимаю, что объекты передаются по ссылке и т.п. Но дело в том, что если мне не нужна была передача параметров по ссылке, я вообще не ставлю перед параметрами ничего (что там по умолчанию попало, то и то).

Но в обсуждениях на другие темы иногда мелькает, что надо так-то или так-то. Соответственно вопрос: какие принципы, какие соображения, как кошерно и т.п.
...
Рейтинг: 0 / 0
18.05.2010, 14:58
    #36634209
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
По умолчанию как раз по ссылке.
...
Рейтинг: 0 / 0
18.05.2010, 14:59
    #36634212
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
AntonariyПо умолчанию как раз по ссылке.

Это я знаю (вроде бы не во всех, кстати, случаях). Но чем это плохо?
...
Рейтинг: 0 / 0
18.05.2010, 15:13
    #36634246
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Shocker.ProЭто я знаюЭто заявление противоречит:
авторесли мне не нужна была передача параметров по ссылке, я вообще не ставлю перед параметрами ничего
авторвроде бы не во всех, кстати, случаяхВо всех.
...
Рейтинг: 0 / 0
18.05.2010, 15:16
    #36634258
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Antonariy
[quot]Это я знаю
Это заявление противоречит:
если мне не нужна была передача параметров по ссылке, я вообще не ставлю перед параметрами ничего
Не противоречит. Я ставлю явно ByRef для себя, чтобы видеть, что эта процедура что-то возвращает в параметрах (типа OUTPUT в SQL)
...
Рейтинг: 0 / 0
18.05.2010, 15:19
    #36634267
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Как так? Если НЕ НУЖНА, то пишут ByVal явно. То, что ты ничего не возвращаешь, не значит, что значение в процедуру не передается по ссылке.
...
Рейтинг: 0 / 0
18.05.2010, 15:35
    #36634316
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
> Автор: Shocker.Pro
> (вроде бы не во всех, кстати, случаях).

Во всех, это объектные ссылки всегда передаются по ссылке. Даже если явно указать ByVal.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.05.2010, 16:05
    #36634394
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Игорь ГорбоносВо всех, это объектные ссылки всегда передаются по ссылке. Даже если явно указать ByVal.Привет.

Нет, объектные ссылки не являются исключением. Сравни:
Class1:
Код: plaintext
1.
2.
Option Explicit

Public Value As String
Модуль:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Option Explicit

Sub Test1(ByVal c As Class1)
 Dim c3 As New Class1
 c3.Value = "c3"
 Set c = c3
End Sub

Sub Test2(ByRef c As Class1)
 Dim c4 As New Class1
 c4.Value = "c4"
 Set c = c4
End Sub

Sub Test()
 Dim c1 As New Class1
 c1.Value = "c1"
 Test1 c1
 Debug.Print c1.Value
 Test2 c1
 Debug.Print c1.Value
End Sub
...
Рейтинг: 0 / 0
18.05.2010, 16:43
    #36634477
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
> Автор: Бенедикт
> Нет ... Сравни:

Так и знал, что кто-то ткнёт носом

Согласен. Не прав. Я имел в виду что в процедуру не передается копия объекта, как это происходит в С++, а только
константный указатель на объект. Что с точки зрения обсуждаемого вопроса, на мой взгляд, является именно передачей по
ссылке. Ведь изменения происходят с тем-же объектом, а не с его копией. Но при явном указании ByVal при объектном
параметре делает сам параметр константным. Что вообще-то тоже не плохо, иногда.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.05.2010, 17:22
    #36634590
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
AntonariyТо, что ты ничего не возвращаешь, не значит, что значение в процедуру не передается по ссылке.

Та не. Я пишу ByRef для того, чтобы ВИДЕТЬ, что есть параметр для вывода (чисто для удобства). Ну а по факту он передается ByRef в обоих случаях, это понятно.

AntonariyЕсли НЕ НУЖНА, то пишут ByVal явно.

Вот меня и интересует, а в каких случаях лучше использовать ByVal (не берем ситуации, когда параметр меняется внутри процедуры). Ну например с точки зрения быстродействия, ресурсов, еще чего-нить....
...
Рейтинг: 0 / 0
18.05.2010, 17:31
    #36634613
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
C точки зрения быстродействия нужно тестировать конкретные процедуры. В разные времена я получал разные результаты. Насколько я понимаю, строки быстрее передавать byref (не нужно выделять память под локальную переменную), все остальное — byval. Ну и правильнее использовать byval у публичных членов классов.
...
Рейтинг: 0 / 0
18.05.2010, 17:33
    #36634621
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
AntonariyНу и правильнее использовать byval у публичных членов классов.

А это из каких соображений?
...
Рейтинг: 0 / 0
18.05.2010, 17:40
    #36634642
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Чтобы, не зная что там на самом деле делает метод, сторонний разработчик мог быть уверен, что параметр byref действительно возвращает что-то полезное, а не объявлен так из лени.
...
Рейтинг: 0 / 0
18.05.2010, 19:59
    #36634883
.Михаил.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Считаю, что лучше во всех случаях использовать ByRef , так как в теле функции (процедуры) не выделяется память под "передаваемые" переменные; ByVal использовать в тех случаях, когда над передаваемыми переменными необходимо произвести некие "манипуляции", но без изменения исходных.
...
Рейтинг: 0 / 0
18.05.2010, 20:43
    #36634941
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
.Михаил.Считаю, что лучше во всех случаях использовать ByRef , так как в теле функции (процедуры) не выделяется память под "передаваемые" переменные;Это бабка надвое сказала .
...
Рейтинг: 0 / 0
18.05.2010, 20:51
    #36634949
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Antonariy, полагаю, Михаил имеет ввиду экономию памяти (что тоже спорный вопрос для коротких переменных), а ты - производительность.
Полюбому при ByRef должен выделяться новый виртуальный указатель, хоть и на ту же переменную.
...
Рейтинг: 0 / 0
18.05.2010, 20:59
    #36634960
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Shocker.ProAntonariy, полагаю, Михаил имеет ввиду экономию памяти (что тоже спорный вопрос для коротких переменных), а ты - производительность.Возможно, но при нынешних объемах оперативки это экономия на спичках. Производительность важнее.
...
Рейтинг: 0 / 0
19.05.2010, 05:16
    #36635436
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
По моему имхо как ByVal нужно передавать всё что <= Long а остальное ByRef, на сколько я знаю передача идёт через стек и ссылка на любую переменную = Long
...
Рейтинг: 0 / 0
19.05.2010, 10:33
    #36635709
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
А я считаю что нужно ставить тот квалификатор, который не допускает неоднозначного трактования кода. Причем ставить
всегда явно. Что-бы изучая чужой код не гадать, передача ByRef обоснованна или программист просто забыл написать ByVal.
Переменная изменится и нужно делать копию перед передачей или можно смело передавать оригинальную переменную.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.05.2010, 01:01
    #36638111
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Вспомнил, кстати, одну особенность ByRef
...
Рейтинг: 0 / 0
20.05.2010, 01:11
    #36638113
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
И еще одну особенность вспомнил - передал как-то элемент массива в качестве единичного значения парамета RaiseEvent (по умолчанию ByRef) и получил ошибку: This array is fixed or temporarily locked
...
Рейтинг: 0 / 0
20.05.2010, 19:11
    #36640089
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByVal vs. ByRef
Игорь Горбонос
А я считаю что нужно ставить тот квалификатор, который не допускает неоднозначного трактования кода. Причем ставить всегда явно. Что-бы изучая чужой код не гадать, передача ByRef обоснованна или программист просто забыл написать ByVal. Переменная изменится и нужно делать копию перед передачей или можно смело передавать оригинальную переменную.



+1
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByVal vs. ByRef / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]