C # es un lenguaje de programación moderno, de propósito general y orientado a objetos desarrollado por Microsoft. C # está diseñado para Common Language Infrastructure (CLI), que consiste en el código ejecutable y el entorno de tiempo de ejecución que permite el uso de varios lenguajes de alto nivel en diferentes plataformas y arquitecturas informáticas.

Una matriz irregular es una matriz de matrices.

Puede inicializar una matriz dentada como:

int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};

Donde, puntuaciones es una matriz de dos matrices de enteros: puntuaciones [0] es una matriz de 3 enteros y puntuaciones [1] es una matriz de 4 enteros.

Hay tres formas de pasar parámetros a un método:

  • Value parameters- Este método copia el valor real de un argumento en el parámetro formal de la función. En este caso, los cambios realizados en el parámetro dentro de la función no tienen ningún efecto en el argumento.

  • Reference parameters- Este método copia la referencia a la ubicación de memoria de un argumento en el parámetro formal. Esto significa que los cambios realizados en el parámetro afectan el argumento.

  • Output parameters - Este método ayuda a devolver más de un valor.

¡Si! Usando parámetros de salida. Una declaración de retorno se puede utilizar para devolver solo un valor de una función. Sin embargo, al usar los parámetros de salida, puede devolver dos valores de una función.

Los parámetros de salida son similares a los parámetros de referencia, excepto que transfieren datos fuera del método en lugar de hacerlo. El parámetro de referencia copia la referencia a la ubicación de memoria de un argumento en el parámetro formal. Esto significa que los cambios realizados en el parámetro afectan el argumento.

Un espacio de nombres está diseñado para proporcionar una forma de mantener un conjunto de nombres separado de otro. Los nombres de clase declarados en un espacio de nombres no entran en conflicto con los mismos nombres de clase declarados en otro.

El uso de palabras clave se utiliza para incluir un espacio de nombres en el programa. Un programa generalmente tiene múltiples declaraciones de uso.

A las variables de tipo de valor se les puede asignar un valor directamente. Se derivan de la clase System.ValueType.

Los tipos de valor contienen datos directamente. Algunos ejemplos son int, char y float, que almacenan números, alfabetos y números de coma flotante, respectivamente. Cuando declara un tipo int, el sistema asigna memoria para almacenar el valor.

Los tipos de referencia no contienen los datos reales almacenados en una variable, pero contienen una referencia a las variables.

En otras palabras, se refieren a una ubicación de memoria. Usando múltiples variables, los tipos de referencia pueden referirse a una ubicación de memoria. Si una de las variables cambia los datos de la ubicación de la memoria, la otra variable refleja automáticamente este cambio de valor. Ejemplos de tipos de referencia integrados son: objeto, dinámico y cadena.

El tipo de objeto es la última clase base para todos los tipos de datos en C # Common Type System (CTS). Object es un alias de la clase System.Object. A los tipos de objeto se les pueden asignar valores de cualquier otro tipo, tipo de valor, tipo de referencia, tipo predefinido o definido por el usuario. Sin embargo, antes de asignar valores, necesita conversión de tipo.

Cuando un tipo de valor se convierte en tipo de objeto, se denomina boxing.

Cuando un tipo de objeto se convierte en un tipo de valor, se denomina unboxing.

Puede almacenar cualquier tipo de valor en la variable de tipo de datos dinámicos. La verificación de tipos para estos tipos de variables se realiza en tiempo de ejecución.

La sintaxis para declarar un tipo dinámico es:

dynamic <variable_name> = value;

Por ejemplo,

dynamic d = 20;

Los tipos dinámicos son similares a los tipos de objeto, excepto que la verificación de tipos para las variables de tipo de objeto se lleva a cabo en tiempo de compilación, mientras que para las variables de tipo dinámico tiene lugar en tiempo de ejecución.

Las variables de tipo puntero almacenan la dirección de memoria de otro tipo. Los punteros en C # tienen las mismas capacidades que los punteros en C o C ++.

La sintaxis para declarar un tipo de puntero es -

type* identifier;

Por ejemplo

char* cptr;
int* iptr;

Este operador determina si un objeto es de cierto tipo.

If (Ford is Car) // comprueba si Ford es un objeto de la clase Car.

como operador lanza sin generar una excepción si el lanzamiento falla.

