C Método Sharp

Los métodos en C # y también en otros lenguajes de programación se utilizan para definir el comportamiento. Se usan para escribir alguna lógica enfocada que se usa para completar una tarea específica y se pueden invocar o invocar para ejecutar el código escrito dentro de ellas. Los métodos dentro de las clases tienen modificadores de acceso, y el valor predeterminado es privado . Esto significa que el método solo está disponible para usar dentro de la misma clase. Para que el método esté disponible para un proyecto completo, puede usar la palabra clave interna . Si tuviera que usar la palabra clave pública , esto hace que el método esté disponible en cualquier lugar. Aprendamos un poco más sobre métodos, campos, eventos y propiedades en C # ahora.


Tipos de retorno

Todos los métodos tienen un tipo de retorno. ¿Qué significa esto? Cuando llama a un método, puede devolver un valor o no. Si no lo hace, todavía tiene un tipo de retorno y lo llamamos un tipo de retorno nulo . Si un método se escribe como nulo, simplemente significa que el método no devuelve un valor al código de llamada. Aquí hay un ejemplo de un método con un tipo de retorno de vacío.

Cuando se invoca el código anterior, no devuelve un valor y, por lo tanto, tiene un tipo de vacío . Tenga en cuenta que no hay declaración de devolución. Sin embargo, el código que figura a continuación utiliza una declaración de devolución. Cuando se ejecuta el método ComputeStatistics (), devuelve un objeto.


Los métodos pueden tomar parámetros

Los métodos pueden tener uno o más parámetros en su firma o definición de método. Sin embargo, no confunda los parámetros y argumentos. Nos referimos a los datos pasados ​​a un método como un parámetro en su código de definición, y como un argumento cuando se llama realmente al método. Parámetros en el área C # escrita. Esto significa que especificamos el tipo de datos de los parámetros que se pasarán al métodoConsidere este código aquí.
static Void WriteResult (descripción de cadena, resultado flotante)

El código anterior toma dos parámetros. El primero tiene un tipo de cadena y utiliza el nombre de la descripción. Entonces, dentro del método, la descripción va a contener un tipo de datos de cadena. También tiene un parámetro de tipo float con un nombre de resultado. De nuevo, dentro de la función cada vez que vea el resultado, sabrá que contendrá un tipo de datos flotante.


Firmas del método C #

La firma de un método consiste en un nombre de método y el tipo y tipo de cada uno de sus parámetros. Este es un identificador único para el compilador de C #. La firma del método no incluye un tipo de retorno. Cualquier carácter legal se puede utilizar en nombre de un método. Los nombres de los métodos suelen comenzar con una letra mayúscula. Los nombres elegidos deben ser verbos o verbos seguidos de adjetivos o sustantivos. Esto ayuda a identificar que un método realiza una acción.


Los métodos se pueden sobrecargar

Los métodos tienen la capacidad de sobrecargarse. Qué significa eso? Significa que un método puede tener el mismo nombre exacto de otro método, y el compilador de C # estará bien con eso. Sin embargo, la regla es que cada método con el mismo nombre debe diferir en el tipo o número de parámetros que el método acepta. Un ejemplo de un método sobrecargado que forma parte del lenguaje C # es el método WriteLine () de uso común. En Visual Studio , incluso podemos ver que intellisense nos da un mensaje de que Console.WriteLine () tiene 18 sobrecargas.
Método de sobrecarga de ejemplo de C #

Es la firma la que hace que estos métodos sean únicos, aunque tengan el mismo nombre. Entonces, en realidad, está llamando a un método diferente en función de si está pasando, por ejemplo, un valor flotante, int o de cadena.

Agreguemos un nuevo método de contenedor a nuestra aplicación llamada CustomWriteLine (). Lo que este método hará por nosotros es aceptar una descripción de los resultados del programa, así como el valor del resultado en sí. Dentro del método CustomWriteLine () hay una llamada a Console.WriteLine que utiliza la interpolación de cadenas para generar los datos. Esto nos permite personalizar el formato de los datos que enviamos.

