Pasar objeto por referencia en C#

Muhammad Maisam Abbas 16 febrero 2024
  1. Pasar variables por valor a una función en C#
  2. Pasar variables por referencia a una función en C#
  3. Pasar objetos por referencia a una función en C#
Pasar objeto por referencia en C#

Este tutorial discutirá los métodos para pasar un objeto a una función en C#.

Pasar variables por valor a una función en C#

Todas las variables de tipo de valor se pasan por valor de forma predeterminada en C#. Supongamos que pasamos una variable por valor a una función y modificamos esa variable en la función. En ese caso, no hay ningún efecto sobre el valor de la variable pasada en los argumentos de la función. Lo que sucede aquí es que se crea una copia separada de la variable pasada en la memoria, y todas las operaciones se realizan en esa copia en particular. El siguiente ejemplo de código nos muestra cómo podemos pasar una variable de tipo de valor por valor en C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Producción :

New value = something
Original Value = Nothing

En el código anterior, pasamos la variable de cadena valueType por valor a la función method1() que asigna un nuevo valor a la variable pasada. Se crean dos copias diferentes de variables que tienen el mismo valor en la memoria cuando pasamos la variable valueType por valor a la función method1(). Y luego, la segunda copia de la variable se modifica al valor de something. Esta segunda copia solo es accesible dentro de la función method1(). Cualquier cambio en este segundo valor no cambia la variable original valueType.

Pasar variables por referencia a una función en C#

También podemos pasar una variable de tipo de valor por referencia con la palabra clave ref en C#. La palabra clave ref especifica que un valor se pasa por referencia a una función. Con este enfoque, solo existirá una copia de la variable en la memoria y se pasará un puntero separado a la función que apunta al valor de la variable. El siguiente ejemplo de código nos muestra cómo pasar una variable de tipo de valor por referencia con la palabra clave ref en C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Producción :

New value = something
Original Value = something

En el código anterior, pasamos la variable de tipo de valor valueType por referencia a la función method1() con la palabra clave ref en C#. La función metodo1() toma una referencia a la variable valueType como argumento y modifica el valor de la variable valueType a something. Esta vez, se modifica el valor original.

Pasar objetos por referencia a una función en C#

De forma predeterminada, todas las variables de tipo de referencia como instancias de clase, instancias de estructura, etc. se pasan por referencia a las funciones en C#. Lo que sucede aquí es que el objeto original nunca se pasa como parámetro a una función. Se pasa una nueva referencia al objeto por valor como argumento de la función. Entonces, terminamos teniendo dos copias de punteros que apuntan a la misma ubicación de memoria. Si modificamos el valor de ese puntero, el valor del objeto original también se modifica. El siguiente ejemplo de código nos muestra cómo pasar un objeto por referencia a una función en C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

Producción :

something

En el código anterior, pasamos el objeto sam por referencia a la función dosomething() que modifica la propiedad s dentro del objeto sam. Cambia el valor del objeto sam original y asigna algo a la propiedad sam.s. Aunque esta es la forma predeterminada de pasar objetos por referencia, existe una excepción a este enfoque. Si inicializamos el objeto pasado con la palabra clave new y el constructor de la clase, se crea una copia separada del objeto dentro de la memoria. Cualquier cambio en el valor de ese objeto no cambia el objeto original pasado como parámetro. El siguiente ejemplo de código muestra un escenario en el que este objeto pasa por valor a una función en C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

Producción :

Initial passed value = Nothing
New value = something
Original Value = Nothing

Pasamos el objeto sam por valor a la función dosomething() en C# en el código anterior. La función dosomething() toma el argumento, imprime su valor inicial, modifica el valor e imprime el valor modificado. Este nuevo valor se asigna a una nueva ubicación de memoria y el objeto original sam no puede acceder a él.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Csharp Class