Como 'fazer' ByVal em C#
Pergunta
Pelo que entendi, C# passa parâmetros para métodos por referência.No VB.NET, você pode especificar isso com ByVal e ByRef.O padrão é ByVal.
Isso é para compatibilidade com o Visual Basic 6.0 ou é apenas aleatório?Além disso, como posso especificar o que usar em C#?Gosto da ideia de passar parâmetros por valor.
Solução
Os parâmetros em C# são, por padrão passado por valor.Não há modificador para tornar isso explícito, mas se você adicionar ref
/ out
o parâmetro é por referência.
A confusão usual aqui é a diferença entre:
- passando um tipo de valor por valor (as alterações no tipo de valor não são visíveis para o chamador, mas o ideal é que os tipos de valor sejam imutáveis de qualquer maneira)
- passando um tipo de valor por referência (as alterações no tipo de valor são visíveis para o chamador, mas o ideal é que os tipos de valor sejam imutáveis de qualquer maneira - tão importante que direi duas vezes; p)
- passando uma referência por valor (muda para campos/propriedades do tipo ref são visíveis para o chamador, mas reatribuindo o tipo de referência para um objeto novo/diferente é não visível)
- passando uma referência por referência (alterações em campos/propriedades, e reatribuir a referência são visíveis para o chamador)
Outras dicas
A passagem pelo valor é o padrão em C#. No entanto, se a variável que está sendo passada for do tipo de referência, você estará passando pelo referência por valor. Essa talvez seja a origem de sua confusão.
Basicamente, se você passar uma referência por valor, poderá alterar o objeto que ele se refere e essas alterações persistirão fora do método, mas você não pode fazer a variável se referir a um objeto diferente e ter essa mudança persistir fora do método.
Os parâmetros em C# são aprovados "BYVAL" por padrão. Você precisa especificar "ref" ou "out" se quiser um comportamento diferente.