通过ref传递WebControls之类的对象是否有任何性能优势?我专门考虑修改控件外观和验证方法等验证方法。感觉(背景颜色,CSSClass等)......
答案 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毫秒。
类的值与类的值相关的效率极不可能与您的代码相关。