AYUDA .NET

C# Ref Keywords (Cómo funciona para los desarrolladores)

La palabra clave C# ref es una herramienta esencial que todo principiante debería aprender. Se utiliza para pasar argumentos o args por referencia en lugar de por valor, permitiendo que los cambios realizados en la variable de tipo referencia dentro del método llamado se reflejen fuera de él. En este tutorial, repasaremos los detalles de la palabra clave ref y exploraremos varios ejemplos de código de consola que ilustran cómo funciona.

Introducción a la palabra clave ref

Cuando pasas un parámetro a un método en C#, por defecto, se pasa por valor. Esto significa que se crea una copia del valor del parámetro, y cualquier cambio realizado dentro del método de llamada no afectará a la variable original fuera del método. La palabra clave ref cambia este comportamiento, permitiéndote pasar un parámetro por referencia. Cuando un parámetro se pasa por referencia, cualquier cambio realizado dentro del método afectará directamente a la variable original fuera del método.

Conceptos clave

  • ref keyword: Utilizada para indicar que una variable se pasa por referencia.
  • Variables de referencia: Tipos que hacen referencia a la ubicación de memoria donde se almacenan los datos.
  • Tipos de valor: Tipos que contienen los datos reales.
  • Variable original: La variable fuera del método que refleja los cambios realizados dentro del método al usar las palabras clave ref.

Pasar por referencia

Empecemos por entender el concepto de cómo se pasan las variables por referencia. Imagina que tienes un método que incrementa un entero como se muestra en el siguiente código:

class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
class Program
{
//method returns incremented value
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  // Output: 5
    }
}
Friend Class Program
'method returns incremented value
	Private Shared Sub IncrementByOne(ByVal num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOne(value)
		Console.WriteLine(value) ' Output: 5
	End Sub
End Class
$vbLabelText   $csharpLabel

En el código anterior, aunque incrementamos num dentro del método IncrementByOne, el value original permanece sin cambios. Esto se debe a que num es una copia de la variable original, y los cambios realizados en ella no afectan a la original.

Utilizar la palabra clave ref

Ahora, veamos cómo la palabra clave ref puede cambiar este comportamiento. Al usar ref, puedes pasar una variable por referencia al método como se muestra en uno de los ejemplos de código a continuación.

class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  // Output: 6
    }
}
Friend Class Program
'ref int
	Private Shared Sub IncrementByOneRef(ByRef num As Integer)
		num += 1
	End Sub

	Shared Sub Main()
		Dim value As Integer = 5
		IncrementByOneRef(value)
		Console.WriteLine(value) ' Output: 6
	End Sub
End Class
$vbLabelText   $csharpLabel

Observe la palabra clave ref tanto en la firma del método como en la llamada. Esto le indica a C# que desea pasar la variable value por referencia. Como resultado, los cambios realizados dentro del método IncrementByOneRef se reflejan en la variable original value.

Trabajar con tipos de valores

La palabra clave ref es particularmente útil al trabajar con tipos como enteros, dobles y estructuras. Estos tipos se almacenan directamente en memoria, y pasarlos por referencia puede suponer mejoras de rendimiento y un control más preciso de la manipulación de los datos.

Modificación de variables de referencia

Aunque la palabra clave ref se asocia comúnmente con tipos de valor, también puede usarse con variables de tipo referencia. Los tipos de referencia, como las clases y las matrices, almacenan una referencia a los datos reales en memoria en lugar de los datos en sí. Esto significa que está tratando con una estructura similar a un puntero, y pasar por referencia puede dar resultados diferentes, como se muestra en el siguiente ejemplo:

class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
class Person
{
    public string Name { get; set; }
}

class Program
{
    //method
    static void ChangeName(ref Person person)
    {
        //new object
        person = new Person { Name = "Alice" };
    }

    static void Main()
    {
        Person person = new Person { Name = "Bob" };
        ChangeName(ref person);
        Console.WriteLine(person.Name);  // Output: Alice
    }
}
Friend Class Person
	Public Property Name() As String
End Class

Friend Class Program
	'method
	Private Shared Sub ChangeName(ByRef person As Person)
		'new object
		person = New Person With {.Name = "Alice"}
	End Sub

	Shared Sub Main()
		Dim person As New Person With {.Name = "Bob"}
		ChangeName(person)
		Console.WriteLine(person.Name) ' Output: Alice
	End Sub
End Class
$vbLabelText   $csharpLabel

En este ejemplo, el método ChangeName cambia la referencia de la variable person a un nuevo objeto Person. Como resultado, la variable original person ahora apunta a un objeto diferente, y su nombre es "Alice".

Sobrecarga de métodos con parámetros de tipo referencia

