在 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
,该值就会被复制。因此,对 c
或 Gameplay.count
的任何更改都不会反映在 this.count
.
中
您希望这段代码做什么?
int c = 0;
int count = c;
c++;
c
和 count
都是引用,但以某种方式改变 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
),并让 AClass
将 IHasCount
的实例作为它的参数。
你的设计开始听起来像是在使用单例模式,现在不提倡使用单例模式。您可能想阅读相关内容。
将计数换成另一个 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());
}
}
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
,该值就会被复制。因此,对 c
或 Gameplay.count
的任何更改都不会反映在 this.count
.
您希望这段代码做什么?
int c = 0;
int count = c;
c++;
c
和 count
都是引用,但以某种方式改变 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
),并让 AClass
将 IHasCount
的实例作为它的参数。
你的设计开始听起来像是在使用单例模式,现在不提倡使用单例模式。您可能想阅读相关内容。
将计数换成另一个 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());
}
}