【问题标题】:Passing variable from another class as input but not getting value back从另一个类传递变量作为输入但没有取回值
【发布时间】:2016-04-16 07:14:41
【问题描述】:

我有一堂课,里面有一些变量:

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);

所以参数previous正在改变它应该的方式,但来自类PreviousCalls的变量根本没有改变,为什么会这样?

【问题讨论】:

  • 请同时附上AI() 方法的作用,以便我们更好地理解您的问题。
  • 它会计算一些我认为没有必要的东西让我们说 AI 只是做 previous - 1 .. 来自 PreviousCalls 的变量根本不会改变

标签: c# class return


【解决方案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; 
       //....
    }

然后执行:

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

用法:

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

【讨论】:

  • 请用ref 粘贴您的代码并输出。我相信你犯了一个错误 - 请参阅我的上一个 sn-p。
  • @kopelence 那是因为你不能传递一个类的一个字段,如果你想更新一个类的一部分,你需要传递整个类作为参考。
  • 如何传递整个类作为参考?
  • PreviousCalls 实例还是previousBot1Call 是静态成员?
  • 在我的问题中它是静态成员
【解决方案2】:

最常见的方法不会更改其方法范围之外的任何值,而是返回一个新值。只有通过引用而不是值接受参数的方法才能在调用上下文中更改参数的值。

This article on MSDN 是了解如何通过引用而不是值传递参数的一个很好的起点。

请注意,您将无法将类成员作为refout 参数传递。如果您希望通过引用更新类的一部分,则需要将整个类对象作为引用传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2021-11-09
    相关资源
    最近更新 更多