2015-12-28 25 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或浮動等。 –