Когда вы делаете
Button btn = new Button();
, переменная btn не является вновь созданной кнопкой, а является ссылкой на кнопку.Поэтому, если мне нужен метод, который делает текст кнопок жирным, этого достаточно:
public void MakeButtonBold(Button button)
{
button.Font.Bold = true;
}
, потому что, даже если метод использует передачу по значению, я получаю копию ссылки накнопка.Затем, когда я разыменую его с помощью оператора .
, объект, который я получаю, одинаков, поскольку и ссылка вне метода, и его копия внутри метода указывают на один и тот же объект.
Однако, если я что-то делаюкак это
public void ReplaceButtonWithBold(Button button)
{
button = new Button();
button.Font.Bold = true;
}
это не будет работать, потому что я отбросил переданную ссылку, когда я установил ее на новую кнопку.
В отличие от этого, когда я использую параметр ref, тогда ссылкасоздается для переменной, которая используется для параметра, и эта ссылка передается методу.Таким образом, если бы ReplaceButtonWithBold
использовал параметр ref
, мой код работал бы так, как предполагалось.
Таким образом, практическое правило должно использовать параметры ref, только если вы явно хотите заменить целом передал объект с чем-то другим, а не когда вы хотите изменить некоторые свойства.С точки зрения производительности, обычный метод должен создать копию ссылки, а метод ref должен создать новую ссылку на исходную ссылку, поэтому в любом случае вам придется использовать время и память для создания ссылки и управления ею