通过参考传递WebControl获得的好处

时间:2010-12-01 14:29:03

标签: c# asp.net language-features

通过ref传递WebControls之类的对象是否有任何性能优势?我专门考虑修改控件外观和验证方法等验证方法。感觉(背景颜色,CSSClass等)......

4 个答案:

答案 0 :(得分:7)

不。通过引用传递引用类型变量的唯一好处是,如果您希望能够更改调用者变量的值,即更改它引用的对象。例如:

// 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趋于表示该方法做得太多。

答案 1 :(得分:2)

当你做

Button btn = new Button();

btn变量不是新创建的按钮,而是对按钮的引用。 因此,如果我想要一个使按钮文本变为粗体的方法,这就足够了:

public void MakeButtonBold(Button button)
{
  button.Font.Bold = true;
}

因为,即使该方法使用pass-by-value,我也会获得该按钮的引用副本。然后,当我使用.运算符取消引用它时,我得到的对象是相同的,因为方法外部的引用和它在方法中的复制都指向同一个对象。

但是,如果我做这样的事情

public void ReplaceButtonWithBold(Button button)
{
  button = new Button();
  button.Font.Bold = true;
}

它不起作用,因为当我将它设置为一个新按钮时,我丢弃了传递的引用。

相反,当我使用ref参数时,则会为用于参数的变量创建引用,并将该引用传递给method。因此,如果ReplaceButtonWithBold使用ref参数,我的代码将按预期工作。

因此,经验法则应该只是使用ref参数,如果您明确希望用不同的东西替换整个传递的对象,而不是在您想要更改某些属性时。 从性能角度来看,普通方法需要制作引用的副本,而ref方法需要对原始引用进行新引用,因此无论哪种方式都必须使用时间和内存来创建和管理引用

答案 2 :(得分:1)

不,没有性能优势。

由于这些已经是引用类型,因此不需要这样做,只会使您的代码编写和使用更加麻烦。

答案 3 :(得分:1)

这是不太可能的,但下面是我用来测试这个的一些代码:

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  

显然这不是真正的代码。可能存在通过引用传递引用类型更快的情况。在某些情况下,使用速度更快的CPU会降低应用程序的速度。尽管如此,这确实提供了一个快速而肮脏的提示,ref可能会慢一些。它还表明它并不重要:看看我需要多少次迭代才能看到执行时间差异大约为100毫秒。

类的值与类的值相关的效率极不可能与您的代码相关。