2015-12-28 56 views
-1

通过“参考”可以将值分配给值类型的最佳做法是什么?在我的情况下,我需要这个可以通过应用内控制台为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; 

工程,但你可以看到它是非常不雅观方式(至少我认为它不是)。

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

干杯

+0

创建您自己的自定义类型aka类 –

+0

为什么地球上你会需要这样做? –

+0

@Ehsan Sajjad,这不是一个案例。客户希望能够通过应用内控制台更改代码中的不同变量。达林如果你阅读我的文章,你会发现,或者你有其他方式的优雅方式。 –

回答

0

官方的回答:

你不应该暴露在你的会员的直接访问。您想要修改的值应该位于容器对象(模型)中。这个模型的所有修改应该由一个权威(控制者)完成。

非官方答案:

使用反射,你就可以访问偶数值型字段,获取或设置它们的值。

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

+0

谢谢。如果这是.NET的原则,并且使用反射只是方法,那么我会说这很糟糕,我留在'指针'类。想象一下我的情况:客户希望能够通过应用内控制台更改玩家速度,以平衡游戏的目的。我的速度由'Player'类中的一些浮点控制。所以我只是创建了一行代码,并将新命令添加到我的控制台管理器中,并对此浮动进行“引用”。客户端通过控制台更改运行时的值,并检查现在所有的工作。这样做反思也是可能的,但在我看来风险更大。 –

+0

@JerrySwitalski即使在使用指针的语言中,指向一个类的私有变量的指针也是可怕的设计。为什么你的播放器类没有一个调用SetSpeed的方法?这对任何语言来说都是一个很好的解决方案,不管有没有指针。 – nvoigt

+1

考虑到这个用例,我想最好的做法是使用属性而不是字段,并用自定义属性来修饰这些属性,并将它们标记为可由控制台修改。使用反射,您可以扫描您的Player类以获取可修改的属性,并自动将适当的类型感知命令添加到您的控制台。您还可以将大量元数据添加到自定义属性中,如描述,默认值,最小值和最大值等。 –

-2

这不是c#的方式。最简单的决定是创建具有静态字段的类并对其进行更改。

+0

嗯,也许我不明白,但它将如何帮助我添加快速的新控制台命令,将控制台的值分配给某些值类型?与'指针'类我可以添加命令只有一条线“参考”任何int或浮动等。 –