2016-01-11 45 views
0

我有一個類,我保持一些變量:從另一個類作爲輸入,傳遞變量,但沒有得到值回

public class PreviousCalls 
{ 
    private static int bot1Call; 
    public static int previousBot1Call 
    { 
     get { return bot1Call; } 
     set { bot1Call = value; } 
    } 

    private static int bot2Call; 
    public static int previousBot2Call 
    { 
     get { return bot2Call; } 
     set { bot2Call = value; } 
    } 

    private static int bot3Call; 
    public static int previousBot3Call 
    { 
     get { return bot3Call; } 
     set { bot3Call = value; } 
    } 

    private static int bot4Call; 
    public static int previousBot4Call 
    { 
     get { return bot4Call; } 
     set { bot4Call = value; } 
    } 

    private static int bot5Call; 
    public static int previousBot5Call 
    { 
     get { return bot5Call; } 
     set { bot5Call = value; } 
    } 
} 

我需要將這些變量作爲參數傳遞給了很多的方法,我在其他類這裏的我該怎麼做:

void AI(... , int previous) 
AI(... , PreviousCalls.previousBot1Call); 

所以參數以前被改變的方式應該但從類PreviousCalls沒有改變,在所有的變量,這是爲什麼?

+0

還請包括'AI()'方法的作用,以便我們更好地理解您的問題。 –

+0

好吧,它計算了一些事情,我不認爲這是必要的讓我們說,AI只是'前 - 1'..來自PreviousCalls的變量將不會改變 – kopelence

回答

1

int是值類型,因此有一個傳遞給方法體的'上一個值'的副本。因此,改變內方法的變量不會造成原始值的改變:

public void Test(int a) 
{ 
    a = 10; 
} 

int t = 11; 
Test(t); 
//t is still 11, because Test method operates on copy of t 

要改變原有的價值,你必須使用refout

void AI(..., ref int previous) { ... } 

int param; 
AI(..., ref param); //when ref is used, original variable wil be changed. 
PreviousCalls.previousBot1Call = param; 

不幸的是,你不能這樣使用它:

AI(... , ref PreviousCalls.previousBot1Call); // compile-time error 
               // member-access is forbidden wtih out/ref 
AI(,.., ref 10); // compile-time error 

的另一種嘗試:

interface IAIParam 
    { 
     int Previous { get; set; } 
     // other params 
    } 

    void AI(IAIParam p) 
    { 
     p.Previous += 1; 
     //.... 
    } 

然後implementaiton:

internal class MyBotProxy : IAIParam 
{ 
    public int Previous 
    { 
     get { return PreviousCalls.previousBot1Call; } 
     set { PreviousCalls.previousBot1Call = value; } 
    } 
} 

用法:

var myProxy = new MyBotProxy(); 
AI(myProxy); 
+0

請用'ref'粘貼你的代碼。我相信你犯了一個錯誤 - 看我最後的片段。 – pwas

+0

@kopelence這是因爲你不能傳遞一個類的一個字段,如果你想更新一個類的一部分,你需要傳遞整個類作爲參考。 –

+0

如何傳遞整個類作爲參考? – kopelence

0

最常見的方法不改變任何價值,他們的方法範圍之外,相反,他們返回一個新值。只有通過引用而不是值接受參數的方法才能更改調用上下文中參數的值。

This article on MSDN是瞭解如何通過引用而不是值傳遞參數的一個很好的起點。

請注意,您將無法通過refout參數的班級成員。如果你想通過引用更新一部分類,你需要傳遞整個類對象作爲參考。

相關問題