Лучшая практика: ByRef или ByVal? в .NET

Не используйте *, но укажите явное имя столбца или в этом случае вы также можете использовать clnt.* (вам не нужно значение для левой объединенной таблицы, а только счетчик (*)

select clnt.clnt_id, clnt.clnt_sid  ,count(air.ac_id) as nAC
from clients_db clnt 
left join aircon_client_db air on trim(air.clnt_sid)=trim(clnt.clnt_sid)
AND  trim(clnt.user_sid)= '10001'
group by clnt.clnt_sid
order by clnt.clnt_name asc
]
18
задан Kevin Fairchild 14 November 2008 в 19:21
поделиться

6 ответов

Существует большая дезинформация вокруг об этом. Главное состоит в том, что Вы понимаете различие между типами значения и ссылочными типами , и различие между передачей значением и передаете ссылкой .

Вы почти всегда хотите передать значением. Передача ссылкой почти всегда для, "Я хочу возвратить больше чем один результат, и не только путем добавления вещей к списку, который передается в". Классический пример метода с помощью передачи ссылкой Int32. TryParse, где возвращаемое значение является успехом/отказом и проанализированным значением, "возвращается" параметр.

34
ответ дан 30 November 2019 в 05:47
поделиться

Значение по умолчанию является byValue для ВСЕХ типов, но важно понять то, что эти две опции означают для "ссылочного типа" (класс) в противоположность типу значения. (структуры).

Для ссылочного типа, если Вы объявляете переменную ссылочного типа в методе, та переменная является ячейкой памяти в стековом фрейме метода. Это не находится на "куче". При инициализации той переменной (использование нового или фабрика, безотносительно), затем Вы создали фактический объект на "куче", и адрес того объекта хранится в заявленной ссылочной переменной в Вашем стековом фрейме методов.

при передаче ссылочного типа другому методу byVal Вы создаете копию адреса, сохраненного в стопке вызывающих методов, и передаете копию того значения (адрес указателя) к вызываемому методу, где это хранится в новом слоте памяти в стопке вызываемых методов. В вызываемом методе новая клонированная переменная указывает непосредственно на тот же объект на "куче". Так использование его может изменить свойства того же объекта. Но Вы не можете измениться, какая "куча" возражают, что переменная исходной ссылки (на стопке вызывающих методов) указывает на. Если, в вызываемом методе я пишу

  myVar = new object();

, исходная переменная в вызывающем методе не будет изменяться на точку к новому объекту.

, Если я передаю ссылочный тип byRef, otoh, я передаю указатель на заявленную переменную в стопке вызывающих методов (который содержит указатель на объект на "куче"), Это - поэтому указатель на указатель на объект. Это указывает на ячейку памяти на стопке вызывающих методов, которая указывает на объект на "куче".
Поэтому теперь, если я изменяю значение переменной в вызываемом методе, путем установки его на новый объект (), как выше, так как это - "refereence" к переменной в вызывающем методе, я на самом деле изменяюсь, на какой объект переменная в вызывающем методе указывает. Таким образом, После возвратов вызываемого метода, переменная в вызывающем методе больше не будет указывать на тот же исходный объект на "куче".

15
ответ дан 30 November 2019 в 05:47
поделиться

ByVal должен быть Вашим "значением по умолчанию". Используйте его, если у Вас нет определенной причины использовать ByRef

8
ответ дан 30 November 2019 в 05:47
поделиться

Отмечание определенных аргументов как ByRef показывает пользователю Вашей функции, что переменная выделенный тому аргументу ** будет изменена. ****

при использовании ByRef для всего args не будет никаким способом сказать, какие переменные изменяются функцией, и которые просто читаются им. (кроме заглядывания в функциональном источнике!)

0
ответ дан 30 November 2019 в 05:47
поделиться

Передача объектного ByVal в .NET не делает копию объекта и не использует больше ресурсов затем ByRef, указатель все еще передается до функции. Время выполнения просто гарантирует, что Вы не можете изменить указатель в своей функции и возвратить другое значение для него. Можно все еще внести изменения в значения в объекте, и Вы будете видеть те изменения вне функции. Именно поэтому ByRef является использованием так редко. Только необходимо, когда Вы хотите, чтобы функция изменила фактический объект, который возвращается; следовательно выходной параметр.

8
ответ дан 30 November 2019 в 05:47
поделиться

Используйте "ByRef", только если параметр является "выходным" параметром. Иначе используйте "ByVal". Используя "ByRef" на параметрах, которые явно не должны возвращать значения, опасно, и может легкий генерировать ошибки.

5
ответ дан 30 November 2019 в 05:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: