C#
C#
C # - Inicio
C # - Descripción general
C # - Medio ambiente
C # - Estructura del programa
C # - Sintaxis básica
C # - Tipos de datos
C # - Conversión de tipo
C # - Variables
C # - Constantes
C # - Operadores
C # - Toma de decisiones
C # - Bucles
C # - Encapsulación
C # - Métodos
C # - Nulables
C #: matrices
C # - Cuerdas
C # - Estructura
C # - Enums
C # - Clases
C # - Herencia
C # - Polimorfismo
C # - Sobrecarga del operador
C # - Interfaces
C # - Espacios de nombres
C # - Directivas de preprocesador
C # - Expresiones regulares
C # - Manejo de excepciones
C # - E / S de archivo
Tutorial avanzado de C #
C # - Atributos
C # - Reflexión
C # - Propiedades
C # - Indizadores
C # - Delegados
C # - Eventos
C # - Colecciones
C # - Genéricos
C # - Métodos anónimos
C # - Códigos inseguros
C # - Multithreading
C# - Descripción general
C # es un lenguaje de programación moderno, de propósito general y
orientado a objetos desarrollado por Microsoft y aprobado por la Asociación
Europea de Fabricantes de Computadoras (ECMA) y la Organización
Internacional de Normalización (ISO).
C # fue desarrollado por Anders Hejlsberg y su equipo durante el desarrollo de
.Net Framework.
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.
Las siguientes razones hacen de C # un lenguaje profesional ampliamente
utilizado:
Condiciones booleanas
Recolección Automática de Basura
Biblioteca estándar
Versiones de ensamblaje
Propiedades y eventos
Delegados y Gestión de Eventos
Genéricos fáciles de usar
Indexadores
Compilación condicional
Multithreading simple
LINQ y expresiones lambda
Integración con Windows
C # - Medio ambiente
Pruébelo Opción en línea
Hemos configurado el entorno de programación C # en línea, para que pueda compilar y
ejecutar todos los ejemplos disponibles en línea. Le da confianza en lo que está leyendo y
le permite verificar los programas con diferentes opciones. Siéntase libre de modificar
cualquier ejemplo y ejecutarlo en línea.
Pruebe el siguiente ejemplo utilizando nuestro compilador en línea disponible
en CodingGround
using System;
namespace HelloWorldApplication {
class HelloWorld {
Para la mayoría de los ejemplos dados en este tutorial, encontrará una opción Pruébelo
en las secciones de código de nuestro sitio web en la esquina superior derecha que lo
llevará al compilador en línea. Así que solo utilízalo y disfruta de tu aprendizaje.
En este capítulo, analizaremos las herramientas necesarias para crear la
programación de C #. Ya hemos mencionado que C # es parte de .Net
framework y se usa para escribir aplicaciones .Net. Por lo tanto, antes de
analizar las herramientas disponibles para ejecutar un programa C #, déjenos
comprender cómo C # se relaciona con el marco .Net.
El marco .Net
.Net Framework es una plataforma revolucionaria que le ayuda a escribir los
siguientes tipos de aplicaciones:
Aplicaciones de Windows
aplicaciones web
servicios web
Las aplicaciones de .Net framework son aplicaciones multiplataforma. El
marco ha sido diseñado de tal manera que puede usarse desde cualquiera de
los siguientes lenguajes: C #, C ++, Visual Basic, Jscript, COBOL, etc. Todos
estos lenguajes pueden acceder al marco y comunicarse entre sí.
El marco .Net consta de una enorme biblioteca de códigos utilizados por los
lenguajes del cliente, como C #. Los siguientes son algunos de los
componentes del marco .Net:
namespace HelloWorldApplication {
class HelloWorld {
C # - Sintaxis básica
C # es un lenguaje de programación orientado a objetos. En la metodología de
Programación Orientada a Objetos, un programa consta de varios objetos que
interactúan entre sí mediante acciones. Las acciones que puede realizar un
objeto se denominan métodos. Se dice que los objetos del mismo tipo tienen
el mismo tipo o, se dice que están en la misma clase.
Por ejemplo, consideremos un objeto Rectángulo. Tiene atributos como largo y
ancho. Dependiendo del diseño, puede necesitar formas de aceptar los
valores de estos atributos, calcular el área y mostrar detalles.
Veamos la implementación de una clase Rectangle y analicemos la sintaxis
básica de C #:
using System;
namespace RectangleApplication {
class Rectangle {
// member variables
double length;
double width;
class ExecuteRectangle {
Comentarios en C #
Los comentarios se utilizan para explicar el código. Los compiladores ignoran
las entradas de comentarios. Los comentarios de varias líneas en los
programas de C # comienzan con / * y terminan con los caracteres * / como se
muestra a continuación:
/* This program demonstrates
The basic syntax of C# programming
Language */
Los comentarios de una sola línea se indican con el símbolo '//'. Por ejemplo,
}//end class Rectangle
Variables miembro
Las variables son atributos o miembros de datos de una clase, utilizados para
almacenar datos. En el programa anterior, la clase Rectangle tiene dos
variables miembro llamadas largo y ancho .
Funciones de miembros
Las funciones son un conjunto de declaraciones que realizan una tarea
específica. Las funciones miembro de una clase se declaran dentro de la
clase. Nuestra clase de rectángulo de muestra contiene tres funciones
miembro: AcceptDetails , GetArea y Display .
Identificadores
Un identificador es un nombre utilizado para identificar una clase, variable,
función o cualquier otro elemento definido por el usuario. Las reglas básicas
para nombrar clases en C # son las siguientes:
Un nombre debe comenzar con una letra que pueda ser seguida por una
secuencia de letras, dígitos (0 - 9) o guión bajo. El primer carácter en un
identificador no puede ser un dígito.
No debe contener ningún espacio o símbolo incrustado como? - +! @ #% ^ & * () []
{}. ; : "'/ y \. Sin embargo, se puede utilizar un guión bajo (_).
No debería ser una palabra clave de C #.
C # Palabras clave
Las palabras clave son palabras reservadas predefinidas para el compilador
de C #. Estas palabras clave no se pueden usar como identificadores. Sin
embargo, si desea utilizar estas palabras clave como identificadores, puede
prefijar la palabra clave con el carácter @.
En C #, algunos identificadores tienen un significado especial en el contexto
del código, como get y set se denominan palabras clave contextuales.
La siguiente tabla enumera las palabras clave reservadas y las palabras clave
contextuales en C # -
Reserved Keywords
in (generic
foreach goto if implicit in int
modifier)
out (generic
null object operator out override params
modifier)
Contextual Keywords
partial
global group into join let orderby
(type)
partial
(method) remove select set
C # - Tipos de datos
Las variables en C # se clasifican en los siguientes tipos:
Tipos de valor
Tipos de referencia
Tipos de puntero
Tipo de valor
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 directamente datos. Algunos ejemplos son int,
char y float , que almacena números, alfabetos y números de coma flotante,
respectivamente. Cuando declara un tipo int , el sistema asigna memoria para
almacenar el valor.
La siguiente tabla enumera los tipos de valores disponibles en C # 2010:
doble Tipo de coma flotante de (+/-) 5.0 x 10 -324 a (+/-) 1.7 x 10308 0.0D
doble precisión de 64 bits
namespace DataTypeApplication {
class Program {
Tipo de referencia
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 modifica los datos en 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 .
Tipo de objeto
El tipo de objeto es la clase base definitiva para todos los tipos de datos en C
# Common Type System (CTS). Object es un alias para la clase
System.Object. A los tipos de objeto se les pueden asignar valores de
cualquier otro tipo, tipos de valor, tipos de referencia, tipos predefinidos o
definidos por el usuario. Sin embargo, antes de asignar valores, necesita
conversión de tipo.
Cuando un tipo de valor se convierte en un tipo de objeto, se llama boxeo y,
por otro lado, cuando un tipo de objeto se convierte en un tipo de valor, se
llama unboxing .
object obj;
obj = 100; // this is boxing
Tipo dinámico
Puede almacenar cualquier tipo de valor en la variable de tipo de datos
dinámico. La verificación de tipos para estos tipos de variables tiene lugar 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 tipo para las variables de tipo de objeto se realiza en tiempo de
compilación, mientras que la de las variables de tipo dinámico se realiza en
tiempo de ejecución.
Tipo de cadena
Tipo de puntero
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;
Discutiremos los tipos de puntero en el capítulo 'Códigos inseguros'.
C # - Conversión de tipo
La conversión de tipos es convertir un tipo de datos a otro tipo. También se
conoce como Type Casting. En C #, la conversión de tipos tiene dos formas:
Conversión de tipo implícita : estas conversiones las realiza C # de forma
segura. Por ejemplo, son conversiones de tipos integrales más pequeños a más
grandes y conversiones de clases derivadas a clases base.
Conversión de tipo explícita : estas conversiones se realizan explícitamente por
los usuarios que utilizan las funciones predefinidas. Las conversiones explícitas
requieren un operador de conversión.
El siguiente ejemplo muestra una conversión de tipo explícito:
using System;
namespace TypeConversionApplication {
class ExplicitConversion {
1
ToBoolean
Convierte un tipo en un valor booleano, donde sea posible.
2
ToByte
Convierte un tipo en un byte.
3
ToChar
Convierte un tipo en un único carácter Unicode, donde sea posible.
44
ToDateTime
Convierte un tipo (entero o tipo de cadena) en estructuras de fecha y hora.
55
ToDecimal
Convierte un tipo de coma flotante o entero en un tipo decimal.
66
Para duplicar
Convierte un tipo en un tipo doble.
77
ToInt16
Convierte un tipo en un entero de 16 bits.
8
ToInt32
Convierte un tipo en un entero de 32 bits.
99
ToInt64
Convierte un tipo en un entero de 64 bits.
10
ToSbyte
Convierte un tipo en un tipo de byte firmado.
11
ToSingle
Convierte un tipo en un pequeño número de coma flotante.
12
Encadenar
Convierte un tipo en una cadena.
13
Digitar
Convierte un tipo en un tipo especificado.
14
TOUInt16
Convierte un tipo en un tipo int sin signo.
15
ToUInt32
Convierte un tipo en un tipo largo sin signo.
dieciséis
ToUInt64
Convierte un tipo en un entero grande sin signo.
namespace TypeConversionApplication {
class StringConversion {
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
75
53.005
2345.7652
True
C # - Variables
Una variable no es más que un nombre dado a un área de almacenamiento
que nuestros programas pueden manipular. Cada variable en C # tiene un tipo
específico, que determina el tamaño y el diseño de la memoria de la variable,
el rango de valores que se pueden almacenar dentro de esa memoria y el
conjunto de operaciones que se pueden aplicar a la variable.
Los tipos de valores básicos proporcionados en C # se pueden clasificar
como:
Tipo Ejemplo
Tipos integrales sbyte, byte, corto, ushort, int, uint, long, ulong y char
Tipos de punto flotante flotador y doble
Definiendo Variables
La sintaxis para la definición de variable en C # es -
<data_type> <variable_list>;
Aquí, data_type debe ser un tipo de datos válido de C # que incluya char, int,
float, double o cualquier tipo de datos definido por el usuario, y variable_list
puede consistir en uno o más nombres de identificadores separados por
comas.
Aquí se muestran algunas definiciones de variables válidas:
int i, j, k;
char c, ch;
float f, salary;
double d;
Puede inicializar una variable en el momento de la definición como -
int i = 100;
Inicializando Variables
Las variables se inicializan (se les asigna un valor) con un signo igual seguido
de una expresión constante. La forma general de inicialización es -
variable_name = value;
namespace VariableDefinition {
class Program {
/* actual initialization */
a = 10;
b = 20;
c = a + b;
Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b,
c);
Console.ReadLine();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
a = 10, b = 20, c = 30
C # - Constantes y literales
Las constantes se refieren a valores fijos que el programa no puede alterar
durante su ejecución. Estos valores fijos también se llaman literales. Las
constantes pueden ser de cualquiera de los tipos de datos básicos, como una
constante entera, una constante flotante, una constante de caracteres o un
literal de cadena. También hay constantes de enumeración también.
Las constantes se tratan como variables regulares, excepto que sus valores
no pueden modificarse después de su definición.
Literales enteros
Un literal entero puede ser una constante decimal o hexadecimal. Un prefijo
especifica la base o la raíz: 0x o 0X para hexadecimal, y no hay identificación
de prefijo para decimal.
Un literal entero también puede tener un sufijo que es una combinación de U y
L, para unsigned y long, respectivamente. El sufijo puede ser mayúscula o
minúscula y puede estar en cualquier orden.
Aquí hay algunos ejemplos de literales enteros:
212 /* Legal */
215u /* Legal */
0xFeeL /* Legal */
Los siguientes son otros ejemplos de varios tipos de literales enteros:
85 /* decimal */
0x4b /* hexadecimal */
30 /* int */
30u /* unsigned int */
30l /* long */
30ul /* unsigned long */
Constantes de personaje
Los literales de caracteres están encerrados entre comillas simples. Por
ejemplo, 'x' y puede almacenarse en una variable simple de tipo char. Un
carácter literal puede ser un carácter simple (como 'x'), una secuencia de
escape (como '\ t') o un carácter universal (como '\ u02C0').
Hay ciertos caracteres en C # cuando están precedidos por una barra
invertida. Tienen un significado especial y se usan para representar como
nueva línea (\ n) o tabulación (\ t). Aquí hay una lista de algunos de estos
códigos de secuencia de escape:
\\ \ personaje
\? ? personaje
\si Retroceso
\F Alimentación de formulario
\norte Nueva línea
\r Retorno de carro
\t Pestaña horizontal
\v Pestaña vertical
namespace EscapeChar {
class Program {
Literales de cuerda
Los literales de cadena o las constantes están entre comillas dobles "" o con
@ "". Una cadena contiene caracteres que son similares a los literales de
caracteres: caracteres simples, secuencias de escape y caracteres
universales.
Puede dividir una línea larga en varias líneas usando literales de cadena y
separando las partes usando espacios en blanco.
Aquí hay algunos ejemplos de literales de cadena. Las tres formas son
cadenas idénticas.
"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"
@"hello dear"
Definiendo constantes
Las constantes se definen con la palabra clave const . La sintaxis para definir
una constante es:
const <data_type> <constant_name> = value;
namespace DeclaringConstants {
class Program {
// constant declaration
double r;
Console.WriteLine("Enter Radius: ");
r = Convert.ToDouble(Console.ReadLine());
double areaCircle = pi * r * r;
Console.WriteLine("Radius: {0}, Area: {1}", r,
areaCircle);
Console.ReadLine();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Enter Radius:
3
Radius: 3, Area: 28.27431
C # - Operadores
Un operador es un símbolo que le dice al compilador que realice
manipulaciones matemáticas o lógicas específicas. C # tiene un amplio
conjunto de operadores integrados y proporciona el siguiente tipo de
operadores:
Operadores aritméticos
Operadores relacionales
Operadores logicos
Operadores bit a bit
Operadores de Asignación
Operadores diversos
Este tutorial explica los operadores aritméticos, relacionales, lógicos, bit a bit,
de asignación y otros operadores uno por uno.
Operadores aritméticos
La siguiente tabla muestra todos los operadores aritméticos admitidos por C
#. Suponga que la variable A contiene 10 y la variable B contiene 20 y luego -
Mostrar ejemplos
Operadores relacionales
La siguiente tabla muestra todos los operadores relacionales compatibles con
C #. Suponga que la variable A tiene 10 y la variable B tiene 20, entonces -
Mostrar ejemplos
!= Comprueba si los valores de dos operandos son iguales o no, si los (A! = B)
valores no son iguales, la condición se vuelve verdadera. es
cierto.
> Comprueba si el valor del operando izquierdo es mayor que el valor (A> B)
del operando derecho, en caso afirmativo, la condición se vuelve no es
verdadera. cierto.
< Comprueba si el valor del operando izquierdo es menor que el valor (A <B)
del operando derecho, en caso afirmativo, la condición se vuelve es
verdadera. cierto.
>= Comprueba si el valor del operando izquierdo es mayor o igual que el (A> = B)
valor del operando derecho, en caso afirmativo, la condición se vuelve no es
verdadera. cierto.
<= Comprueba si el valor del operando izquierdo es menor o igual que el (A <= B)
valor del operando derecho, en caso afirmativo, la condición se vuelve es
verdadera. cierto.
Operadores logicos
La siguiente tabla muestra todos los operadores lógicos admitidos por C
#. Suponga que la variable A tiene un valor booleano verdadero y la
variable B tiene un valor booleano falso, entonces -
Mostrar ejemplos
00 00 00 00 00
00 1 00 1 1
1 1 1 1 00
1 00 00 1 1
Operadores de Asignación
Los siguientes operadores de asignación son compatibles con C #:
Mostrar ejemplos
Operadores Misceláneos
Hay algunos otros operadores importantes que incluyen sizeof,
typeof y ? : apoyado por C #.
Mostrar ejemplos
Y &un; Devuelve la
Devuelve la dirección de una variable. dirección real de la
variable.
?: Si la condición es
verdadera? Entonces
Expresión condicional
valor X: de lo
contrario, valor Y
es If (Ford is Car) //
comprueba si Ford
Determina si un objeto es de cierto tipo.
es un objeto de la
clase Car.
C # - Toma de decisiones
Las estructuras de toma de decisiones requieren que el programador
especifique una o más condiciones para ser evaluadas o probadas por el
programa, junto con una declaración o declaraciones que se ejecutarán si se
determina que la condición es verdadera, y opcionalmente, otras
declaraciones que se ejecutarán si la condición se determina que es falso
A continuación se presenta la forma general de una estructura de toma de
decisiones típica que se encuentra en la mayoría de los lenguajes de
programación:
No Declaración y descripción
Señor.
1 si la declaración
3 instrucciones if anidadas
Puede usar una declaración if o else if dentro de otra declaración if o else if (s).
44 declaración de cambio
Una declaración de cambio permite que una variable sea probada para la
igualdad contra una lista de valores.
Los ? : Operador
Hemos cubierto operador condicional? : en el capítulo anterior que se puede
usar para reemplazar las declaraciones if ... else . Tiene la siguiente forma
general:
Exp1 ? Exp2 : Exp3;
Donde Exp1, Exp2 y Exp3 son expresiones. Observe el uso y la colocación del
colon.
El valor de a? la expresión se determina como sigue: se evalúa Exp1. Si es
cierto, ¿se evalúa Exp2 y se convierte en el valor de todo? expresión. Si Exp1
es falso, se evalúa Exp3 y su valor se convierte en el valor de la expresión.
C # - Bucles
Puede haber una situación en la que necesite ejecutar un bloque de código
varias veces. En general, las instrucciones se ejecutan secuencialmente: la
primera instrucción de una función se ejecuta primero, seguida de la segunda,
y así sucesivamente.
Los lenguajes de programación proporcionan diversas estructuras de control
que permiten rutas de ejecución más complicadas.
Una declaración de bucle nos permite ejecutar una declaración o un grupo de
declaraciones varias veces y lo siguiente es lo general de una declaración de
bucle en la mayoría de los lenguajes de programación:
C # proporciona los siguientes tipos de bucle para manejar los requisitos de
bucle. Haga clic en los siguientes enlaces para verificar sus detalles.
1 mientras bucle
2 en bucle
Ejecuta una secuencia de declaraciones varias veces y abrevia el código que
administra la variable de bucle.
44 bucles anidados
Puede usar uno o más bucles dentro de otro mientras, para o hacer ... while loop.
1 declaración de ruptura
2 continuar declaración
Hace que el bucle omita el resto de su cuerpo e inmediatamente vuelva a probar
su condición antes de reiterar.
Bucle infinito
Un bucle se convierte en bucle infinito si una condición nunca se vuelve
falsa. El bucle for se usa tradicionalmente para este propósito. Como no se
requiere ninguna de las tres expresiones que forman el bucle for, puede hacer
un bucle sin fin dejando vacía la expresión condicional.
Ejemplo
using System;
namespace Loops {
class Program {
C # - Encapsulación
La encapsulación se define "como el proceso de encerrar 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 abstracción y la encapsulación son características relacionadas en la
programación orientada a objetos. La abstracción permite hacer visible la
información relevante y la encapsulación permite al programador implementar
el nivel deseado de abstracción .
La encapsulación se implementa mediante el uso de especificadores de
acceso . Un especificador de acceso define el alcance y la visibilidad de un
miembro de la clase. C # admite los siguientes especificadores de acceso:
Público
Privado
Protegido
Interno
Interno protegido
namespace RectangleApplication {
class Rectangle {
//member variables
public double length;
public double width;
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Length: 4.5
Width: 3.5
Area: 15.75
En el ejemplo anterior, las variables miembro longitud y anchura se
declaran públicas , por lo que se puede acceder a ellas desde la función Main
() utilizando una instancia de la clase Rectangle, denominada r .
La función miembro Display () y GetArea () también puede acceder a estas
variables directamente sin utilizar ninguna instancia de la clase.
Las funciones miembro Display () también se declaran públicas , por lo que
también se puede acceder desde Main () utilizando una instancia de la clase
Rectangle, llamada r .
namespace RectangleApplication {
class Rectangle {
//member variables
private double length;
private double width;
namespace RectangleApplication {
class Rectangle {
//member variables
internal double length;
internal double width;
double GetArea() {
return length * width;
}
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Length: 4.5
Width: 3.5
Area: 15.75
En el ejemplo anterior, observe que la función miembro GetArea () no se
declara con ningún especificador de acceso. Entonces, ¿cuál sería el
especificador de acceso predeterminado de un miembro de la clase si no
mencionamos ninguno? Es privado .
C # - Métodos
Un método es un grupo de declaraciones que juntas realizan una tarea. Cada
programa C # tiene al menos una clase con un método llamado Main.
Para usar un método, necesita:
Define el método
Llamar al método
Definición de métodos en C #
Cuando define un método, básicamente declara los elementos de su
estructura. La sintaxis para definir un método en C # es la siguiente:
<Access Specifier> <Return Type> <Method Name>(Parameter
List) {
Method Body
}
Los siguientes son los diversos elementos de un método:
Especificador de acceso : determina la visibilidad de una variable o un método
de otra clase.
Tipo de retorno : un método puede devolver un valor. El tipo de retorno es el tipo
de datos del valor que devuelve el método. Si el método no devuelve ningún valor,
entonces el tipo de retorno es nulo .
Nombre del método: el nombre del método es un identificador único y distingue
entre mayúsculas y minúsculas. No puede ser el mismo que cualquier otro
identificador declarado en la clase.
Lista de parámetros : encerrados entre paréntesis, los parámetros se utilizan
para pasar y recibir datos de un método. La lista de parámetros se refiere al tipo,
orden y número de parámetros de un método. Los parámetros son opcionales; es
decir, un método puede no contener parámetros.
Cuerpo del método : contiene el conjunto de instrucciones necesarias para
completar la actividad requerida.
Ejemplo
El siguiente fragmento de código muestra una función FindMax que toma dos
valores enteros y devuelve el mayor de los dos. Tiene un especificador de
acceso público, por lo que se puede acceder desde fuera de la clase utilizando
una instancia de la clase.
class NumberManipulator {
return result;
}
...
}
Métodos de llamada en C #
Puede llamar a un método usando el nombre del método. El siguiente ejemplo
ilustra esto:
using System;
namespace CalculatorApplication {
class NumberManipulator {
namespace CalculatorApplication {
class NumberManipulator {
class Test {
namespace CalculatorApplication {
class NumberManipulator {
No Mecanismo y Descripción
Señor.
1 Parámetros de valor
2 Parámetros de referencia
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.
3 Parámetros de salida
Este método ayuda a devolver más de un valor.
C # - Nulables
C # proporciona tipos de datos especiales, los tipos anulables , a los que
puede asignar un rango normal de valores, así como valores nulos.
Por ejemplo, puede almacenar cualquier valor de -2,147,483,648 a
2,147,483,647 o nulo en una variable Nullable <Int32>. Del mismo modo,
puede asignar verdadero, falso o nulo en una variable <bool> anulable. La
sintaxis para declarar un tipo anulable es la siguiente:
< data_type> ? <variable_name> = null;
El siguiente ejemplo demuestra el uso de tipos de datos anulables:
using System;
namespace CalculatorApplication {
class NullablesAtShow {
namespace CalculatorApplication {
class NullablesAtShow {
Declarar matrices
Para declarar una matriz en C #, puede usar la siguiente sintaxis:
datatype[] arrayName;
dónde,
tipo de datos se utiliza para especificar el tipo de elementos en la matriz.
[] especifica el rango de la matriz. El rango especifica el tamaño de la matriz.
arrayName especifica el nombre de la matriz.
Por ejemplo,
double[] balance;
namespace ArrayApplication {
class MyArray {
static void Main(string[] args) {
int [] n = new int[10]; /* n is an array of 10
integers */
int i,j;
namespace ArrayApplication {
class MyArray {
}
Console.ReadKey();
}
}
}
Matrices C #
A continuación se detallan algunos conceptos importantes relacionados con la
matriz que deben ser claros para un programador de C #:
No Concepto y descripción
Señor.
1 Matrices multidimensionales
2 Matrices dentadas
C # admite matrices multidimensionales, que son matrices de matrices.
44 Matrices de parámetros
Esto se utiliza para pasar un número desconocido de parámetros a una función.
55 La clase de matriz
Definido en el espacio de nombres del sistema, es la clase base para todas las
matrices y proporciona varias propiedades y métodos para trabajar con matrices.
C # - Cuerdas
En C #, puede usar cadenas como matriz de caracteres. Sin embargo, la
práctica más común es usar la palabra clave de cadena para declarar una
variable de cadena. La palabra clave string es un alias para
la clase System.String .
namespace StringApplication {
class Program {
1
Caracteres
Obtiene el objeto Char en una posición especificada en el objeto String actual .
2
Longitud
Obtiene el número de caracteres en el objeto de cadena actual.
1
public static int Compare (cadena strA, cadena strB)
Compara dos objetos de cadena especificados y devuelve un número entero
que indica su posición relativa en el orden de clasificación.
2
public static int Compare (cadena strA, cadena strB, bool ignoreCase)
Compara dos objetos de cadena especificados y devuelve un número entero
que indica su posición relativa en el orden de clasificación. Sin embargo,
ignora el caso si el parámetro booleano es verdadero.
3
cadena estática pública Concat (cadena str0, cadena str1)
Concatena dos objetos de cadena.
44
cadena estática pública Concat (cadena str0, cadena str1, cadena str2)
Concatena tres objetos de cadena.
55
cadena estática pública Concat (cadena str0, cadena str1, cadena str2,
cadena str3)
Concatena cuatro objetos de cadena.
66
public bool Contins (valor de cadena)
Devuelve un valor que indica si el objeto String especificado se produce
dentro de esta cadena.
77
Copia de cadena estática pública (cadena de cadena)
Crea un nuevo objeto String con el mismo valor que la cadena especificada.
8
public void CopyTo (int sourceIndex, char [] destination, int
destinationIndex, int count)
Copia un número específico de caracteres desde una posición específica del
objeto String a una posición específica en una matriz de caracteres Unicode.
99
public bool EndsWith (valor de cadena)
Determina si el final del objeto de cadena coincide con la cadena especificada.
10
public bool Equals (valor de cadena)
Determina si el objeto String actual y el objeto String especificado tienen el
mismo valor.
11
public static bool Equals (cadena a, cadena b)
Determina si dos objetos String especificados tienen el mismo valor.
12
Formato de cadena estática pública (formato de cadena, Objeto arg0)
Reemplaza uno o más elementos de formato en una cadena especificada con la
representación de cadena de un objeto especificado.
13
public int IndexOf (valor de char)
Devuelve el índice de base cero de la primera aparición del carácter Unicode
especificado en la cadena actual.
14
public int IndexOf (valor de cadena)
Devuelve el índice de base cero de la primera aparición de la cadena
especificada en esta instancia.
15
public int IndexOf (valor de char, int startIndex)
Devuelve el índice basado en cero de la primera aparición del carácter
Unicode especificado en esta cadena, comenzando la búsqueda en la posición
del carácter especificado.
dieciséis
public int IndexOf (valor de cadena, int startIndex)
Devuelve el índice basado en cero de la primera aparición de la cadena
especificada en esta instancia, comenzando la búsqueda en la posición de
carácter especificada.
17
public int IndexOfAny (char [] anyOf)
Devuelve el índice basado en cero de la primera aparición en esta instancia de
cualquier carácter en una matriz especificada de caracteres Unicode.
18 años
public int IndexOfAny (char [] anyOf, int startIndex)
Devuelve el índice basado en cero de la primera aparición en esta instancia de
cualquier carácter en una matriz especificada de caracteres Unicode,
comenzando la búsqueda en la posición de carácter especificada.
19
Insertar cadena pública (int startIndex, valor de cadena)
Devuelve una nueva cadena en la que se inserta una cadena especificada en
una posición de índice especificada en el objeto de cadena actual.
20
public static bool IsNullOrEmpty (valor de cadena)
Indica si la cadena especificada es nula o una cadena vacía.
21
cadena estática pública Join (separador de cadena, valor de cadena de
parámetros [])
Concatena todos los elementos de una matriz de cadenas, utilizando el
separador especificado entre cada elemento.
22
unión de cadena estática pública (separador de cadena, valor de cadena [],
int startIndex, int count)
Concatena los elementos especificados de una matriz de cadenas, utilizando el
separador especificado entre cada elemento.
23
public int LastIndexOf (valor char)
Devuelve la posición de índice basada en cero de la última aparición del
carácter Unicode especificado dentro del objeto de cadena actual.
24
public int LastIndexOf (valor de cadena)
Devuelve la posición de índice basada en cero de la última aparición de una
cadena especificada dentro del objeto de cadena actual.
25
Eliminar cadena pública (int startIndex)
Elimina todos los caracteres de la instancia actual, comenzando en una
posición específica y continuando hasta la última posición, y devuelve la
cadena.
26
Eliminar cadena pública (int startIndex, int count)
Elimina el número especificado de caracteres en la cadena actual que
comienza en una posición específica y devuelve la cadena.
27
Reemplazo de cadena pública (char oldChar, char newChar)
Reemplaza todas las apariciones de un carácter Unicode especificado en el
objeto de cadena actual con el carácter Unicode especificado y devuelve la
nueva cadena.
28
cadena pública Reemplazar (cadena oldValue, cadena newValue)
Reemplaza todas las apariciones de una cadena especificada en el objeto de
cadena actual con la cadena especificada y devuelve la nueva cadena.
29
cadena pública [] Split (separador char params [])
Devuelve una matriz de cadenas que contiene las subcadenas en el objeto de
cadena actual, delimitado por elementos de una matriz de caracteres Unicode
especificada.
30
cadena pública [] Split (separador char [], recuento int)
Devuelve una matriz de cadenas que contiene las subcadenas en el objeto de
cadena actual, delimitado por elementos de una matriz de caracteres Unicode
especificada. El parámetro int especifica el número máximo de subcadenas a
devolver.
31
public bool StartsWith (valor de cadena)
Determina si el comienzo de esta instancia de cadena coincide con la cadena
especificada.
32
char público [] ToCharArray ()
Devuelve una matriz de caracteres Unicode con todos los caracteres en el
objeto de cadena actual.
33
public char [] ToCharArray (int startIndex, int length)
Devuelve una matriz de caracteres Unicode con todos los caracteres en el
objeto de cadena actual, comenzando desde el índice especificado y hasta la
longitud especificada.
34
cadena pública ToLower ()
Devuelve una copia de esta cadena convertida a minúsculas.
35
cadena pública ToUpper ()
Devuelve una copia de esta cadena convertida a mayúsculas.
36
Recorte de cadena pública ()
Elimina todos los caracteres de espacio en blanco iniciales y finales del objeto
String actual.
Comparar cadenas
using System;
namespace StringApplication {
class StringProg {
if (String.Compare(str1, str2) == 0) {
Console.WriteLine(str1 + " and " + str2 + " are
equal.");
} else {
Console.WriteLine(str1 + " and " + str2 + " are
not equal.");
}
Console.ReadKey() ;
}
}
}
using System;
namespace StringApplication {
class StringProg {
if (str.Contains("test")) {
Console.WriteLine("The sequence 'test' was
found.");
}
Console.ReadKey() ;
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
The sequence 'test' was found.
using System;
namespace StringApplication {
class StringProg {
Unir cuerdas
using System;
namespace StringApplication {
class StringProg {
Título
Autor
Tema
ID del libro
struct Books {
public string title;
public string author;
public string subject;
public int book_id;
};
/* book 1 specification */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 specification */
Book2.title = "Telecom Billing";
Book2.author = "Zara Ali";
Book2.subject = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
Console.ReadKey();
}
}
las clases son tipos de referencia y las estructuras son tipos de valor
las estructuras no admiten herencia
las estructuras no pueden tener un constructor predeterminado
A la luz de las discusiones anteriores, reescribamos el ejemplo anterior:
using System;
struct Books {
private string title;
private string author;
private string subject;
private int book_id;
/* book 1 specification */
Book1.getValues("C Programming",
"Nuha Ali", "C Programming Tutorial",6495407);
/* book 2 specification */
Book2.getValues("Telecom Billing",
"Zara Ali", "Telecom Billing Tutorial", 6495700);
Console.ReadKey();
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Title : C Programming
Author : Nuha Ali
Subject : C Programming Tutorial
Book_id : 6495407
Title : Telecom Billing
Author : Zara Ali
Subject : Telecom Billing Tutorial
Book_id : 6495700
C # - Enums
Una enumeración es un conjunto de constantes enteras con nombre. Un tipo
enumerado se declara utilizando 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
heredar.
namespace EnumApplication {
class EnumProgram {
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
namespace BoxApplication {
class Box {
public double length; // Length of a box
public double breadth; // Breadth of a box
public double height; // Height of a box
}
class Boxtester {
// box 1 specification
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 specification
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// volume of box 1
volume = Box1.height * Box1.length *
Box1.breadth;
Console.WriteLine("Volume of Box1 : {0}",
volume);
// volume of box 2
volume = Box2.height * Box2.length *
Box2.breadth;
Console.WriteLine("Volume of Box2 : {0}",
volume);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Volume of Box1 : 210
Volume of Box2 : 1560
namespace BoxApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
class Boxtester {
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}" ,volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Volume of Box1 : 210
Volume of Box2 : 1560
Constructores C #
Un constructor de clase es una función miembro especial de una clase que
se ejecuta cada vez que creamos nuevos objetos de esa clase.
Un constructor tiene exactamente el mismo nombre que el de clase y no tiene
ningún tipo de retorno. El siguiente ejemplo explica el concepto de constructor:
using System;
namespace LineApplication {
class Line {
private double length; // Length of a line
public Line() {
Console.WriteLine("Object is being created");
}
namespace LineApplication {
class Line {
private double length; // Length of a line
Destructores C #
Un destructor es una función miembro especial de una clase que se ejecuta
cada vez que un objeto de su clase queda fuera de
alcance. Un destructor tiene exactamente el mismo nombre que el de la clase
con una tilde prefijada (~) y no puede devolver un valor ni puede tomar ningún
parámetro.
Destructor puede ser muy útil para liberar recursos de memoria antes de salir
del programa. Los destructores no se pueden heredar ni sobrecargar.
El siguiente ejemplo explica el concepto de destructor:
using System;
namespace LineApplication {
class Line {
private double length; // Length of a line
~Line() { //destructor
Console.WriteLine("Object is being deleted");
}
namespace StaticVarApplication {
class StaticVar {
public static int num;
class StaticTester {
static void Main(string[] args) {
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("Variable num for s1: {0}",
s1.getNum());
Console.WriteLine("Variable num for s2: {0}",
s2.getNum());
Console.ReadKey();
}
}
}
namespace StaticVarApplication {
class StaticVar {
public static int num;
class StaticTester {
namespace InheritanceApplication {
class Shape {
// Derived class
class Rectangle: Shape {
class RectangleTester {
Rect.setWidth(5);
Rect.setHeight(7);
namespace RectangleApplication {
class Rectangle {
//member variables
protected double length;
protected double width;
class ExecuteRectangle {
Herencia múltiple en C #
C # no admite herencia múltiple . Sin embargo, puede usar interfaces para
implementar herencia múltiple. El siguiente programa demuestra esto:
using System;
namespace InheritanceApplication {
class Shape {
// Derived class
class Rectangle : Shape, PaintCost {
class RectangleTester {
Polimorfismo estático
El mecanismo de vinculación de una función con un objeto durante el tiempo
de compilación se denomina enlace temprano. También se llama enlace
estático. C # proporciona dos técnicas para implementar el polimorfismo
estático. Ellos son
Función de sobrecarga
Sobrecarga del operador
Discutimos sobrecarga del operador en el próximo capítulo.
Sobrecarga de funciones
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 las
declaraciones de funciones que difieren solo por tipo de retorno.
El siguiente ejemplo muestra el uso de la función print () para imprimir
diferentes tipos de datos:
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i );
}
void print(double f) {
Console.WriteLine("Printing float: {0}" , f);
}
void print(string s) {
Console.WriteLine("Printing string: {0}", s);
}
Polimorfismo Dinámico
C # le permite crear clases abstractas que se utilizan para proporcionar una
implementación de clase parcial de una interfaz. La implementación se
completa cuando una clase derivada hereda de ella. Las clases abstractas
contienen métodos abstractos, que son implementados por la clase
derivada. Las clases derivadas tienen una funcionalidad más especializada.
Aquí están las reglas sobre las clases abstractas:
No puede crear una instancia de una clase abstracta
No puede declarar un método abstracto fuera de una clase abstracta
Cuando una clase se declara sellada , no se puede heredar, las clases abstractas
no se pueden declarar selladas.
El siguiente programa muestra una clase abstracta:
using System;
namespace PolymorphismApplication {
class RectangleTester {
namespace PolymorphismApplication {
class Shape {
protected int width, height;
class Caller {
public void CallArea(Shape sh) {
int a;
a = sh.area();
Console.WriteLine("Area: {0}", a);
}
}
class Tester {
namespace OperatorOvlApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
class Tester {
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}", volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
// volume of box 3
volume = Box3.getVolume();
Console.WriteLine("Volume of Box3 : {0}", volume);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
1
+, -,!, ~, ++, -
Estos operadores unarios toman un operando y pueden sobrecargarse.
2
+, -, *, /,%
Estos operadores binarios toman un operando y pueden sobrecargarse.
3
==,! =, <,>, <=,> =
Los operadores de comparación se pueden sobrecargar.
44
&&, ||
Los operadores lógicos condicionales no se pueden sobrecargar directamente.
55
+ =, - =, * =, / =,% =
Los operadores de asignación no se pueden sobrecargar.
66
=,.,?:, ->, nuevo, es, sizeof, typeof
Estos operadores no se pueden sobrecargar.
Ejemplo
A la luz de las discusiones anteriores, ampliemos el ejemplo anterior y
sobrecarguemos algunos operadores más:
using System;
namespace OperatorOvlApplication {
class Box {
private double length; // Length of a box
private double breadth; // Breadth of a box
private double height; // Height of a box
class Tester {
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
//displaying the Boxes using the overloaded
ToString():
Console.WriteLine("Box 1: {0}", Box1.ToString());
Console.WriteLine("Box 2: {0}", Box2.ToString());
// volume of box 1
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}", volume);
// volume of box 2
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
// volume of box 3
volume = Box3.getVolume();
Console.WriteLine("Volume of Box3 : {0}", volume);
if (Box1 != Box2)
Console.WriteLine("Box1 is not equal to Box2");
else
Console.WriteLine("Box1 is not greater or equal
to Box2");
Box4 = Box3;
if (Box3 == Box4)
Console.WriteLine("Box3 is equal to Box4");
else
Console.WriteLine("Box3 is not equal to Box4");
Console.ReadKey();
}
}
}
Declarando interfaces
Las interfaces se declaran utilizando la palabra clave de interfaz. Es similar a
la declaración de clase. Las declaraciones de interfaz son públicas por
defecto. El siguiente es un ejemplo de una declaración de interfaz:
public interface ITransactions {
// interface members
void showTransaction();
double getAmount();
}
Ejemplo
El siguiente ejemplo demuestra la implementación de la interfaz anterior:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
namespace InterfaceApplication {
public Transaction() {
tCode = " ";
date = " ";
amount = 0.0;
}
class Tester {
namespace first_space {
class namespace_cl {
namespace second_space {
class namespace_cl {
public void func() {
Console.WriteLine("Inside second_space");
}
}
}
class TestClass {
namespace first_space {
class abc {
namespace second_space {
class efg {
class TestClass {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
namespace first_space {
class abc {
public void func() {
Console.WriteLine("Inside first_space");
}
}
namespace second_space {
class efg {
class TestClass {
Directivas de preprocesador en C #
La siguiente tabla enumera las directivas de preprocesador disponibles en C #
-
No Directiva y descripción del preprocesador
Señor.
1
#definir
Define una secuencia de caracteres, llamada símbolo.
2
#undef
Le permite definir un símbolo.
3
#Si
Permite probar un símbolo o símbolos para ver si se evalúan como verdaderos.
44
#más
Permite crear una directiva condicional compuesta, junto con #if.
55
#elif
Permite crear una directiva condicional compuesta.
66
#terminara si
Especifica el final de una directiva condicional.
77
#línea
Le permite modificar el número de línea del compilador y (opcionalmente) la
salida del nombre del archivo para errores y advertencias.
8
#error
Permite generar un error desde una ubicación específica en su código.
99
#advertencia
Permite generar una advertencia de nivel uno desde una ubicación específica en
su código.
10
#región
Le permite especificar un bloque de código que puede expandir o contraer al usar
la función de esquema del Editor de código de Visual Studio.
11
#endregion
Marca el final de un bloque #region.
El preprocesador #define
La directiva #define preprocessor crea constantes simbólicas.
#define le permite definir un símbolo de modo que, al usar el símbolo como la
expresión pasada a la directiva #if, la expresión se evalúe como verdadera. Su
sintaxis es la siguiente:
#define symbol
El siguiente programa ilustra esto:
#define PI
using System;
namespace PreprocessorDAppl {
class Program {
Directivas condicionales
Puede usar 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 el #if y la siguiente directiva.
La sintaxis para la directiva condicional es -
#if symbol [operator symbol]...
Donde, símbolo es el nombre del símbolo que desea probar. También puede
usar verdadero y falso o anteponer el símbolo con el operador de negación.
El símbolo del operador es el operador utilizado para evaluar el símbolo. Los
operadores podrían ser cualquiera de los siguientes:
== (igualdad)
! = (desigualdad)
&& (y)
|| (o)
También puede agrupar símbolos y operadores con paréntesis. Las directivas
condicionales se usan para compilar código para una compilación de
depuración o al compilar para una configuración específica. Una directiva
condicional que comienza con una directiva #if debe terminarse explícitamente
con una directiva #endif .
El siguiente programa demuestra el uso de directivas condicionales:
#define DEBUG
#define VC_V10
using System;
No Métodos y descripción
Señor.
1
public bool IsMatch (entrada de cadena)
Indica si la expresión regular especificada en el constructor Regex encuentra una
coincidencia en una cadena de entrada especificada.
2
public bool IsMatch (entrada de cadena, int startat)
Indica si la expresión regular especificada en el constructor Regex encuentra una
coincidencia en la cadena de entrada especificada, comenzando en la posición
inicial especificada en la cadena.
3
public static bool IsMatch (entrada de cadena, patrón de cadena)
Indica si la expresión regular especificada encuentra una coincidencia en la
cadena de entrada especificada.
44
Partidos públicos de MatchCollection (entrada de cadena)
Busca en la cadena de entrada especificada todas las apariciones de una
expresión regular.
55
Reemplazo de cadena pública (entrada de cadena, reemplazo de cadena)
En una cadena de entrada especificada, reemplaza todas las cadenas que
coinciden con un patrón de expresión regular con una cadena de reemplazo
especificada.
66
cadena pública [] División (entrada de cadena)
Divide una cadena de entrada en una matriz de subcadenas en las posiciones
definidas por un patrón de expresión regular especificado en el constructor Regex.
Para obtener la lista completa de métodos y propiedades, lea la
documentación de Microsoft en C #.
Ejemplo 1
El siguiente ejemplo coincide con palabras que comienzan con 'S':
using System;
using System.Text.RegularExpressions;
namespace RegExApplication {
class Program {
Ejemplo 2
El siguiente ejemplo coincide con palabras que comienzan con 'm' y terminan
con 'e':
using System;
using System.Text.RegularExpressions;
namespace RegExApplication {
class Program {
private static void showMatch(string text, string expr)
{
Console.WriteLine("The Expression: " + expr);
MatchCollection mc = Regex.Matches(text, expr);
foreach (Match m in mc) {
Console.WriteLine(m);
}
}
static void Main(string[] args) {
string str = "make maze and manage to measure it";
Ejemplo 3
Este ejemplo reemplaza el espacio en blanco adicional:
using System;
using System.Text.RegularExpressions;
namespace RegExApplication {
class Program {
Sintaxis
Suponiendo que un bloque genera una excepción, un método detecta una
excepción utilizando una combinación de las palabras clave try y catch. Se
coloca un bloque try / catch alrededor del código que podría generar una
excepción. El código dentro de un bloque try / catch se conoce como código
protegido, y la sintaxis para usar try / catch es similar a la siguiente:
try {
// statements causing exception
} catch( ExceptionName e1 ) {
// error handling code
} catch( ExceptionName e2 ) {
// error handling code
} catch( ExceptionName eN ) {
// error handling code
} finally {
// statements to be executed
}
Puede enumerar varias declaraciones catch para detectar diferentes tipos de
excepciones en caso de que su bloque try provoque más de una excepción en
diferentes situaciones.
Clases de excepción en C #
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 lo tanto, las excepciones definidas por los
programadores deben derivar de esta clase.
La clase System.SystemException es la clase base para todas las
excepciones de sistema predefinidas.
La siguiente tabla proporciona algunas de las clases de excepción
predefinidas derivadas de la clase Sytem.SystemException:
1
System.IO.IOException
Maneja errores de E / S.
2
System.IndexOutOfRangeException
Maneja los errores generados cuando un método hace referencia a un índice de
matriz fuera de rango.
3
System.ArrayTypeMismatchException
Maneja los errores generados cuando el tipo no coincide con el tipo de matriz.
44
System.NullReferenceException
Maneja los errores generados al hacer referencia a un objeto nulo.
55
System.DivideByZeroException
Maneja los errores generados al dividir un dividendo con cero.
66
System.InvalidCastException
Maneja los errores generados durante la conversión de texto.
77
System.OutOfMemoryException
Maneja errores generados por memoria libre insuficiente.
8
System.StackOverflowException
Maneja los errores generados por el desbordamiento de la pila.
Manejo de excepciones
C # proporciona una solución estructurada para el manejo de excepciones en
forma de bloques try and catch. Al usar estos bloques, las declaraciones del
programa principal se separan de las declaraciones de manejo de errores.
Estos bloques de manejo de errores se implementan usando las palabras
clave try , catch y finalmente . El siguiente es un ejemplo de lanzar una
excepción cuando se produce una condición de división por cero:
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers() {
result = 0;
}
namespace UserDefinedException {
class TestTemperature {
}
}
if(temperature == 0) {
throw (new TempIsZeroException("Zero Temperature
found"));
} else {
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
TempIsZeroException: Zero Temperature found
Lanzar objetos
Puede lanzar un objeto si se deriva directa o indirectamente de
la clase System.Exception . Puede usar una instrucción throw en el bloque
catch para lanzar el objeto actual como:
Catch(Exception e) {
...
Throw e
}
C # - E / S de archivo
Un archivo es una colección de datos almacenados en un disco con un
nombre específico y una ruta de directorio. Cuando se abre un archivo para
leer o escribir, se convierte en una secuencia .
La secuencia es básicamente la secuencia de bytes que pasan a través de la
ruta de comunicación. Hay dos flujos principales: el flujo de entrada y el flujo
de salida . El flujo de entrada se usa para leer datos del archivo (operación
de lectura) y el flujo de salida se usa para escribir en el archivo (operación de
escritura).
C # Clases de E / S
El espacio de nombres System.IO tiene varias clases que se utilizan para
realizar numerosas operaciones con archivos, como crear y eliminar archivos,
leer o escribir en un archivo, cerrar un archivo, etc.
La siguiente tabla muestra algunas clases no abstractas de uso común en el
espacio de nombres System.IO:
No Clase de E / S y descripción
Señor.
1
BinaryReader
Lee datos primitivos de una secuencia binaria.
2
BinaryWriter
Escribe datos primitivos en formato binario.
3
BufferedStream
Un almacenamiento temporal para una secuencia de bytes.
44
Directorio
Ayuda a manipular una estructura de directorios.
55
DirectoryInfo
Se utiliza para realizar operaciones en directorios.
66
DriveInfo
Proporciona información para las unidades.
77
Archivo
Ayuda a manipular archivos.
8
Información del archivo
Se utiliza para realizar operaciones en archivos.
99
FileStream
Se usa para leer y escribir en cualquier ubicación de un archivo.
10
MemoryStream
Se utiliza para el acceso aleatorio a los datos transmitidos almacenados en la
memoria.
11
Camino
Realiza operaciones en la información de ruta.
12
StreamReader
Se usa para leer caracteres de una secuencia de bytes.
13
StreamWriter
Se utiliza para escribir caracteres en una secuencia.
14
StringReader
Se utiliza para leer desde un búfer de cadena.
15
StringWriter
Se usa para escribir en un búfer de cadena.
La clase FileStream
La clase FileStream en el espacio de nombres System.IO ayuda a leer,
escribir y cerrar archivos. Esta clase deriva de la clase abstracta Stream.
Debe crear un objeto FileStream para crear un nuevo archivo o abrir un
archivo existente. La sintaxis para crear un objeto FileStream es la siguiente:
FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>,
<FileAccess Enumerator>, <FileShare Enumerator>);
Por ejemplo, creamos un objeto FileStream F para leer un archivo
llamado sample.txt como se muestra :
FileStream F = new FileStream("sample.txt", FileMode.Open,
FileAccess.Read,
FileShare.Read);
No Descripción de parámetros
Señor.
1
FileMode
El enumerador FileMode define varios métodos para abrir archivos. Los
miembros del enumerador FileMode son:
Anexar : abre un archivo existente y coloca el cursor al final del archivo, o
crea el archivo, si el archivo no existe.
Crear : crea un nuevo archivo.
CreateNew : especifica al sistema operativo que debe crear un nuevo
archivo.
Abrir : abre un archivo existente.
OpenOrCreate : especifica al sistema operativo que debe abrir un archivo
si existe, de lo contrario, debe crear un nuevo archivo.
Truncar : abre un archivo existente y trunca su tamaño a cero bytes.
2
FileAccess
FileAccess encuestadores tienen miembros: Leer , ReadWrite y escritura .
3
Recurso compartido de archivos
Los enumeradores de FileShare tienen los siguientes miembros:
Heredable : permite que un identificador de archivo pase la herencia a los
procesos secundarios
Ninguno : rechaza compartir el archivo actual
Leer : permite abrir el archivo para leer.
ReadWrite : permite abrir el archivo para leer y escribir
Escribir : permite abrir el archivo para escribir
Ejemplo
El siguiente programa demuestra el uso de la clase FileStream :
using System;
using System.IO;
namespace FileIOApplication {
class Program {
F.Position = 0;
for (int i = 0; i <= 20; i++) {
Console.Write(F.ReadByte() + " ");
}
F.Close();
Console.ReadKey();
}
}
}
No Tema Descripción
Señor.
C # - Atributos
Un atributo es una etiqueta declarativa que se utiliza para transmitir
información al tiempo de ejecución sobre los comportamientos de varios
elementos como clases, métodos, estructuras, enumeradores, ensamblajes,
etc. en su programa. Puede agregar información declarativa a un programa
utilizando un atributo. Una etiqueta declarativa se representa entre corchetes
([]) colocados encima del elemento para el que se usa.
Los atributos se utilizan para agregar metadatos, como la instrucción del
compilador y otra información como comentarios, descripción, métodos y
clases a un programa. .Net Framework proporciona dos tipos de
atributos: los atributos predefinidos y los atributos personalizados .
Especificar un atributo
La sintaxis para especificar un atributo es la siguiente:
[attribute(positional_parameters, name_parameter = value,
...)]
element
El nombre del atributo y sus valores se especifican entre corchetes, antes del
elemento al que se aplica el atributo. Los parámetros posicionales especifican
la información esencial y los parámetros de nombre especifican la información
opcional.
Atributos predefinidos
.Net Framework proporciona tres atributos predefinidos:
Atributo
Condicional
Obsoleto
Atributo
El atributo predefinido AttributeUsage describe cómo se puede utilizar una
clase de atributo personalizado. Especifica los tipos de elementos a los que se
puede aplicar el atributo.
La sintaxis para especificar este atributo es la siguiente:
[AttributeUsage (
validon,
AllowMultiple = allowmultiple,
Inherited = inherited
)]
Dónde,
El parámetro validon especifica los elementos del lenguaje en los que se puede
colocar el atributo. Es una combinación del valor de un
enumerador AttributeTargets . El valor predeterminado es AttributeTargets.All .
El parámetro allowmultiple (opcional) proporciona el valor para
la propiedad AllowMultiple de este atributo, un valor booleano. Si esto es cierto, el
atributo es multiuso. El valor predeterminado es falso (uso único).
El parámetro heredado (opcional) proporciona un valor para
la propiedad Heredada de este atributo, un valor booleano. Si es cierto, el atributo
es heredado por las clases derivadas. El valor predeterminado es falso (no
heredado).
Por ejemplo,
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
Condicional
Este atributo predefinido marca un método condicional cuya ejecución
depende de un identificador de preprocesamiento especificado.
Provoca la compilación condicional de llamadas a métodos, dependiendo del
valor especificado como Debug o Trace . Por ejemplo, muestra los valores de
las variables al depurar un código.
La sintaxis para especificar este atributo es la siguiente:
[Conditional(
conditionalSymbol
)]
Por ejemplo,
[Conditional("DEBUG")]
El siguiente ejemplo demuestra el atributo:
#define DEBUG
using System;
using System.Diagnostics;
class Test {
static void function1() {
Myclass.Message("In Function 1.");
function2();
}
Obsoleto
Este atributo predefinido marca una entidad de programa que no debe
usarse. Le permite informar al compilador que descarte un elemento objetivo
particular. Por ejemplo, cuando se usa un nuevo método en una clase y si aún
desea conservar el método anterior en la clase, puede marcarlo como
obsoleto mostrando un mensaje que debe usar el nuevo método, en lugar del
método anterior.
La sintaxis para especificar este atributo es la siguiente:
[Obsolete (
message
)]
[Obsolete (
message,
iserror
)]
Dónde,
El mensaje de parámetro es una cadena que describe la razón por la cual el
elemento está obsoleto y qué usar en su lugar.
El parámetro iserror , es un valor booleano. Si su valor es verdadero, el compilador
debe tratar el uso del elemento como un error. El valor predeterminado es falso (el
compilador genera una advertencia).
El siguiente programa demuestra esto:
using System;
C # - Reflexión
Los objetos de reflexión se utilizan para obtener información de tipo en
tiempo de ejecución. Las clases que dan acceso a los metadatos de un
programa en ejecución se encuentran en el espacio
de nombres System.Reflection .
El espacio de nombres System.Reflection contiene clases que le permiten
obtener información sobre la aplicación y agregar dinámicamente tipos,
valores y objetos a la aplicación.
Aplicaciones de la reflexión
Reflection tiene las siguientes aplicaciones:
Permite ver información de atributos en tiempo de ejecución.
Permite examinar varios tipos en un ensamblaje e instanciar estos tipos.
Permite la unión tardía a métodos y propiedades.
Permite crear nuevos tipos en tiempo de ejecución y luego realiza algunas tareas
utilizando esos tipos.
Visualización de metadatos
Hemos mencionado en el capítulo anterior que usando la reflexión puede ver
la información del atributo.
El objeto MemberInfo de la clase System.Reflection debe inicializarse para
descubrir los atributos asociados con una clase. Para hacer esto, define un
objeto de la clase de destino, como -
System.Reflection.MemberInfo info = typeof(MyClass);
El siguiente programa demuestra esto:
using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute {
public readonly string Url;
set {
topic = value;
}
}
namespace AttributeAppl {
class Program {
Ejemplo
En este ejemplo, utilizamos el atributo DeBugInfo creado en el capítulo
anterior y utilizamos la reflexión para leer metadatos en la clase Rectangle .
using System;
using System.Reflection;
namespace BugFixApplication {
//a custom attribute BugFix to be
//assigned to a class and its members
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property,
AllowMultiple = true)]
class Rectangle {
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w) {
length = l;
width = w;
}
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle(4.5, 7.5);
r.Display();
Type type = typeof(Rectangle);
if (null != dbi) {
Console.WriteLine("Bug no: {0}", dbi.BugNo);
Console.WriteLine("Developer: {0}",
dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}",
dbi.Message);
}
}
if (null != dbi) {
Console.WriteLine("Bug no: {0}, for Method:
{1}", dbi.BugNo, m.Name);
Console.WriteLine("Developer: {0}",
dbi.Developer);
Console.WriteLine("Last Reviewed: {0}",
dbi.LastReview);
Console.WriteLine("Remarks: {0}",
dbi.Message);
}
}
}
Console.ReadLine();
}
}
}
Accesorios
El descriptor de acceso de una propiedad contiene las instrucciones
ejecutables que ayudan a obtener (leer o computar) o configurar (escribir) la
propiedad. Las declaraciones de descriptor de acceso pueden contener un
descriptor de acceso get, un descriptor de acceso conjunto o ambos. Por
ejemplo
// Declare a Code property of type string:
public string Code {
get {
return code;
}
set {
code = value;
}
}
Ejemplo
El siguiente ejemplo demuestra el uso de propiedades:
using System;
namespace postparaprogramadores {
class Student {
private string code = "N.A";
private string name = "not known";
private int age = 0;
class ExampleDemo {
public static void Main() {
Propiedades abstractas
Una clase abstracta puede tener una propiedad abstracta, que debe
implementarse en la clase derivada. El siguiente programa ilustra esto:
using System;
namespace postparaprogramadores {
public abstract class Person {
public abstract string Name {
get;
set;
}
public abstract int Age {
get;
set;
}
}
class ExampleDemo {
public static void Main() {
// Create a new Student object:
Student s = new Student();
Sintaxis
Un indexador unidimensional tiene la siguiente sintaxis:
element-type this[int index] {
Uso de indexadores
La declaración de comportamiento de un indexador es, en cierta medida,
similar a una propiedad. similar a las propiedades, usa get y set accessors
para definir un indexador. Sin embargo, las propiedades devuelven o
establecen un miembro de datos específico, mientras que los indexadores
devuelven o establecen un valor particular de la instancia del objeto. En otras
palabras, divide los datos de la instancia en partes más pequeñas e indexa
cada parte, obtiene o establece cada parte.
Definir una propiedad implica proporcionar un nombre de propiedad. Los
indexadores no se definen con nombres, sino con la palabra clave this , que
se refiere a la instancia del objeto. El siguiente ejemplo demuestra el
concepto:
using System;
namespace IndexerApplication {
class IndexedNames {
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames() {
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
get {
string tmp;
return ( tmp );
}
set {
if( index >= 0 && index <= size-1 ) {
namelist[index] = value;
}
}
}
Indizadores sobrecargados
Los indexadores se pueden sobrecargar. Los indexadores también se pueden
declarar con múltiples parámetros y cada parámetro puede ser de un tipo
diferente. No es necesario que los índices tengan que ser enteros. C # permite
que los índices sean de otros tipos, por ejemplo, una cadena.
El siguiente ejemplo muestra indexadores sobrecargados:
using System;
namespace IndexerApplication {
class IndexedNames {
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames() {
for (int i = 0; i < size; i++) {
namelist[i] = "N. A.";
}
}
get {
string tmp;
return ( tmp );
}
set {
if( index >= 0 && index <= size-1 ) {
namelist[index] = value;
}
}
}
get {
int index = 0;
Declarando delegados
La declaración de delegado determina los métodos a los que puede hacer
referencia el delegado. Un delegado puede referirse a un método, que tiene la
misma firma que la del delegado.
Por ejemplo, considere un delegado:
public delegate int MyDelegate (string s);
El delegado anterior se puede usar para hacer referencia a cualquier método
que tenga un único parámetro de cadena y devuelva una variable de tipo int .
La sintaxis para la declaración de delegado es:
delegate <return type> <delegate-name> <parameter list>
Delegados de instancia
Una vez que se declara un tipo de delegado, se debe crear un objeto delegado
con la nueva palabra clave y asociarlo con un método en particular. Al crear
un delegado, el argumento pasado a la nueva expresión se escribe de manera
similar a una llamada al método, pero sin los argumentos del método. Por
ejemplo
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
El siguiente ejemplo demuestra la declaración, la creación de instancias y el
uso de un delegado que se puede utilizar para hacer referencia a métodos que
toman un parámetro entero y devuelven un valor entero.
using System;
class TestDelegate {
static int num = 10;
Multidifusión de un delegado
Los objetos delegados se pueden componer utilizando el operador "+". Un
delegado compuesto llama a los dos delegados de los que estaba
compuesto. Solo se pueden componer delegados del mismo tipo. El operador
"-" se puede utilizar para eliminar un delegado componente de un delegado
compuesto.
Con esta propiedad de delegados, puede crear una lista de invocación de
métodos a los que se llamará cuando se invoque a un delegado. Esto se
llama multidifusión de un delegado. El siguiente programa demuestra la
multidifusión de un delegado:
using System;
class TestDelegate {
static int num = 10;
//calling multicast
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Value of Num: 75
Usar delegados
El siguiente ejemplo demuestra el uso de delegado. El delegado printString se
puede utilizar para hacer referencia al método que toma una cadena como
entrada y no devuelve nada.
Usamos este delegado para llamar a dos métodos, el primero imprime la
cadena en la consola y el segundo la imprime en un archivo:
using System;
using System.IO;
namespace DelegateAppl {
class PrintString {
static FileStream fs;
static StreamWriter sw;
// delegate declaration
public delegate void printString(string s);
Declarando eventos
Para declarar un evento dentro de una clase, en primer lugar, debe declarar
un tipo de delegado para el par como:
public delegate string BoilerLogHandler(string str);
luego, declare el evento usando la palabra clave del evento :
event BoilerLogHandler BoilerEventLog;
El código anterior define un delegado llamado BoilerLogHandler y un evento
llamado BoilerEventLog , que invoca al delegado cuando se genera .
Ejemplo
using System;
namespace SampleApp {
public delegate string MyDel(string str);
class EventProgram {
event MyDel MyEvent;
public EventProgram() {
this.MyEvent += new MyDel(this.WelcomeUser);
}
}
}
1 Lista de arreglo
2 Tabla de picadillo
Utiliza una clave para acceder a los elementos de la colección.
Se utiliza una tabla hash cuando necesita acceder a elementos utilizando la clave,
y puede identificar un valor clave útil. Cada elemento de la tabla hash tiene
un par clave / valor . La clave se usa para acceder a los elementos de la
colección.
3 SortedList
Utiliza una clave y un índice para acceder a los elementos de una lista.
Una lista ordenada es una combinación de una matriz y una tabla hash. Contiene
una lista de elementos a los que se puede acceder utilizando una clave o un
índice. Si accede a los elementos usando un índice, es una ArrayList, y si accede a
los elementos usando una clave, es un Hashtable. La colección de artículos
siempre se ordena por el valor clave.
44 Apilar
Representa una colección de objetos de último en entrar, primero en salir .
Se utiliza cuando necesita un acceso de elementos de último en entrar, primero en
salir. Cuando agrega un elemento en la lista, se llama empujar el elemento y
cuando lo elimina, se denomina abrir el elemento.
55 Cola
Representa una colección de objetos primero en entrar , primero en salir .
Se utiliza cuando necesita un acceso de los primeros en entrar, primero en
salir. Cuando agrega un elemento en la lista, se llama en cola y cuando elimina un
elemento, se llama deque .
66 BitArray
Representa una matriz de la representación binaria utilizando los valores 1 y 0.
Se utiliza cuando necesita almacenar los bits pero no conoce el número de bits por
adelantado. Puede acceder a los elementos de la colección BitArray utilizando
un índice entero , que comienza desde cero.
C # - Genéricos
Los genéricos le permiten definir la especificación del tipo de datos de los
elementos de programación en una clase o un método, hasta que realmente
se use en el programa. En otras palabras, los genéricos le permiten escribir
una clase o método que puede funcionar con cualquier tipo de datos.
Usted escribe las especificaciones para la clase o el método, con parámetros
sustitutos para los tipos de datos. Cuando el compilador encuentra un
constructor para la clase o una llamada de función para el método, genera
código para manejar el tipo de datos específico. Un ejemplo simple ayudaría a
comprender el concepto:
using System;
using System.Collections.Generic;
namespace GenericApplication {
class Tester {
static void Main(string[] args) {
//setting values
for (int c = 0; c < 5; c++) {
intArray.setItem(c, c*5);
}
Console.WriteLine();
//setting values
for (int c = 0; c < 5; c++) {
charArray.setItem(c, (char)(c+97));
}
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
0 5 10 15 20
a b c d e
Métodos genéricos
En el ejemplo anterior, hemos usado una clase genérica; Podemos declarar un
método genérico con un parámetro de tipo. El siguiente programa ilustra el
concepto:
using System;
using System.Collections.Generic;
namespace GenericMethodAppl {
class Program {
//call swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
Console.ReadKey();
}
}
}
Delegados Genéricos
Puede definir un delegado genérico con parámetros de tipo. Por ejemplo
delegate T NumberChanger<T>(T n);
El siguiente ejemplo muestra el uso de este delegado:
using System;
using System.Collections.Generic;
class TestDelegate {
static int num = 10;
Ejemplo
El siguiente ejemplo demuestra el concepto:
using System;
class TestDelegate {
static int num = 10;
Punteros
Un puntero es una variable cuyo valor es la dirección de otra variable, es
decir, la dirección directa de la ubicación de la memoria. similar a cualquier
variable o constante, debe declarar un puntero antes de poder usarlo para
almacenar cualquier dirección variable.
La forma general de una declaración de puntero es:
type *var-name;
Las siguientes son declaraciones válidas de puntero:
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */
namespace UnsafeCodeApplication {
class Program {
namespace UnsafeCodeApplication {
class Program {
unsafe {
int var = 20;
int* p = &var;
Console.WriteLine("Data is: {0} " , var);
Console.WriteLine("Data is: {0} " , p-
>ToString());
Console.WriteLine("Address is: {0} " , (int)p);
}
Console.ReadKey();
}
}
}
namespace UnsafeCodeApplication {
class TestPointer {
namespace UnsafeCodeApplication {
class TestPointer {
Console.ReadKey();
}
}
}
C # - Multithreading
Un subproceso se define como la ruta de ejecución de un programa. Cada
hilo define un flujo de control único. Si su aplicación involucra operaciones
complicadas y que requieren mucho tiempo, a menudo es útil establecer
diferentes rutas de ejecución o subprocesos, con cada subproceso realizando
un trabajo en particular.
Los hilos son procesos ligeros . Un ejemplo común de uso de hilo es la
implementación de programación concurrente por parte de los sistemas
operativos modernos. El uso de hilos ahorra el desperdicio del ciclo de la CPU
y aumenta la eficiencia de una aplicación.
Hasta ahora, escribimos los programas donde se ejecuta un solo hilo como un
solo proceso, que es la instancia en ejecución de la aplicación. Sin embargo,
de esta manera la aplicación puede realizar un trabajo a la vez. Para que
ejecute más de una tarea a la vez, podría dividirse en subprocesos más
pequeños.
namespace MultithreadingApplication {
class MainThreadProgram {
No Descripción de propiedad
Señor.
1
Contexto actual
Obtiene el contexto actual en el que se ejecuta el subproceso.
2
Cultura actual
Obtiene o establece la cultura del subproceso actual.
3
Principio actual
Obtiene o establece el principal actual del subproceso (para seguridad basada en
roles).
44
Tema actual
Obtiene el hilo actualmente en ejecución.
55
CurrentUICulture
Obtiene o establece la cultura actual utilizada por el Administrador de recursos
para buscar recursos específicos de la cultura en tiempo de ejecución.
66
ExecutionContext
Obtiene un objeto ExecutionContext que contiene información sobre los diversos
contextos del subproceso actual.
77
IsAlive
Obtiene un valor que indica el estado de ejecución del subproceso actual.
8
IsBackground
Obtiene o establece un valor que indica si un subproceso es o no un subproceso
de fondo.
99
IsThreadPoolThread
Obtiene un valor que indica si un subproceso pertenece o no al grupo de
subprocesos administrados.
10
ManagedThreadId
Obtiene un identificador único para el subproceso administrado actual.
11
Nombre
Obtiene o establece el nombre del subproceso.
12
Prioridad
Obtiene o establece un valor que indica la prioridad de programación de un
subproceso.
13
ThreadState
Obtiene un valor que contiene los estados del subproceso actual.
No Método y descripción
Señor.
1
anulación pública Abortar ()
Genera una ThreadAbortException en el hilo en el que se invoca, para comenzar
el proceso de terminar el hilo. Llamar a este método generalmente termina el hilo.
2
público estático LocalDataStoreSlot AllocateDataSlot ()
Asigna una ranura de datos sin nombre en todos los hilos. Para un mejor
rendimiento, utilice los campos que están marcados con el atributo
ThreadStaticAttribute en su lugar.
3
público estático LocalDataStoreSlot AllocateNamedDataSlot (nombre de
cadena)
Asigna una ranura de datos con nombre en todos los hilos. Para un mejor
rendimiento, utilice los campos que están marcados con el atributo
ThreadStaticAttribute en su lugar.
44
public static void BeginCriticalRegion ()
Notifica a un host que la ejecución está a punto de ingresar una región de código
en la que los efectos de una anulación de subproceso o una excepción no
controlada pueden poner en peligro otras tareas en el dominio de la aplicación.
55
public static void BeginThreadAffinity ()
Notifica a un host que el código administrado está a punto de ejecutar
instrucciones que dependen de la identidad del subproceso físico actual del
sistema operativo.
66
público estático vacío EndCriticalRegion ()
Notifica a un host que la ejecución está a punto de ingresar una región de código
en la que los efectos de una anulación de subproceso o una excepción no
controlada se limitan a la tarea actual.
77
público estático vacío EndThreadAffinity ()
Notifica a un host que el código administrado ha terminado de ejecutar
instrucciones que dependen de la identidad del subproceso físico actual del
sistema operativo.
8
public static void FreeNamedDataSlot (nombre de cadena)
Elimina la asociación entre un nombre y un espacio, para todos los hilos en el
proceso. Para un mejor rendimiento, utilice los campos que están marcados con
el atributo ThreadStaticAttribute en su lugar.
99
GetData de objeto estático público (ranura LocalDataStoreSlot)
Recupera el valor de la ranura especificada en el hilo actual, dentro del dominio
actual del hilo actual. Para un mejor rendimiento, utilice los campos que están
marcados con el atributo ThreadStaticAttribute en su lugar.
10
AppDomain público estático GetDomain ()
Devuelve el dominio actual en el que se ejecuta el hilo actual.
11
AppDomain público estático GetDomainID ()
Devuelve un identificador de dominio de aplicación único
12
LocalDataStoreSlot público estático GetNamedDataSlot (nombre de cadena)
Busca una ranura de datos con nombre. Para un mejor rendimiento, utilice los
campos que están marcados con el atributo ThreadStaticAttribute en su lugar.
13
interrupción pública nula ()
Interrumpe un hilo que está en el estado de hilo WaitSleepJoin.
14
public void Join ()
Bloquea el subproceso de llamada hasta que termina un subproceso, mientras
continúa realizando el bombeo estándar de COM y SendMessage. Este método
tiene diferentes formularios sobrecargados.
15
público estático vacío MemoryBarrier ()
Sincroniza el acceso a la memoria de la siguiente manera: el procesador que
ejecuta el subproceso actual no puede reordenar las instrucciones de tal manera
que los accesos a la memoria antes de la llamada a MemoryBarrier se ejecuten
después de los accesos a la memoria que siguen a la llamada a MemoryBarrier.
dieciséis
public static void ResetAbort ()
Cancela una cancelación solicitada para el hilo actual.
17
SetData público estático vacío (ranura LocalDataStoreSlot, datos de objeto)
Establece los datos en la ranura especificada en el hilo actualmente en ejecución,
para el dominio actual de ese hilo. Para un mejor rendimiento, utilice los campos
marcados con el atributo ThreadStaticAttribute en su lugar.
18 años
inicio público vacío ()
Inicia un hilo.
19
sueño estático público vacío (int millisecondsTimeout)
Hace que el hilo se detenga por un período de tiempo.
20
público estático vacío SpinWait (int iteraciones)
Hace que un hilo espere el número de veces definido por el parámetro iteraciones
21
Byte estático público VolatileRead (dirección de byte de referencia)
public static double VolatileRead (dirección doble de referencia)
public static int VolatileRead (ref int address)
Public static Object VolatileRead (ref. Dirección del objeto)
Lee el valor de un campo. El valor es el último escrito por cualquier procesador
en una computadora, independientemente de la cantidad de procesadores o el
estado de la memoria caché del procesador. Este método tiene diferentes
formularios sobrecargados. Solo algunos se dan arriba.
22
público estático vacío VolatileWrite (dirección de byte de referencia, valor
de byte)
público estático vacío VolatileWrite (dirección doble de referencia, valor
doble)
público estático void VolatileWrite (ref int address, int value)
público estático vacío VolatileWrite (ref Dirección de objeto, valor de objeto)
Escribe un valor en un campo inmediatamente, de modo que el valor sea visible
para todos los procesadores de la computadora. Este método tiene diferentes
formularios sobrecargados. Solo algunos se dan arriba.
23
rendimiento estático público bool ()
Hace que el hilo de llamada produzca ejecución en otro hilo que está listo para
ejecutarse en el procesador actual. El sistema operativo selecciona el hilo a
ceder.
Crear hilos
Los hilos se crean extendiendo la clase de hilos. La clase Thread extendida
luego llama al método Start () para comenzar la ejecución del hilo secundario.
El siguiente programa demuestra el concepto:
using System;
using System.Threading;
namespace MultithreadingApplication {
class ThreadCreationProgram {
Administrar hilos
La clase Thread proporciona varios métodos para administrar hilos.
El siguiente ejemplo demuestra el uso del método sleep () para hacer una
pausa de hilo por un período específico de tiempo.
using System;
using System.Threading;
namespace MultithreadingApplication {
class ThreadCreationProgram {
Destruyendo hilos
El método Abort () se usa para destruir hilos.
El tiempo de ejecución anula el subproceso lanzando
una ThreadAbortException . Esta excepción no se puede detectar, el control
se envía al bloque finalmente , si lo hay.
El siguiente programa ilustra esto:
using System;
using System.Threading;
namespace MultithreadingApplication {
class ThreadCreationProgram {
try {
Console.WriteLine("Child thread starts");
childThread.Abort();
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception