AYUDA .NET

C# Pass By Reference (Cómo funciona para desarrolladores)

Actualizado 3 de abril, 2024
Compartir:

En C#, el paso de variables a métodos puede hacerse de dos formas principales: pass by value y pasar por referencia. El paso por referencia es un método que permite pasar la referencia de una variable, en lugar de una copia de su valor, a un método. Esto significa que cualquier cambio realizado en la variable en el método llamado se reflejará en el método de llamada, ya que tanto la definición del método como el método de llamada interactúan con la misma ubicación de memoria.

En este artículo, hablaremos del concepto Pass by reference y del Biblioteca IronPDF.

Comprender la palabra clave Ref

La palabra clave ref desempeña un papel fundamental en el paso por referencia. Se utiliza tanto en la definición del método como en la llamada al método para indicar que un argumento se pasa por referencia. Esta palabra clave garantiza que un método pueda cambiar el valor del argumento que se le pasa.

La palabra clave ref puede utilizarse tanto con tipos de valor como con tipos de referencia, pero su efecto es más notable con los tipos de valor porque permite que los cambios en el tipo de valor se reflejen fuera de la llamada al método.

Ejemplo práctico: Utilización de la palabra clave Ref

Considere un escenario en el que desea escribir un método que duplica el valor de un número. Utilizando la palabra clave ref, puede asegurarse de que se modifica el valor de la variable original.

public class Program
{
    public static void Main(string [] args)
    {
        int number = 10;
        Double(ref number);
        Console.WriteLine(number); //  Salida: 20
    }
    static void Double(ref int number)
    {
        number *= 2;
    }
}
public class Program
{
    public static void Main(string [] args)
    {
        int number = 10;
        Double(ref number);
        Console.WriteLine(number); //  Salida: 20
    }
    static void Double(ref int number)
    {
        number *= 2;
    }
}
Public Class Program
	Public Shared Sub Main(ByVal args() As String)
		Dim number As Integer = 10
		Double(number)
		Console.WriteLine(number) '  Salida: 20
	End Sub
	Private Shared Sub Double(ByRef number As Integer)
		number *= 2
	End Sub
End Class
VB   C#

En el ejemplo anterior, el ref int number en el método Double significa que la variable number es un parámetro de referencia. Cuando se llama al método Doble con ref número, se modifica directamente el valor de la variable original número a 20.

Parámetros de referencia y definiciones de métodos

Los parámetros de referencia deben indicarse explícitamente tanto en la definición del método como en la llamada al método. Este requisito garantiza la claridad del código, haciendo evidente cuándo una variable se pasa por referencia. Es esencial recordar que los valores iniciales de los parámetros ref deben establecerse antes de pasarlos a un método, ya que éste podría acceder al valor o modificarlo.

Ejemplo: Intercambiar dos números

Un uso común de los parámetros ref es en una función swap, en la que se intercambian los valores de dos variables:

public class Program
{
    public static void Main()
    {
        int a = 5, b = 10;
        Swap(ref a, ref b);
        Console.WriteLine($"a: {a}, b: {b}"); //  Salida: a: 10, b: 5
    }
    static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
}
public class Program
{
    public static void Main()
    {
        int a = 5, b = 10;
        Swap(ref a, ref b);
        Console.WriteLine($"a: {a}, b: {b}"); //  Salida: a: 10, b: 5
    }
    static void Swap(ref int x, ref int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
}
Public Class Program
	Public Shared Sub Main()
		Dim a As Integer = 5, b As Integer = 10
		Swap(a, b)
		Console.WriteLine($"a: {a}, b: {b}") '  Salida: a: 10, b: 5
	End Sub
	Private Shared Sub Swap(ByRef x As Integer, ByRef y As Integer)
		Dim temp As Integer = x
		x = y
		y = temp
	End Sub
End Class
VB   C#

En este ejemplo, Swap utiliza parámetros ref para modificar directamente las posiciones de memoria de las variables a y b, intercambiando efectivamente sus valores.

Distinción entre tipos de valor y de referencia

Comprender la diferencia entre tipos de valor y tipos de referencia es crucial cuando se trata de un pase por referencia. Los tipos de valor almacenan los datos directamente en su ubicación de memoria, mientras que los tipos de referencia almacenan una referencia a los datos reales almacenados en una ubicación de memoria diferente.

El uso de la palabra clave ref con tipos de referencia permite modificar la propia referencia, por ejemplo, apuntándola a un nuevo objeto.

Ejemplo: Modificación del tipo de referencia

Considere la posibilidad de modificar el nombre de un objeto Persona a través de un método:

public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        Person person = new Person { Name = "John" };
        ChangeName(ref person);
        Console.WriteLine(person.Name); //  Salida: Jane
    }
    static void ChangeName(ref Person p)
    {
        p = new Person { Name = "Jane" };
    }
}
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        Person person = new Person { Name = "John" };
        ChangeName(ref person);
        Console.WriteLine(person.Name); //  Salida: Jane
    }
    static void ChangeName(ref Person p)
    {
        p = new Person { Name = "Jane" };
    }
}
Public Class Person
	Public Property Name() As String
