Como hacer

8 características impresionantes de C # que debe conocer

C # y .NET han estado en constante explicación activo durante las últimas dos décadas; cada año, el idioma recibe un conjunto de nuevas funciones efectos. Discutiremos algunos de nuestros favoritos que creemos que los principiantes deberían conocer.

Tipos de narración que aceptan títulos NULL

C # ha tenido nulos valía tipos durante un tiempo, como ” int? ”Que puede contener un int o el valía de null, a diferencia de un tradicional int que siempre tendría un valía predeterminado de cero. Estos son efectos para muchas cosas, incluidas las clases destinadas a la deserialización JSON, donde no todos los campos pueden estar presentes.

Sin retención, a los tipos de narración siempre se les ha podido asignar un null value, entonces, ¿cuál es el punto de esta nueva característica de C # 8.0?

Los tipos de narración que aceptan títulos NULL básicamente imponen una distinción entre las variables de narración que pueden volverse nulas y las variables de narración que no. Es una característica de ruptura que probablemente dejará su cojín de código con muchas advertencias, por lo que es poco que debe activar manualmente. Una vez que está activado, el compilador comienza a notar la diferencia entre:

  • string?, que puede ser incompetente y conserva el comportamiento “predeterminado” de versiones anteriores, y
  • string, cuales no puedo ser incompetente. Nunca puede ser incompetente, porque se le debe dar un valía predeterminado y nunca se puede establecer en incompetente.

Esto tiene muchos artículos interesantes, pero el más importante es un enfoque implícito en los null manejo de títulos a nivel de idioma. Por ejemplo, el compilador le gritará si intenta devolver un valía incompetente para una función que devuelve un valía no anulable. Incluso le gritará si intenta tener lugar un valía posiblemente incompetente a una función que no lo aplazamiento.

Si aceptablemente eso puede parecer restrictivo, al igual que la escritura estática, al final conduce a un código mejor y más apto. Recomendamos insistentemente habilitarlo para la mayoría de los proyectos, y puede repasar nuestra supervisión completa sobre ellos para obtener más información.

Para activarlo, deberá editar el archivo de su plan. En Visual Studio, haga clic derecho en su plan y haga clic en “Editar archivo de plan”. Luego enciéndalo con la futuro directiva:

enable

Si está utilizando el formato de plan heredado, es posible que deba anularlo manualmente con una directiva en la parte superior de cada archivo:

#nullable enable

RELACIONADO: ¿Cómo funcionan los tipos de narración que aceptan títulos NULL de C #?

Operadores coalescentes nulos y condicionales

En circunstancia de tener que comprobar if(something==null), C # tiene una taquigrafía increíble con operadores de entrada de miembros condicional incompetente. Básicamente, en circunstancia de usar un punto para conseguir a poco que puede ser incompetente, puede usar un signo de interrogación y un punto, que realizará la comprobación nula automáticamente.

Incluso puede usarlos para emplazar a métodos en objetos nulos o conseguir a índices en matrices nulas. Si el objeto termina siendo incompetente, simplemente no hace ausencia y devuelve un valía incompetente.

reference?.field reference?.method(); reference?[N]

Tenga en cuenta que el final no evita una IndexOutOfRangeException, simplemente accede al hábitat N de una nómina posiblemente nula.

Sin retención, es posible que tenga que trabajar con los títulos nulos devueltos por esta expresión y, para hacerlo más manejable, C # tiene operadores de fusión de nulos. Se pueden utilizar para asignar un valía rotatorio en caso de que una expresión (cualquier expresión) devuelva un valía incompetente. Básicamente, son títulos de respaldo. Puede especificarlos con dobles signos de interrogación:

string value=GetValue() ?? "Backup"

Incluso está el ??=cámara, que funciona como || ya que no evaluará el valía de respaldo si el primer valía devuelve un resultado adecuado.

Tuplas

¿Alguna vez ha querido devolver varios títulos de un método? Con las tuplas puede hacerlo, y el C # nuevo ha tenido un gran soporte de habla para ellas desde C # 7.0. Simplemente devuelva dos títulos entre paréntesis y separados por comas, y podrá conseguir a los rudimentos individuales internamente de ellos.

 

Pin it

Si aceptablemente no es obligatorio, es una experiencia global dar estos nombres, como (float X, float Y, float Z), en circunstancia de conseguir a ellos por números de artículo.

Incluso puede usar la deconstrucción de tuplas para disolver una tupla en múltiples variables de componentes.

 

Pin it

En verdad, esto es congruo útil para constructores simples, donde necesita establecer algunos campos iguales a los argumentos de entrada. El uso de la deconstrucción de tuplas logra esto de guisa congruo limpia:

 

Pin it

Sobrecarga del constructor con: this ()

Los constructores, como cualquier otro método, pueden tener un cámara sobrecargado para hospedar muchas combinaciones diferentes de parámetros. Sin retención, donado que los constructores se usan comúnmente para inicializar muchos campos, esto puede conducir a la duplicación de código.

Una posibilidad rápida y sucia sería compartir un método de “clase de inicialización” que se pira desde todos los métodos de constructor sobrecargados, pero si tiene habilitados los tipos de narración que aceptan títulos NULL, obtendrá advertencias de nulabilidad para los campos que no aceptan títulos NULL que en realidad se están configurando, ya que el compilador no es lo suficientemente inteligente para comprender la inicialización en llamadas a funciones impuras.

 

