在类构造函数中通过引用传递静态变量
本文关键字:静态 变量 引用 构造函数 | 更新日期: 2023-09-27 18:02:04
public class Gameplay {
public static int count = 0;
AClass aClass = new AClass(ref count);
}
public class AClass {
public int count { get; set; }
public AClass(ref int c) {
this.count = c;
}
public void printCount() {
Console.WriteLine(this.count.ToString());
}
}
我有两个类似上面的类。假设Gameplay的count变量在另一个执行Gameplay.count++的类中增加。我想要class。count总是等于Gameplay.count.
现在,我当然可以只使用Gameplay。但是如果我在AClass的不同实例中传递不同的计数,最好有你想要访问的计数的引用。上面的例子总是写0,即使玩法计数增加了。
您希望这段代码做什么?
int c = 0;
int count = c;
c++;
c
和count
都是引用,但突变的c
不改变count
的值。
这在你的代码中是完全相同的情况。
在你的代码中,这一行:
this.count = c;
不复制c
的引用。它将赋值时的值复制到count
的值类型支持字段。
如果您需要AClass
能够访问任意整数的值,则可以将lambda表达式传递给构造函数。
public class Gameplay {
public static int count = 0;
AClass aClass = new AClass( () => count );
}
public class AClass {
public int count { get { return this.getCount(); } }
private readonly Func<int> getCount;
public AClass(Func<int> getCount) {
this.getCount = getCount;
}
public void printCount() {
Console.WriteLine(this.count.ToString());
}
}
构造函数:
public AClass(ref int c) {
this.count = c;
}
…尽管参数c
是通过引用传递的,但只要将其赋值给this.count
,该值就会被复制。因此,c
或Gameplay.count
的任何更改都不会反映在this.count
中。
这将是一个挑战,因为整数是值类型。
您可以尝试使用具有Count属性的类,并将其传入。如果你有多个具有Count属性的对象,你可以声明一个带有Count属性的接口(让我们称之为IHasCount
),并让AClass
接受IHasCount
的一个实例作为它的参数。
您的设计开始听起来像是使用了Singleton模式,这是现在不鼓励的。你最好仔细研究一下。
将计数换行到另一个类
public class CounterHolder
{
public int count = 0;
}
public class Gameplay
{
public static CounterHolder counterHolder = new CounterHolder();
AClass aClass = new AClass(counterHolder);
public void DoSomething()
{
// Something
counterHolder.count++;
aClass.printCount();
}
}
public class AClass
{
private CounterHolder _counterHolder;
public AClass(CounterHolder counterHolder)
{
_counterHolder = counterHolder;
}
public void printCount()
{
Console.WriteLine(_counterHolder.count.ToString());
}
}