End Class
Public Class Program
	Public Shared Sub Main()
		Dim person As New Person With {.Name = "John"}
		ChangeName(person)
		Console.WriteLine(person.Name) '  Salida: Jane
	End Sub
	Private Shared Sub ChangeName(ByRef p As Person)
		p = New Person With {.Name = "Jane"}
	End Sub
End Class
VB   C#

Aquí, el método ChangeName cambia la referencia del objeto persona original a un nuevo objeto Persona con un nombre diferente.

Palabra clave Out para devolver varios valores

Otra palabra clave estrechamente relacionada con ref es out. La palabra clave out se utiliza para pasar argumentos a los métodos como referencias. Resulta especialmente útil cuando se desea que un método devuelva varios valores. A diferencia de ref, las variables pasadas con out no necesitan ser inicializadas antes de ser pasadas a un método.

Ejemplo: Devolución de varios valores

public class Program
{
    public static void Main()
    {
        GetValues(out int a, out int b);
        Console.WriteLine($"a: {a}, b: {b}");
    }
    static void GetValues(out int x, out int y)
    {
        x = 5;
        y = 10;
    }
}
public class Program
{
    public static void Main()
    {
        GetValues(out int a, out int b);
        Console.WriteLine($"a: {a}, b: {b}");
    }
    static void GetValues(out int x, out int y)
    {
        x = 5;
        y = 10;
    }
}
Public Class Program
	Public Shared Sub Main()
		Dim a As Integer
		Dim b As Integer
		GetValues(a, b)
		Console.WriteLine($"a: {a}, b: {b}")
	End Sub
	Private Shared Sub GetValues(ByRef x As Integer, ByRef y As Integer)
		x = 5
		y = 10
	End Sub
End Class
VB   C#

En este ejemplo, GetValues utiliza la palabra clave out para devolver dos enteros a la persona que llama. Esto ilustra cómo la palabra claveout permite a un método dar salida a múltiples valores sin devolver un objeto complejo o utilizar parámetros out.

Uso de Params para parámetros de métodos flexibles

Otra palabra clave que mejora la forma de pasar argumentos a los métodos es params. La palabra clave params permite especificar un parámetro de método que toma un número variable de argumentos. Esto puede ser especialmente útil cuando el número exacto de entradas que debe manejar su método no es fijo.

Ejemplo: Suma con parámetros

public class Program
{
    public static void Main()
    {
        int sum = Sum(1, 2, 3, 4, 5); //  Puede pasar cualquier número de argumentos
        Console.WriteLine($"Sum: {sum}");
    }
    static int Sum(params int [] numbers)
    {
        return numbers.Sum();
    }
}
public class Program
{
    public static void Main()
    {
        int sum = Sum(1, 2, 3, 4, 5); //  Puede pasar cualquier número de argumentos
        Console.WriteLine($"Sum: {sum}");
    }
    static int Sum(params int [] numbers)
    {
        return numbers.Sum();
    }
}
Public Class Program
	Public Shared Sub Main()
		Dim sum As Integer = Sum(1, 2, 3, 4, 5) '  Puede pasar cualquier número de argumentos
		Console.WriteLine($"Sum: {sum}")
	End Sub
	Private Shared Function Sum(ParamArray ByVal numbers() As Integer) As Integer
		Return numbers.Sum()
	End Function
End Class
VB   C#

En este fragmento de código, el método Suma utiliza la palabra clave parámetros para aceptar una matriz de enteros. De esta forma, el método puede manejar cualquier número de argumentos enteros y sumarlos, demostrando la flexibilidad que params proporciona a los parámetros de los métodos.

Diferencias entre Ref, Out y Params

Aunque las palabras clave ref, out y params mejoran la forma en que los métodos reciben argumentos en C#, tienen propósitos diferentes:

  • ref se utiliza para pasar una variable por su referencia, permitiendo que el método modifique la variable del invocador.
  • out es similar a ref pero está específicamente diseñado para métodos que necesitan devolver múltiples valores. Las variables pasadas como parámetros out no necesitan ser inicializadas de antemano.
  • params ofrece una forma de pasar un número variable de argumentos a un método, haciendo que tus métodos sean más flexibles en términos del número de entradas que pueden manejar.

Introducción a la biblioteca IronPDF

