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

时间:2016-08-11 16:06:33

标签: c# constructor pass-by-reference

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 ++ 的另一个类中增加。我希望AClass.count始终等于Gameplay.count。

现在,我当然可以在AClass中使用Gameplay.count但是如果我有不同的计数来传递AClass的不同实例,那么最好能够引用你想要访问的计数。即使游戏玩法计数增加,上面的示例总是写0。

4 个答案:

答案 0 :(得分:3)

您希望此代码能做什么?

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

答案 1 :(得分:1)

在你的构造函数中:

"success"

...即使参数public AClass(ref int c) { this.count = c; } 通过引用传递,只要将其分配给c,该值就会被复制。因此,对this.countc的任何更改都不会反映在Gameplay.count中。

答案 2 :(得分:0)

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

您可以尝试使用具有Count属性的类,并将其传递给它。如果您有多个具有Count属性的对象,则可以声明具有Count属性的接口(让我们称之为IHasCount)并让AClassIHasCount的实例作为其参数。< / p>

你的设计开始听起来像使用Singleton模式,现在不鼓励这样做。你可能想读一下。

答案 3 :(得分:0)

将计数包装到另一个班级

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