C# apenas copia dados de campo para atribuir a outro campo ou se refere aos dados?

StackOverflow https://stackoverflow.com/questions/2078974

  •  21-09-2019
  •  | 
  •  

Pergunta

Ao atribuir um campo a outro, o C# apenas copia dados ou realmente cria o link? Dentro isto Artigo Há um exemplo de estrutura do motor do jogo. O codificador lá tem componentes contêm seus pais. Em C#, eles apenas contêm a cópia pai ou se referem a ela?

Código de exemplo:

class World
{
    ...
    public void Update()
    {
        ...
        ent.OnAttach(this);
        ...
    }
    ...
}

class Entity
{
    ...
    public void OnAttach(World world)
    {
        world_ = world;
    }
    ...
}

O objeto da entidade agora pode acessar o objeto mundial e ter acesso aos seus campos e métodos, como na Artice? (Ou eu entendi mal o código?)

Foi útil?

Solução

Porque o seu tipo de dados World é definido como um class e não um struct Isso significa que quando você atribui uma variável desse tipo, apenas um referência para os mesmos dados são copiados.

Em outros wrods, se você usa world.SomeProperty = something ou world_.someProperty = something Eles estarão editando o mesmo objeto na memória.

Se você alterar seu tipo de dados para ser um struct Em seguida, toda a estrutura de dados será copiada e você terá duas cópias dos mesmos dados.

Independentemente de como você definiu seus dados, depois de ter uma referência aos dados, você pode acessar seus métodos ou propriedades. Portanto, sim, uma vez que seu objeto de entidade tenha uma referência ao objeto mundial, ele pode acessar quaisquer métodos ou propriedades nele (desde que não sejam privados).

Outras dicas

Depende do World modelo. Se for um tipo de referência (uma classe), a referência copiada apontará para o mesmo objeto e, assim, alterar o objeto apontado pela nova referência, afetará o objeto original (nenhum novo objeto será criado). Este é o caso na amostra postada. O campo simplesmente se referirá ao mesmo World objeto.

Se o World O tipo é um tipo de valor, é copiado (junto com seu conteúdo) e se tornará um valor totalmente distinto, alterando que não afetará o original.

Como entidade e mundo são classe (ou seja, "tipos de referência"), eles teriam apenas referências um ao outro. Se alguém fosse uma estrutura (ou seja, um "tipo de valor"), a coisa da enite seria copiada.

Você deve dar uma olhada na passagem por referência e passagem por valor. Seu objeto mundial é um referência passada por referência, então você está passando uma referência a um local na memória em que os dados que esse objeto contém reside.

A entidade agora só poderia acessar apenas os métodos públicos de objeto mundial.

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