使值类型表现为引用

Make value type behave as reference

能够通过 "reference" 将值分配给值类型的最佳做法是什么?在我的例子中,我需要它来提供通过应用程序内控制台为整数、浮点数等赋值的可能性。我不想引用包含值类型的对象,因为这不会使我的控制台管理器通用,添加新命令将是一场噩梦。我也不能使用指针,因为在我的情况下不安全模式是不可能的。

由于我对CLR了解不多,所以试了下:

int i = 1;
object o = i;
o = (object) 5;
Console.WriteLine(i);// prints original value of i, 1. I expected 5;

所以它没有用,所以我找到了这个 class:

using System.Collections.Generic;
using System.Collections;
using System;

public class Pointer < T >
{
    private Func<T> getter;
    private Action<T> setter;

    public Pointer ( Func<T> getter, Action<T> setter )
    {
        this.getter = getter;
        this.setter = setter;
    }

    public T Value
    {
        get { return getter(); }
        set { setter(value); }
    }
}

多亏了它,我可以将值分配给像这样引用的值类型:

int i = 1;
Pointer ptr = new Pointer<int>(()=>i, x=>{i=x;})
ptr.Value = 5;
Console.WriteLine(i);// prints as expected 5;

有效,但如您所见,这不是一种优雅的方式(至少我认为不是)。

所以问题依然存在。在这种情况下,最佳做法是什么?

干杯

这不是 c# 方式。最简单的决定是使用静态字段创建 class 并更改它。

官方回答:

您永远不应向您的成员公开直接访问权限。您想要修改的值应该在容器对象(模型)中。此模型的所有修改应由一个权限(控制器)完成。

非官方回答:

使用反射,您甚至可以访问值类型字段并获取或设置它们的值。

如果这没有帮助,我需要更清楚地了解您想要实现的目标。