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

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

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

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

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

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

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

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

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

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

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

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

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

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



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


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