对于一些背景信息,我有一个在循环中运行的应用程序,并且它总是勾选它调用方法Tick。有一堆类扩展了一个基类,并且都有自己的tick方法,并且被添加到一个依赖链中,这样就可以说当A类被调用并且它的链中有B和C的实例时,B.Tick被调用接着是C.Tick,然后是A.Tick。
所以在伪代码中,我的类看起来像这样:
public class A : Super
Super b;
Super c;
ArrayList one;
ArrayList two;
tick(){
one.Add(b.LastValue);
two.Add(c.LastValue);
... do something with one and two ...
}
A(){
b = new B(some other array list);
c = new C(ref one);
}
B工作正常,并始终获得正确的值。问题是我猜你不能在类中存储对另一个变量的引用,所以当我做新的C(ref one)时;并且C的构造函数将一个类变量设置为1,稍后在A中更新一个之后它就像C一样不再知道它仍然应该指向一个(现在已经更新)并且只是空(就像它最初一样)在构造函数内部)。有关如何实现我想做的事情的任何想法,而不必使用C#指针和不安全的代码?谢谢,希望它有意义:))
编辑: 显然,人们无法回答与实际问题完全无关的混淆伪代码的问题,因此更改扩展为:
编辑2:C类
...
ArrayList local;
...
C(ref ArrayList one){
local = one;
}
Tick(){
LastValue = local[0] + 5; //not actual formula, just shows trying to use a referenced variable
}
答案 0 :(得分:2)
由于one
是一个ArrayList,您可以仅将其作为参考传递。您现在显然已将其作为对构造函数的引用的引用传递。您可能不需要ref
。
但请详细说明您要完成的工作。
看到你的C课程后,就不需要ref
了。 c
将共享A调用one
。
这似乎归结为.NET中的一般referencetype / valuetype问题。总结一下:
one
(2x),two
,local
都是对Arraylist实例的引用。 要了解有关referencetypes / valuetypes的更多信息,请搜索“复制语义”并避免以“存在于堆栈中的值类型”开头的帖子。
答案 1 :(得分:0)
您无法存储对类
中另一个变量的引用
你可以,人们一直这样做。只需将其分配给(私人)字段。
所以当我做新的C(参考一个); [snip /]稍后在A更新之后它就像C一样不再知道它仍然应该指向一个
实际上,它确实知道这一点,但您应该将one
分配给成员字段。分配给对象只不过是设置对象的引用。更改对象,在您指定的任何位置更改它们:
class A
{
public string Hello { get; set; }
}
class C
{
private A myA;
public C(A a) { myA = a; }
public A GetMyA() { return myA; }
}
// somewhere else:
A someA = new A();
someA.Hello = "Hello World";
C someC = new C(someA);
someA.Hello = "Other World";
Console.WriteLine(someC.GetMyA().Hello);
// this will print "Other World" and not "Hello World" as you suggest
PS:既然你发布了伪代码,我希望你不要介意我简化一下。如果我误解了你的问题,那么请忽略(如果可能的话,也许澄清一下)。
PPS:重读你的(编辑过的)代码并仍然试图弄清楚问题是什么,似乎没有什么能阻止代码中的C
使成员引用{{ 1}}并且调用A
显然也会反映a.Add
中的成员变量。实际上,这里不需要c
。
答案 2 :(得分:0)
没有什么可以阻止你这样做。然而,这是否是一个好主意是另一个问题。一般来说,如果可以避免,我建议尽量避免在方法调用之间更改状态。当然,那里的关键表达是“如果你能避免它”。 : - )