Pergunta

Para um pouco de informação, eu tenho um aplicativo que está sendo executado em um loop, e mais que nunca carrapato ele chama um método Tick. Há um monte de classes que estendem a classe base e todos têm seus próprios métodos de carrapatos, e são adicionados a uma cadeia de dependência de modo que dizer quando a classe A é chamado e é cadeia tem instâncias de B e C na mesma, B.Tick é chamado , seguido por C.Tick, e então finalmente A.Tick.

Assim, no código pseudo minha classe tipo de olhares como este:

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 está funcionando bem, e sempre recebe o valor correto. O problema é que eu acho que você não pode armazenar uma referência a outra variável em uma classe, então quando eu faço novo C (um ref); eo contructor para C está definindo uma variável de classe para um, mais tarde, após um é atualizado em um é como C não sabe que o seu ainda deveria estar apontando para um (que é agora atualizado) e é apenas esvaziar (como originalmente estava dentro do construtor). Qualquer idéia sobre como conseguir o que eu estou procurando fazer, sem ter que usar C ponteiros # e código inseguro? Obrigado, espero que ele faz sentido:)

Edit: Aparentemente, as pessoas não podem responder a perguntas com confundindo código pseudo que é completamente sem relação com a questão real, tão mudado estende-se a:

Edit 2: classe 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 
}
Foi útil?

Solução

Desde one é um ArrayList, você pode única passá-lo como uma referência. Está agora, aparentemente, passando-o como uma referência-to-a-referência para o construtor. Você pode não precisar que ref.

Mas por favor mostre uma idéia mais completa do que você está tentando realizar.

Editar:

Depois de ver sua classe C, não há necessidade para o ref. c irá partilhar a instância do ArrayList que A chama one.

Este parece resumir-se à questão geral referenceType / valuetype em .NET. Para resumir:

  • instâncias de objetos não têm um nome e não pode (fisicamente) ser passada como parâmetro a todos.
  • você sempre acessar uma instância através de uma referência. Em seu código, one (2x), two, local são todas as referências a casos ArrayList.
  • as referências se comportam como valuetypes, isto é, meios de atribuição copiar.

Para saber mais sobre referencetypes / valuetypes, procurar 'copiar semântica' e postagens evitar que começam com 'existem valuetypes na pilha'.

Outras dicas

Não há nada para impedi-lo de fazer isso. Se é ou não é uma boa idéia é outra questão embora. Em geral, eu recomendo tentar evitar o estado mudar entre chamadas de método se você pode evitá-lo. Claro, a expressão chave é "se você pode evitá-lo". : -)

Você não pode armazenar uma referência a outra variável em uma classe

Você pode, as pessoas fazem isso o tempo todo. Simplesmente atribuí-la a um campo (privado).

Então, quando eu faço novo C (um ref); [Snip /], mais tarde, após um é atualizado em um é como C não sabe que o seu ainda deveria estar apontando para um

Na verdade, ele sabe disso, mas você deve atribuir one a um campo de membro. Atribuindo a objetos não é nada mais, em seguida, definir uma referência para o objeto. Alterar o objeto, as mudanças em todos os lugares que você atribuiu-lo:

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: desde que você estavam postando pseudocódigo, espero que você não se importa de me simplificando-o um pouco. Se eu não entendi sua pergunta, em seguida, por favor desconsidere (e talvez esclarecer, se possível).

PPS: relendo seu código (editado) e ainda tentando descobrir qual é o problema, não parece haver nada que impeça C em seu código de manter um membro com uma referência a A e chamando a.Add irá, obviamente, refletir a variável de membro em c também. Na verdade, não há necessidade de ref aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top