Professional Documents
Culture Documents
TEMAS
CAMPOS DE BITS
HILOS
SYSTEM.OBJECT
SET(C#)
GET(C#)
CAMPOS DE BITS
S INOPSIS
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
D ECLARACIÓN
Ejemplos:
int Uno : 8;
unsigned int Dos : 16;
int : 2;
Definición de Interfaz
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
C#
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,
CREAR OBJETOS
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#
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;
C#
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.
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#
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.
C#
Casi todas las estructuras comparten la misma sintaxis que las clases, aunque están
más limitadas que éstas:
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
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.
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.
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;
th.Start();
th.Join();
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.
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.
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)
if (o==null)
return this==null;
else
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:
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.
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);
}
}
Hilo de Ejecucion
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.
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.
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.
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
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;
{
Mensajes msg = new Mensajes();
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.
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;
th.Start();
th.Join();
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.
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}
Get (Referencia de C#)
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}