传递参数,会发生拆箱

时间:2012-03-09 08:21:47

标签: c# .net

我所读到的,传递参数是默认的valuetypes。在我的例子中,第一个函数test1采用引用类型和unbox,如果我做对了,它会降低性能。 但是我从来没有读过你喜欢test2来提高性能。

那么最佳做法是什么?

public Main(){
    string test = "hello";
    test1(test); // Does this line perform a boxing? So it's not good for performance?
    test2(ref test); // Passing a reference as a reference
}

public string test1(string arg1) {
    return arg1;
}

public string test2(ref string arg1) {
    return arg1;
}

2 个答案:

答案 0 :(得分:6)

这里根本没有拳击或拆箱。 string是一种参考类型 - 为什么要装箱?这甚至意味着什么?

即使您使用了int,也不需要装箱,因为没有将值转换为实际对象。

我怀疑您对boxingparameter passing的理解是有缺陷的。

当需要将值类型值转换为对象时,通常是为了将其用作接口或对象类型的变量(某处)时发生限制。所以这个框:

int value = 10;
Foo(value);

...

public void Foo(object x)
{
}

...但如果更改Foo以使x的类型为int,则不会

有关拳击的详细规则变得非常复杂,以准确和准确地陈述,特别是在仿制药进入的情况下,但这是基础。

答案 1 :(得分:5)

这里根本没有拳击; boxing是将值类型视为object或接口(不包括泛型)时,例如:

int i = 1;
Foo(i); // the value of i is boxed
Bar(i); // the value of i is boxed
...
private void Foo(object obj) {...}
private void Bar(IConvertible obj) {...}

在您的示例中,a:此处没有类型转换,因此无需使用框,而b:string无论如何都是引用类型,因此没有含义拳击一个字符串。

您的test2实际上显示的是“按参考传递”,又名ref,这与拳击完全无关 - 确实ref参数必须是精确匹配,因此永远不会参与ref参数的任何装箱(但是,后续代码可以从参考中获取值然后使用/ unbox < EM>那