You are on page 1of 16

INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

TEMAS

CAMPOS DE BITS

HILOS

SYSTEM.OBJECT

SET(C#)

GET(C#)

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


1
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

CAMPOS DE BITS

S INOPSIS

Los campos de bits, o simplemente campos, son grupos de un número determinado


de bits, que pueden o no tener un identificador asociado. Representan un artificio
que permite utilizar miembros de tamaño arbitrario en estructuras, uniones y
clases; independiente de la posibilidad que proporcionan los tipos básicos ( 2.2.1)
cuyo tamaño está predeterminado por el lenguaje. Por ejemplo, en ocasiones es
necesario almacenar semáforos (flags) con determinados estados del programa,
para los que en realidad solo hace falta un bit, pero incluso una variable bool ocupa
un octeto. Los campos de bits permiten utilizar cada bit de un octeto
independientemente, aumentando así su capacidad de representación.

Nota: esta técnica, de manejo independiente de bits en una palabra, ha sido


ampliamente utilizada desde siempre en la programación, no solo de C/C++; casi
todos los lenguajes ofrecen la posibilidad de operadores "bitwise", que permiten
esto de forma más o menos artesanal.

Entre otros usos, los campos de bits se han utilizado históricamente para
empaquetar variables en un espacio más pequeño, pero obligan al compilador a
generar código adicional para manejarlos, lo que resulta costoso en términos de
tamaño y velocidad del ejecutable. El resultado es que frecuentemente, el código
resulta mayor y más lento si se usan estos tipos, por lo que generalmente se
desaconseja su uso excepto para aplicaciones muy específicas de bajo nivel, en las
que la alineación exacta de los patrones de bits a utilizar es un aspecto primordial.
Por ejemplo, transmisiones de datos

Otra cuestión distinta, a veces decisiva para su utilización, es la significativa


reducción de espacio de almacenamiento externo (disco por ejemplo) que puede
conseguirse cuando en determinados casos, se almacena gran número de registros
que utilizan campos de bits en sustitución de tipos básicos.

D ECLARACIÓN

La sintaxis para declaración de campos es la siguiente:

especificador-de-tipo <identificador> : ancho;

Ejemplos:

int Uno : 8;
unsigned int Dos : 16;
int : 2;

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


2
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

El especificador-de-tipo puede ser alguno de los siguientes: bool; char; unsigned


char; short; unsigned short; long; unsigned long; int; unsigned int; __int64 o
unsigned __int64. Abreviadamente lo denominaremos tipo del campo.

Definición de Interfaz

1. En software, parte de un programa que permite el flujo de información entre un


usuario y la aplicación, o entre la aplicación y otros programas o periféricos. Esa
parte de un programa está constituida por un conjunto de comandos y métodos que
permiten estas intercomunicaciones.

2. Intefaz también hace referencia al conjunto de métodos para lograr


interactividad entre un usuario y una computadora. Una interaz puede ser del tipo
GUI, o línea de comandos, etc. También puede ser a partir de un hardware, por
ejemplo, el monitor, el teclado y el mouse, son interfaces entre el usuario y el
ordenador.

En C#, una clase es un tipo de datos muy eficaz. Como las estructuras, las clases
definen los datos y el comportamiento del tipo de datos. Los programadores
pueden crear objetos que son instancias de una clase. A diferencia de las
estructuras, las clases admiten herencia, que es una parte fundamental de la
programación orientada a objetos. Para obtener más información, vea Herencia.

DECLARAR CLASES

Las clases se definen mediante la palabra clave class, como se muestra en el


ejemplo siguiente:

C#

public class Customer


{
//Fields, properties, methods and events go here...
}

El nivel de acceso precede a la palabra clave class. En este caso, se utiliza public,
que significa que cualquiera puede crear objetos a partir de esta clase. El nombre
de la clase sigue a la palabra clave class. El resto de la definición es el cuerpo de
clase, donde se definen el comportamiento y los datos. Los campos, propiedades,

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


3
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

métodos y eventos de una clase se conocen colectivamente como miembros de


clase.

CREAR OBJETOS

Aunque se utilizan a veces de forma intercambiable, una clase y un objeto son


cosas diferentes. Una clase define un tipo de objeto, pero no es propiamente un
objeto. Un objeto es una entidad concreta basada en una clase y, a veces, se
denomina instancia de una clase.

Los objetos se pueden crear con la palabra clave new seguida del nombre de la
clase en la que se basará el objeto, de la manera siguiente:

C#

Customer object1 = new Customer();

Cuando se crea una instancia de una clase, una referencia al objeto se vuelve a
pasar al programador. En el ejemplo anterior, object1 es una referencia a un
objeto basado en Customer. Esta referencia hace referencia el nuevo objeto, pero
no contiene los datos del propio objeto. De hecho, se puede crear una referencia a
objeto sin crear un objeto:

C#

Customer object2;

No se recomienda la creación de referencias a objetos como ésta, que no hace


referencia a un objeto, porque al intentar el acceso a un objeto a través de esa
referencia se producirá un error en tiempo de ejecución. Sin embargo, este tipo de
referencia se puede crear para hacer referencia a un objeto, ya sea creando un
nuevo objeto o asignándola a un objeto existente, de la forma siguiente:

C#

Customer object3 = new Customer();


Customer object4 = object3;

Este código crea dos referencias a objeto que se refieren al mismo objeto. Por
consiguiente, los cambios realizados en el objeto a través de object3 se reflejarán
en los usos posteriores de object4. El hecho de que las clases se conozcan como
tipos de referencia se debe a que se hace referencia a los objetos basados en
clases por referencia.

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


4
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

HERENCIA DE CLASE

La herencia se realiza a través de una derivación, lo que significa que una clase se
declara utilizando una clase base de la cual hereda los datos y el comportamiento.
Una clase base se especifica anexando dos puntos y el nombre de la clase base a
continuación del nombre de la clase derivada, del modo siguiente:

C#

public class Manager : Employee


{
// Employee fields, properties, methods and events are inherited
// New Manager fields, properties, methods and events go here...
}

Cuando una clase declara una clase base, todos los miembros de clase definidos
para la clase base también pasan a formar parte de la nueva clase. Dado que una
clase base se puede heredar de otra clase, que a su vez se heredó de otra clase y
así sucesivamente, una clase puede provenir de varias clases base.

Las estructuras se definen mediante la palabra clave struct, por ejemplo:

C#

public struct PostalAddress


{
// Fields, properties, methods and events go here...
}

Casi todas las estructuras comparten la misma sintaxis que las clases, aunque están
más limitadas que éstas:

 Dentro de una declaración de estructura, los campos no se pueden


inicializar a menos que se declaren como constantes o estáticos.
 Una estructura no puede declarar un constructor predeterminado (es decir,
un constructor sin parámetros) ni un destructor.

El compilador crea y destruye automáticamente copias de estructuras, de modo


que un constructor y destructor predeterminados son innecesarios. De hecho, el
compilador implementa el constructor predeterminado asignando a todos los
campos sus valores predeterminados (vea Tabla de valores predeterminados
(Referencia de C#)). Las estructuras no pueden heredar de clases u otras
estructuras.

Las estructuras son tipos de valor; cuando un objeto se crea a partir de una
estructura y se asigna a una variable, la variable contiene el valor completo de la

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


5
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

estructura. Cuando se copia una variable que contiene una estructura, todos los
datos se copian y cualquier modificación a la nueva copia no cambia los datos de la
copia antigua. Como las estructuras no utilizan referencias, no tienen identidad; no
existe ninguna forma de distinguir entre dos instancias de un tipo de valor con los
mismos datos. En C#, todos los tipos de valor derivan inherentemente de
ValueType, que hereda de Object.

El compilador puede convertir tipos de valor en tipos de referencia en un proceso


conocido como conversión boxing. Para obtener más información, vea Boxing y
Unboxing.

INFORMACIÓN GENERAL SOBRE LAS ESTRUCTURAS

Las estructuras tienen las propiedades siguientes:

 Las estructuras son tipos de valor, mientras que las clases son tipos de
referencia.
 A diferencia de las clases, se pueden crear instancias de las estructuras sin
utilizar un operador new.
 Las estructuras pueden declarar constructores, pero deben utilizar
parámetros.
 Una estructura no puede heredar de otra estructura o clase, ni puede ser la
base de una clase. Todas las estructuras heredan directamente de
System.ValueType, que hereda de System.Object.
 Una estructura puede implementar interfaces.

HILOS

La creación de cada hilo se realiza mediante las líneas Thread th1 = new
Thread(new ThreadStart(msg.Mostrar1));. Esta línea indica que se crea una
instancia de la clase Thread, con nombre th1, a partir de un delegado de la clase
ThreadStart, que apunta al método Mostrar1 del objeto msg creado
anteriormente.

Una vez creados los dos hilos hay que activarlos, para lo que se llama al método
Start de cada uno de ellos. Tras este punto cada hilo se ejecuta en paralelo entre
si, y con el programa principal, por lo que utilizamos el método Join de ambos hilos
para esperar a que terminen los hilos antes de finalizar el programa.

El delegado ThreadStart no acepta parámetros de entrada ni de salida, por lo que


si queremos crear un hilo sobre un método que los necesite, hay que utilizar algún
mecanismo auxiliar. Una posible forma de conseguir esto es crear una nueva clase
con los parámetros necesarios en la entrada y con un nuevo método sin parámetros
que llame al método que queremos hacer paralelo, enviándole estos parámetros. A
ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


6
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

partir de aquí tendríamos que crear una instancia de dicha clase con los
parámetros que queremos enviar al método original, y hacer que el hilo se
ejecutase sobre el nuevo método de la clase. En el caso de que quisiéramos obtener
el resultado de la ejecución, deberíamos crear una función que acepte como
parámetro de entrada el tipo del valor devuelto por el método original, y hacer que
la nueva clase creada disponga también de un delegado que indique la función a la
que llamar tras la ejecución.

Como esto puede parecer un poco lioso, vamos a ver otro ejemplo. En esta ocasión
disponemos de una clase de funciones matemáticas y queremos llamar de forma
paralela a una de ellas. Este método acepta un valor entero en la entrada y
devuelve otro entero.

using System;
using System.Threading;
using System.IO;

public class EjemploMates{

public static int CalculoComplejo(int n)


{
// sumo uno y espero 5 segundos
n = n+1;
Thread.Sleep(5000);
return n;
}

public class HiloParaMates{


protected int n;
protected MatesCallback callback = null;
public HiloParaMates(int n, MatesCallback callback){
this.n = n;
this.callback = callback;
}
public void CalculoComplejo()
{
int result = EjemploMates.CalculoComplejo(n);
if(callback != null)
callback(result);
}
}

// creo un delegado con la firma necesaria para capturar

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


7
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

// el valor devuelto por el método CalculoComplejo


public delegate void MatesCallback(int n);

public class Ejemplo{

public static void Main()


{
HiloParaMates hpm = new HiloParaMates(1000, new
MatesCallback(ResultCallback));

Thread th = new Thread(new ThreadStart(hpm.CalculoComplejo));

th.Start();
th.Join();

public static void ResultCallback(int n)


{
Console.WriteLine("Resultado de la operación: "+n);
}
}

En el anterior código la clase HiloParaMates es la que nos permite encapsular la


llamada al método EjemploMates.Calcular. Este método requiere un parámetro de
tipo entero, por lo que la clase requiere este parámetro en su constructor. Además
se requiere en el constructor otro parámetro más, un delegado MatesCallback, que
acepta un entero en la entrada. La idea es que tras realizar el cálculo se llame al
método que se indique proporcionándole el resultado.

Para hacer funcionar todo esto, en Main se crea una instancia de la clase
HiloParaMates indicándole que queremos utilizar el valor numérico 1000 y que se
llame al método (estático) ResultCallback cuando se obtenga el resultado. Para
crear el hilo es suficiente con indicar que se quiere hacer sobre el método
CalculoComplejo de la instancia hpm.

System. Object

Ahora que sabemos lo que es la herencia es el momento apropiado para explicar que
en .NET todos los tipos que se definan heredan implícitamente de la clase
System.Object predefinida en la BCL, por lo que dispondrán de todos los
miembros de ésta. Por esta razón se dice que System.Object es la raíz de la
jerarquía de objetos de .NET.

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


8
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

A continuación vamos a explicar cuáles son estos métodos comunes a todos los
objetos:

 public virtual bool Equals(object o): Se usa para comparar el objeto sobre
el que se aplica con cualquier otro que se le pase como parámetro. Devuelve
true si ambos objetos son iguales y false en caso contrario.

La implementación que por defecto se ha dado a este método consiste en


usar igualdad por referencia para los tipos por referencia e igualdad por
valor para los tipos por valor. Es decir, si los objetos a comparar son
de tipos por referencia sólo se devuelve true si ambos objetos apuntan a la
misma referencia en memoria dinámica, y si los tipos a comparar son tipos
por valor sólo se devuelve true si todos los bits de ambos objetos son
iguales, aunque se almacenen en posiciones diferentes de memoria.

Como se ve, el método ha sido definido como virtual, lo que permite que los
programadores puedan redefinirlo para indicar cuándo ha de considerarse
que son iguales dos objetos de tipos definidos por ellos. De hecho, muchos
de los tipos incluidos en la BCL cuentan con redefiniciones de este tipo,
como es el caso de string, quien aún siendo un tipo por referencia, sus
objetos se consideran iguales si apuntan a cadenas que sean iguales
carácter a carácter (aunque referencien a distintas direcciones de memoria
dinámica)

El siguiente ejemplo muestra cómo hacer una redefinición de Equals() de


manera que aunque los objetos Persona sean de tipos por referencia, se
considere que dos Personas son iguales si tienen el mismo NIF:

public override bool Equals(object o)

if (o==null)

return this==null;

else

return (o is Persona) && (this.NIF == ((Persona) o).NIF);

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


9
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

Hay que tener en cuenta que es conveniente que toda redefinición del
método Equals() que hagamos cumpla con una serie de propiedades que
muchos de los métodos incluidos en las distintas clases de la BCL esperan
que se cumplan. Estas propiedades son:

Reflexividad: Todo objeto ha de ser igual a sí mismo. Es decir,


x.Equals(x) siempre ha de devolver true.

Simetría: Ha de dar igual el orden en que se haga la comparación. Es


decir, x.Equals(y) ha de devolver lo mismo que y.Equals(x) .

Transitividad: Si dos objetos son iguales y uno de ellos es igual a otro,


entonces el primero también ha de ser igual a ese otro objeto. Es decir,
si x.Equals(y) e y.Equals(z) entonces x.Equals(z) .

Consistencia: Siempre que el método se aplique sobre los mismos


objetos ha de devolver el mismo resultado.

Tratamiento de objetos nulos: Si uno de los objetos comparados es


nulo (null), sólo se ha de devolver true si el otro también lo es.

Hay que recalcar que el hecho de que redefinir Equals() no implica que el
operador de igualdad (==) quede también redefinido. Ello habría que hacerlo
de independientemente como se indica en el Tema 11: Redefinición de
operadores.

 public virtual int GetHashCode(): Devuelve un código de dispersión (hash)


que representa de forma numérica al objeto sobre el que el método es
aplicado. GetHashCode() suele usarse para trabajar con tablas de
dispersión, y se cumple que si dos objetos son iguales sus códigos de
dispersión serán iguales, mientras que si son distintos la probabilidad de que
sean iguales es ínfima.

En tanto que la búsqueda de objetos en tablas de dispersión no se realiza


únicamente usando la igualdad de objetos (método Equals()) sino usando
también la igualdad de códigos de dispersión, suele ser conveniente
redefinir GetHashCode() siempre que se redefina Equals() De hecho, si no
se hace el compilador informa de la situación con un mensaje de aviso.

 public virtual string ToString(): Devuelve una representación en forma de


cadena del objeto sobre el que se el método es aplicado, lo que es muy útil

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


10
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

para depurar aplicaciones ya que permite mostrar con facilidad el estado de


los objetos.

Object (Referencia de C#)

El tipo object es un alias de Object en .NET Framework. En el sistema de tipos


unificado de C#, todos los tipos (tipos de valor y de referencia predefinidos y definidos
por el usuario) se heredan directa o indirectamente de Object. Las variables de tipo
object pueden recibir valores de cualquier tipo. Cuando una variable de un tipo de
valor se convierte en un objeto, se dice que se le ha aplicado la conversión boxing.
Cuando una variable de objeto de tipo se convierte en un tipo de valor, se dice que se
le ha aplicado la conversión unboxing. Para obtener más información, vea Boxing y
Unboxing.

Ejemplo

En el siguiente ejemplo se muestra cómo las variables de tipo object pueden aceptar
valores de cualquier tipo de datos y cómo pueden utilizar métodos de Object
procedentes de .NET Framework.

// keyword_object.cs
using System;
class SampleClass
{
public int i = 10;
}

class MainClass
{
static void Main()
{
object a;
a = 1; // an example of boxing
Console.WriteLine(a);
Console.WriteLine(a.GetType());
Console.WriteLine(a.ToString());

a = new SampleClass();
SampleClass classRef;
classRef = (SampleClass)a;
Console.WriteLine(classRef.i);
}
}

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


11
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

Hilo de Ejecucion

Un hilo de ejecución, en sistemas operativos, es una característica que permite a una


aplicación realizar varias tareas a la vez(concurrentemente). Los distintos hilos de
ejecución comparten una serie de recursos tales como el espacio de memoria, los
archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el
diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.

Los hilos de ejecución que comparten los mismos recursos, sumados a estos
recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de
ejecución de un mismo proceso compartan los recursos hace que cualquiera de estos
hilos pueda modificar éstos. Cuando un hilo modifica un dato en la memoria, los otros
hilos acceden a ese dato modificado inmediatamente.

Lo que es propio de cada hilo es el contador de programa, la pila de ejecución y el


estado de la CPU (incluyendo el valor de los registros).

El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga
activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han
terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan, el
proceso no existe más y todos sus recursos son liberados.

Algunos lenguajes de programación tienen características de diseño expresamente


creadas para permitir a los programadores lidiar con hilos de ejecución (como Java o
Delphi). Otros (la mayoría) desconocen la existencia de hilos de ejecución y éstos
deben ser creados mediante llamadas de biblioteca especiales que dependen del
sistema operativo en el que estos lenguajes están siendo utilizados (como es el caso
del C y del C++).

Un ejemplo de la utilización de hilos es tener un hilo atento a la interfaz gráfica (iconos,


botones, ventanas), mientras otro hilo hace una larga operación internamente. De esta
manera el programa responde de manera más ágil a la interacción con el usuario.
También pueden ser utilizados por una aplicación servidora para dar servicio a
múltiples clientes.

Funcionalidad de los hilos

Al igual que los procesos, los hilos poseen un estado de ejecución y pueden
sincronizarse entre ellos para evitar problemas de compartimiento de recursos.

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


12
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

Generalmente, cada hilo tiene una tarea especifica y determinada, como forma de
aumentar la eficiencia del uso del procesador.

 Informática
 Diseño Web
 Proyectos
 Ocio

Muchos lenguajes de programación permiten la creación de hilos o threads en un


programa. De forma resumida, los hilos son un mecanismo mediante el cual podemos
devidir una aplicación en diferentes partes que se pueden ejecutar de forma paralela,
existiendo mecanismos por los que pueden compartir información.

C# ofrece un mecanismo muy sencillo de implementar hilos, basado en la utilización


de la clase Thread. El constructor de esta clase recibe como parámetro el método o
función que hay que ejecutar en paralelo. Este parámetro se indica mediante la
utilización de un delegado, que es el mecanismo que, entre otras cosas, se utiliza en
.NET para utilizar punteros a funciones de forma segura. La firma del delegado no
incluye ningún parámetro, por lo que únicamente es posible crear hilos de forma
directa sobre métodos y funciones que no requieran parámetros de entrada ni de
salida. En los siguientes ejemplos muestro un caso sencillo de creación de un hilo y
otro en el que explico una forma de poder crear un hilo con entrada y salida de
parámetros.

En el siguiente ejemplo se dispone de una clase con dos métodos que muestran
mensajes por pantalla. El objetivo es crear dos hilos, uno para cada uno de los
métodos y ejecutarlos de forma paralela, de forma que podamos ver como resultado
cómo se van intercalando los mensajes escritos por cada método.

using System;
using System.IO;
using System.Threading;

public class Mensajes{


public void Mostrar1()
{
for(int i=0;i<10;i++){
Console.WriteLine("Escribiendo desde ==> 1″);
Thread.Sleep(1000);
}
}

public void Mostrar2()


{
for(int i=0;i<10;i++){
Console.WriteLine("Escribiendo desde ==> 2″);
Thread.Sleep(1000);
}
}
}

public class Ejemplo{

public static void Main()


ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


13
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

{
Mensajes msg = new Mensajes();

Thread th1 = new Thread(new ThreadStart(msg.Mostrar1));


Thread th2 = new Thread(new ThreadStart(msg.Mostrar2));

th1.Start();
th2.Start();

th1.Join();
th2.Join();
}

La creación de cada hilo se realiza mediante las líneas Thread th1 = new Thread(new
ThreadStart(msg.Mostrar1));. Esta línea indica que se crea una instancia de la clase
Thread, con nombre th1, a partir de un delegado de la clase ThreadStart, que apunta
al método Mostrar1 del objeto msg creado anteriormente.

Una vez creados los dos hilos hay que activarlos, para lo que se llama al método Start
de cada uno de ellos. Tras este punto cada hilo se ejecuta en paralelo entre si, y con el
programa principal, por lo que utilizamos el método Join de ambos hilos para esperar a
que terminen los hilos antes de finalizar el programa.

El delegado ThreadStart no acepta parámetros de entrada ni de salida, por lo que si


queremos crear un hilo sobre un método que los necesite, hay que utilizar algún
mecanismo auxiliar. Una posible forma de conseguir esto es crear una nueva clase
con los parámetros necesarios en la entrada y con un nuevo método sin parámetros
que llame al método que queremos hacer paralelo, enviándole estos parámetros. A
partir de aquí tendríamos que crear una instancia de dicha clase con los parámetros
que queremos enviar al método original, y hacer que el hilo se ejecutase sobre el
nuevo método de la clase. En el caso de que quisiéramos obtener el resultado de la
ejecución, deberíamos crear una función que acepte como parámetro de entrada el
tipo del valor devuelto por el método original, y hacer que la nueva clase creada
disponga también de un delegado que indique la función a la que llamar tras la
ejecución.

Como esto puede parecer un poco lioso, vamos a ver otro ejemplo. En esta ocasión
disponemos de una clase de funciones matemáticas y queremos llamar de forma
paralela a una de ellas. Este método acepta un valor entero en la entrada y devuelve
otro entero.

using System;
using System.Threading;
using System.IO;

public class EjemploMates{

public static int CalculoComplejo(int n)


{
// sumo uno y espero 5 segundos
n = n+1;
Thread.Sleep(5000);
return n;
ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


14
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

public class HiloParaMates{


protected int n;
protected MatesCallback callback = null;
public HiloParaMates(int n, MatesCallback callback){
this.n = n;
this.callback = callback;
}
public void CalculoComplejo()
{
int result = EjemploMates.CalculoComplejo(n);
if(callback != null)
callback(result);
}
}

// creo un delegado con la firma necesaria para capturar


// el valor devuelto por el método CalculoComplejo
public delegate void MatesCallback(int n);

public class Ejemplo{

public static void Main()


{
HiloParaMates hpm = new HiloParaMates(1000, new
MatesCallback(ResultCallback));

Thread th = new Thread(new


ThreadStart(hpm.CalculoComplejo));

th.Start();
th.Join();

public static void ResultCallback(int n)


{
Console.WriteLine("Resultado de la operación: "+n);
}
}

En el anterior código la clase HiloParaMates es la que nos permite encapsular la


llamada al método EjemploMates.Calcular. Este método requiere un parámetro de tipo
entero, por lo que la clase requiere este parámetro en su constructor. Además se
requiere en el constructor otro parámetro más, un delegado MatesCallback, que
acepta un entero en la entrada. La idea es que tras realizar el cálculo se llame al
método que se indique proporcionándole el resultado.

Para hacer funcionar todo esto, en Main se crea una instancia de la clase
HiloParaMates indicándole que queremos utilizar el valor numérico 1000 y que se
llame al método (estático) ResultCallback cuando se obtenga el resultado. Para crear

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


15
INSTITUTO TECNOLOGICO SUPERIOR DE ESCARCEGA

el hilo es suficiente con indicar que se quiere hacer sobre el método CalculoComplejo
de la instancia hpm.

Set (Referencia de C#)

Define un método de descriptor de acceso en una propiedad o indizador que


estableció el valor de la propiedad o el elemento del indizador. Vea Propiedades e
Indizadores para obtener más información.

Éste es un ejemplo de un descriptor de acceso set para una propiedad denominada


Seconds:

class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}
Get (Referencia de C#)

Define un método de descriptor de acceso en una propiedad o indizador que recupera


el valor de la propiedad o el elemento del indizador. Vea Propiedades (Guía de
programación de C#) e Indizadores (Guía de programación de C#) para obtener más
información.

Éste es un ejemplo de un descriptor de acceso get para una propiedad denominada


Seconds:

class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}

ERIC ADRIAN CONTRERAS ARJONA

TOPICOS SELECTOS DE PROGRAMACION


16

You might also like