使值类型表现为引用
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 并更改它。
官方回答:
您永远不应向您的成员公开直接访问权限。您想要修改的值应该在容器对象(模型)中。此模型的所有修改应由一个权限(控制器)完成。
非官方回答:
使用反射,您甚至可以访问值类型字段并获取或设置它们的值。
如果这没有帮助,我需要更清楚地了解您想要实现的目标。
能够通过 "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 并更改它。
官方回答:
您永远不应向您的成员公开直接访问权限。您想要修改的值应该在容器对象(模型)中。此模型的所有修改应由一个权限(控制器)完成。
非官方回答:
使用反射,您甚至可以访问值类型字段并获取或设置它们的值。
如果这没有帮助,我需要更清楚地了解您想要实现的目标。