在类构造函数中通过引用传递静态变量

本文关键字:静态 变量 引用 构造函数 | 更新日期: 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++;

ccount都是引用,但突变的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,该值就会被复制。因此,cGameplay.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());
        }
    }