Ahora, cuando se ejecuta el programa, podemos ver que la salida es exactamente lo que estamos buscando. ¡Agradable!
C formato de cadena fuerte


Propiedades y campos

Campos: los campos se utilizan para almacenar datos o estados dentro de una claseBásicamente son variables, pero viven dentro de una clase. En nuestra pequeña aplicación, actualmente tenemos un campo Nombre en la clase StockPortfolio y se define usando el nombre de cadena pública; Dado que es público, cualquiera puede cambiar el nombre de StockPortfolio. Una forma un poco más avanzada de manejar esto es hacer que el campo sea privado . Esto oculta o encapsula los datos para que ningún código fuera de la clase tenga acceso directo a ese campo. Por qué querrías hacer esto? Bueno, al adoptar este enfoque, puede proteger y validar cualquier información que se inserte en un objeto. Esa es una buena cosa. Aquí hay un ejemplo de código que usa un campo privado.

El código anterior usa un campo privado de tipo cadena. Por convención, a menudo verá un campo privado utilizando el guión bajo para dar una indicación visual de que se trata de un campo privado. Entonces, este campo está dentro de una clase llamada Dog, y en el constructor de Dog un desarrollador necesita pasar un nombre para crear un objeto Dog. El constructor guarda el nombre en el campo privado y lo pone a disposición del resto del objeto. Este campo también es un campo de solo lectura. Esto significa que solo el código de esta clase puede asignar un nombre a través del constructor. Intentar establecer el nombre en un nuevo valor en cualquier otro método que no sea el constructor generaría una excepción por parte del compilador de C #.

Propiedades: una propiedad en C # es casi como un campo, pero tiene captadores y establecedores, que son una forma realmente genial de administrar lo que sucede al leer o escribir datos en esa propiedad. Estos accesos se utilizan a menudo para la validación para garantizar que los datos estén seguros y limpios. Veamos esto en algún código.

Este código todavía tiene el campo privado llamado _name. Lo que es diferente es que ahora tenemos una propiedad llamada Nombre. En C #, los nombres de propiedades y métodos deben comenzar con una letra mayúscula. Observe los accesos get y set en esta propiedad. En el get getor hay una simple declaración de devolución que devuelve el valor en _name. El valor devuelto debe ser una picadura ya que la propiedad se define como una cadena. Además del get getor hay un seter de acceso. El conjunto de accesos es posiblemente más importante que el get getor. Esto se debe a que aquí es donde se puede colocar la lógica de validación para garantizar que los datos correctos se almacenen en _name. No queremos que nadie intente establecer _name en nulo o en una cadena vacía. Este tipo de código a menudo se usa para validar un valor entrante antes de asignar ese valor al objeto.

Si lo desea, también puede hacer uso de una propiedad implementada automáticamente en C #. Este tipo de propiedad no tiene lógica asociada. Solo utiliza las palabras clave get y set sin código adicional. El compilador de C # crea automáticamente un campo para almacenar el valor de esta propiedad. Leerá automáticamente ese campo durante una operación de obtención y escribirá en ese campo durante una operación establecida. Esto es útil si no necesita ninguna lógica especial, pero aún quiere el beneficio de un getter y setter.

Podemos agregar este tipo de enfoque a nuestra clase StockPortfolio así.

Por lo tanto, el propósito de las propiedades sobre los campos es que pueda escribir lógica dentro de un get getor o un seter. El get getor puede realizar algunas operaciones en los datos o simplemente recuperar algún valor de campo y devolverlo. El conjunto de accesos puede realizar la validación y proteger el estado interno de un objeto para garantizar que alguien no le otorgue un valor que no desea. Las propiedades mantienen el estado de nuestros diversos objetos en un programa.


C # Eventos

