Tutorial de Programación en C# para Principiantes
Tutorial de Programación en C# para Principiantes
Audiencia
Este tutorial ha sido preparado para los principiantes para ayudarles a
entender de programación C # básica.
Requisitos previos
Programación C # es muy basado en los lenguajes de programación C y C
++, por lo que si usted tiene un conocimiento básico de programación C o
C ++, entonces será divertido para aprender C #.
Ejecutar C # en línea
Para la mayoría de los ejemplos dados en este tutorial encontrará Pruébalo
opción, por lo que sólo hacen uso de esta opción para ejecutar sus
programas de C # en el lugar y disfrutar de su aprendizaje.
Trate siguiente ejemplo usando Inténtelo opción disponible en la esquina
superior derecha del cuadro de código de ejemplo siguiente -
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
/* my first program in C# */
[Link]("Hello World");
[Link]();
}
}
}
C# Visión de conjunto
Condiciones de Boole
Recogida automática de basura
Biblioteca estándar
Asamblea de versiones
Propiedades y eventos
Los delegados y Gestión de Eventos
Los genéricos fácil de usar
indexadores
Compilación condicional
multihilo sencilla
LINQ y Expresiones Lambda
Integración con Windows
C# Ambiente
Inténtelo opción en línea
Hemos establecido el entorno de programación C # en línea, de
modo que se puede compilar y ejecutar todos los ejemplos
disponibles en línea. Se le da confianza en lo que está leyendo y le
permite verificar los programas con diferentes opciones. Siéntase
libre de modificar ningún ejemplo y ejecutarlo en línea.
El siguiente ejemplo muestra el uso de nuestro compilador de línea
disponible en CodingGround
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
/* my first program in C# */
[Link]("Hello World");
[Link]();
}
}
}
.Net Framework
El .NET Framework es una plataforma revolucionaria que le ayuda a escribir
los siguientes tipos de aplicaciones:
aplicaciones de Windows
aplicaciones web
servicios web
Los dos últimos son de libre acceso desde el sitio web oficial de Microsoft. El
uso de estas herramientas, se puede escribir todo tipo de programas en C
# desde simples aplicaciones de línea de comandos para las aplicaciones
más complejas. También puede escribir archivos de código fuente C #
usando un editor de texto básico, como el Bloc de notas, y compilar el
código en ensamblados utilizando el compilador de línea de comandos, que
a su vez es una parte de .NET Framework.
Visual C # y Visual Web Developer Express Edition se recortada versiones
de Visual Studio y tiene la misma apariencia. Conservan la mayoría de
características de Visual Studio. En este tutorial, hemos utilizado Visual C #
2010 Express.
Puede descargarla desde Microsoft Visual Studio . Que se instala
automáticamente en su máquina.
Nota: Se necesita una conexión a Internet activa para la instalación de la
edición expresa.
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
/* my first program in C# */
[Link]("Hello World");
[Link]();
}
}
}
Hello World
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í por medio de acciones. Las acciones que un objeto
puede tomar son llamados métodos. Los objetos del mismo tipo se dice que
tienen el mismo tipo o, se dice que está en la misma clase.
Por ejemplo, consideremos un objeto rectangular. Tiene atributos tales
como longitud y anchura. Dependiendo del diseño, es posible que tenga
maneras para aceptar los valores de estos atributos, el cálculo del área, y la
visualización de datos.
Veamos implementación de una clase Rectángulo y discutimos C # sintaxis
básica:
using System;
namespace RectangleApplication
{
class Rectangle
{
// member variables
double length;
double width;
public void Acceptdetails()
{
length = 4.5;
width = 3.5;
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
[Link]();
[Link]();
[Link]();
}
}
}
Length: 4.5
Width: 3.5
Area: 15.75
using System;
Los comentarios en C #
Los comentarios se utilizan para explicar código. Los compiladores ignoran
las entradas de comentario. Los comentarios de varias líneas en programas
C # comienzan con / * y termina 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 mediante el símbolo '//'. Por
ejemplo,
identificadores
Un identificador es un nombre usado para identificar una clase, variable,
función, o cualquier otro elemento definido por el usuario. Las reglas
básicas para la denominación de las clases en C # son los siguientes:
Un nombre debe comenzar con una letra que podría ser seguido por
una secuencia de letras, dígitos (0 - 9) o un guión. El primer carácter
de un identificador no puede ser un dígito.
No debe contener ningún espacio o símbolo incrustado como? - +! @
#% ^ & * ( ) [] {}. ; : " '/ Y \ Sin embargo, un subrayado. ( _ ) Se
puede utilizar.
No debe ser una palabra clave de C #.
Palabras clave de C #
Palabras clave son palabras reservadas predefinidas para el compilador de
C #. Estas palabras clave no se pueden utilizar como identificadores. Sin
embargo, si desea utilizar estas palabras clave como identificadores, puede
prefijar los mensajes con el carácter @.
En C #, algunos identificadores tienen un significado especial en el
contexto de código, como obtener y establecer se llaman palabras clave
contextuales.
La siguiente tabla muestra las palabras clave reservadas y las palabras
claves contextuales en C #:
Reserved Keywords
in (generic
foreach goto if implicit in int
modifier)
out (generic
null object operator out override params
modifier)
unchecke
ulong unsafe ushort using virtual void
d
volatile while
Contextual Keywords
ascendin descendin
add alias dynamic from get
g g
partial
global group into join let orderby
(type)
partial
remove select set
(method)
C# Tipos de datos
Tipo de valor
Las variables de tipo valor se puede asignar un valor directamente. Se
derivan de la clase [Link] .
Los tipos de valor contienen directamente datos. Algunos ejemplos son int,
char, and float , que almacena números, alfabetos, y los números
de coma flotante, respectivamente. Cuando se declara una int tipo, el
sistema asigna memoria para almacenar el valor.
La siguiente tabla muestra los tipos de valor disponibles en C # 2010:
Valor
por
Tipo representa Distancia
defect
o
32 bits de precisión
float simple tipo de punto -3.4 x 10 38
to + 3.4 x 10 38
0.0F
flotante
using System;
namespace DataTypeApplication
{
class Program
{
static void Main(string[] args)
{
[Link]("Size of int: {0}", sizeof(int));
[Link]();
}
}
}
Size of int: 4
Tipo de referencia
Los tipos de referencia no contienen los datos reales almacenados en una
variable, pero que contienen una referencia a las variables.
En otras palabras, se refieren a una posición de memoria. El uso de
múltiples variables, los tipos de referencia se puede referir a una ubicación
de memoria. Si los datos de la posición de memoria se cambia por una de
las variables, la otra variable refleja automáticamente este cambio de valor.
Ejemplo de built-in los tipos de referencia son: object , dynamic, y
string .
Tipo de objeto
El Object Type es la clase base definitiva para todos los tipos de
datos en C # Common Type System (CTS) . Objeto es un alias para la
clase [Link]. Los tipos de objetos pueden ser valores de cualquier
otro tipo, tipos de valores, tipos de referencia, tipos predefinidos o definidos
por el usuario asignados. Sin embargo, antes de asignar valores, se
necesita la conversión de tipos.
Cuando un tipo de valor se convierte en tipo de objeto, se llama boxing y
por el 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
Se puede almacenar cualquier tipo de valor en la variable tipo de datos
dinámico. La verificación de tipos para estos tipos de variables se lleva a
cabo en tiempo de ejecución.
Sintaxis para declarar un tipo dinámico es:
Por ejemplo,
dynamic d = 20;
@"Tutorials Point";
Tipo de puntero
Las variables de tipo puntero almacenar la dirección de memoria de otro
tipo. Punteros en C # tienen las mismas capacidades que los punteros en C
o C ++.
Sintaxis para declarar un tipo de puntero es:
type* identifier;
Por ejemplo,
char* cptr;
int* iptr;
C# tipo de conversión
Conversión de tipo es la conversión de un tipo de datos a otro tipo. También
se conoce como la conversión de tipos. En C #, el tipo de colada tiene dos
formas:
Implicit type conversion - Estas conversiones se llevan a cabo
por C # en una forma de tipo seguro. Por ejemplo, son
conversiones de menor a tipos y conversiones integrales de mayor
tamaño de las clases derivadas a clases base.
Explicit type conversion - Estas conversiones se realizan de
forma explícita por los usuarios utilizando las funciones
predefinidas. Conversiones explícitas requieren un operador de
conversión.
El ejemplo siguiente muestra una conversión de tipo explícito:
using System;
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
5673
ToBoolean
1
Convierte un tipo en un valor booleano, si es posible.
ToByte
2
Convierte un tipo a un byte.
ToChar
3 Convierte un tipo a un solo carácter Unicode, siempre que sea
posible.
ToDateTime
4 Convierte un tipo (integer or string type) a las estructuras de fecha y
hora.
ToDecimal
5
Convierte un punto flotante o tipo entero a un tipo decimal.
ToDouble
6
Convierte un tipo a un tipo doble.
ToInt16
7
Convierte un tipo en un entero de 16 bits.
ToInt32
8
Convierte un tipo en un entero de 32 bits.
9 ToInt64
Convierte un tipo en un entero de 64 bits.
ToSbyte
10
Convierte un tipo a otro tipo byte con signo.
ToSingle
11
Convierte un tipo a un pequeño número de coma flotante.
ToString
12
Convierte un tipo en una cadena.
ToType
13
Convierte un tipo a un tipo especificado.
ToUInt16
14
Convierte un tipo a un tipo unsigned int.
ToUInt32
15
Convierte un tipo a un tipo largo sin signo.
ToUInt64
16
Convierte un tipo a un gran número entero sin signo.
El ejemplo siguiente convierte varios tipos de valor a tipo de cadena:
using System;
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
int i = 75;
float f = 53.005f;
double d = 2345.7652;
bool b = true;
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]();
}
}
}
75
53.005
2345.7652
True
C# Variables
Una variable es nada 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, el cual determina el tamaño y el diseño de
la memoria de la variable de la gama de valores que puede ser almacenado
dentro de esa memoria y el conjunto de operaciones que puede ser
aplicado a la variable.
Los tipos de valores básicos ofrecidos en C # se pueden clasificar como:
Tipo Ejemplo
tipos integrales sbyte, byte, short, ushort, int, uint larga, ulong, y Char
Flotante tipos de
flotador y doble
puntos
Definición de variables
Sintaxis para la definición de variables en C # es:
<data_type> <variable_list>;
Aquí, data_type debe ser un tipo de datos C # válida incluyendo char, int,
float, doble, o cualquier tipo de datos definido por el usuario, y variable_list
puede consistir de uno o más nombres de identificadores separados por
comas.
Algunas definiciones de variables válidos se muestran aquí:
int i, j, k;
char c, ch;
float f, salary;
double d;
int i = 100;
La inicialización de variables
Las variables se inicializan (assigned a value) con un signo igual seguido de
una expresión constante. La forma general de la inicialización es:
variable_name = value;
using System;
namespace VariableDefinition
{
class Program
{
static void Main(string[] args)
{
short a;
int b ;
double c;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
[Link]("a = {0}, b = {1}, c = {2}", a, b,
c);
[Link]();
}
}
}
a = 10, b = 20, c = 30
int num;
num = Convert.ToInt32([Link]());
int g = 20;
10 = 20;
C# Constantes y literales
Las constantes se refieren a valores fijos que el programa no puede alterar
durante su ejecución. Estos valores fijos son también llamados literales. Las
constantes pueden ser de cualquiera de los tipos de datos básicos como
una constante entera, una constante de coma flotante, una constante de
caracteres, o una cadena literal. También hay constantes de enumeración
también.
Las constantes son tratadas igual que las variables regulares, excepto que
sus valores no pueden ser modificados después de su definición.
212 /* Legal */
215u /* Legal */
0xFeeL /* Legal */
078 /* Illegal: 8 is not an octal digit */
032UU /* Illegal: cannot repeat a suffix */
85 /* decimal */
0213 /* octal */
0x4b /* hexadecimal */
30 /* int */
30u /* unsigned int */
30l /* long */
30ul /* unsigned long */
Los literales de punto flotante
A-coma flotante literal tiene una parte entera, un punto decimal, una parte
fraccionaria, y una parte exponente. Puede representar literales de punto
flotante, ya sea en forma decimal o exponencial.
Estos son algunos ejemplos de literales de punto flotante:
3.14159 /* Legal */
314159E-5L /* Legal */
510E /* Illegal: incomplete exponent */
210f /* Illegal: no decimal or exponent */
.e55 /* Illegal: missing integer or fraction */
\\ \ personaje
\? ? personaje
\a Alerta o campana
\b Retroceso
\f avance de página
\n Nueva línea
\r retorno de carro
\t pestaña horizontal
\v pestaña vertical
using System;
namespace EscapeChar
{
class Program
{
static void Main(string[] args)
{
[Link]("Hello\tWorld\n\n");
[Link]();
}
}
}
Hello World
Los literales de cadena
Cadenas literales o constantes se encierran entre comillas dobles "" o con
@ "". Una cadena contiene caracteres que son similares a los literales de
caracteres: personajes planos, secuencias de escape, y los caracteres
universales.
Puede romper una larga línea en múltiples líneas usando literales de
cadena y que separan las partes que utilizan espacios en blanco.
Estos son algunos ejemplos de literales de cadena. Todas las formas son
tres cadenas idénticas.
"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"
@"hello dear"
Definición de Constantes
Las constantes se definen mediante la const palabra clave. Sintaxis para
definir una constante es:
using System;
namespace DeclaringConstants
{
class Program
{
static void Main(string[] args)
{
const double pi = 3.14159;
// constant declaration
double r;
[Link]("Enter Radius: ");
r = [Link]([Link]());
double areaCircle = pi * r * r;
[Link]("Radius: {0}, Area: {1}", r,
areaCircle);
[Link]();
}
}
}
Enter Radius:
3
Radius: 3, Area: 28.27431
C# operadores
Un operador es un símbolo que indica al compilador para realizar
manipulaciones matemáticas o lógicas específicas. C # tiene amplio
conjunto de operadores integrados y ofrece los siguientes tipos de
operadores:
Operadores aritméticos
Operadores relacionales
Operadores logicos
Los operadores bit a bit
Operadores de Asignación
Los operadores misceláneos
Operadores aritméticos
La siguiente tabla muestra todos los operadores aritméticos soportados por
C #. Supongamos variable de A tiene 10 y la variable B tiene 20 a
continuación:
Mostrar ejemplos
Operado
Descripción Ejemplo
r
Operadores relacionales
La siguiente tabla muestra todos los operadores relacionales con el apoyo
de C #. Supongamos variable de A tiene 10 y la variable B tiene 20,
entonces:
Mostrar ejemplos
Operado
Descripción Ejemplo
r
Operadores logicos
La siguiente tabla muestra todos los operadores lógicos soportados por C #.
Supongamos variable de A tiene un valor booleano verdadero y la
variable B tiene un valor booleano falso, entonces:
Mostrar ejemplos
Operado
Descripción Ejemplo
r
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Operadores de Asignación
Hay siguientes operadores de asignación soportados por C #:
Mostrar ejemplos
Operado
Descripción Ejemplo
r
C &= 2 is same as C = C
&= AND bit a bit operador de asignación
&2
If Condition is true ?
?: La expresión condicional Then value X : Otherwise
value Y
De derecha a
Unary + - ! ~ ++ - - (type) * & sizeof
izquierda
Multiplicativ De izquierda a
*/%
e derecha
De izquierda a
Additive +-
derecha
De izquierda a
Shift << >>
derecha
De izquierda a
Relational < <= > >=
derecha
De izquierda a
Equality == !=
derecha
De izquierda a
Bitwise AND &
derecha
De izquierda a
Bitwise XOR ^
derecha
De izquierda a
Bitwise OR |
derecha
De izquierda a
Logical AND &&
derecha
De izquierda a
Logical OR ||
derecha
De derecha a
Conditional ?:
izquierda
De derecha a
Assignment = += -= *= /= %=>>= <<= &= ^= |=
izquierda
De izquierda a
Comma ,
derecha
C# Toma de decisiones
Toma de decisiones estructuras requiere que el programador para
especificar una o más condiciones a ser evaluados o probados por el
programa, junto con una declaración o sentencias que se ejecutan si la
condición se determina para ser verdad, y opcionalmente, otras
declaraciones que se ejecutan si la condición se determina que es falsa.
A continuación se presenta lo general de una típica estructura de toma de
decisiones que se encuentra en la mayoría de los lenguajes de
programación:
Los ? : Operador:
Hemos cubierto conditional operator ? : conditional operator ? : En el
capítulo anterior que se puede utilizar para reemplazar if...else
declaraciones. Tiene la siguiente forma general:
C# bucles
Puede haber una situación, cuando se necesita para ejecutar un bloque de
código varias veces. En general, las instrucciones se ejecutan
secuencialmente: La primera sentencia de una función se ejecuta en primer
lugar, seguido por el segundo, y así sucesivamente.
Los lenguajes de programación proporcionan diversas estructuras de
control que permiten rutas de ejecución más complicados.
Una sentencia de bucle nos permite ejecutar una instrucción o un grupo de
instrucciones varias veces y después se lo general de una declaración de
bucle en la mayoría de los lenguajes de programación:
C # proporciona siguientes tipos de bucle para manejar los requerimientos
de bucle. Haga clic en los siguientes enlaces para ver sus detalles.
Tipo de bucle Descripción
Bucle infinito
Un bucle se convierte en bucle infinito si una condición nunca se convierte
en falsa. El for bucle se utiliza tradicionalmente para este propósito.
Dado que ninguna de las tres expresiones que forman el bucle se requieren
para, usted puede hacer un bucle sin fin, dejando la expresión condicional
vacía.
Ejemplo
using System;
namespace Loops
{
class Program
{
static void Main(string[] args)
{
for (; ; )
{
[Link]("Hey! I am Trapped");
}
}
}
}
Cuando la expresión condicional está ausente, se supone para ser verdad.
Es posible que tenga una inicialización y el incremento de expresión, pero
los programadores más comúnmente utilizar el for(;;) construir para
significar un bucle infinito.
C# La encapsulación
Encapsulation se define 'como el proceso de encerrar uno o más
artículos dentro de un paquete físico o lógico'. 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. Abstracción permite hacer visible la
información relevante y la encapsulación permite a un programador para
implement the desired level of abstraction .
La encapsulación se implementa mediante access specifiers . Un access
specifier define el alcance y visibilidad de un miembro de la clase.
C # soporta los siguientes especificadores de acceso:
Público
Privado
Protegido
Interno
interna protegida
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
public double length;
public double width;
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
[Link] = 4.5;
[Link] = 3.5;
[Link]();
[Link]();
}
}
}
Length: 4.5
Width: 3.5
Area: 15.75
En el ejemplo anterior, la longitud y anchura variables miembro son
declarados public , por lo que se puede acceder desde la función
Main() utilizando una instancia de la clase Rectángulo, llamado r .
La función miembro Display() y GetArea() también pueden acceder a estas
variables directamente sin utilizar cualquier instancia de la clase.
La funciones miembro Display() también se declara public , por lo que
también se puede acceder desde Main() usando una instancia de la
clase Rectángulo, llamado r .
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
private double length;
private double width;
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
[Link]();
[Link]();
[Link]();
}
}
}
Enter Length:
4.4
Enter Width:
3.3
Length: 4.4
Width: 3.3
Area: 14.52
En el ejemplo anterior, la longitud y anchura variables miembro son
declarados private , por lo que no se puede acceder desde la función
Main() . Las funciones miembro AcceptDetails() y Display() pueden acceder
a estas variables. Dado que las funciones miembro AcceptDetails() y la
Display() se declaran public , que se puede acceder desde Main()
usando una instancia de la clase Rectángulo, llamado r .
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
internal double length;
internal double width;
double GetArea()
{
return length * width;
}
public void Display()
{
[Link]("Length: {0}", length);
[Link]("Width: {0}", width);
[Link]("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
[Link] = 4.5;
[Link] = 3.5;
[Link]();
[Link]();
}
}
}
Length: 4.5
Width: 3.5
Area: 15.75
C# métodos
Un método es un grupo de instrucciones que juntos realizan una tarea.
Cada programa en C # tiene al menos una clase con un método llamado
Principal.
Para utilizar un método, es necesario:
Definir el método
Llamar al método
Métodos de definición en C #
Cuando se define un método, se declara básicamente los elementos de su
estructura. La sintaxis para la definición de un método en C # es la
siguiente:
Ejemplo
Después de fragmento de código de muestra una función FindMax que
toma dos valores enteros y devuelve el mayor de los dos. Tiene
especificador de acceso público, por lo que se puede acceder desde fuera
de la clase utilizando una instancia de la clase.
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
/* local variable declaration */
int result;
return result;
}
...
}
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
/* local variable declaration */
int result;
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int FindMax(int num1, int num2)
{
/* local variable declaration */
int result;
return result;
}
}
class Test
{
static void Main(string[] args)
{
/* local variable definition */
int a = 100;
int b = 200;
int ret;
NumberManipulator n = new NumberManipulator();
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public int factorial(int num)
{
/* local variable declaration */
int result;
if (num == 1)
{
return 1;
}
else
{
result = factorial(num - 1) * num;
return result;
}
}
C# nullables
C # proporciona un tipo de datos especiales, los nullable tipos, a los que
puede asignar rango normal de valores, así como los valores nulos.
Por ejemplo, puede almacenar cualquier valor de -2147483648 a
2147483647 o nulo en una variable anulable <Int32>. Del mismo modo,
puede asignar verdadero, falso o nulo en una variable anulable <bool>.
Sintaxis para declarar un nullable tipo es el siguiente:
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
int? num1 = null;
int? num2 = 45;
double? num3 = new double?();
double? num4 = 3.14157;
bool? boolval = new bool?();
using System;
namespace CalculatorApplication
{
class NullablesAtShow
{
static void Main(string[] args)
{
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34;
[Link](" Value of num3: {0}", num3);
num3 = num2 ?? 5.34;
[Link](" Value of num3: {0}", num3);
[Link]();
}
}
}
C# formación
Una matriz almacena una colección de tamaño fijo secuencial de elementos
del mismo tipo. Una matriz se utiliza para almacenar una colección de
datos, pero a menudo es más útil pensar en una matriz como una colección
de variables del mismo tipo almacenado en ubicaciones de memoria
contiguas.
En lugar de declarar las variables individuales, como Number0,
número1, ..., y number99, se declara una variable de matriz tales como
números y uso de los números [0], números [1], y, números ... [99] para
representar variables individuales. Un elemento específico en una matriz se
accede por un índice.
Todos los arreglos consisten en posiciones de memoria contiguas. La
dirección más baja corresponde al primer elemento y la dirección más alta
hasta el último elemento.
declarar arrays
Para declarar una matriz en C #, puede utilizar la siguiente sintaxis:
datatype[] arrayName;
dónde,
d atatype se utiliza para especificar el tipo de elementos de 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;
using System;
namespace ArrayApplication
{
class MyArray
{
static void Main(string[] args)
{
int [] n = new int[10]; /* n is an array of 10
integers */
int i,j;
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
using System;
namespace ArrayApplication
{
class MyArray
{
static void Main(string[] args)
{
int [] n = new int[10]; /* n is an array of 10
integers */
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Arrays de C #
Hay siguiendo algunos conceptos importantes relacionados con la matriz
que debe ser claro para un programador de C #:
Concepto Descripción
C# Instrumentos de cuerda
En C #, puede utilizar cadenas como un array de caracteres, sin embargo,
la práctica más común es el uso de la string de palabras clave para
declarar una variable de cadena. La palabra clave de cadena es un alias
para el [Link] clase.
using System;
namespace StringApplication
{
class Program
{
static void Main(string[] args)
{
//from string literal and string concatenation
string fname, lname;
fname = "Rowan";
lname = "Atkinson";
Chars
1
Obtiene el Char objeto en una posición especificada en la corriente
String objeto.
Length
2
Obtiene el número de caracteres del objeto String actual.
using System;
namespace StringApplication
{
class StringProg
{
static void Main(string[] args)
{
string str1 = "This is test";
string str2 = "This is text";
if ([Link](str1, str2) == 0)
{
[Link](str1 + " and " + str2 + " are
equal.");
}
else
{
[Link](str1 + " and " + str2 + " are not
equal.");
}
[Link]() ;
}
}
}
using System;
namespace StringApplication
{
class StringProg
{
static void Main(string[] args)
{
string str = "This is test";
if ([Link]("test"))
{
[Link]("The sequence 'test' was found.");
}
[Link]() ;
}
}
}
Getting a Substring:
using System;
namespace StringApplication
{
class StringProg
{
static void Main(string[] args)
{
string str = "Last night I dreamt of San Pedro";
[Link](str);
string substr = [Link](23);
[Link](substr);
}
}
}
San Pedro
Joining Strings:
using System;
namespace StringApplication
{
class StringProg
{
static void Main(string[] args)
{
string[] starray = new string[]{"Down the way nights
are dark",
"And the sun shines daily on the mountain top",
"I took a trip on a sailing ship",
"And when I reached Jamaica",
"I made a stop"};
C# estructuras
En C #, una estructura es un tipo de datos tipo de valor. Se le ayuda a
hacer un solo dato relacionado de mantenimiento variable de distintos tipos
de datos. La struct palabra clave se utiliza para la creación de una
estructura.
Las estructuras se utilizan para representar un registro. Suponga que desea
realizar un seguimiento de sus libros en una biblioteca. Es posible que
desee realizar un seguimiento de los following atributos acerca de cada
libro:
Título
Autor
Tema
Identificación libro
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
El programa siguiente muestra el uso de la estructura:
using System;
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
/* book 1 specification */
[Link] = "C Programming";
[Link] = "Nuha Ali";
[Link] = "C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 specification */
[Link] = "Telecom Billing";
[Link] = "Zara Ali";
[Link] = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
[Link]();
}
}
Características de C # Estructuras
Ya ha utilizado una estructura simple denominada Libros. Estructuras en C
# son bastante diferente de la tradicional C o C ++. Las estructuras de C #
tienen las siguientes características:
Las estructuras pueden tener métodos, campos, los indexadores,
propiedades, métodos y eventos operador.
Las estructuras pueden tener constructores definidos, pero no
destructores. Sin embargo, no se puede definir un constructor por
defecto para una estructura. El constructor por defecto se define
automáticamente y no se puede cambiar.
A diferencia de clases, estructuras no pueden heredar otras
estructuras o clases.
Las estructuras no se pueden usar como base para otras estructuras
o clases.
Una estructura puede implementar una o más interfaces.
miembros de la estructura no se pueden especificar como abstracto,
virtual o protegido.
Cuando se crea un objeto struct usando el New operador, que se
crea y el constructor adecuado se llama. A diferencia de clases,
estructuras se pueden crear instancias sin utilizar el nuevo operador.
Si no se utiliza el operador New, los campos permanecen sin asignar
y el objeto no se pueden utilizar hasta que todos los campos se
inicializan.
using System;
struct Books
{
private string title;
private string author;
private string subject;
private int book_id;
public void getValues(string t, string a, string s, int id)
{
title = t;
author = a;
subject = s;
book_id = id;
}
public void display()
{
[Link]("Title : {0}", title);
[Link]("Author : {0}", author);
[Link]("Subject : {0}", subject);
[Link]("Book_id :{0}", book_id);
}
};
/* book 1 specification */
[Link]("C Programming",
"Nuha Ali", "C Programming Tutorial",6495407);
/* book 2 specification */
[Link]("Telecom Billing",
"Zara Ali", "Telecom Billing Tutorial", 6495700);
[Link]();
}
}
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# enumeraciones
Una enumeración es un conjunto de constantes enteras con nombre. Un
tipo enumerado se declara utilizando la enum de palabras clave.
C # enumeraciones son de tipo de datos de valor. En otras palabras, la
enumeración contiene sus propios valores y no puede heredar o no puede
pasar a la herencia.
enum <enum_name>
{
enumeration list
};
Dónde,
El enum_name especifica el nombre del tipo de enumeración.
La enumeration list es una lista separada por comas de
identificadores.
Cada uno de los símbolos en la lista enumeración representa un valor
entero, uno mayor que el símbolo que precede. Por defecto, el valor del
primer símbolo de enumeración es 0. Por ejemplo:
Ejemplo
El siguiente ejemplo demuestra el uso de la variable enum:
using System;
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
static void Main(string[] args)
{
int WeekdayStart = (int)[Link];
int WeekdayEnd = (int)[Link];
[Link]("Monday: {0}", WeekdayStart);
[Link]("Friday: {0}", WeekdayEnd);
[Link]();
}
}
}
Monday: 1
Friday: 5
C# clases
Cuando se define una clase, se define un modelo para un tipo de datos.
Esto no define ningún dato, pero sí define lo que significa el nombre de la
clase. Es decir, lo que es un objeto de la clase consiste y qué operaciones
se pueden realizar en ese objeto. Los objetos son instancias de una clase.
Los métodos y las variables que constituyen una clase se denominan
miembros de la clase.
Nota:
especificadores de acceso especifican las reglas de acceso para los
miembros, así como la propia clase. Si no se menciona, entonces el
especificador de acceso predeterminado para un tipo de clase es
internal . De acceso predeterminado para los miembros es private .
tipo de datos especifica el tipo de variable, y el tipo de retorno
especifica el tipo de datos de los datos el método devuelve, en su
caso.
Para acceder a los miembros de la clase, se utiliza el punto (.) Del
operador.
El operador punto vincula el nombre de un objeto con el nombre de
un miembro.
El siguiente ejemplo ilustra los conceptos discutidos hasta ahora:
using System;
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
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box(); // Declare Box2 of type Box
double volume = 0.0; // Store the volume of a box
here
// box 1 specification
[Link] = 5.0;
[Link] = 6.0;
[Link] = 7.0;
// box 2 specification
[Link] = 10.0;
[Link] = 12.0;
[Link] = 13.0;
// volume of box 1
volume = [Link] * [Link] * [Link];
[Link]("Volume of Box1 : {0}", volume);
// volume of box 2
volume = [Link] * [Link] * [Link];
[Link]("Volume of Box2 : {0}", volume);
[Link]();
}
}
}
using System;
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
public void setLength( double len )
{
length = len;
}
// volume of box 1
volume = [Link]();
[Link]("Volume of Box1 : {0}" ,volume);
// volume of box 2
volume = [Link]();
[Link]("Volume of Box2 : {0}", volume);
[Link]();
}
}
}
C # constructores
Una clase constructor es una función miembro de una clase especial
que se ejecuta cada vez que se crea nuevos objetos de esa clase.
Un constructor tiene exactamente el mismo nombre que el de la 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()
{
[Link]("Object is being created");
}
using System;
namespace LineApplication
{
class Line
{
private double length; // Length of a line
public Line(double len) //Parameterized constructor
{
[Link]("Object is being created, length =
{0}", len);
length = len;
}
Los destructores de C #
Un destructor es una función miembro especial de una clase que se
ejecuta cada vez que un objeto de su clase sale del ámbito. Un
destructor tiene exactamente el mismo nombre que el de la clase
con una tilde prefijado (~) y no las puede devolver un valor ni
puede tener ningún parámetro.
Destructor puede ser muy útil para liberar recursos de memoria antes de
salir del programa. Los destructores no pueden ser heredados o
sobrecargados.
El siguiente ejemplo explica el concepto de destructor:
using System;
namespace LineApplication
{
class Line
{
private double length; // Length of a line
public Line() // constructor
{
[Link]("Object is being created");
}
~Line() //destructor
{
[Link]("Object is being deleted");
}
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
[Link]();
[Link]();
[Link]();
[Link]();
[Link]();
[Link]();
[Link]("Variable num for s1: {0}",
[Link]());
[Link]("Variable num for s2: {0}",
[Link]());
[Link]();
}
}
}
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public static int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s = new StaticVar();
[Link]();
[Link]();
[Link]();
[Link]("Variable num: {0}",
[Link]());
[Link]();
}
}
}
Variable num: 3
C# heredar
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 hace que sea más fácil de crear y mantener
una aplicación. Esto también proporciona una oportunidad para volver a
utilizar la funcionalidad de código y acelera el tiempo de aplicación.
Al crear una clase, en lugar de escribir datos miembro y funciones miembro
completamente nuevo, el programador puede designar que la nueva clase
debe heredar los miembros de una clase existente. Esta clase existente se
llama la base la clase, y la nueva clase se conoce como el derived la
clase.
La idea de la herencia implementa el IS-A relación. Por ejemplo, mamífero
IS A animal, perro IS-A mamífero, por tanto, perro IS-A animal, así,
y así sucesivamente.
using System;
namespace InheritanceApplication
{
class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
}
// Derived class
class Rectangle: Shape
{
public int getArea()
{
return (width * height);
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle Rect = new Rectangle();
[Link](5);
[Link](7);
Total area: 35
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
public double GetArea()
{
return length * width;
}
Length: 4.5
Width: 7.5
Area: 33.75
Cost: 2362.5
La herencia múltiple en C #
C# does not support multiple inheritance . Sin embargo, puede utilizar
las interfaces para implementar la herencia múltiple. El programa siguiente
muestra esto:
using System;
namespace InheritanceApplication
{
class Shape
{
public void setWidth(int w)
{
width = w;
}
public void setHeight(int h)
{
height = h;
}
protected int width;
protected int height;
}
// Derived class
class Rectangle : Shape, PaintCost
{
public int getArea()
{
return (width * height);
}
public int getCost(int area)
{
return area * 70;
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle Rect = new Rectangle();
int area;
[Link](5);
[Link](7);
area = [Link]();
Total area: 35
Total paint cost: $2450
C# Polimorfismo
La palabra polymorphism significa tener muchas formas. En
paradigma de programación orientado a objetos, el polimorfismo se
expresa a menudo como "una interfaz, múltiples funciones.
El polimorfismo puede ser estática o dinámica. En static polymorphism ,
la respuesta a una función se determina en el tiempo de
compilación. En dynamic polymorphism , se decide en tiempo de
ejecución.
El polimorfismo estático
El mecanismo de vinculación de una función con un objeto durante el
tiempo de compilación se llama el primer enlace. También se conoce como
enlace estático. C # proporciona dos técnicas para implementar
polimorfismo estático. Son:
la sobrecarga de funciones
La sobrecarga de operadores
Sobrecarga de funciones
Puede tener varias definiciones para el mismo nombre de la función en el
mismo ámbito. La definición de la función debe diferenciarse entre sí por el
tipo y / o el número de argumentos en la lista de argumentos. No se puede
sobrecargar las declaraciones de funciones que se diferencian sólo por el
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)
{
[Link]("Printing int: {0}", i );
}
void print(double f)
{
[Link]("Printing float: {0}" , f);
}
void print(string s)
{
[Link]("Printing string: {0}", s);
}
static void Main(string[] args)
{
Printdata p = new Printdata();
Printing int: 5
Printing float: 500.263
Printing string: Hello C++
El polimorfismo dinámico
C # le permite crear clases abstractas que se utilizan para proporcionar
implementación de la clase parcial de una interfaz. Implementación se
completa cuando una clase derivada hereda de ella. Abstract clases
contienen métodos abstractos, que son implementadas por la clase
derivada. Las clases derivadas tienen una funcionalidad más
especializada.
Estas son las reglas sobre las clases abstractas:
No se puede crear una instancia de una clase abstracta
No se puede declarar un método abstracto fuera de una clase
abstracta
Cuando se declara una clase sealed , que no puede ser
heredada, clases abstractas no pueden ser declarados
sellados.
El programa siguiente muestra una clase abstracta:
using System;
namespace PolymorphismApplication
{
abstract class Shape
{
public abstract int area();
}
class Rectangle: Shape
{
private int length;
private int width;
public Rectangle( int a=0, int b=0)
{
length = a;
width = b;
}
public override int area ()
{
[Link]("Rectangle class area :");
return (width * length);
}
}
class RectangleTester
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(10, 7);
double a = [Link]();
[Link]("Area: {0}",a);
[Link]();
}
}
}
Cuando se tiene una función definida en una clase que desea implementar
en un heredada class(es) , que utilice virtual funciones. Las funciones
virtuales podrían ser implementadas de manera diferente en diferentes
clases heredadas y se decidirá la llamada a estas funciones en tiempo de
ejecución.
Polimorfismo dinámico se implementa abstract classes y virtual
functions .
El programa siguiente muestra esto:
using System;
namespace PolymorphismApplication
{
class Shape
{
protected int width, height;
public Shape( int a=0, int b=0)
{
width = a;
height = b;
}
public virtual int area()
{
[Link]("Parent class area :");
return 0;
}
}
class Rectangle: Shape
{
public Rectangle( int a=0, int b=0): base(a, b)
{
}
public override int area ()
{
[Link]("Rectangle class area :");
return (width * height);
}
}
class Triangle: Shape
{
public Triangle(int a = 0, int b = 0): base(a, b)
{
}
public override int area()
{
[Link]("Triangle class area :");
return (width * height / 2);
}
}
class Caller
{
public void CallArea(Shape sh)
{
int a;
a = [Link]();
[Link]("Area: {0}", a);
}
}
class Tester
{
C# La sobrecarga de operadores
Puede redefinir o sobrecargar la mayor parte de los operadores internos
disponibles en C #. Así, un programador puede utilizar operadores con tipos
definidos por el usuario también. Operadores sobrecargados son funciones
especiales con nombres la palabra clave operator , seguido del símbolo
para el operador se está definiendo. similar a cualquier otra función, un
operador sobrecargado tiene un tipo de retorno y una lista de parámetros.
Por ejemplo, pasar por la función siguiente:
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
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box(); // Declare Box2 of type Box
Box Box3 = new Box(); // Declare Box3 of type Box
double volume = 0.0; // Store the volume of a box
here
// box 1 specification
[Link](6.0);
[Link](7.0);
[Link](5.0);
// box 2 specification
[Link](12.0);
[Link](13.0);
[Link](10.0);
// volume of box 1
volume = [Link]();
[Link]("Volume of Box1 : {0}", volume);
// volume of box 2
volume = [Link]();
[Link]("Volume of Box2 : {0}", volume);
// volume of box 3
volume = [Link]();
[Link]("Volume of Box3 : {0}", volume);
[Link]();
}
}
}
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
{
static void Main(string[] args)
{
Box Box1 = new Box(); // Declare Box1 of type Box
Box Box2 = new Box(); // Declare Box2 of type Box
Box Box3 = new Box(); // Declare Box3 of type Box
Box Box4 = new Box();
double volume = 0.0; // Store the volume of a box
here
// box 1 specification
[Link](6.0);
[Link](7.0);
[Link](5.0);
// box 2 specification
[Link](12.0);
[Link](13.0);
[Link](10.0);
// volume of box 1
volume = [Link]();
[Link]("Volume of Box1 : {0}", volume);
// volume of box 2
volume = [Link]();
[Link]("Volume of Box2 : {0}", volume);
// volume of box 3
volume = [Link]();
[Link]("Volume of Box3 : {0}", volume);
if (Box1 != Box2)
[Link]("Box1 is not equal to Box2");
else
[Link]("Box1 is not greater or equal to
Box2");
Box4 = Box3;
if (Box3 == Box4)
[Link]("Box3 is equal to Box4");
else
[Link]("Box3 is not equal to Box4");
[Link]();
}
}
}
Box 1: (6, 7, 5)
Box 2: (12, 13, 10)
Volume of Box1 : 210
Volume of Box2 : 1560
Box 3: (18, 20, 15)
Volume of Box3 : 5400
Box1 is not greater than Box2
Box1 is less than Box2
Box1 is not greater or equal to Box2
Box1 is less or equal to Box2
Box1 is not equal to Box2
Box3 is equal to Box4
C# Interfaces
Una interfaz se define como un contrato sintáctica que todas las clases que
heredan de la interfaz deben seguir. La interfaz define el 'what' parte del
contrato sintáctico y las clases derivadas a definir el 'how' parte
del contrato sintáctica.
Interfaces definen propiedades, métodos y eventos, que son los miembros
de la interfaz. Las interfaces sólo contienen la declaración de los miembros.
Es responsabilidad de la clase derivada de definir los miembros. A menudo
ayuda a proporcionar una estructura estándar que seguirían las clases
derivadas.
Las clases abstractas en cierta medida tienen el mismo propósito, sin
embargo, que se utilizan sobre todo cuando sólo unos pocos métodos han
de ser declarada por la clase base y la clase derivada implementa las
funcionalidades.
La declaración de Interfaces
Las interfaces se declaran usando la palabra clave interface. Es similar a la
declaración de la clase. declaraciones de interfaz son públicos por defecto.
A continuación se presenta un ejemplo de una declaración de interfaz:
Ejemplo
El siguiente ejemplo muestra la implementación de la interfaz anterior:
using [Link];
using [Link];
using [Link];
using System;
namespace InterfaceApplication
{
public interface ITransactions
{
// interface members
void showTransaction();
double getAmount();
}
Transaction: 001
Date: 8/10/2012
Amount: 78900
Transaction: 002
Date: 9/10/2012
Amount: 451900
namespace namespace_name
{
// code declarations
}
namespace_name.item_name;
using System;
namespace first_space
{
class namespace_cl
{
public void func()
{
[Link]("Inside first_space");
}
}
}
namespace second_space
{
class namespace_cl
{
public void func()
{
[Link]("Inside second_space");
}
}
}
class TestClass
{
static void Main(string[] args)
{
first_space.namespace_cl fc = new
first_space.namespace_cl();
second_space.namespace_cl sc = new
second_space.namespace_cl();
[Link]();
[Link]();
[Link]();
}
}
Inside first_space
Inside second_space
[Link]("Hello there");
También puede evitar prepending de espacios de nombres con el using la
directiva espacio de nombres. Esta directiva indica al compilador que el
código subsiguiente está haciendo uso de nombres en el espacio de
nombres especificado. El espacio de nombres es por lo tanto implicaba para
el código siguiente:
Vamos a reescribir nuestro ejemplo anterior, la directiva using:
using System;
using first_space;
using second_space;
namespace first_space
{
class abc
{
public void func()
{
[Link]("Inside first_space");
}
}
}
namespace second_space
{
class efg
{
public void func()
{
[Link]("Inside second_space");
}
}
}
class TestClass
{
static void Main(string[] args)
{
abc fc = new abc();
efg sc = new efg();
[Link]();
[Link]();
[Link]();
}
}
Inside first_space
Inside second_space
namespace namespace_name1
{
// code declarations
namespace namespace_name2
{
// code declarations
}
}
namespace first_space
{
class abc
{
public void func()
{
[Link]("Inside first_space");
}
}
namespace second_space
{
class efg
{
public void func()
{
[Link]("Inside second_space");
}
}
}
}
class TestClass
{
static void Main(string[] args)
{
abc fc = new abc();
efg sc = new efg();
[Link]();
[Link]();
[Link]();
}
}
Inside first_space
Inside second_space
El preprocesador #define
La directiva #define preprocesador crea constantes simbólicas.
#define permite definir un símbolo de tal manera que, mediante el uso del
símbolo como la expresión pasada a la directiva #if, la expresión se evalúa
como verdadera. Su sintaxis es la siguiente:
#define symbol
#define PI
using System;
namespace PreprocessorDAppl
{
class Program
{
static void Main(string[] args)
{
#if (PI)
[Link]("PI is defined");
#else
[Link]("PI is not defined");
#endif
[Link]();
}
}
}
PI is defined
Directivas condicionales
Puede usar la directiva #if para crear una directiva condicional. directivas
condicionales son útiles para probar un símbolo o símbolos para comprobar
si como resultado true. Si no lo hacen como resultado true, el compilador
evalúa todo el código entre el #if y la siguiente directiva.
Sintaxis para la directiva condicional es:
== (equality)
! = (inequality)
&& (and)
|| (or)
#define DEBUG
#define VC_V10
using System;
public class TestClass
{
public static void Main()
{
#if (DEBUG && !VC_V10)
[Link]("DEBUG is defined");
#elif (!DEBUG && VC_V10)
[Link]("VC_V10 is defined");
#elif (DEBUG && VC_V10)
[Link]("DEBUG and VC_V10 are defined");
#else
[Link]("DEBUG and VC_V10 are not defined");
#endif
[Link]();
}
}
C# Expresiones regulares
Una regular expression es un patrón que podría ser igualada en
contra de un texto de entrada. El marco .NET proporciona un motor de
expresión regular que permite tal juego. Un patrón consta de literales uno o
más caracteres, operadores, o construcciones.
La clase Regex
La clase Regex se utiliza para representar una expresión regular. Tiene las
siguientes métodos comúnmente utilizados:
No
Seño métodos
r
Ejemplo 1
El siguiente ejemplo coincide con las palabras que empiezan con 'S':
using System;
using [Link];
namespace RegExApplication
{
class Program
{
private static void showMatch(string text, string expr)
{
[Link]("The Expression: " + expr);
MatchCollection mc = [Link](text, expr);
foreach (Match m in mc)
{
[Link](m);
}
}
Ejemplo 2
El siguiente ejemplo coincide con las palabras que empiezan con 'm' y
termina con 'e':
using System;
using [Link];
namespace RegExApplication
{
class Program
{
private static void showMatch(string text, string expr)
{
[Link]("The Expression: " + expr);
MatchCollection mc = [Link](text, expr);
foreach (Match m in mc)
{
[Link](m);
}
}
static void Main(string[] args)
{
string str = "make maze and manage to measure it";
using System;
using [Link];
namespace RegExApplication
{
class Program
{
static void Main(string[] args)
{
string input = "Hello World ";
string pattern = "\\s+";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = [Link](input, replacement);
C# Manejo de excepciones
Una excepción es un problema que se presenta durante la ejecución de un
programa. AC # excepción es una respuesta a una circunstancia
excepcional que se produce mientras se ejecuta un programa, como un
intento de dividir por cero.
Excepciones proporcionan una manera de transferir el control de una parte
de un programa a otro. C # manipulación de excepción se basa en cuatro
palabras clave: try , catch , finally , y throw .
try : Un bloque try identifica un bloque de código para la que
se activa excepciones particulares. Es seguido por uno o más
bloques catch.
catch : Un programa detecta una excepción con un
controlador de excepciones en el lugar en un programa en el
que desea manejar el problema. La palabra clave de captura
indica la captura de una excepción.
finally : El bloque finally se utiliza para ejecutar un
determinado conjunto de declaraciones, si se produce una
excepción o sin torcer. Por ejemplo, si abre un archivo, tiene que
ser cerrado si se produce una excepción o no.
throw : Un programa emite una excepción cuando un
problema aparece. Esto se hace usando una palabra clave tiro.
Sintaxis
Suponiendo un bloque genera una excepción, un método detecta una
excepción utilizando una combinación de las palabras clave try y catch. Un
bloque try / catch se coloca alrededor del código que podría generar una
excepción. Código dentro de un bloque try / catch se conoce como código
protegido, y la sintaxis para usar try / catch tiene el siguiente aspecto:
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
}
Manejo de excepciones
C # ofrece una solución estructurada para el manejo de excepciones en
forma de bloques try y catch. El uso de estos bloques de los estados del
programa básico se separan de los estados de control de errores.
Estos bloques de tratamiento de errores se implementan utilizando la try ,
catch , y finally palabras clave. Lo que sigue es un ejemplo de lanzar
una excepción cuando se divide por la condición cero ocurre:
using System;
namespace ErrorHandlingApplication
{
class DivNumbers
{
int result;
DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
[Link]("Exception caught: {0}", e);
}
finally
{
.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
[Link](25, 0);
[Link]();
}
}
}
using System;
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
[Link]();
}
catch(TempIsZeroException e)
{
[Link]("TempIsZeroException: {0}",
[Link]);
}
[Link]();
}
}
}
Lanzar objetos
Usted puede lanzar un objeto si se deriva directa o indirectamente de la
[Link] clase. Puede utilizar una instrucción throw en el
bloque catch para lanzar el presente objeto como:
Catch(Exception e)
{
...
Throw e
}
C# Puedo presentar de E / S
Un file 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 lectura o escritura, se convierte en una stream .
La corriente es, básicamente, la secuencia de bytes que pasan a través de
la ruta de comunicación. Existen dos corrientes principales: el input
stream y el output stream . El input stream se utiliza para leer
datos de archivo (read operation) y el output stream se utiliza para
escribir en el archivo (write operation) .
Clases C # E / S
El espacio de nombres [Link] tiene diferentes clases que se utilizan
para realizar numerosas operaciones con archivos, tales como crear y
borrar archivos, leer o escribir en un archivo, cerrar un archivo, etc.
La siguiente tabla muestra algunas clases no abstractos de uso común en el
espacio de nombres [Link]:
I / O Clase Descripción
La clase FileStream
El FileStream clase en el espacio de nombres [Link] ayuda en la
lectura de, la escritura y el cierre de archivos. Esta clase se deriva de
la Corriente clase abstracta.
Es necesario crear un FileStream objeto para crear un nuevo archivo
o abrir un archivo existente. La sintaxis para crear un FileStream
objeto es la siguiente:
Parámetro Descripción
Ejemplo
El programa siguiente muestra el uso de FileStream clase:
using System;
using [Link];
namespace FileIOApplication
{
class Program
{
static void Main(string[] args)
{
FileStream F = new FileStream("[Link]",
[Link], [Link]);
for (int i = 1; i <= 20; i++)
{
[Link]((byte)i);
}
[Link] = 0;
for (int i = 0; i <= 20; i++)
{
[Link]([Link]() + " ");
}
[Link]();
[Link]();
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1
C# atributos
Un attribute es una etiqueta declarativa que se utiliza para
transmitir información a tiempo de ejecución sobre los
comportamientos de los diversos elementos como clases, métodos,
estructuras, enumeradores, asambleas, etc., en su programa. Se
puede añadir información declarativa a un programa mediante el uso de un
atributo. Una etiqueta declarativa se representa mediante cuadrados ([ ])
soportes colocados por encima del elemento se utiliza para.
Los atributos se utilizan para añadir metadatos, tales como la instrucción
compilador y otra información como comentarios, descripción, métodos y
clases para un programa. .NET Framework proporciona dos tipos de
atributos: the pre-defined atributos y custom built atributos.
Especificar un atributo
Sintaxis para especificar un atributo es la siguiente:
AttributeUsage
Condicional
Obsoleto
AttributeUsage
El pre-defined atributo 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.
Sintaxis para especificar este atributo es el siguiente:
[AttributeUsage(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)]
Dónde,
El validon parámetro especifica los elementos del lenguaje en el que
se puede colocar el atributo. Es una combinación del valor de un
enumerador AttributeTargets . El valor por defecto es
[Link] .
El parámetro allowmultiple (optional) proporciona un valor para el
AllowMultiple propiedad de este atributo, un valor booleano. Si esto
es cierto, es el atributo de usos múltiples. El valor predeterminado es
falso (single-use) .
El parámetro heredado (optional) proporciona un valor para el
Inherited propiedad de este atributo, un valor booleano. Si es verdad,
el atributo es heredado por las clases derivadas. El valor
predeterminado es falso (not inherited) .
Por ejemplo,
[AttributeUsage([Link] |
[Link] |
[Link] |
[Link] |
[Link],
AllowMultiple = true)]
Condicional
Este atributo predefinido marca un método condicional cuya ejecución
depende de un identificador de preprocesamiento especificado.
Hace que 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 durante la depuración de un código.
Sintaxis para especificar este atributo es el siguiente:
[Conditional(
conditionalSymbol
)]
Por ejemplo,
[Conditional("DEBUG")]
#define DEBUG
using System;
using [Link];
class Test
{
static void function1()
{
[Link]("In Function 1.");
function2();
}
static void function2()
{
[Link]("In Function 2.");
}
In Main function
In Function 1
In Function 2
Obsoleto
Este atributo predefinido marca una entidad de programa que no debe ser
utilizado. Se le permite informar al compilador para descartar un elemento
objetivo en particular. Por ejemplo, cuando un nuevo método está siendo
utilizado en una clase y si aún desea conservar el viejo método de la clase,
puede marcarlo como obsoleta mostrando un mensaje del nuevo método se
debe utilizar, en lugar del método de edad.
Sintaxis para especificar este atributo es el siguiente:
[Obsolete(
message
)]
[Obsolete(
message,
iserror
)]
Dónde,
El parámetro de message , es una cadena que describe la razón por
la que el artículo es obsoleta y lo que debe usar en su lugar.
El parámetro iserror , es un valor booleano. Si su valor es verdadero,
el compilador debe tratar el uso del artículo como un error. El valor
por defecto es falso (compiler generates a warning) .
El programa siguiente muestra esto:
using System;
El DeBugInfo clase tiene tres propiedades privadas para almacenar los tres
primeros de la información y una propiedad pública para almacenar el
mensaje. Por lo tanto el número de error, el nombre del desarrollador, y la
fecha de revisión son los parámetros de posición de la clase debuginfo y el
mensaje es un parámetro opcional o denominación.
Cada atributo debe tener al menos un constructor. Los parámetros
posicionales se deben pasar a través del constructor. El código siguiente
muestra la DeBugInfo clase:
C# Reflexión
Reflection objetos se utilizan para la obtención de 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 la [Link]
espacio de nombres.
El [Link] espacio de nombres contiene clases que
permiten obtener información sobre la aplicación y permite añadir
dinámicamente tipos, valores y objetos de la aplicación.
Aplicaciones de Reflexión
La reflexión tiene las siguientes aplicaciones:
Permite a la vista la información de atributos en tiempo de ejecución.
Permite examinar varios tipos en una asamblea y una instancia de
este tipo.
Permite el enlace a métodos y propiedades
Permite la creación de nuevos tipos en tiempo de ejecución y luego
realiza algunas tareas utilizando esos tipos.
visualización de metadatos
Ya hemos mencionado en el capítulo anterior que el uso de la reflexión se
puede ver la información de atributos.
El MemberInfo objeto de la [Link] clase tiene que ser
inicializado para descubrir los atributos asociados a una clase. Para
ello, se define un objeto de la clase de destino, como:
using System;
[AttributeUsage([Link])]
public class HelpAttribute : [Link]
{
public readonly string Url;
[Link]();
}
}
}
HelpAttribute
Ejemplo
En este ejemplo, se utiliza el DeBugInfo atributo creado en el capítulo y el
uso previo de reflexión para leer los metadatos en el Rectangle clase.
using System;
using [Link];
namespace BugFixApplication
{
//a custom attribute BugFix to be
//assigned to a class and its members
[AttributeUsage([Link] |
[Link] |
[Link] |
[Link] |
[Link],
AllowMultiple = true)]
class Rectangle
{
//member variables
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
[DeBugInfo(55, "Zara Ali", "19/10/2012", Message = "Return
type mismatch")]
public double GetArea()
{
return length * width;
}
[DeBugInfo(56, "Zara Ali", "19/10/2012")]
public void Display()
{
[Link]("Length: {0}", length);
[Link]("Width: {0}", width);
[Link]("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle(4.5, 7.5);
[Link]();
Type type = typeof(Rectangle);
[Link]();
}
}
}
Length: 4.5
Width: 7.5
Area: 33.75
Bug No: 49
Developer: Nuha Ali
Last Reviewed: 10/10/2012
Remarks: Unused variable
Bug No: 45
Developer: Zara Ali
Last Reviewed: 12/8/2012
Remarks: Return type mismatch
Bug No: 55, for Method: GetArea
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks: Return type mismatch
Bug No: 56, for Method: Display
Developer: Zara Ali
Last Reviewed: 19/10/2012
Remarks:
C# propiedades
Properties se nombran los miembros de las clases, estructuras e
interfaces. Las variables de miembro o métodos de una clase o
estructuras se llaman Fields . Las propiedades son una extensión de los
campos y se accede utilizando la misma sintaxis. Utilizan accessors a
través del cual los valores de los campos privados pueden ser
leídas, escritas o manipulados.
Propiedades no nombran a los lugares de almacenamiento. En cambio,
tienen accessors que leer, escribir, o calcular sus valores.
Por ejemplo, vamos a tener una clase llamada Student, con los campos
privados de edad, nombre y código. No podemos acceder directamente a
estos campos desde fuera del ámbito de la clase, pero podemos tener
propiedades para acceder a estos campos privados.
accessors
El accessor de una propiedad contiene las sentencias ejecutables
que ayuda a conseguir (reading or computing) o el establecimiento
(writing) la propiedad. Las declaraciones de descriptor de acceso pueden
contener un acceso get, un descriptor de acceso set, o ambos. Por ejemplo:
Ejemplo
El siguiente ejemplo demuestra el uso de propiedades:
using System;
namespace tutorialspoint
{
class Student
{
private string code = "N.A";
private string name = "not known";
private int age = 0;
class ExampleDemo
{
public static void Main()
{
Propiedades abstractos
Una clase abstracta puede tener una propiedad abstracta, que debe ser
implementado en la clase derivada. El programa siguiente ilustra esto:
using System;
namespace tutorialspoint
{
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();
C# Los indexadores
Un indexer permite que un objeto sea indexado tal como una
matriz. Cuando se define un indexador para una clase, esta clase se
comporta similar a una virtual array . A continuación, puede acceder a la
instancia de esta clase mediante el operador de acceso a conjunto ([ ]) .
Sintaxis
A un indexador dimensional tiene la siguiente sintaxis:
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.";
}
return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
[Link]();
}
}
}
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
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.";
}
}
return ( tmp );
}
set
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
public int this[string name]
{
get
{
int index = 0;
while(index < size)
{
if (namelist[index] == name)
{
return index;
}
index++;
}
return index;
}
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2
C# Los delegados
C # delegados son similares a los punteros a funciones, en C o C ++. Un
delegate es una variable de tipo de referencia que contiene la
referencia a un método. La referencia se puede cambiar en tiempo de
ejecución.
Los delegados se utilizan sobre todo para la implementación de eventos y
los métodos de rellamada. Todos los delegados se derivan implícitamente
de la [Link] clase.
instanciar delegados
Una vez que se declara un tipo de delegado, un objeto delegado debe ser
creado con la new palabra clave y se asocia con un método
particular. Cuando se crea un delegado, el argumento pasado a la new
expresión se escribe similar a una llamada a un método, pero sin
los argumentos del método. Por ejemplo:
using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
Value of Num: 35
Value of Num: 175
La multidifusión de un delegado
Objetos de delegado pueden estar compuestos usando el "+" operador. Un
delegado compuesto llama a los dos delegados que se compone de. Sólo
los delegados del mismo tipo pueden estar compuestos. El "-" operador se
pueden utilizar para quitar un delegado componente de un delegado
compuesta.
El uso de esta propiedad de delegados puede crear una lista de invocación
de métodos que serán llamados cuando se invoca un delegado. Esto se
conoce como multicasting de un delegado. El programa siguiente
muestra la multidifusión de un delegado:
using System;
//calling multicast
nc(5);
[Link]("Value of Num: {0}", getNum());
[Link]();
}
}
}
Cuando el código se compila y ejecuta, se produce el siguiente resultado:
Value of Num: 75
El uso de delegados
El siguiente ejemplo muestra el uso del delegado. El delegado printString
puede ser utilizado para hacer referencia a un método que toma una
cadena como entrada y devuelve nada.
Utilizamos este delegado llamar dos métodos, el primero imprime la cadena
a la consola, y el segundo lo imprime a un archivo:
using System;
using [Link];
namespace DelegateAppl
{
class PrintString
{
static FileStream fs;
static StreamWriter sw;
// delegate declaration
public delegate void printString(string s);
public EventTest(int n )
{
SetValue(n);
}
Event Fired!
Event Fired!
Event Fired!
Ejemplo 2
Este ejemplo proporciona una sencilla aplicación para la resolución de
problemas para un sistema de caldera de agua caliente. Cuando el
ingeniero de mantenimiento inspecciona la caldera, la temperatura de la
caldera y la presión se registra automáticamente en un archivo de registro,
junto con las observaciones del ingeniero de mantenimiento.
using System;
using [Link];
namespace BoilerEventAppl
{
// boiler class
class Boiler
{
private int temp;
private int pressure;
public Boiler(int t, int p)
{
temp = t;
pressure = p;
}
// event publisher
class DelegateBoilerEvent
{
public delegate void BoilerLogHandler(string status);
//Defining event based on the above delegate
public event BoilerLogHandler BoilerEventLog;
// this class keeps a provision for writing into the log file
class BoilerInfoLogger
{
FileStream fs;
StreamWriter sw;
public BoilerInfoLogger(string filename)
{
fs = new FileStream(filename, [Link],
[Link]);
sw = new StreamWriter(fs);
}
}//end of RecordBoilerInfo
}
Logging info:
Temperature 100
Pressure 12
Message: O. K
C# Colecciones
clases de colección son clases especializadas para el almacenamiento y
recuperación de datos. Estas clases proporcionan soporte para pilas, colas,
listas y tablas hash. La mayoría de las clases de colección aplicar las
mismas interfaces.
clases de colección sirven diversos fines, tales como la asignación de
memoria de forma dinámica a los elementos y acceder a una lista de
artículos sobre la base de un índice etc. Estas clases crean colecciones de
objetos de la clase Object, que es la clase base para todos los tipos de
datos en C #.
using System;
using [Link];
namespace GenericApplication
{
public class MyGenericArray<T>
{
private T[] array;
public MyGenericArray(int size)
{
array = new T[size + 1];
}
public T getItem(int index)
{
return array[index];
}
class Tester
{
static void Main(string[] args)
{
//setting values
for (int c = 0; c < 5; c++)
{
[Link](c, c*5);
}
//setting values
for (int c = 0; c < 5; c++)
{
[Link](c, (char)(c+97));
}
[Link]();
}
}
}
0 5 10 15 20
a b c d e
Características de los genéricos
Los medicamentos genéricos es una técnica que enriquece sus programas
en las siguientes formas:
Se le ayuda a maximizar la reutilización de código, la seguridad de
tipos, y el rendimiento.
Se pueden crear clases de colección genéricos. La biblioteca de
clases de .NET Framework contiene varias nuevas clases de colección
genérica en la [Link] espacio de nombres.
Puedes usar las siguientes clases de colección genéricos en lugar de
las clases de colección en el [Link] espacio de nombres.
Usted puede crear sus propios genéricos interfaces, clases, métodos,
eventos y delegados.
Puede crear clases genéricas limitados para permitir el acceso a los
métodos sobre los tipos de datos particulares.
Usted puede obtener información sobre los tipos utilizados en un tipo
genérico de datos en tiempo de ejecución por medio de la reflexión.
Métodos genéricos
En el ejemplo anterior, hemos utilizado 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 [Link];
namespace GenericMethodAppl
{
class Program
{
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args)
{
int a, b;
char c, d;
a = 10;
b = 20;
c = 'I';
d = 'V';
//call swap
Swap<int>(ref a, ref b);
Swap<char>(ref c, ref d);
[Link]();
}
}
}
using System;
using [Link];
Value of Num: 35
Value of Num: 175
C# Métodos anónimos
Hemos discutido que los delegados se utilizan para hacer referencia a
cualquier método que tiene la misma firma que la del delegado. En otras
palabras, se puede llamar a un método que puede ser referenciado por un
delegado de utilizar ese objeto delegado.
Anonymous methods proporcionan una técnica para pasar un
bloque de código como parámetro delegado. métodos anónimos son
los métodos sin un nombre, sólo el cuerpo.
No es necesario especificar el tipo de retorno de un método anónimo; que
se deduce de la sentencia return dentro del cuerpo del método.
nc(10);
Ejemplo
El siguiente ejemplo demuestra el concepto:
using System;
delegate void NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static void AddNum(int p)
{
num += p;
[Link]("Named Method: {0}", num);
}
Anonymous Method: 10
Named Method: 15
Named Method: 30
C# Códigos inseguras
C # permite el uso de variables de puntero en función del bloque de código
cuando está marcada por la unsafe modificador. El unsafe code o el
código no administrado es un bloque de código que utiliza un
pointer variable.
Note: Para ejecutar los programas mencionados en este
capítulo en codingground , opción de compilación en favor
de establecer Project >> Compile Options >> Compilation
Command de
mcs *.cs -out:[Link] -unsafe"
punteros
Un pointer es una variable cuyo valor es la dirección de otra
variable de decir, la dirección directa de la posición de memoria.
similar a cualquier variable o constante, debe declarar un puntero antes de
poder utilizarlo para almacenar cualquier dirección variable.
La forma general de una declaración de puntero es:
type *var-name;
using System;
namespace UnsafeCodeApplication
{
class Program
{
static unsafe void Main(string[] args)
{
int var = 20;
int* p = &var;
[Link]("Data is: {0} ", var);
[Link]("Address is: {0}", (int)p);
[Link]();
}
}
}
Data is: 20
Address is: 99215364
using System;
namespace UnsafeCodeApplication
{
class Program
{
public static void Main()
{
unsafe
{
int var = 20;
int* p = &var;
[Link]("Data is: {0} " , var);
[Link]("Data is: {0} " , p->ToString());
[Link]("Address is: {0} " , (int)p);
}
[Link]();
}
}
}
Data is: 20
Data is: 20
Address is: 77128984
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe void swap(int* p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe static void Main()
{
int[] list = {10, 100, 200};
fixed(int *ptr = list)
[Link]();
}
}
}
C# multihilo
Un thread se define como la ruta de ejecución de un programa.
Cada hilo define un flujo único de control. Si su aplicación implica
operaciones complicadas y que requieren mucho tiempo, a continuación, a
menudo es útil para establecer diferentes rutas de ejecución o hilos, con
cada hilo de la realización de un trabajo en particular.
Los hilos son lightweight processes . Un ejemplo común de uso de hilo es
la implementación de la programación concurrente por los sistemas
operativos modernos. El uso de hilos de guarda desperdicio de ciclo de la
CPU y el aumento de la eficiencia de una aplicación.
Hasta ahora hemos escrito los programas en los que una sola hebra se
ejecuta como un proceso único, que es la instancia en ejecución de la
aplicación. Sin embargo, de esta manera la aplicación puede realizar una
tarea a la vez. Para que sea ejecutar más de una tarea a la vez, que se
puede dividir en las discusiones más pequeñas.
El hilo principal
En C #, el [Link] clase se utiliza para trabajar
con hilos. Permite crear y acceder a hilos individuales en una aplicación de
multiproceso. La primera rosca para ser ejecutado en un proceso se llama
el main hilo.
Cuando un programa en C # inicia la ejecución, el hilo principal se crea
automáticamente. Los hilos creados usando el Thread de clase se llaman
los hilos secundarios del hilo principal. Se puede acceder a un hilo
mediante el CurrentThread propiedad de la clase Thread.
El programa siguiente muestra la ejecución del hilo principal:
using System;
using [Link];
namespace MultithreadingApplication
{
class MainThreadProgram
{
static void Main(string[] args)
{
Thread th = [Link];
[Link] = "MainThread";
[Link]("This is {0}", [Link]);
[Link]();
}
}
}
This is MainThread
2 Asigna una ranura de datos sin nombre en todos los hilos. Para un
mejor rendimiento, campos de uso que están marcados con el
ThreadStaticAttribute atribuyen su lugar.
public static LocalDataStoreSlot
AllocateNamedDataSlot(string name)
3
Asigna una ranura de datos cuyo nombre aparece en todas las
discusiones. Para un mejor rendimiento, campos de uso que están
marcados con el ThreadStaticAttribute atribuyen su lugar.
public static void BeginCriticalRegion()
Notifica un anfitrión que ejecución está a punto de entrar en una
4 región de código en el que los efectos de un hilo o abortan
excepción no controlada podría poner en peligro otras tareas en el
dominio de aplicación.
5 public static void BeginThreadAffinity()
Notifica a un host que el código administrado está a punto de
ejecutar las instrucciones que dependen de la identidad de la
corriente de hilos del sistema operativo físico.
public static void EndCriticalRegion()
Creación de Hilos
Los hilos se crean mediante la extensión de la clase Thread. La clase
Thread extendida continuación, llama al Start() método para iniciar la
ejecución del hilo niño.
El programa siguiente muestra el concepto:
using System;
using [Link];
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
[Link]("Child thread starts");
}
Gestión de Temas
La clase Thread proporciona varios métodos para la gestión de hilos.
El siguiente ejemplo demuestra el uso del sleep() método para hacer
una pausa hilo por un período de tiempo específico.
using System;
using [Link];
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
[Link]("Child thread starts");
La destrucción de Hilos
El Abort() método se utiliza para destruir los hilos.
El tiempo de ejecución aborta el hilo lanzando un
ThreadAbortException . Esta excepción no puede ser capturado, el
control se envía al finally del bloque, en su caso.
El programa siguiente ilustra esto:
using System;
using [Link];
namespace MultithreadingApplication
{
class ThreadCreationProgram
{
public static void CallToChildThread()
{
try
{
[Link]("Child thread starts");
catch (ThreadAbortException e)
{
[Link]("Thread Abort Exception");
}
finally
{
[Link]("Couldn't catch the Thread
Exception");
}
}
[Link]();
[Link]();
}
}
}
S
Pregunta / Tipo Respuestas
N
C # preguntas de la entrevista
C# Recursos útiles
Los siguientes recursos contienen información adicional sobre C #. Por
favor usarlos para obtener más conocimiento en profundidad sobre este
tema.
Para dar de alta su sitio en esta página, por favor un correo electrónico a
contact@[Link]