Pin it

Pero hay una posibilidad para esto, y es un poco extraño. Viene de herencia del constructor, que es otra característica asombrosa que le permite ampliar el constructor de la clase cojín. Utiliza la misma sintaxis de herencia, dos puntos, seguidos de cojín (parameters). Esto llamará automáticamente al constructor cojín (ayer del nuevo). Tenga en cuenta que aún necesita poner los parámetros del constructor cojín en la definición del método.

 

Pin it

Lo bueno es que no necesitas usar cojín; puedes hacer exactamente lo mismo con : this (), que llamará a un constructor internamente de la propia clase. Puede usar esto para especificar parámetros adicionales sin copiar el código de inicialización.

 

Pin it

Obviamente, deberá fallar los campos opcionales como anulables, ya que son porque el constructor cojín no los admite. Pero eso es por diseño aquí; En este ejemplo, es necesario establecer el nombre y patronímico de la persona, pero el correo electrónico puede serlo o no, lo que lo hace adecuado para un tipo que acepta títulos NULL.

Constructores estáticos

Los constructores se usan comúnmente para crear instancias de clases usando el new palabra secreto. En el constructor, puede configurar los campos necesarios para inicializar la clase.

Pero, ¿qué pasa con las clases estáticas? Bueno, en verdad además pueden usar constructores. De hecho, las clases regulares pueden usar constructores estáticos para configurar sus propiedades estáticas.

 

Pin it

Sin retención, estos no se ejecutan exactamente al inicio. Si aceptablemente el ejemplo antedicho parece correcto, configurar el startupTime en un constructor quieto, no está asegurado en tiempo de ejecución porque C #, y el MSIL en el que se ejecuta, es un habla compilado Just-In-Time.

La compilación JIT solo ocurre, bueno, exacto a tiempo, exactamente cuando se necesita la clase. Esto significa que la clase se sentará en su punta de la asamblea, acumulando polvo hasta que se necesite uno de sus campos o métodos. Una vez que sea necesario, el tiempo de ejecución de .NET lo desempolvará, lo compilará y solo entonces invocará el constructor quieto.

Sin retención, el constructor quieto todavía se ejecuta ayer cualquier cosa, incluso ayer de que se configuren los campos estáticos y ayer de que se pueda hacer narración a poco. Siguen siendo congruo efectos cuando los necesitas. Alternativamente, puede emplazar a un método de inicialización desde la rutina de inicio de su aplicación si necesita ejecutar poco en orden cronológico.

Parámetros de tipo genérico

Definitivamente se ha incompatible con estos ayer, aunque es posible que no haya escrito uno usted mismo. Los parámetros de tipo genérico le permiten escribir funciones que son independientes del tipo y no se preocupan por el tipo que se le pasa. El ejemplo principal de esto son las colecciones; una List y un List utilizan el mismo código, pero se les pasa un parámetro de tipo genérico diferente.

Los genéricos son congruo fáciles de usar. Simplemente agregue un nombre para la variable de tipo entre paréntesis en la definición de clase o método. Es una experiencia global usar T, o al menos nombres que comienzan con T. Por ejemplo, un diccionario puede tener TKey y TValue, dos tipos diferentes.

 

Pin it

Los tipos genéricos crean múltiples “tipos” diferentes de la clase genérica. Esto significa que los campos estáticos se separarán según el tipo de clase, por lo que List no comparte datos con List.

Oportuno a esto, debe pasarle un parámetro de tipo si desea hacer narración al nombre de la clase directamente. Esto puede ser un problema en algunos casos, por lo que, alternativamente, si necesita hospedar varios tipos, puede transmitir desde y alrededor de object usando una técnica emplazamiento lucha.

Delegados

Los delegados son una forma de empaquetar métodos en variables. Esto es útil para la inyección de dependencias, que es un nombre demasiado elegante para un concepto simple: las clases flexibles deberían obtener algunos títulos, llamados dependencias, de sus variables de constructor, lo que permite al favorecido de esa clase especificar las dependencias a voluntad.

Los delegados le permiten hacer esto con funciones. Puede hacer que la clase realice cualquier tipo de movimiento, y no le importa la implementación. Estos todavía están escritos de forma estática; tendrá que puntualizar los parámetros de entrada y salida como lo haría con cualquier función, excepto marcarlo con “delegar” y no escribir un cuerpo.

 

Pin it

Luego puede asignar una función a esta variable, y luego usar el variable para invocar la función. Puede hacer esto directamente como se muestra, o puede usar myDelegate.Invoke(), que hace lo mismo pero más detallado.

 

Pin it

Puede repasar más sobre los delegados en nuestra supervisión para usarlos.

Indexadores

Las clases en C # usan campos para juntar datos y propiedades para exponer esos datos a otras clases. Las propiedades son en realidad solo un método que expone un campo para que pueda conseguir a él haciendo class.property.

Puede hacer lo mismo para la indexación, p. Ej. class[index]. Esto se puede utilizar para crear un comportamiento de indexación personalizado. Por ejemplo, puede crear una nómina 2D a partir de una List creando un indexador personalizado que devuelve un valía basado en los argumentos de entrada.

 

Pin it