我有一个班级,我拿着一些变量:
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 :(得分: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
要更改原始值,您必须使用ref
或out
:
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);
答案 1 :(得分:0)
最常见的方法不会更改方法范围之外的任何值,而是返回新值。只有通过引用而不是值接受参数的方法才能更改调用上下文中参数的值。
This article on MSDN是理解如何通过引用而不是值传递参数的一个很好的起点。
请注意,您无法将类成员作为ref
或out
参数传递。如果您希望通过引用更新类的一部分,则需要将整个类对象作为引用传递。