2009-05-23 4 views
11

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

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

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

+0

vb.net: [which-is-fast-byval-orreref] (http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref) – nawfal

+0

Теперь есть способ как можно было бы передать битмап по значению. – IllidanS4

ответ

30

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

7

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

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

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

Спасибо за дополнительные подробности! –

+0

«Использование ключевого слова ref ... только очищает намерение». Эммм, я не думаю, что это правда. Ссылка, переданная byref (объект **), может быть запрошена вызывающим; влияя на объект, на который ссылаются ссылочные пункты. Передача ссылочного байтового значения (объекта *) передает копию ссылки, изолируя ссылку-вызывающие от изменений в пределах calle. В этой статье http://preview.tinyurl.com/oda4jz есть пример в C#. – corlettk

+0

Исправить. Следовательно, метод, принимающий параметр ref, заставляет вызывающих явно писать ref перед аргументом - чтобы убедиться, что вызывающие стороны понимают и соглашаются с семантикой. Он разъясняет намерение, что вызывающий передает аргумент, полностью осознавая, что аргумент может иметь другое значение/состояние, отправляющее вызов метода. – Gishu

15

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

Я бы рекомендовал Jon Skeet's article on the subject для подробного объяснения того, как «по ссылке» и «по значению» работают в C#.

+0

Спасибо за ссылку на статью, действительно помог мне. Цените это бутон –

+0

Хорошая рекомендация. Это отличное чтение для полного понимания значений/ссылочных типов и передачи параметров по значению/ссылке. –

5

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

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

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

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

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

+0

+1 за то, что он указал на преимущество передачи ссылок для структур и более подробное объяснение последствий разыменования. – Didaxis

Смежные вопросы