Dúvida sobre relações em C#

Bom dia pessoal.

Estou com dúvida em relação a um certo comportamento do C#, sou iniciante então pode ser que seja algo bobo, mas vamos lá.

Vou dar essa parte do código onde utilizo um datatable como exemplo, porem o mesmo poderia ser com uma List<> ou outro tipo de variável.
A questão é a seguinte.
Tenho em um WindowsForm um botão que chama uma outra tela, passando como parâmetro um DataTable, que no caso aqui tem o nome de datatableprincipal.

private void BtGerar_Click(object sender, EventArgs e)
{
    var frv = new fmRltGenerico(datatableprincipal);
    frv.Show(this);
}

O WindowsForm chamado recebe o DataTable e usa ele como parâmetro para setar o valor de um outro DataTable chamado _dados.

    private DataTable _dados = new DataTable();
    public fmRltGenerico(DataTable dados)
    {
        InitializeComponent();
        _dados = dados;
    }

A questão é, cada DataTable está em um WindowsForm, porem se eu edito, altero qualquer parte do _dados, o datatableprincipal também é alterado.
Eu sei que é por eu ter feito _dados = dados;
Mas eu confesso que não entendo muito bem o por que acontece isso. O que eu queria na verdade é que o _dados apenas “copiasse” o DataTable recebido no caso.

Não sei se consegui ser claro em relação a minha dúvida, mas se alguém conseguir me esclarecer um pouco, eu serei muito grato.

Vlw galera

Seu entendimento é correto. Quando você faz:

_dados = dados;

Faz com que ambos objetos (_dados e dados) apontem para o mesmo DataTable. Por isso as alterações de um refletem no outro: são o mesmo objeto, apenas referenciados por nomes diferentes.

Se a sua ideia é criar um datatable totalmente novo, precisa fazer um tipo de cópia profunda (deep copy), que cria um novo DataTable e cria cópias de todos os elementos. Não sei se existe algo pronto que faça isso, mas acredito que não seja difícil de codificar.

Abraço.

Show, vou pesquisar sobre deep copy então. E obrigado pelo esclarecimento. Abraço

Bom, pesquisei e encontrei uma solução. Vou deixar o código caso alguém venha a precisar algum dia.

public static T DeepCopy<T>(T item)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, item);
    stream.Seek(0, SeekOrigin.Begin);
    T result = (T)formatter.Deserialize(stream);
    stream.Close();
    return result;
}

Apenas substitui o seguinte trecho:

Por este trecho:

_dados = DeepCopy(dados);
1 curtida