Pruebas en un entorno real
Pruebe en producción sin marcas de agua.
Funciona donde lo necesites.
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.
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.
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
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.
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.
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
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.
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.
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
Aquí, el método ChangeName cambia la referencia del objeto persona original a un nuevo objeto Persona con un nombre diferente.
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.
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
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.
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.
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
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.
Aunque las palabras clave ref, out y params mejoran la forma en que los métodos reciben argumentos en C#, tienen propósitos diferentes:
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.
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
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.
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.
9 productos API .NET para sus documentos de oficina