AYUDA .NET

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

Actualizado 13 de noviembre, 2023
Compartir:

En Palabra clave ref en C# es una herramienta esencial que todo principiante debería conocer. 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 su funcionamiento.

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éndole 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

  • Palabra clave ref: Se utiliza para indicar que una variable se pasa por referencia.
  • Variables de referencia: Tipos que hacen referencia a la posició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 utilizar 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
{
//devuelve el valor incrementado
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  //  Salida: 5
    }
}
class Program
{
//devuelve el valor incrementado
    static void IncrementByOne(int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOne(value);
        Console.WriteLine(value);  //  Salida: 5
    }
}
Friend Class Program
'devuelve el valor incrementado
	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) '  Salida: 5
	End Sub
End Class
VB   C#

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

Veamos ahora cómo la palabra clave ref puede cambiar este comportamiento. Mediante el uso de ref, puede 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);  //  Salida: 6
    }
}
class Program
{
//ref int
    static void IncrementByOneRef(ref int num)
    {
        num++;
    }

    static void Main()
    {
        int value = 5;
        IncrementByOneRef(ref value);
        Console.WriteLine(value);  //  Salida: 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) '  Salida: 6
	End Sub
End Class
VB   C#

Observe la palabra clave ref tanto en la firma del método como en la llamada. Esto 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 cuando se trabaja con tipos como enteros, dobles y structs. 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 utilizarse 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
{
    //método
    static void ChangeName(ref Person person)
    {
        //nuevo objeto
        person = new Person { Name = "Alice" };
    }

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

class Program
{
    //método
    static void ChangeName(ref Person person)
    {
        //nuevo objeto
        person = new Person { Name = "Alice" };
    }

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

Friend Class Program
	'método
	Private Shared Sub ChangeName(ByRef person As Person)
		'nuevo objeto
		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) '  Salida: Alice
	End Sub
End Class
VB   C#

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

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. Cuando se utiliza la palabra clave ref, la sobrecarga de métodos se vuelve más potente.

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;
        //parámetro ref
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      //  Salida: 8
        Console.WriteLine(doubleValue);   //  Salida: 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;
        //parámetro ref
        Calculator.Add(ref intValue, 3);
        Calculator.Add(ref doubleValue, 2.5);

        Console.WriteLine(intValue);      //  Salida: 8
        Console.WriteLine(doubleValue);   //  Salida: 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
		'parámetro ref
		Calculator.Add(intValue, 3)
		Calculator.Add(doubleValue, 2.5)

		Console.WriteLine(intValue) '  Salida: 8
		Console.WriteLine(doubleValue) '  Salida: 10.0
	End Sub
End Class
VB   C#

En el ejemplo anterior, estamos sobrecargando el método Add para que funcione con los tipos int y double. La palabra clave ref permite a los métodos modificar directamente las variables originales.

Utilizar la palabra clave out

Otra palabra clave relacionada es out. Es similar a ref pero tiene un propósito ligeramente diferente. Mientras que ref espera que la variable se inicialice antes de pasarla, la palabra clave out se utiliza cuando se desea 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);  //  Salida: 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);  //  Salida: 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) '  Salida: 5
	End Sub
End Class
VB   C#

En este ejemplo, el método Divide calcula el cociente y lo asigna a la variable quotient utilizando la palabra clave out. Cabe destacar que no es necesario inicializar el resultado 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 utilizarse con criterio. El uso incorrecto de estas palabras clave puede dar lugar a un código confuso y a un comportamiento inesperado. Por ejemplo, no puedes utilizar una variable que no sea ref en un parámetro ref o out sin inicializarla antes, ya que provocaría un error de compilación.

Uso avanzado de la palabra clave ref

Trabajar con tipos de referencia y tipos de valor

Entender la diferencia entre dos referencias y tipos de valor es crucial cuando se trabaja con la palabra clave ref.

  • Tipo de referencia: La variable se refiere a la ubicación en 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.

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

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

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

public static class StringExtensions
{
//ejemplo
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
public static class StringExtensions
{
//ejemplo
    public static void AppendValue(ref this string input, string value)
    {
        input += value;
    }
}
Public Module StringExtensions
'ejemplo
	Public Sub AppendValue(ByRef Me input As String, ByVal value As String)
		input &= value
	End Sub
End Module
VB   C#

Error del compilador y la palabra clave ref

Si olvida incluir la palabra clave ref en la firma del método o en la llamada al método, se producirá un error de compilación.

Métodos Async y parámetros de referencia

Ten en cuenta que no puedes usar 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

Además de comprender conceptos clave como la palabra clave ref en C#, existe un conjunto de potentes herramientas que pueden hacer la vida de un desarrollador mucho más fácil. 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

IronPDF es 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. Echa un vistazo a la Tutorial de 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 Excel en C# puede ser un reto, pero IronXL simplifica 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 facilita el manejo de Excel en C#

IronOCR Reconocimiento óptico de caracteres para C#

Reconocimiento óptico de caracteres (OCR) puede ser compleja, pero IronOCR agiliza 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 se utilizan habitualmente en diversos sectores, y manejarlos en sus aplicaciones es ahora más accesible con 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

Te preguntarás qué relación tienen estas herramientas con la palabra clave ref de la que hemos hablado. Cuando trabaje en proyectos complejos que impliquen PDF, Excel, OCR o códigos de barras, el uso eficaz de la palabra clave ref y otros principios de C# serán cruciales para gestionar su código de forma eficiente.

Por ejemplo, cuando se manipulan grandes archivos de Excel con IronXL, pasar objetos por referencia usando la palabra clave ref puede hacer su código más eficiente y mantenible. Del mismo modo, trabajar con documentos PDF utilizando IronPDF podría implicar métodos en los que la palabra clave ref puede desempeñar un papel.

La comprensión de las características básicas del lenguaje, como la palabra clave ref, y el acceso a herramientas como Iron Suite le proporcionan una potente combinación para crear aplicaciones eficaces, 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 funciones como la palabra clave ref, ofrece potentes posibilidades a 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 prueba gratuita que le permite explorar y utilizar las amplias funcionalidades sin ninguna inversión inmediata. Si decide adquirir una licencia completa, los precios comienzan a partir de $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.

< ANTERIOR
C# Datatable to List (Cómo funciona para desarrolladores)
SIGUIENTE >
NLog 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