我所读到的,传递参数是默认的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;
}
答案 0 :(得分:6)
这里根本没有拳击或拆箱。 string
是一种参考类型 - 为什么要装箱?这甚至意味着什么?
即使您使用了int
,也不需要装箱,因为没有将值转换为实际对象。
我怀疑您对boxing和parameter 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>那)