Преимущества, полученные путем прохождения WebControls по Ref - PullRequest
3 голосов
/ 01 декабря 2010

Есть ли какие-либо преимущества в производительности, которые можно получить от передачи таких объектов, как WebControls, по ссылке? Я специально думаю о таких вещах, как методы проверки, которые изменяют внешний вид элемента управления (цвет фона, CSSClass и т. Д.) ...

Ответы [ 4 ]

7 голосов
/ 01 декабря 2010

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

// Creates a new label if necessary, and sets the text to Stuff
public void Foo(ref Label label)
{
    if (label == null)
    {
        label = new Label();
    }
    label.Text = "Stuff";
}

Лично я стараюсь избегать ref, где это возможно: он стремится указывать, что метод делает слишком много.

2 голосов
/ 01 декабря 2010

Когда вы делаете

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 должен создать новую ссылку на исходную ссылку, поэтому в любом случае вам придется использовать время и память для создания ссылки и управления ею

1 голос
/ 01 декабря 2010

Очень маловероятно, чтобы это когда-либо имело значение, но ниже приведен код, с которым я играл, чтобы проверить это:

public class popo
{
    public int X;
    public int Y;
}

public static bool foo(popo x)
{
    x.X = 10;
    return x.X == x.Y;
}

public static bool foo(ref popo x)
{
    x.X = 10;
    return x.X == x.Y;
}

static void Main(string[] args)
{
    Stopwatch sw = new Stopwatch();
    sw.Stop();
    sw.Reset();
    sw.Start();
    popo pio = new popo();
    bool luka = true;
    for (long i = 0; i < 100000000; ++i)
    {
        luka = luka ^ foo(pio);
    }
    sw.Stop();
    Trace.WriteLine(sw.ElapsedMilliseconds);
}

Результаты (в миллисекундах):

Release Val: 948
Release Ref: 1065  
Debug Val: 2451  
Debug Ref: 2550  

Очевидноэто не настоящий код.Могут быть ситуации, когда передача ссылочного типа по ссылке происходит быстрее.Есть случаи, когда использование более быстрого процессора может замедлить работу вашего приложения.Тем не менее, это дает быстрый и грязный намек на то, что ссылка, вероятно, будет немного медленнее.Это также демонстрирует, что это не имеет значения: посмотрите, сколько итераций мне потребовалось, чтобы увидеть разницу во времени выполнения даже на ~ 100 мс.

Маловероятно, что эффективность ref в сравнении со значением для классовбудет иметь отношение к вашему коду.

1 голос
/ 01 декабря 2010

Нет, никаких преимуществ в производительности.

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

...