代码之家  ›  专栏  ›  技术社区  ›  user64718

c并存储方法参数的引用

  •  0
  • user64718  · 技术社区  · 15 年前

    对于一些背景信息,我有一个循环中运行的应用程序,而且它一直在调用一个方法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的contractor正在将一个类变量设置为1,稍后在a中更新一个变量之后,它就好像c不再知道它仍然应该指向一个(现在更新了)并且是空的(就像它最初的w一样)。在构造函数内部)。关于如何实现我想要做的,而不必使用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 
    }
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Henk Holterman    15 年前

    自从 one 是个排练员,你可以 只有 将其作为参考传递。显然,您现在将它作为对构造函数的引用传递。你可能不需要那个 ref .

    但是请对你想要完成的事情有一个更完整的想法。

    编辑:

    看完你的C班后,就不需要 裁判 . c 将共享调用的ArrayList的实例 .

    这似乎归结为.NET中的一般referenceType/valueType问题。总结:

    • 对象的实例没有名称,无法(物理上)作为参数传递。
    • 您总是通过引用访问实例。在您的代码中, (2x) two ,请 local 都是对arraylist实例的引用。
    • 引用本身的行为类似于值类型,即赋值意味着复制。

    要了解有关referencetypes/valuetypes的更多信息,请搜索“copy semantics”,并避免以“valuetypes exist on the stack”开头的过账。

        2
  •  0
  •   Jason Baker    15 年前

    没有什么可以阻止你这样做。不过,这是否是个好主意是另一个问题。一般来说,如果可以避免,我建议尽量避免在方法调用之间更改状态。当然,这里的关键表达式是“如果你能避免它”。:-)

        3
  •  0
  •   Abel    15 年前

    不能在类中存储对另一个变量的引用

    你可以,人们总是这么做。只需将其分配给(私有)字段。

    所以当我做新的c(ref one);[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
    

    附言:既然你发布了伪代码,我希望你不介意我把它简化一点。如果我误解了你的问题,那么请置之不理(如果可能的话,也可以澄清)。

    PPS:重读(编辑过的)代码,仍然试图找出问题所在,似乎没有什么可以阻止。 C 在您的代码中,不要让成员引用 A 呼唤 a.Add 将明显反映成员变量 c 也。事实上,没有必要 ref 在这里。