Object obj = new StringReader("Hello");
StringReader r = obj as StringReader;

La encapsulación se define "como el proceso de incluir uno o más elementos dentro de un paquete físico o lógico". La encapsulación, en la metodología de programación orientada a objetos, impide el acceso a los detalles de implementación.

La encapsulación se implementa mediante especificadores de acceso.

Un especificador de acceso define el alcance y la visibilidad de un miembro de la clase.

El especificador de acceso público permite que una clase exponga sus variables miembro y funciones miembro a otras funciones y objetos. Se puede acceder a cualquier miembro público desde fuera de la clase.

El especificador de acceso privado permite que una clase oculte sus variables miembro y funciones miembro de otras funciones y objetos. Solo las funciones de la misma clase pueden acceder a sus miembros privados. Incluso una instancia de una clase no puede acceder a sus miembros privados.

El especificador de acceso protegido permite a una clase secundaria acceder a las variables miembro y funciones miembro de su clase base. De esta forma ayuda a implementar la herencia.

El especificador de acceso interno permite que una clase exponga sus variables miembro y funciones miembro a otras funciones y objetos en el ensamblado actual. En otras palabras, se puede acceder a cualquier miembro con un especificador de acceso interno desde cualquier clase o método definido dentro de la aplicación en la que se define el miembro.

El especificador de acceso interno protegido permite que una clase oculte sus variables miembro y funciones miembro de otros objetos y funciones de clase, excepto una clase secundaria dentro de la misma aplicación. Esto también se usa al implementar la herencia.

C # proporciona tipos de datos especiales, los tipos que aceptan valores NULL, a los que puede asignar un rango normal de valores y valores nulos.

Por ejemplo, puede almacenar cualquier valor de -2,147,483,648 a 2,147,483,647 o nulo en una variable <Int32> que acepta valores NULL. De manera similar, puede asignar verdadero, falso o nulo en una variable <bool> que acepta valores NULL.

El operador de fusión nula se utiliza con los tipos de valor que aceptan valores NULL y los tipos de referencia. Se utiliza para convertir un operando al tipo de otro operando de tipo valor que acepta valores NULL (o no), donde es posible una conversión implícita.

Si el valor del primer operando es nulo, entonces el operador devuelve el valor del segundo operando; de lo contrario, devuelve el valor del primer operando.

Al usar la palabra clave params, se puede especificar un parámetro de método que toma un número variable de argumentos o incluso ningún argumento.

¡No! no se permiten parámetros adicionales después de la palabra clave params en una declaración de método. Solo se permite una palabra clave params en una declaración de método.

La clase Array es la clase base para todas las matrices en C #. Se define en el espacio de nombres del sistema. La clase Array proporciona varias propiedades y métodos para trabajar con matrices.

Usando la función Array.sort (array). Ordena los elementos en una matriz unidimensional completa utilizando la implementación IComparable de cada elemento de la matriz.

Primero ordene la matriz usando Array.sort (matriz) luego invierta la misma usando el método Array.reverse (matriz).

En C #, una estructura es un tipo de datos de tipo de valor. Le ayuda a hacer que una sola variable contenga datos relacionados de varios tipos de datos. La palabra clave struct se utiliza para crear una estructura.

Las estructuras se utilizan para representar un registro. Para definir una estructura, debe utilizar la instrucción struct. La declaración de estructura define un nuevo tipo de datos, con más de un miembro para su programa.

Las clases y estructuras tienen las siguientes diferencias básicas:

  • las clases son tipos de referencia y las estructuras son tipos de valor.

  • las estructuras no admiten la herencia.

  • las estructuras no pueden tener un constructor predeterminado.

Una enumeración es un conjunto de constantes enteras con nombre. Un tipo enumerado se declara mediante la palabra clave enum.

Las enumeraciones de C # son tipos de datos de valor. En otras palabras, la enumeración contiene sus propios valores y no puede heredar o no puede transmitir herencia.

El especificador de acceso predeterminado para un tipo de clase es interno.

El acceso predeterminado para los miembros es privado.

Uno de los conceptos más importantes de la programación orientada a objetos es la herencia. La herencia nos permite definir una clase en términos de otra clase, lo que facilita la creación y el mantenimiento de una aplicación. Esto también brinda la oportunidad de reutilizar la funcionalidad del código y acelera el tiempo de implementación.

