通过ref从仅获取属性返回私有字段

时间:2018-04-06 05:46:03

标签: c#

我一直在搞乱结构。我找了一个这样的例子,但没有找到任何东西。

struct TransformComponent 
{
    public int X { get; set; }
}

class Foo 
{
    private TransformComponent _transform;

    public ref TransformComponent Transform
    {
        get { return ref _transform; }
    }
}

class Bar
{
    Foo testFoo = new Foo;

    void TestMethod()
    {
        testFoo.Transform.X = 5;
    }
}

这可以按照您的假设进行编译和工作。

这样做是否有问题,我没有看到?

我感兴趣的原因是,由于TransformComponent是一个值类型而不是一个引用类型,它将被存储在Foo对象旁边的内存中吗?如果它是参考类型,而不是可能在内存中的其他地方?

编辑:

阅读帖子后,我意识到我的问题可能并不清楚。

_transform是否会存储在内存中的Foo对象旁边,因为它是一个Value Type和一个类的字段?

编辑2:

阅读答案,很明显_transform会员被分配到堆上的Foo实例旁边。

如果我没有记错的话,我这样删除一级地址引用是正确的吗?

如果我将TransformComponent切换为引用类型,_transform成员将是对Heap中分配的对象的引用,而不是对Value本身的引用是否正确?

编辑3:

我需要研究如何分配更多东西。感谢所有参与的人,感谢您的时间。

1 个答案:

答案 0 :(得分:1)

因为Transform是类Foo的一部分,它只存储在Heap上,因为它是用户定义的类型clas的一部分,即引用类型。

当您将其标记为Ref时,表示您传递的地址不是对象,对其所做的每项更改都将更改存储在给定地址上的值。

如果你在方法中声明了值类型,那么它将被存储在堆栈中,并且该adddress将在ref中传递。

所以,当你将变量标记为Ref时,它不会在堆上分配内存,它将保持在原来的位置(即在堆/堆栈上)。 Ref仅告知您正在传递地址,因此对变量所做的更改将反映到地址。

这可能会有所帮助:Reference type modification vs change of reference