IronPDF es una biblioteca PDF .NET desarrollada para que los desarrolladores que trabajan con C# puedan crear, manipular y leer archivos PDF sin esfuerzo. Los promotores pueden crear archivos PDF a partir de cadenas HTML archivos HTML y URL. También ofrece funciones avanzadas de edición de PDF como encabezados, pies de página, marcas de agua y muchas más. Su sencilla integración en proyectos C# mediante NuGet simplifica el manejo de archivos PDF.

Cuando pasas parámetros por referencia utilizando la palabra clave ref en C#, esencialmente estás permitiendo que un método modifique el objeto que estás pasando. Este método de pasar parámetros de referencia resulta útil cuando se trabaja con objetos o recursos de gran tamaño, como archivos PDF, ya que garantiza que siempre se interactúa con el mismo objeto en diferentes llamadas a métodos, lo que reduce la sobrecarga y mejora el rendimiento.

Ejemplo de código

Considere el siguiente ejemplo de código simple que demuestra el uso del parámetro ref con IronPDF para modificar un documento PDF dentro de un método:

using IronPdf;
using IronPdf.Editing;
public class PdfEditor
{
    public void AddWatermark(ref PdfDocument document, string watermarkText, int opacity = 90, VerticalAlignment verticalAlignment = IronPdf.Editing.VerticalAlignment.Middle, HorizontalAlignment horizontalAlignment = IronPdf.Editing.HorizontalAlignment.Center)
    {
        document.ApplyWatermark(watermarkText, opacity, verticalAlignment, horizontalAlignment);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "ILicense-Key";
        var pdf = new PdfDocument("Report.pdf");
        var editor = new PdfEditor();
        //  Pasando el objeto 'pdf' por referencia. Cualquier cambio realizado en 'AddWatermark' afecta al objeto 'pdf' original.
        editor.AddWatermark(ref pdf, "<h2>Confidential</h2>");
        //  Guardar el documento modificado
        pdf.SaveAs("modified_document.pdf");
    }
}
using IronPdf;
using IronPdf.Editing;
public class PdfEditor
{
    public void AddWatermark(ref PdfDocument document, string watermarkText, int opacity = 90, VerticalAlignment verticalAlignment = IronPdf.Editing.VerticalAlignment.Middle, HorizontalAlignment horizontalAlignment = IronPdf.Editing.HorizontalAlignment.Center)
    {
        document.ApplyWatermark(watermarkText, opacity, verticalAlignment, horizontalAlignment);
    }
}
class Program
{
    static void Main(string [] args)
    {
        License.LicenseKey = "ILicense-Key";
        var pdf = new PdfDocument("Report.pdf");
        var editor = new PdfEditor();
        //  Pasando el objeto 'pdf' por referencia. Cualquier cambio realizado en 'AddWatermark' afecta al objeto 'pdf' original.
        editor.AddWatermark(ref pdf, "<h2>Confidential</h2>");
        //  Guardar el documento modificado
        pdf.SaveAs("modified_document.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Public Class PdfEditor
	Public Sub AddWatermark(ByRef document As PdfDocument, ByVal watermarkText As String, Optional ByVal opacity As Integer = 90, Optional ByVal verticalAlignment As VerticalAlignment = IronPdf.Editing.VerticalAlignment.Middle, Optional ByVal horizontalAlignment As HorizontalAlignment = IronPdf.Editing.HorizontalAlignment.Center)
		document.ApplyWatermark(watermarkText, opacity, verticalAlignment, horizontalAlignment)
	End Sub
End Class
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		License.LicenseKey = "ILicense-Key"
		Dim pdf = New PdfDocument("Report.pdf")
		Dim editor = New PdfEditor()
		'  Pasando el objeto 'pdf' por referencia. Cualquier cambio realizado en 'AddWatermark' afecta al objeto 'pdf' original.
		editor.AddWatermark(pdf, "<h2>Confidential</h2>")
		'  Guardar el documento modificado
		pdf.SaveAs("modified_document.pdf")
	End Sub
End Class
VB   C#

C# Pasar por referencia (Cómo funciona para los desarrolladores): Figura 1

En este ejemplo, el método AddWatermark modifica el objeto PdfDocument directamente porque se pasa por referencia. Esto significa que el objeto pdf en el método Main refleja cualquier cambio realizado por AddWatermark.

Conclusión

En conclusión, entender cómo utilizar el paso por referencia en C# es crucial para los desarrolladores que buscan manipular variables directamente dentro de los métodos o devolver múltiples valores de manera eficiente. La correcta aplicación de las palabras clave ref, out y params mejora la funcionalidad y flexibilidad de su código.

Si está trabajando en proyectos que requieren funcionalidades PDF avanzadas, IronPDF ofrece una solución convincente con su sólida biblioteca. Proporcionan una prueba gratuita las opciones comienzan a partir de $749.

< ANTERIOR
C# Corto (Cómo funciona para los desarrolladores)
SIGUIENTE >
Valor absoluto en C# (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123