Ключевое слово С# 'ref', производительность

Если у вас есть объект Bitmap, который необходимо передать многочисленным методам (около 10), и, наконец, к событию, в котором он должен быть удален после использования, было бы (полезным) передать его каждый из этих методов по ссылке вместо значения?

Передача по значению, объект копируется, передавая по ссылке его не.

(Производительность имеет решающее значение в этой ситуации. Приложение должно выполняться как можно быстрее.)

Ответ 1

Растровое изображение является ссылочным типом. Передача ссылочного типа по значению не копирует объект, а только ссылку на объект. Не будет никакого преимущества в производительности для передачи битмапа по ссылке вместо значения.

Ответ 2

Так как Bitmap является ссылочным типом, в этом сценарии нет практической разницы в производительности, поскольку он уже передается ссылкой на метод.

Я бы рекомендовал статью Джона Скита по этому вопросу для подробного объяснения того, как "по ссылке" и "по значению" работают в С#.

Ответ 3

Какой тип вы используете для размещения битмапа? Например, System.Drawing.Bitmap является ссылочным типом/классом. Когда вы передаете ссылку на метод (в качестве аргумента), эта ссылка передается по значению. (Сделана копия ссылки... не объект). Таким образом, четыре байта будут выделены на 32-разрядной машине для хранения копии.

Использование ключевого слова ref мало влияет на производительность, за исключением того, что передается одна и та же ссылка (копия ссылки не производится). Он имеет следующие преимущества.

  • Только очищает намерение, что метод, принимающий параметр , может изменить его, а вызывающий может получить изменение после изменения значения.
  • И переменная должна быть инициализирована вызываемым пользователем перед передачей в качестве аргумента вызываемой функции с параметром ref.

Ответ 4

"ref" не передает сам объект в функцию, вместо этого он передает ссылку на переменную, которая хранится в /at.

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

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

Итак, если вы передаете структуру, тогда ref обычно является способом перехода, иначе на самом деле не будет большой разницы (накладные расходы на этапе разыменования являются незначительными).

О, и чтобы ответить на вопрос, битмап - это класс, поэтому ключевое слово 'ref' не будет действительно изменять скорость по сравнению с параметром non -fef.