Al crear una clase, en lugar de escribir miembros de datos y funciones de miembros completamente nuevos, el programador puede designar que la nueva clase herede los miembros de una clase existente. Esta clase existente se denomina clase base y la nueva clase se denomina clase derivada.

La idea de herencia implementa la relación IS-A. Por ejemplo, el mamífero es un animal, el perro es un mamífero y, por lo tanto, el perro también es un animal, y así sucesivamente.

¡No! C # no admite herencia múltiple.

Una clase puede derivarse de más de una clase o interfaz, lo que significa que puede heredar datos y funciones de varias clases o interfaces base. La sintaxis utilizada en C # para crear clases derivadas es la siguiente:

<acess-specifier> class <base_class>
{
   ...
}
class <derived_class> : <base_class>
{
   ...
}

La palabra polimorfismo significa tener muchas formas. En el paradigma de la programación orientada a objetos, el polimorfismo a menudo se expresa como "una interfaz, múltiples funciones".

El polimorfismo puede ser estático o dinámico. En el polimorfismo estático, la respuesta a una función se determina en el momento de la compilación. En polimorfismo dinámico, se decide en tiempo de ejecución.

C # proporciona dos técnicas para implementar el polimorfismo estático. Ellos son -

  • Sobrecarga de funciones

  • Sobrecarga del operador

El mecanismo de vincular una función con un objeto durante el tiempo de compilación se denomina vinculación anticipada. También se llama enlace estático.

Puede tener varias definiciones para el mismo nombre de función en el mismo ámbito. La definición de la función debe diferir entre sí por los tipos y / o el número de argumentos en la lista de argumentos. No puede sobrecargar declaraciones de funciones que difieran solo por el tipo de retorno.

El polimorfismo dinámico se implementa mediante clases abstractas y funciones virtuales.

Cuando una clase se declara sellada, no se puede heredar.

¡No! No se puede crear ya que las clases abstractas no se pueden declarar selladas.

Cuando tiene una función definida en una clase que desea implementar en una (s) clase (s) heredadas, usa funciones virtuales. Las funciones virtuales podrían implementarse de manera diferente en diferentes clases heredadas y la llamada a estas funciones se decidirá en tiempo de ejecución.

Puede redefinir o sobrecargar la mayoría de los operadores integrados disponibles en C #. Por tanto, un programador también puede utilizar operadores con tipos definidos por el usuario.

Los operadores sobrecargados son funciones con nombres especiales, la palabra clave operador seguida del símbolo del operador que se está definiendo. Similar a cualquier otra función, un operador sobrecargado tiene un tipo de retorno y una lista de parámetros.

n interfaz se define como un contrato sintáctico que deben seguir todas las clases que heredan la interfaz. La interfaz define la parte "qué" del contrato sintáctico y las clases derivadas definen la parte "cómo" del contrato sintáctico.

Las interfaces definen propiedades, métodos y eventos, que son los miembros de la interfaz. Las interfaces contienen solo la declaración de los miembros. Es responsabilidad de la clase derivada definir los miembros. A menudo ayuda a proporcionar una estructura estándar que seguirían las clases derivadas.

Las directivas del preprocesador dan instrucciones al compilador para preprocesar la información antes de que comience la compilación.

Todas las directivas de preprocesador comienzan con # y solo los caracteres de espacio en blanco pueden aparecer antes de una directiva de preprocesador en una línea. Las directivas de preprocesador no son declaraciones, por lo que no terminan con punto y coma (;).

Puede utilizar la directiva #if para crear una directiva condicional. Las directivas condicionales son útiles para probar un símbolo o símbolos para verificar si se evalúan como verdaderos. Si se evalúan como verdaderos, el compilador evalúa todo el código entre #if y la siguiente directiva.

Las excepciones de C # están representadas por clases. Las clases de excepción en C # se derivan principalmente directa o indirectamente de la clase System.Exception. Algunas de las clases de excepción derivadas de la clase System.Exception son las clases System.ApplicationException y System.SystemException.

La clase System.ApplicationException admite excepciones generadas por programas de aplicación. Por tanto, las excepciones definidas por los programadores deben derivar de esta clase.

La clase System.SystemException es la clase base para todas las excepciones del sistema predefinidas.