un editor múltiples suscriptores
Los eventos son una característica realmente genial del lenguaje de programación C #. Los eventos se pueden usar para interactuar con partes de la aplicación que hacen cosas que a veces no conocemos de antemano. Si está familiarizado con los eventos en JavaScript, el concepto es similar. Imagine un botón en la interfaz de usuario de una aplicación. Queremos que se nos informe cada vez que un usuario hace clic en ese botón para que podamos realizar una acción en el software. No se sabe cuándo el usuario puede hacer clic en el botón, pero necesitamos que se nos notifique si sucede. Otro escenario podría ser escuchar un enlace web de algún tiempo. Queremos que se nos notifique si alguna vez se realiza una solicitud POST a un determinado punto final para que podamos tomar una medida. Este tipo de escenarios son buenos para eventos. Los eventos permiten que los objetos hagan un anuncio a cualquier parte de la aplicación que está escuchando. El anuncio es el evento y el objeto desde el que se realiza el anuncio es el editor de ese evento. En el otro extremo de esto está el suscriptor del evento. Esta es la parte de la aplicación que está interesada en escuchar los anuncios de cualquier evento y luego tomar una acción. Puede haber muchos suscriptores a un evento. Imagine a un usuario haciendo clic en un botón y, como resultado, se registra una acción en una base de datos, se envía un correo electrónico a un administrador, se guarda un archivo en el sistema de archivos y se muestra una alerta en la pantalla. Por lo tanto, puede tener múltiples piezas de código independientes que se ponen en acción según el anuncio de un evento. ¿Cómo funciona esto en C #? Vía delegados! Esta es la parte de la aplicación que está interesada en escuchar los anuncios de cualquier evento y luego tomar una acción. Puede haber muchos suscriptores a un evento. Imagine a un usuario haciendo clic en un botón y, como resultado, se registra una acción en una base de datos, se envía un correo electrónico a un administrador, se guarda un archivo en el sistema de archivos y se muestra una alerta en la pantalla. Por lo tanto, puede tener múltiples piezas de código independientes que se ponen en acción según el anuncio de un evento. ¿Cómo funciona esto en C #? Vía delegados! Esta es la parte de la aplicación que está interesada en escuchar los anuncios de cualquier evento y luego tomar una acción. Puede haber muchos suscriptores a un evento. Imagine a un usuario haciendo clic en un botón y, como resultado, se registra una acción en una base de datos, se envía un correo electrónico a un administrador, se guarda un archivo en el sistema de archivos y se muestra una alerta en la pantalla. Por lo tanto, puede tener múltiples piezas de código independientes que se ponen en acción según el anuncio de un evento. ¿Cómo funciona esto en C #? Vía delegados! y se muestra una alerta en la pantalla. Por lo tanto, puede tener múltiples piezas de código independientes que se ponen en acción según el anuncio de un evento. ¿Cómo funciona esto en C #? Vía delegados! y se muestra una alerta en la pantalla. Por lo tanto, puede tener múltiples piezas de código independientes que se ponen en acción según el anuncio de un evento. ¿Cómo funciona esto en C #? Vía delegados!


Delegados en C #

Los delegados son donde las cosas divertidas comienzan a suceder en C #. Una manera fácil de pensar en Delegados es si está familiarizado con el funcionamiento de JavaScript. En JavaScript, puede asignar una función a una variable. Luego, puede llamar al nombre de la variable como una función. Puede hacer el mismo tipo de cosas en C # utilizando Delegados. La variable en sí contiene código ejecutable en el programa. Para demandar a un delegado en C #, primero debe crear un tipo de delegado. Crear un tipo de delegado no es tan diferente de cómo usamos la palabra clave de clase o la palabra clave de estructura para crear un tipo. Al crear un Delegado, usará, lo adivinó, la delegate palabra clave durante la definición de tipo.

Vamos a agregar un delegado a nuestro programa, para que podamos comenzar agregando un archivo de clase al proyecto y simplemente nombrarlo como delegado. Este delegado representa cada vez que cambia el nombre de una cartera en el programa.
PortfolioNameChangedDelegate.cs

A continuación, podemos agregar un campo público en la clase StockPortfolio que haga referencia a nuestro nuevo delegado como tal.

