使用ref关键字传递给方法时是否使用了结构框?

时间:2011-11-20 17:23:49

标签: c# struct parameter-passing ref

有人知道当使用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;
}

我想为一个类型使用结构,但我有几个方法需要 更改。如果它是盒子,我将把它传入并返回它或者可能使用一个类。

3 个答案:

答案 0 :(得分:2)

不,不是。

相反,传递结构在内存中的位置。

然而,不要这样做 Mutable structs are evil.

答案 1 :(得分:2)

没有拳击,但听起来你应该使用一个班级 结构的最佳建议是它们应该被设计为不可变的,所以

  • 为什么一个struct
  • 为什么要切换到复制&回来避免拳击?你认为那更快吗?

答案 2 :(得分:1)

对于通过引用传递的内容,参数的声明类型必须精确匹配传递的事物的声明类型。仅当值类型转换为声明类型不是值类型的某些内容时才会发生限制,因此与所讨论的值类型不完全相同。

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

struct StructType1 {public int V; ... }
class ClassType1 {public int V; ... }

void blah()
{
  StructType1 s1;
  ClassType1 c1 = new ClassType1();
  ... do some stuff...
  Routine1(s_pt, c_pt);
  Routine2(ref s_pt, ref c_pt);
  ... do more stuff
}

Routine1对S1.V有什么影响?例程1对C1.V有什么影响?

Routine2对S1.V有什么影响?什么时候会发生这样的影响? C1.V怎么样?特别是,是否有任何方法可以知道Routine1或Routine2是否可能导致C1.V在未来的任意时间发生变化,在呼叫返回后很久?

另外,假设S1保存了一些我想要存储到类中的数据。如果S1只包含值类型(可能是也可能不是可变的)和不可变引用类型,我是否需要担心意外改变我存储的数据?

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

通过引用传递结构是允许其他函数提供多条信息的一种很好的方式,无需冗余复制。支持可变值类型可能会对语言实现者造成麻烦,但是值语义在生产代码中非常有用,尽管在某些框架的实现中存在一些不幸的怪癖。