传递参数,是否会发生拆箱

本文关键字:是否 参数 | 更新日期: 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参数中永远不会涉及任何装箱(但是,后续代码可以从引用获取值,然后装箱/取消装(