Grupos de métodos en C#

Bilal Shahid 12 octubre 2023
  1. Grupo de métodos en C#
  2. Delegates en C#
  3. Conversión de grupos de métodos con DELEGATE en C#
  4. Delegate personalizado simple para grupos de métodos en C#
  5. Usar punteros de función para grupos de métodos en C#
Grupos de métodos en C#

Este artículo abordará los grupos de métodos en C#.

Grupo de métodos en C#

A veces nos encontramos con un caso en el que una función puede tener más de una implementación. Puede tener otra definición con un conjunto o tipo de parámetros completamente diferente o generalmente se conoce como una función sobrecargada.

Sintaxis:

void print(int x) {
  ///...code
}

void print(int x, int y) {
  ///...code for x and y
}

Estas funciones o métodos se denominan GRUPOS DE MÉTODOS.

Delegates en C#

DELEGATES son punteros a funciones creadas. Además de apuntar a la función, también define el tipo de devolución de las funciones y sus parámetros.

Un delegado, digamos, llamado LAPTOP puede tener un tipo de retorno como void y un parámetro como USERNAME (cadena). Tenemos otra función llamada PC, que también tiene el mismo tipo de retorno y tipo de parámetro que LAPTOP.

Podemos llamar a PC desde el delegado LAPTOP en este escenario.

Ejemplo de código:

delegate void LAPTOP(string username);

static void PC(string username) {
  Console.WriteLine("USER: " + username + " has logged in!");
}

static void Main() {
  LAPTOP lap1 = PC;
  lap1("Hydrogen");
}

Puede notar que hemos creado una instancia de la instancia LAPTOP con PC, y al invocarla más tarde, hacemos que imprimamos el nombre de usuario pasado desde el método PC. Así funcionan los DELEGADOS.

Conversión de grupos de métodos con DELEGATE en C#

Veremos uno de los usos más comunes de los grupos de métodos y cómo manejarlos cuando se les llama. Discutimos cómo los grupos de métodos son funciones sobrecargadas de un método básico, y podemos usar grupos de métodos como deseemos usando DELEGATES.

En nuestro ejemplo, supongamos que tenemos un método llamado CAR desde el que queremos dirigirnos a varios otros métodos, como DASHBOARD, WHEEL, LIGHTS etc. Por comodidad, sólo utilizaremos dos métodos: LIGHTS y MIRRORS.

Ejemplo de código:

delegate void CAR(bool start);

static void MIRROR(bool start) {
  if (start)
    Console.WriteLine("Mirror is now working!");
  else
    Console.WriteLine("Mirror is not stopped/closed");
}

static void LIGHTS(bool start) {
  if (start)
    Console.WriteLine("Lights are now working!");
  else
    Console.WriteLine("Lights have stopped/closed");
}

Ahora que hemos definido los métodos, implementemos el método MAIN, donde usamos delegados para manejar estos grupos de métodos.

CAR car = MIRROR;
car(true);

car = LIGHTS;
car(false);

Puedes notar que el objeto CAR apunta al MIRROR, pero luego se hace que apunte a LIGHTS. Entonces al llamar al método se llama a la función a la que apunta.

El nombre de la función se asigna al objeto car. Cambiar el puntero DELEGATE para que apunte a diferentes métodos en su grupo se denomina CONVERSIÓN DE GRUPO DE MÉTODOS, y en este escenario, LIGHTS, MIRRORS y CAR forman parte del mismo grupo de métodos.

Delegate personalizado simple para grupos de métodos en C#

Una forma simple de crear un DELEGATE que pueda apuntar a GRUPOS DE MÉTODOS es algo tan simple como lo siguiente.

Func<string> f_test = "AA".ToString;
Console.WriteLine(f_test());

Invocar lo anterior generará la cadena AA como resultado. F_TEST apunta al método ToString y lo llama.

También puede notar que esta función apunta a la dirección del método ToString y no a la función en sí. Así es como funcionan los punteros.

A continuación se proporciona otro ejemplo para entender correctamente GRUPOS DE MÉTODOS.

Func<string, int> f_test = Convert.ToInt32;
Console.WriteLine(f_test("435"));

Sintaxis:

Func<param1, param2> name;
//param1 is the parameter passed in the function/method pointed to
//param 2 is the return type of that function/method that the delegate points to

Como Convert.ToInt32 tiene un tipo de retorno de INT y 18 sobrecargas diferentes. Es imperativo definir el tipo de parámetro porque queremos llamar a F_TEST con una cadena "435", y definimos PARAM2 como STRING.

Definir PARAM2 es importante incluso si solo hay una sobrecarga de una función presente; debido a que los GRUPOS DE MÉTODOS son construcciones de tiempo compiladas, deben elegirse para una sola sobrecarga. Es importante asegurarse de que PARAM2 contenga al menos una sobrecarga.

También puede eliminar el molde en LINQ al llamar a List.Select(MethodGroup) en una función. No discutiremos los contextos LINQ en detalle porque este artículo se centra en GRUPOS DE MÉTODOS.

Usar punteros de función para grupos de métodos en C#

Solo es necesario señalar funciones diferentes de un delegado si está trabajando en GRUPOS DE MÉTODOS. Debe asegurarse de que los tipos de devolución y los parámetros coincidan en tales circunstancias.

C# ya proporciona una palabra clave FUNC para permitir apuntar a diferentes funciones. Así como los punteros funcionan apuntando a direcciones de objetos y variables y luego llamándolos, puede imaginar delegados de la misma manera.

Los punteros también tienden a tener el mismo tipo de retorno que los objetos a los que se dirigen. Los delegados también deben cuidar los parámetros debido a los requisitos de la función.

Se necesita apuntar a funciones cuando, digamos, desea almacenar funciones en una matriz y llamarlas dinámicamente para su código o pasar las funciones a otras funciones para que sean llamadas. Las funciones LAMBDA también cumplen el mismo requisito.

Sin embargo, los GRUPOS DE MÉTODOS son clústeres comunes con funciones sobrecargadas que siguen un tipo básico de retorno y parámetro.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - Csharp Method