使用ref关键字传递给方法时被装箱的结构体

本文关键字:结构体 方法 关键字 ref 使用 | 更新日期: 2023-09-27 18:15:25

有谁知道当一个结构被传递给使用ref的方法时是否会发生装箱关键字即。

struct Test
{
    public int Value;
}
static void Main()
{
    Test test = new Test();
    SomeMethod(ref test);
    System.Diagnostics.Debug.WriteLine(test.Value);
}
static void SomeMethod(ref Test test)
{
    test.Value = 5;
}

我想使用一个类型的结构体,但我有几个方法需要改变它。如果它是框,我就把它传入并返回或者使用一个类

使用ref关键字传递给方法时被装箱的结构体

不,它不是。

传递结构体在内存中的位置。

但是,不这样做
可变结构

没有装箱,但听起来应该使用类。
对于结构体最好的建议是它们应该被设计成不可变的,所以

  • 为什么首先是struct ?
  • 为什么切换到copy &回归避拳?你认为那样更快吗?

对于通过引用传递的内容,形参的声明类型必须精确地匹配所传递的内容的声明类型。装箱仅在值类型转换为其声明的类型不是值类型的东西时发生,因此与所讨论的值类型不完全相同。

有些人可能不喜欢可变值类型,但是通过引用传递可变值类型通常优于传递混杂引用的邪恶做法。例如,考虑:

<>之前struct StructType1{公共int V;…}类ClassType1{公共int V;…}空白等等(){StructType1 s1;= new classstype1 ();…做些事情……Routine1 (s_pt c_pt);Routine2(ref s_pt, ref c_pt);…做更多的事情}之前

Routine1对S1.V有什么影响?日常生活对C1.V有什么影响?

Routine2对S1.V有什么影响?这种影响何时会发生?C1.V呢?特别是,是否有办法知道Routine1或Routine2是否可能导致C1。V要在未来的任意时间改变,很久以后还会打电话吗?

同样,假设S1持有一些我想要存储到类中的数据。如果S1只包含值类型(可能是可变的,也可能不是可变的)和不可变引用类型,我是否需要担心任何意外地改变我存储在那里的数据?

现在假设C1存储了我想要存储的数据。如果C1是可变的,或者包含任何可变引用类型,并且我已经将其暴露给任何外部函数,那么我是否可以安全地存储其中包含的信息,而无需了解C1的大量内部信息?

通过引用传递结构体是一种很好的方式,它允许其他函数提供多个信息片段,而不需要冗余复制。支持可变值类型对于语言实现者来说可能是一个麻烦,但是值语义在生产代码中非常有用,尽管在一些框架的实现中有一些不幸的怪异之处。