Puede tener varios métodos con el mismo nombre pero diferentes parámetros. Esto se denomina sobrecarga de métodos. Al usar la palabra clave ref, la sobrecarga de métodos se vuelve más poderosa.

class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
class Calculator
{
    public static void Add(ref int x, int y)
    {
        x += y;
    }

    public static void Add(ref double x, double y)
    {
        x += y;
    }
}

class Program
{
    static void Main()
    {
        int intValue = 5;
        double doubleValue = 7.5;
        //ref parameter
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      // Output: 8
        Console.WriteLine(doubleValue);   // Output: 10.0
    }
}
Friend Class Calculator
	Public Shared Sub Add(ByRef x As Integer, ByVal y As Integer)
		x += y
	End Sub

	Public Shared Sub Add(ByRef x As Double, ByVal y As Double)
		x += y
	End Sub
End Class

Friend Class Program
	Shared Sub Main()
		Dim intValue As Integer = 5
		Dim doubleValue As Double = 7.5
		'ref parameter
		Calculator.Add(intValue, 3)
		Calculator.Add(doubleValue, 2.5)

		Console.WriteLine(intValue) ' Output: 8
		Console.WriteLine(doubleValue) ' Output: 10.0
	End Sub
End Class
$vbLabelText   $csharpLabel

En el ejemplo anterior, estamos sobrecargando el método Add para trabajar tanto con tipos int como double. La palabra clave ref permite que los métodos modifiquen las variables originales directamente.

Utilizar la palabra clave out

Otro término relacionado es out. Es similar al ref, pero tiene un propósito ligeramente diferente. Mientras que ref espera que la variable esté inicializada antes de ser pasada, la palabra clave out se utiliza cuando deseas que un método asigne un valor a un parámetro que no necesariamente tiene un valor inicial:

class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
class Program
{
    static void Divide(int dividend, int divisor, out int quotient)
    {
        quotient = dividend / divisor;
    }

    static void Main()
    {
        int result;
        Divide(10, 2, out result);
        Console.WriteLine(result);  // Output: 5
    }
}
Friend Class Program
	Private Shared Sub Divide(ByVal dividend As Integer, ByVal divisor As Integer, ByRef quotient As Integer)
		quotient = dividend \ divisor
	End Sub

	Shared Sub Main()
		Dim result As Integer = Nothing
		Divide(10, 2, result)
		Console.WriteLine(result) ' Output: 5
	End Sub
End Class
$vbLabelText   $csharpLabel

En este ejemplo, el método Divide calcula el cociente y lo asigna a la variable quotient usando la palabra clave out. Vale la pena señalar que no es necesario inicializar el result antes de pasarlo al método.

Diferencia entre las palabras clave ref y out

La palabra clave out es similar a la palabra clave ref pero significativamente diferente. Un parámetro out no necesita un valor inicial, mientras que un parámetro ref debe tener valores iniciales antes de la llamada al método.

Posibles escollos

Aunque las palabras clave ref y out pueden ser herramientas poderosas, deben usarse con precaución. El uso incorrecto de estas palabras clave puede dar lugar a un código confuso y a un comportamiento inesperado. Por ejemplo, no se puede usar una variable no ref en un parámetro ref o out sin inicializarla primero, ya que conduciría a un error de compilación.

Uso avanzado de la palabra clave ref

Trabajar con tipos de referencia y tipos de valor

Comprender la diferencia entre dos referencias y tipos de valor es crucial al trabajar con la palabra clave ref.

  • Tipo de Referencia: La variable se refiere a la ubicación en la memoria donde se almacenan los datos, por ejemplo, objetos, matrices, etc.
  • Tipo de Valor: La variable contiene directamente los datos, por ejemplo, enteros, flotantes, etc.

    Usar ref con tipos de valor permite que los cambios se reflejen fuera del método, mientras que las variables de tipo de referencia se comportan de esta manera de forma inherente.

Método de extensión con la palabra clave ref

También puedes usar la palabra clave ref con métodos de extensión. Un ejemplo:

