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

Passing a static variable by reference in a class constructor

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

我有两个 class 和上面的一样。假设 Gameplay 的计数变量在另一个 class 中增加 Gameplay.count++。我希望 AClass.count 始终等于 Gameplay.count.

现在,我当然可以在 AClass 中使用 Gameplay.count,但是如果我有不同的计数要传递到 AClass 的不同实例中,最好引用您要访问的计数。上面的例子总是写 0,即使游戏次数增加了也是如此。

在你的构造函数中:

public AClass(ref int c) {
    this.count = c;
}

... 即使参数 c 是通过引用传递的,只要您将其分配给 this.count,该值就会被复制。因此,对 cGameplay.count 的任何更改都不会反映在 this.count.

您希望这段代码做什么?

int c = 0;
int count = c;
c++;

ccount 都是引用,但以某种方式改变 c 不会改变 count.

的值

你的代码中的情况完全一样。

在您的代码中,这一行:

this.count = c;

不复制对 c 的引用。它将赋值时的值复制到 count.

的值类型支持字段

如果您需要 AClass 能够访问某个任意整数的值,您可以将 lambda expression 传递给构造函数。

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

这将具有挑战性,因为整数是值类型。

您可以尝试使用具有计数 属性 的 class,并将其传入。如果您有多个具有 Count 属性的对象,您可以声明一个具有 属性 Count 的接口(我们称之为 IHasCount),并让 AClassIHasCount 的实例作为它的参数。

你的设计开始听起来像是在使用单例模式,现在不提倡使用单例模式。您可能想阅读相关内容。

将计数换成另一个 class

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