使值类型表现为参考

时间:2015-12-28 17:18:07

标签: c# reference value-type boxing

能够通过"参考"?为值类型分配值的最佳做法是什么?在我的情况下,我需要这个可以通过应用程序内控制台为int,float等分配值。我不想提供对包含值类型的对象的引用,因为这不会使我的控制台管理器通用,并且添加新命令将是一场噩梦。另外我不能使用指针,因为在我的情况下不可能使用不安全模式。

因为我对CLR的了解很少,我尝试过这样的事情:

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

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

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;

有效,但正如你所看到的那样,这是非常不优雅的方式(至少我认为不是这样)。

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

干杯

2 个答案:

答案 0 :(得分:0)

官方回答:

您永远不应公开对您的会员的直接访问权限。您希望可修改的值应位于容器对象(模型)中。该模型的所有修改都应由一个机构(控制器)完成。

非正式回答:

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

如果这没有帮助,我需要更清楚地了解你想要达到的目标。

答案 1 :(得分:-2)

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