Esto significa que ahora podemos hacer uso de ese delegado en nuestra clase. Entonces, en nuestro caso, lo que queremos hacer es hacer un anuncio cada vez que cambie el nombre de un StockPortfolio. Eso significa que podemos sumergirnos en la propiedad Name, específicamente en el setter. Cada vez que se establece la variable _name, podemos hacer un anuncio. Aquí hay un comienzo.

Ahora en la clase principal Program.cs podemos asignar a nuestro delegado al miembro público PortfolioNameChanged que acabamos de agregar a la clase StockPortfolio. Esta línea de código se vería así.

En este punto, se establece portfolio.Name, luego el delegado hace un anuncio. En ese momento, nos gustaría que un suscriptor tome una acción en respuesta a ese anuncio. ¿Cómo se hace esto? Necesitamos crear un nuevo método que se pueda pasar a PortfolioNameChangedDelegate (). Piénselo así: WhenThisHappens (TakeThisAction); Con eso en mente, actualizaremos el código a esto.

El método OnPortfolioNameChanged () aún no existe, por lo que podemos crearlo.

Ahora podemos ejecutar el programa y ver qué sucede. Parece que está funcionando. Cuando el nombre cambia en la cartera, se escribe un mensaje en la consola explicando tanto.
Ejemplo de delegado de C #


Delegados de multidifusión

Eso fue genial, pero ahora queremos subir de nivel. El nombre cambia, se hizo un anuncio y sucedió algo. Es una cosa de uno a uno en este momento. Sin embargo, recuerde que dijimos que puede hacer que suceda una cosa y luego que sucedan varias cosas en respuesta a eso. ¿Qué sucede si cuando invocamos PortfolioNameChanged () queremos activar dos, tres o incluso diez métodos diferentes? ¡Usted puede hacer eso! Veamos eso en acción.

Ahora, cuando se ejecuta el programa, ocurren dos acciones si cambia el nombre de la cartera. Primero, el método OnPortfolioNameChanged () dispara y escribe en la pantalla "¡El nombre del portafolio cambió de 'Nombre del portafolio inicial' a 'Nuevo nombre del portafolio'!". Entonces OnPortfolioNameChangedSecondAction () se dispara y escribe en la pantalla "OnPortfolioNameChanged se ejecutó, ahora OnPortfolioNameChangedSecondAction se ejecutó".
Ejemplo de delegado de multidifusión C sharp

¡Excelente! Ahora podemos ver cómo hacer que sucedan muchas cosas en respuesta a un evento.


De delegados a eventos

Por lo general, tiene más sentido hacer uso de la eventpalabra clave cuando se sigue el estilo de programación pub-sub. La razón de esto es porque exponer delegados sin procesar es un poco más propenso a errores. El uso de un evento agrega un poco más de protección, de modo que fuera de la clase StockPortfolio, lo único que pueden hacer otras piezas de código es agregar un suscriptor a este evento o eliminar un suscriptor a este. Si estuviéramos usando solo delegados, sería posible hacer una tarea que anularía y anularía todas las demás suscripciones y probablemente no queremos eso. Entonces, todo lo que tenemos que hacer es agregar la palabra clave del evento de esta manera.


Convenciones de eventos

Queremos hacer un cambio más en la forma en que configuramos nuestros eventos en la aplicación. En lugar de pasar dos cadenas PortfolioNameChangedDelegate (), deberíamos seguir una convención popular de incluir al remitente de un evento como parámetro. Si la clase StockPortfolio anuncia que el nombre ha cambiado, debería enviarse como el primer parámetro. El segundo parámetro también será un objeto que contenga los argumentos del evento. Para hacer esto, primero crearemos una nueva clase como esta.
PortfolioNameChangedEventArgs.cs

Una vez que la clase se haya creado anteriormente, necesitamos actualizar PortfolioNameChangedDelegate () para aceptar el remitente y los objetos args en lugar de dos cadenas como era antes.

Ahora, StockPortfolio.cs tendrá que actualizarse para reflejar este cambio así.