传递参数,是否会发生拆箱
本文关键字:是否 参数 | 更新日期: 2023-09-27 18:27:24
我读到的,传递参数默认是值类型。在我的示例中,第一个函数 test1 采用引用类型并取消装箱,如果我做对了,它会降低性能。但是,我从未读过您喜欢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;
}
这里根本不涉及装箱或拆箱。 string
是引用类型 - 为什么要装箱?这甚至意味着什么?
即使您改用int
,也不需要装箱,因为不会将值转换为实际对象。
我怀疑你对拳击和参数传递的理解是有缺陷的。
当值类型值需要转换为对象时,通常会发生装箱,通常是为了将其用作接口或对象类型的变量(某处(。所以这个框:
int value = 10;
Foo(value);
...
public void Foo(object x)
{
}
。但是,如果Foo
更改为int
x
类型,则不会发生这种情况。
关于拳击的详细规则变得非常复杂,难以准确和准确地陈述,特别是在仿制药出现的地方,但这是基础。
这里根本没有装箱; 装箱是指将值类型视为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
参数中永远不会涉及任何装箱(但是,后续代码可以从引用中获取值,然后装箱/取消装箱(