public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
public static class StringExtensions
{
//example
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
Public Module StringExtensions
'example
	Public Sub AppendValue(ByRef Me input As String, ByVal value As String)
		input &= value
	End Sub
End Module
$vbLabelText   $csharpLabel

Error del compilador y la palabra clave ref

Si olvidas incluir la palabra clave ref ya sea en la firma del método o en la llamada al método, resultará en un error del compilador durante el tiempo de compilación.

Métodos Async y parámetros ref

Tenga en cuenta que no puede utilizar parámetros ref con métodos iteradores o métodos async, ya que estos requieren pasar el parámetro por valor.

Presentación de Iron Suite

Junto con la comprensión de conceptos clave como la palabra clave ref en C#, hay un conjunto de herramientas poderosas que pueden facilitar mucho la vida de un desarrollador. Iron Suite es una colección de sólidas herramientas y bibliotecas que incluye IronPDF, IronXL, IronOCR e IronBarcode. Exploremos estas herramientas y veamos cómo pueden mejorar tu experiencia de codificación sin ningún argumento.

Procesamiento de PDF IronPDF simplificado

Aprende sobre IronPDF como una parte esencial de Iron Suite. Es una biblioteca que permite a los desarrolladores crear, leer y editar archivos PDF dentro de C#. Si desea convertir HTML a PDF, IronPDF tiene las herramientas que necesita. Consulta el tutorial sobre cómo convertir HTML a PDF para obtener más información sobre esta función.

Manipulación de Excel IronXL al alcance de su mano

Trabajar con archivos de Excel en C# puede ser un desafío, pero las funcionalidades de IronXL simplifican esta tarea. Permite leer, escribir, editar y manipular archivos de Excel sin necesidad de tener Excel instalado. Desde la importación de datos hasta la creación de nuevas hojas de cálculo, IronXL permite manejar Excel en C#.

IronOCR Reconocimiento óptico de caracteres para C#

El reconocimiento óptico de caracteres (OCR) puede ser complejo, pero descubra IronOCR para agilizar el proceso. Esta biblioteca permite leer texto de imágenes y convertirlo en texto legible por máquina. Tanto si necesita extraer texto de un documento escaneado como reconocer caracteres de una imagen, IronOCR tiene la funcionalidad para ayudarle.

Generación y lectura de códigos de barras IronBarcode

Los códigos de barras son comúnmente utilizados en diversas industrias, y manejarlos en tus aplicaciones ahora es más accesible con la biblioteca IronBarcode. Esta biblioteca le permite crear, leer y trabajar con códigos de barras en C#. IronBarcode admite una amplia gama de formatos QR y de códigos de barras.

Relación de Iron Suite con la palabra clave ref

Puede que te preguntes cómo se relacionan estas herramientas con la palabra clave ref de la que hemos hablado. Cuando trabajes en proyectos complejos que involucren PDF, Excel, OCR o códigos de barras, el uso efectivo de la palabra clave ref y otros principios de C# será crucial para gestionar tu código de manera eficiente.

Por ejemplo, al manipular archivos Excel grandes con IronXL, pasar objetos por referencia usando la palabra clave ref puede hacer que tu código sea más eficiente y fácil de mantener. De manera similar, trabajar con documentos PDF utilizando IronPDF podría involucrar métodos donde la palabra clave ref puede desempeñar un papel.

Comprender las características básicas del lenguaje como la palabra clave ref y tener acceso a herramientas como el Iron Suite te equipa con una combinación poderosa para construir aplicaciones eficientes, robustas y versátiles. Iron Suite está diseñado para funcionar a la perfección con sus conocimientos de C# y, juntos, pueden ayudarle a crear soluciones más profesionales y sofisticadas.

Conclusión

El lenguaje C#, con características como la palabra clave ref, ofrece potentes capacidades para los desarrolladores. En combinación con Iron Suite, que incluye IronPDF, IronXL, IronOCR e IronBarcode, las posibilidades se amplían aún más.

Cada producto de la Iron Suite ofrece una prueba gratuita de Iron Suite, permitiéndote explorar y utilizar las amplias funcionalidades sin ninguna inversión inmediata. Si decides proceder con una licencia completa, el precio comienza desde $749 para componentes individuales.

Si considera que toda la Iron Suite se ajusta a sus necesidades, le espera una excelente oferta. Puede adquirir el paquete completo por el precio de sólo dos componentes individuales.

Chipego
Ingeniero de software
Chipego tiene una habilidad natural para escuchar que le ayuda a comprender los problemas de los clientes y a ofrecer soluciones inteligentes. Se unió al equipo de Iron Software en 2023, después de estudiar una licenciatura en Tecnología de la Información. IronPDF e IronOCR son los dos productos en los que Chipego se ha centrado, pero su conocimiento de todos los productos crece día a día, a medida que encuentra nuevas formas de ayudar a los clientes. Disfruta de lo colaborativa que es la vida en Iron Software, con miembros del equipo de toda la empresa que aportan su variada experiencia para contribuir a soluciones eficaces e innovadoras. Cuando Chipego está lejos de su escritorio, a menudo se le puede encontrar disfrutando de un buen libro o jugando al fútbol.
< ANTERIOR
C# Datatable to List (Cómo funciona para desarrolladores)
SIGUIENTE >
NLog C# (Cómo funciona para desarrolladores)