You are on page 1of 0

Marco Besteiro y Miguel Rodrguez Los Tipos en C#

1/36
Los Tipos de C#.
Introduccin
La mayora de los lenguajes orientados a objetos tienen dos tipos distintos de datos:
aquellos que son intrnsecos al lenguaje (tipos primitivos) y aquellos que pueden ser
creados por el programador. Los tipos primitivos son tipos simples como caracteres,
strings y nmeros. Es evidente que tener dos tipos de datos o variables es una fuente de
problemas ya que dificulta el tratamiento de estructuras con datos genricos, como
cuando, por ejemplo, se quiere especificar que un determinado mtodo pueda recibir un
argumento de cualquier tipo. Como los tipos primitivos son incompatibles entre s, no se
puede trabajar con un mtodo de estas caractersticas a menos que se escriba una clase
que envuelva a cada uno de los tipos primitivos, como ocurre en J ava.

Sin embargo, en C#todo objeto deriva implcitamente de una simple clase base, que se
llama Syst em. Obj ect . Esto quiere decir que todas las variables en C# son, directa o
indirectamente, objetos. Se hablar ms adelante de esta clase base.

Sin embargo, no siempre es eficaz trabajar en programacin con objetos y, por esta
razn, los creadores de la plataforma Microsoft.NET separaron los tipos en dos
categoras: tipos valor y tipos referencia.

Los tipos valor son:
a) Los tipos simples como char , i nt , f l oat , et c. . . - predefinidos por el
sistema.
b) Las enumeraciones: tipos enum,
c) Las estructuras: tipos st r uct .

Tanto los tipos enumcomo st r uct pueden ser predefinidos por el sistema o por el
programador.

Los tipos referencia son:

a) Las clases el tipo cl ass- entre las que se incluyen los tipos st r i ng y obj ect .
b) Las interfaces el tipo i nt er f ace- .
c) El tipo del egat e,
d) Los arrays -el tipo ar r ay-

Adems, existe una tercera categora que son los punteros, que estn disponibles
nicamente para cdigo inseguro. Los punteros en C#y, en general, el cdigo
inseguro se tratan con profundidad en un captulo posterior.

Las diferencias ms importantes entre los tipos valor y los tipos referencia se pueden
resumir as:
Las variables de tipo valor contienen directamente valores o datos como
una variable de C o C++-, mientras que las variables de tipo referencia
almacenan referencias a datos, que en realidad son objetos.
Las variables de tipo valor se almacenan directamente en la pila o stack
mientras que las variables de tipo referencia son referencias que se
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
2/36
almacenan en la pila y apuntan o referencian a un objeto que se almacena en
el heap o montn y que contiene toda la informacin referente a ese objeto.
Todo tipo en C# deriva directa o indirectamente del tipo clase
Syst em. Obj ect , que es la clase raz de la jerarqua de herencia en C#. Esto
quiere decir que una variable tanto de tipo valor como de tipo referencia
puede ser tratada como un objeto.
En los tipo valor cada variable tiene su propia copia de los datos y las
operaciones sobre una variable no afectan a otras variables. En cambio, en
los de tipo referencia puede darse el caso de que dos variables de tipo
referencia apunten o referencien al mismo objeto, con lo que las operaciones
realizadas a travs de una de las referencias pueden llegar a afectar al objeto
referenciado por la otra.

Los desarrolladores pueden definir nuevos tipos valor por medio de declaraciones de
estructuras st r uct - y enumeraciones enum- y nuevos tipos referencia por medio de
clases cl ass-, interfaces i nt er f ace- y delegates del egat e-.

Caractersticas del lenguaje
Comentarios
Los comentarios se utilizan para que una o varias lneas sean ignoradas por el
compilador. Estas lneas se utilizan, en general, para hacer que el cdigo sea ms
comprensible.

Hay dos tipos de comentarios:

a) El smbolo / / convierte en comentario todo lo que est situado a su derecha y en
la misma lnea.
b) Todo el texto encerrado entre los smbolos / * y */ ser considerado como
comentario por el programador.

Por ejemplo:

usi ng Syst em;
namespace Consol eAppl i cat i on3
{
/ ******************COMENTARI O**************
* Est as t r es l neas son i gnor adas por el compi l ador
******************CODI GO******************/

cl ass Mi Cl ase
{
st at i c voi d Mai n( st r i ng[ ] ar gs)
{
/ / La si gui ent e l nea se i mpr i mi r en pant al l a
Consol e. Wr i t eLi ne( " Est o se i mpr i mi r " ) ;
}

}
/ / Est e es ot r o coment ar i o
}
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
3/36

Identificadores
Un identificador es un nombre que se utiliza para nombrar, etiquetar o identificar una
variable, una clase, un mtodo, etc.

C#es sensible a las maysculas. Esto quiere decir que distinguir, por ejemplo, entre
PI , pi o Pi .

Los identificadores deben comenzar por una letra o por guin bajo y se puede utilizar
cualquier carcter UNICODE o nmero en dichos identificadores. Por eso, por fin
pueden utilizarse como nombre de variable palabras con o con acento. As, las
siguientes palabras son identificadores vlidos:

unaVar i abl e
Ot r aVar i abl e
var i abl e1
var i abl e_2
unNi o
Ni o2
Rect ngul o

Sin embargo no pueden utilizarse como identificadores las palabras siguientes,
reservadas por el lenguaje:

abstract as base bool break
byte case catch char checked
class const continue decimal default
delegate do double else enum
event explicit extern false finally
fixed float for foreach goto
if implicit in int interface
internal lock is long namespace
new null object operator out
override params private protected public
readonly ref return sbyte sealed
short sizeof stackalloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual void
while

Tabla 3.1
Literales
Los literales son los valores que pueden tener o almacenar los tipos bsicos del
lenguaje. Se tratarn con profundidad al hablar de los tipos de datos. Pueden ser:

a) enteros
b) reales
c) booleanos o lgicos
d) caracteres
e) cadenas
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
4/36
f) nul l . Este literal indica que una referencia no apunta a ningn objeto.
Tipos valor .
Los datos de tipo valor se dividen en tres categoras principales:

Tipo simple
Tipo estructura
Tipo enumeracin

Los tipos simples pueden clasificarse del siguiente modo.

o Tipo Entero
con signo
sbyt e
shor t
i nt
l ong
sin signo
byt e
ushor t
ui nt
ul ong
o Tipo coma flotante
f l oat
doubl e
o Tipo char
o Tipo booleano: bool
o Tipo deci mal



Una variable de tipo valor contiene y almacena un dato del tipo que se especifique: i nt ,
f l oat , doubl e, etc... Se habla entonces de variable de tipo entero, f l oat , doubl e... Una
variable de tipo valor no puede ser nul l .

Por ejemplo:

i nt unEnt er o=4; / / var i abl e de t i po ent er o
doubl e unDoubl e=2. 3; / / var i abl e de t i po doubl e

Todos los tipo valor heredan implcitamente de la clase Syst em. Obj ect - que es la
clase raz de la jerarqua de herencia en C#-. Por eso, todas las variables en C#son
objetos y tienen los miembros que heredan de obj ect . Por ejemplo, en C#es correcto
escribir:

Consol e. Wr i t eLi ne( 7. ToSt r i ng( ) ) ; / / 7 es un obj et o que ut i l i za
/ / el mt odo ToSt r i ng( )
/ / her edado de obj ect


i nt i = i nt . MaxVal ue; / / Syst em. I nt 32. MaxVal ue,
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
5/36
i nt n = I nt 32. Mi nVal ue;
st r i ng s = i . ToSt r i ng( ) ; / / Syst em. I nt 32. ToSt r i ng( )
st r i ng t = 123. ToSt r i ng( ) ; / / Syst em. I nt 32. ToSt r i ng( )


Sin embargo, no es posible crear tipos derivados de un tipo valor aunque, como en los
tipo referencia, pueden implementar interfaces. Ms adelante, en un captulo posterior
se estudiarn estos conceptos con ms detenimiento.

Declaracin de variables
Cuando se declara una variable de tipo valor se reserva memoria para el nmero de
bytes asociado con ese tipo de dato en la pila y se trabaja directamente con ese conjunto
de bits. A continuacin, se asocia a ese espacio en memoria el nombre de la variable de
tipo valor y se almacena el valor o valores que se asigna a la variable en ese espacio de
memoria. Por ejemplo, si se escribe:

i nt unVal or = 78;

En la expresin anterior se reserva espacio en memoria para 32 bits en la pila o stack, ya
que cada variables de tipo entero como se puede ver en la tabla 3.4- ocupa 4 bytes y
ese espacio se etiqueta o asocia con una variable denominada unVal or . Adems, el
valor 78 se almacena en esos 32 bits, es decir, se hace una copia de ese valor en esas
posiciones de memoria.
A continuacin se adjuntan ejemplos de inicializaciones:
i nt unEnt er o = 7;
doubl e unDoubl e = 3. 141592;
char unChar = g ;
bool unBool ean = t r ue;

Inicializacin por defecto de los tipos valor.
Cada variable de tipo valor tiene un constructor implcito por defecto que la inicializa
en caso de que no lo haga el usuario. Todos los tipos valor tienen un constructor
pblico sin parmetros llamado constructor por defecto. El constructor por defecto
devuelve una instancia inicializada a la que se conoce como valor por defecto. La tabla
3.2 representa dichos valores de inicializacin:

Tipo valor Valor por defecto
bool f al se
byt e 0
char ' \ 0'
deci mal 0. 0M
doubl e 0. 0D
enum 0
f l oat 0. 0F
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
6/36
i nt 0
l ong 0L
sbyt e 0
shor t 0
ui nt 0
ul ong 0
ushor t 0

Tabla 3.2

En el caso de las estructuras st r uct -, el valor por defecto es el resultado de dar el
valor por defecto a cada uno de sus campos y a nul l todos los tipos referencia.

Alias de los tipos valor
Para simplificar el lenguaje, .NET permite invocar por medio de un alias a algunos
tipos de datos. Por ejemplo, en lugar de decir que una variable es de tipo
Syst em. I nt 32, se le invoca por su alias, en este caso i nt .
Por eso, las dos sentencias que siguen son equivalentes:
Syst em. I nt 32 unEnt er o = 34;
i nt unEnt er o = 34
La lista completa de alias se presenta en la tabla 3.3.
Tipo de .NET Tipo de C# o alias
Syst em. Bool ean bool
Syst em. Byt e byt e
Syst em. Sbyt e sbyt e
Syst em. Char char
Syst em. Deci mal deci mal
Syst em. Doubl e doubl e
Syst em. Si ngl e f l oat
Syst em. I nt 32 i nt
Syst em. UI nt 32 ui nt
Syst em. I nt 64 l ong
Syst em. UI nt 64 ul ong
Syst em. Obj ect obj ect
Syst em. I nt 16 shor t
Syst em. UI nt 16 ushor t
Syst em. St r i ng st r i ng

Tabla 3.3

Clasificacin de tipos Valor
Los tipos valor se dividen en tipos simples, estructuras y enumeraciones. A
continuacin se estudian brevemente cada uno de los tipos simples y posteriormente se
hablar de las enumeraciones y de las estructuras.
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
7/36

Tipos Enteros
C#soporta ocho tipos de enteros predefinidos. En la tabla 3.4 se especifican cada uno
de ellos, la cantidad de memoria que se reserva en la pila y el rango de valores que
pueden tomar.

Tipo descripcin Bytes Rango
sbyt e
Tipo entero con signo 1
de - 128 a 127
byt e
Tipo entero sin signo 1
de 0 a 255
shor t
Tipo entero con signo 2
de - 32, 768 a 32, 767
ushor t 6
Tipo entero sin signo 2
de 0 a 65, 535
i nt
Tipo entero con signo 4
de - 2, 147, 483, 648
a 2, 147, 483, 647
ui nt
Tipo entero sin signo 4
de 0 a 4, 294, 967, 295
l ong
Tipo entero con signo 8
de 9, 223, 372, 036, 854, 775, 808
a 9, 223, 372, 036, 854, 775, 807
ul ong
Tipo entero sin signo 8
de 0 a
18, 446, 744, 073, 709, 551, 615

Tabla 3.4

Los nmeros enteros son muy importantes pero tambin quiz los ms conocidos en
cualquier lenguaje de programacin. A todas las variables de tipo integral se les puede
asignar valores en notacin decimal o hexadecimal. Estos ltimos requieren del prefijo
0x.
Si hay ambigedad acerca de si un determinado tipo entero es i nt , ui nt , l ong o ul ong,
por defecto se convierte a i nt .
Para especificar el tipo de dato entero que se est tratando se debe aadir al final del
valor U o L.

Por ejemplo:

ui nt unaVar i abl eSi nSi gno=652U;
l ong unLong=836L;
ul ong unUl ong=6546UL;


Tipos en coma flotante
C#soporta nmeros en coma flotante, como f l oat o doubl e. Difieren entre ellos en el
rango de valores que pueden tomar y en la precisin.

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
8/36
En la tabla 3.5 se especifican estos valores y el espacio de memoria que requieren los
tipos en coma flotante. f l oat tiene menor precisin que doubl e. Tiene 7 dgitos de
precisin y doubl e 14 o 15 dgitos.

Como regla general, hay que tener en cuenta que si en una determinada expresin hay
tipos coma flotante y enteros, stos ltimos se convierten a coma flotante antes de llevar
a cabo el clculo.

Si hubiese ambigedad acerca de si un determinado valor en coma flotante es f l oat o
doubl e, por defecto se convierte a doubl e. Si se quiere especificar que un determinado
valor es f l oat , se debe aadir el carcter F ( f ) como por ejemplo:

f l oat unFl oat =29. 23F;
Es posible trabajar con C#en aplicaciones cientficas, porque permite gran variedad de
posibilidades y precisin en los clculos.

f l oat
Tipo real. 7 dg. de precisin 4
de 1. 5 10
- 45
a 3. 4 10
38

doubl e
Tipo real. 15 dg. de precisin 8
de 5. 0 10
- 324
a 1. 7 10
308


Tabla 3.5
Tipo decimal
Hay ocasiones en las que es preciso trabajar con nmeros con muchas cifras sin perder
precisin en los clculos. Esto sucede en las aplicaciones financieras que necesitan
trabajar con nmeros fraccionarios muy grandes. A veces, los tipos f l oat o doubl e
pueden no ser tiles para este tipo de programas. Para ello, C#proporciona el tipo
deci mal , que es un tipo de dato de gran precisin, de 128 bits.
En la tabla 3.6 se recoge una comparacin de los tipos en coma flotante y decimal y se
especifica el nmero de bytes que ocupan en memoria, el nmero de dgitos de precisin
y el rango de valores que ofrece.
Tipo Bytes Precisin Rango
float 4 7 dgitos
de 1, 510
- 45
a 3, 410
38

double 8 15-16 dgitos
de 5, 010
- 324
a 1, 710
308

decimal 16 28-29 dgitos
de 1, 010
- 28
a 7, 910
28


Tabla 3.6. Tipos de datos que permiten almacenar valores en coma flotante.

Aparentemente el rango de valores en coma flotante es inmenso, pero se debe tener
cuidado pues la forma en que se representan impide que los clculos con nmeros
grandes tengan la precisin que en muchos casos se puede necesitar. Por ejemplo, el
tipo f l oat aparentemente almacena nmeros en el rango 1, 510
- 45
a 3, 410
38
, pero
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
9/36
en absoluto permite representar todos los nmeros dentro de este rango. La explicacin
es simple: para representar estos nmeros se utilizan cuatro bytes y esta cantidad de
almacenamiento permite representar 4. 294. 967. 295 valores diferentes, ya sean enteros
o reales. Por ejemplo, el valor 0. 9876543210987654321, aunque se encuentra dentro
del rango de valores del tipo doubl e no se puede representar con precisin y C#lo
redondea. El tipo decimal permite una enorme precisin, pero es importante especificar
que esta precisin se ofrece en dgitos, no en lugares decimales. Si se necesita gran
precisin para los clculos, entonces lo ms probable es que haya que utilizar el tipo de
datos deci mal , aunque tambin tiene que tener en cuenta que las operaciones con los
valores de este tipo son mucho ms lentas que las operaciones con los valores de otros
tipos. El intervalo de tipo deci mal es mucho menor que la del tipo doubl e pero la
precisin es mucho mayor. Es fcil imaginar los problemas que podra generar los
grandes nmeros de una gran entidad bancaria.
Para especificar que se trata de un tipo decimal, se debe especificar con la letra M ( m)
al final del nmero.
Por ejemplo:

f l oat unFl oat =7. 0F;
doubl e unDoubl e=5. 89;
deci mal unDeci mal =6. 56M;

Tipo booleano
Admite dos posibles valores:
o Tr ue (a diferencia de C y C++no es un valor distinto de cero).
o Fal se

Si una variable se declara como bool , slo puede tomar valor Tr ue o Fal se. No se
puede convertir un valor booleano a un valor entero.

Por eso, en C# no es correcto el siguiente cdigo:

i nt a=0;
i f ( a) / / ERROR. Debe escr i bi r se i f ( a==0)
Consol e. Wr i t eLi ne( a no es cer o) ;
el se
Consol e. Wr i t eLi ne( a es cer o) ;

El tipo bool ocupa 4 bytes.

Tipo char
C#soporta tambin el tipo char . Representa un carcter UNICODE, con una longitud
de 16 bits, o sea, ocupa 2 bytes de memoria. De esta forma, en C#puede representarse
cualquier carcter de cualquier lengua.

Se puede declarar e inicializar una variable de este tipo de la siguiente forma:

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
10/36
char unCar act er = a ;

Tambin se puede asignar a un tipo char una secuencia de escape. Por ejemplo:

char ot r oCar act er = \ n ;

En la tabla 3.7 se representan los caracteres de escape de C#.

Secuencia de escape Nombre del carcter
\
Comillas simples
\
Comillas dobles
\ \
Barra invertida
\ 0
Carcter Nulo
\ a
Alerta
\ b
Retroceso
\ f
Avance de formulario
\ n
Nueva lnea
\ r
Retorno de carro
\ t
Tabulacin horizontal
\ v
Tabulacin vertical

Tabla 3.7. Secuencias de escape.

No se pueden realizar conversiones implcitas de un tipo char a otros tipos. Es decir,
no es posible tratar un char como si fuera un entero. Para trabajar de esta forma, tiene
realizarse una conversin explcita. Por ejemplo:

char unCar act er =( char ) 65;
i nt unEnt er o=( i nt ) a ;

Tipos enum

El tipo enumpermite utilizar un grupo de constantes a travs de nombres asociados que
son ms representativos que dichas constantes. Las constantes pueden ser de los tipos
siguientes: byt e, shor t , i nt o l ong. En su forma ms simple una enumeracin puede
tener el siguiente aspecto:

enumCol or es
{ Roj o=2,
Ver de=3,
Azul =4
};

En ocasiones, se escribe en una sola lnea:

enumCol or es {Roj o=2, Ver de=3, Azul =4};

Si no se especifica ningn valor, por ejemplo:

enumCol or es
{ Roj o,
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
11/36
Ver de,
Azul
};

El compilador asigna los valores por defecto siguientes : Roj o es 0, Ver de 1 y Azul 2 y
son de tipo i nt . En general, el primer elemento es 0 y cada elemento sucesivo aumenta
en una unidad.

Es posible cambiar el valor inicial y/o cualquier valor:

enumCol or es
{
Roj o=1,
Ver de,
Azul
};

En este caso, Roj o es 1, Ver de 2 y Azul 3 y son de tipo i nt .

enumCol or es2
{
Roj o=20,
Ver de=30,
Azul
};

Roj o es 20, Ver de 30 y Azul 31 y son de tipo i nt

Y tambin es posible cambiar el tipo:

enumCol or es : byt e
{
Roj o,
Ver de,
Azul
};

En este caso, Roj o, Ver de y Azul sern de tipo byt e.

Ejemplo:

usi ng Syst em;
publ i c cl ass Mi Cl ase{
st r uct Di as {Lun, Mar =4, Mi e, J ue=10, Vi e, Sab, Dom};
publ i c st at i c voi d Mai n( ) {
i nt x=( i nt ) Di as. Lun;
i nt y=( i nt ) Di as. Vi e;

Consol e. Wr i t eLi ne( Lunes = {0}, Vi er nes = {1}, x, y) ;
}
}

La salida de este programa es:

Lunes = 0, Vi er nes = 11
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
12/36
Tipos struct
Un tipo st r uct es similar a un tipo cl ass -puede contener constructores, constantes,
mtodos, etc...-, con una diferencia muy importante: cl ass es de tipo referencia, y
st r uct de tipo valor. Cuando se declara una variable de un tipo cl ass, se crea el objeto
con los datos en el heap o montn y una variable de referencia a ese objeto en la pila o
stack. En cambio, cuando se declara una variable de un tipo st r uct los datos se
almacenan directamente en la pila, ya que es un tipo valor. Por eso, el tipo st r uct es
interesante para crear objetos ligeros, es decir, de un tamao pequeo, en los que una
referencia significara un incremento considerable en el tamao de la variable. Para los
clculos en los que se utilicen nicamente los datos, es ms rpido en general- utilizar
variables de tipo estructura. Sin embargo, cuando sea necesario pasarlo como parmetro
a un mtodo, se optimiza el trabajo si se pasan referencias a los objetos en lugar de los
objetos propiamente dichos. Este concepto es interesante tenerlo en cuenta cuando se va
a trabajar con matrices que contienen muchos objetos.

Las estructuras se estudiarn conjuntamente con las clases y aqu nicamente se
introducir un ejemplo:

usi ng Syst em;
st r uct Punt o
{
publ i c i nt x, y;
publ i c Punt o( i nt x, i nt y) {
t hi s. x = x;
t hi s. y = y;
}
}
cl ass Mi Cl ase{
publ i c st at i c voi d Mai n( ) {
Punt o p=new Punt o( 7, 9) ;
Consol e. Wr i t eLi ne( Coor denadas de p ( {0}, {1}) , p. x, p. y) ;
}
}

Tipos referencia.

Como se ha explicado en el apartado anterior, los tipos de referencia definen por un lado
una referencia en la pila y por otro un objeto que se ha creado en el montn y que se
asigna a la referencia (figura 3.1). Dicho de otro modo: una variable de tipo referencia
es una referencia a una instancia u objeto de un determinado tipo. Las variables de tipo
referencia no almacenan los datos que representan sino que almacenan referencias a
dichos datos. Un tipo referencia admite el valor nul l que indica que no referencia o no
apunta a ningn objeto.


Los tipos referencia implican la creacin de:
a) una variable de referencia en la pila.
b) un objeto con los datos, que son apuntados por la variable de referencia en el
montn (figura 3.1).


Marco Besteiro y Miguel Rodrguez Los Tipos en C#
13/36


















Figura 3.1

Existen los siguientes tipos de referencia:

tipo clase
o cl ass
o obj ect
o st r i ng
tipo i nt er f ace
tipo ar r ay
tipo del egat e


Los tipos de referencia pueden ser predefinidos por el sistema o definidos por el
programador.

Tipo class.
Un tipo cl ass define una estructura de datos que puede contener miembros de datos
(constantes, campos y eventos), funciones miembro (mtodos, propiedades,
indexadores, operadores, constructores y destructores) y otros tipos anidados.

Los tipos cl ass las clases- soportan la herencia, pero slo simple, excepto en el caso
de la herencia de interfaces que es la nica que puede ser mltiple.

Ms adelante se vern en detalle las clases. Tienen la misma composicin que las
estructuras.
Tipo object.

Pila










Referencias a objetos de tipo
MiClase
Montn
Objetos tipo MiClase
refObjeto2
refObjeto1
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
14/36
Como se ha mencionado anteriormente, todos los tipos de C# heredan del tipo
Syst em. Obj ect y se puede decir que en C#todos los tipos de datos son objetos. Esto
garantiza que cualquier tipo tenga los mtodos de la clase obj ect .

La palabra clave obj ect es un alias de la clase predefinida Syst em. Obj ect .

Una caracterstica del tipo obj ect es que una variable de este tipo admite cualquier
valor, por ejemplo:

obj ect r ef Obj et o = 20;

La sentencia anterior es en realidad- una conversin implcita de un dato de tipo valor
a uno de tipo referencia, es decir, un boxing o encuadramiento. Este importante
concepto se estudiar en detalle ms adelante, en este mismo captulo.

En la tabla 3.8, se describen los mtodos pblicos -publ i c- ms importantes de la clase
Syst em. Obj ect y que cualquier variable puede utilizar por el hecho de ser objeto.

bool Equal s( obj ect oA)
Compara los objetos. Devuelve Tr ue o
Fal se dependiendo de que sean o no el
mismo objeto. En el caso de variables de
tipo valor este mtodo devuelve Tr ue si los
dos tipos son idnticos y tienen
exactamente el mismo valor.
Type Get Type( )
Se usa para mtodos de reflexin y
devuelve el tipo de un objeto dado.
st r i ng ToSt r i ng( )
Devuelve el nombre del objeto. Se puede
sobrescribir.

Tabla 3.8. Algunos mtodos de la clase Syst em. Obj ect .

En los siguientes ejemplos se puede observar cmo cualquier variable de cualquier tipo
puede utilizar los miembros de obj ect .

i nt a=56;
Obj ect oA=a;
Consol e. Wr i t eLi ne( a. ToSt r i ng( ) ) ;
Consol e. Wr i t eLi ne( a. Get Type( ) ) ;
Consol e. Wr i t eLi ne( 56. ToSt r i ng( ) ) ;
Consol e. Wr i t eLi ne( a. Equal s( 56) ) ;
Consol e. Wr i t eLi ne( oA. ToSt r i ng( ) ) ;

La salida de este programa es:

56
I nt 32
56
Tr ue
56
56

Es importante sealar aqu que cuando se comparan variables de tipos predefinidos, hay
que tener en cuenta los siguiente:
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
15/36

Dos expresiones de tipo entero, real, etc, son iguales si representan el mismo
valor entero, real, etc.
Dos expresiones de tipo obj ect se consideran iguales si ambas se refieren al
mismo objeto o si ambas son nul l .
Dos expresiones de tipo st r i ng se consideran iguales si las instancias los
objetos- tienen idntica longitud y caracteres iguales en las mismas posiciones o
si ambos son nul l .

Tipo string.
El tipo st r i ng representa una cadena de caracteres UNICODE. st r i ng es un alias de la
clase Syst em. St r i ng. El tipo st r i ng hereda o deriva directamente del tipo obj ect .
Un objeto st r i ng se maneja como un objeto de una clase cualquiera. Pero adems, en
este caso, se permite crearlo y utilizarlo directamente, a partir de literales:

st r i ng unaCadena = Hol a;
st r i ng ot r aCadena = Mundo;

Esta clase tiene muchos constructores. Algunos de ellos se describen a continuacin:

a) St r i ng( char unCar act er , i nt numer o) ;
Construye un st r i ng formado por el carcter unCar act er , repetido tantas veces
como indica numer o.

b) St r i ng( char [ ] unAr r ay) ;
Construye un string con la cadena formada por los caracteres del array unArray

c) St r i ng( char [ ] mi Ar r ay, i nt comi enzo, i nt l ongi t ud) ;
Construye un string basado en la cadena formada por los caracteres de miArray,
pero comenzando en el carcter comienzo y a partir de l tantos caracteres como
indique longitud.

d) Por supuesto, se puede construir un st r i ng asignndole un literal como se ha hecho
anteriormente.

En el siguiente ejemplo se utilizan varios constructores diferentes:

st r i ng st r 1=new st r i ng( ' m' , 7) ;
Consol e. Wr i t eLi ne( st r 1) ;
char [ ] mi Ar r ay={' h' , ' o' , ' l ' , ' a' };
st r i ng st r 2=new st r i ng( mi Ar r ay) ;
Consol e. Wr i t eLi ne( st r 2) ;
st r i ng st r 3=new st r i ng( mi Ar r ay, 1, 2) ;
Consol e. Wr i t eLi ne( st r 3) ;
st r i ng st r 4=" I an es un paquet e" ;
Consol e. Wr i t eLi ne( st r 4) ;


La salida de este programa es:
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
16/36

mmmmmmm
hol a
ol
I an es un paquet e

Por alguna extraa razn que los autores desconocen, Microsoft ha dispuesto que un
st r i ng se construya como si fuera un tipo valor, aunque realmente no lo es. Es decir,
no se permite la expresin:

st r i ng st r 5=new st r i ng( " Hol a Mundo" ) ; / / ERROR

A continuacin, se describen algunas caractersticas del tipo st r i ng:

Se pueden concatenar dos cadenas con el operador + , que est sobrecargado:

Por ejemplo:

st r i ng unaCadena = Hol a;
st r i ng ot r aCadena = Mundo;
Consol e. Wr i t eLi ne( unaCadena + ot r aCadena) ; / / La sal i da es Hol aMundo

st r i ng s1=Una cadena + ot r a cadena;
Consol e. Wr i t eLi ne( s1) ; / / La sal i da es: Una cadenaot r a cadena

El operador [ ] accede individualmente a los caracteres del st r i ng:

st r i ng st r =Mi guel
char c1=st r [ 3] ; / / c1 = u
char c2=Pat r i ci a[ 2] / / c2= t

Aunque un st r i ng es de tipo referencia, los operadores sobrecargados == y =
comparan los valores de los objetos st r i ng no las referencias a los objetos.

st r i ng s1=Hol a;
st r i ng s2=Hol a;
Consol e. Wr i t eLi ne( s1==s2) ; / / La sal i da es Tr ue
Consol e. Wr i t eLi ne( ( obj ect ) s1==( obj ect ) s2) ; / / La sal i da es Fal se

Esto es as porque s1 y s2 son dos referencias a dos objetos distintos fsicamente estn
almacenados en posiciones de memoria diferentes-, pero que tienen el mismo valor. En
la primera sentencia, se comparan los valores de los objetos que son iguales- y en la
segunda, las referencias -que son distintas-.

El contenido de un objeto st r i ng es constante y no se puede cambiar.
Por ejemplo:
st r i ng unaFr ase=Est a es una f r ase;
unaFr ase+= i ngeni osa;

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
17/36
Cuando este cdigo se ejecuta ocurre lo siguiente: en primer lugar, se crea un objeto de
tipo Syst em. St r i ng y se inicializa con el texto Est a es una f r ase. .NET reserva
memoria en el montn suficiente para albergar este objeto 17 caracteres- y crea una
referencia unaFr ase en la pila de tipo st r i ng que apunte a ese objeto.

En la lnea siguiente parece que se aade un texto en el st r i ng anterior, en el objeto.
Pero esto no sucede as. Lo que realmente ocurre es que se crea un nuevo objeto y se
reserva la memoria suficiente para almacenar un nuevo objeto de tipo st r i ng con ese
nuevo contenido 27 caracteres-. Entonces la referencia de tipo st r i ng unaFr ase se
actualiza para que referencie o apunte al nuevo objeto. El antiguo objeto st r i ng sigue
existiendo en memoria, pero es desrreferenciado y ser borrado por el garbage collector
(recolector de basura).

Para poder tratar los st r i ng como se supone que deberan ser tratados es decir, no
siendo constantes- .NET proporciona otra clase, llamada St r i ngBui l der . Se utiliza
para situaciones en las cuales se desea modificar un st r i ng, aadiendo, reeemplazando
o insertando caracteres, sin crear un nuevo objeto st r i ng en cada modificacin. Los
mtodos de esta clase no devuelven un nuevo objeto St r i ngBui l der a menos que se
especifique otra cosa.
Los literales de tipo st r i ng se pueden escribir de dos formas: precedidos o no por el
carcter @. Si no se precede de @, se define con comillas dobles. Por ejemplo:
" Buenos d as" / / un l i t er al de t i po st r i ng
La otra forma es escribir el literal de st r i ng comenzando con el carcter arroba @y
encerrndolo entre comillas dobles. Por ejemplo:
@" Buenos d as" / / un l i t er al

La ventaja de esta forma de escribir un literal es que no se procesan las secuencias de
escape. Esto hace que sea ms sencillo escribir, por ejemplo, el path de un determinado
fichero:
@" c: \ Docs\ Sour ce\ a. t xt "

Es mejor que escribir:

" c: \ \ Docs\ \ Sour ce\ \ a. t xt "
Para incluir las comillas dobles en la notacin precedida por @, hay que escribirlas dos
veces. Por ejemplo:
@" " " Hol a! " " l e gr i t desde l ej os. " / / " Hol a! " l e gr i t desde l ej os.

Esta clase tiene un buen nmero de mtodos. A continuacin se explican algunos de
ellos que facilitan enormemente el trabajo con cadenas.

- i nt I ndexOf ( char unCar act er ) ;

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
18/36
Devuelve un entero con el lugar de la primera ocurrencia de unCar act er , en el
st r i ng que llama al mtodo.

i nt I ndexOf ( char unCar act er , i nt comi enzo) ;

Devuelve un entero con el lugar de la primera ocurrencia de unCar act er , a
partir de comi enzo, en el st r i ng que llama al mtodo.

- i nt I ndexOf ( char unCar act er , i nt comi enzo, i nt l ongi t ud) ;

Devuelve un entero con el lugar de la primera ocurrencia de unCar act er , y
examinando l ongi t ud caracteres a partir de comi enzo.

En todos los casos, si no se encuentra ningn carcter coincidente, devuelve 1.
Por ejemplo:

Consol e. Wr i t eLi ne( " Hol a MundoMundi al " . I ndexOf ( ' M' ) ) ;
Consol e. Wr i t eLi ne( " Hol a MundoMundi al " . I ndexOf ( ' M' , 7) ) ;
Consol e. Wr i t eLi ne( " Hol a MundoMundi al " . I ndexOf ( ' M' , 7, 5) ) ;

La salida es:

5
10
10

- i nt Lengt h

Devuelve un entero con la longitud de la cadena. Es una propiedad, no un
mtodo.

Consol e. Wr i t eLi ne( " El Madr i d es el mej or " . Lengt h) ; / / 21

- st r i ng I nser t ( i nt comi enzo, st r i ng unaCadena) ;

Devuelve la cadena actual donde se le ha insertado a partir de comi enzo el
st r i ng unaCadena.

Consol e. Wr i t eLi ne( " Hol a" . I nser t ( 2, " j uan" ) ) ; / / HoJ uanl a

- st r i ng Remove( i nt comi enzo, i nt numCar act er es) ;

Devuelve el st r i ng resultante de borrar numCar act er es desde comi enzo del
st r i ng actual.

Consol e. Wr i t eLi ne( " El Madr i d es el mej or " . Remove( 4, 8) ) ;

- st r i ng Repl ace( st r i ng vi ej o, st r i ng nuevo) ;

Devuelve una cadena con el st r i ng actual donde se ha sustituido todas las
ocurrencias de vi ej o por nuevo. Por ejemplo:

Consol e. Wr i t eLi ne( " El Madr i d es el mej or " . Repl ace( " Madr i d" ,
" Sevi l l a" ) ) ;
La salida es:
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
19/36

El Sevi l l a es el mej or

- st r i ng ToUpper ( ) / / st r i ng ToLower ( )

Devuelve el st r i ng actual en maysculas o minsculas. Por ejemplo:

Consol e. Wr i t eLi ne( " El Madr i d es el mej or " . ToUpper ( ) ) ;

La salida es:

EL MADRI D ES EL MEJ OR

A continuacin se resumen otros mtodos tiles:


St ar t sWi t h
Determina si el st r i ng comienza por un st r i ng especificado.
EndsWi t h
Determina si el st r i ng finaliza por un st r i ng especificado
Subst r i ng
Sobrecargado. Devuelve un subst r i ng desde el st r i ng actual.
ToChar Ar r ay
Sobrecargado. Copia los caracteres a un array de caracteres.
Tr i m
Sobrecargado. Borra un conjunto de caracteres especificados al
comienzo y al final de un st r i ng. Muy utilizado en programacin
visual.
Tr i mEnd
Borra un conjunto de caracteres especificados al final de un st r i ng.
Tr i mSt ar t
Borra un conjunto de caracteres especificados al comienzo de un
st r i ng.
Tabla 3.9
Tipo interface.
Un interface es similar a una clase o a una estructura con la salvedad de que todos sus
miembros son abstractos, es decir, no estn definidos, no tienen cdigo.

Las interfaces estn pensadas para representar un aspecto de la realidad que habr de ser
implementado por una clase que herede la interface.

Ejemplo:

i nt er f ace I Vol ar
{
voi d Vol ar ( ) ;
voi d Despegar ( ) ;
voi d At er r i zar ( ) ;
}


cl ass CAvi on: I Vol ar
{
publ i c voi d Vol ar ( )
{
/ / Cdi go que i mpl ement a el mt odo I Vol ar ( )
. . .
}
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
20/36
publ i c voi d Despegar ( )
{
/ / Cdi go que i mpl ement a el mt odo I Despegar ( )
. . .
}
publ i c voi d At er r i zar ( )
{
/ / Cdi go que i mpl ement a el mt odo I At er r i zar ( )
. . .
}
}

No es posible crear objetos de tipo i nt er f ace, porque sus mtodos no estn
implementados, pero s es posible referenciar a un objeto de una clase que implementa
cierta interface a travs de una referencia a esa interface. Por ejemplo:

I Vol ar i v = new CAvi on( ) ;

o

CAvi on ca = new CAvi on( ) ;
I Vol ar i v = ( I Vol ar ) ca;
Tipo Array.
Un array es un tipo referencia que contiene un conjunto ordenado de datos que son
variables (elementos) a los que se accede a travs de ndices. Estas variables pueden ser
a su vez- de tipo valor o de tipo referencia.

Todas las variables de un array son del mismo tipo.

Para declarar un array, se escribe el tipo de elementos del array, despus el operador [ ]
y, por ltimo, el nombre del array. Por ejemplo:

i nt [ ] unAr r ay;

En la anterior sentencia se ha declarado un ar r ay de enteros de nombre unAr r ay.
unAr r ay es una referencia al array.

Se puede crear un objeto de tipo array con el operador new.

i nt [ ] mi Ar r ay=new i nt [ 4] ; / / Se cr ea un obj et o de t i po ar r ay
/ / de 5 ent er os i ni ci al i zados a 0

Se puede tambin inicializar los elementos del array:

i nt [ ] mi Ar r ay=new i nt [ 4] {2, 5, 12, 56, 3};

o mejor:

i nt [ ] mi Ar r ay=new i nt [ ] {2, 5, 12, 56, 3};

o bien, se puede compactar ms la declaracin y definicin e inicializacin del array:

i nt [ ] mi Ar r ay={2, 5, 12, 56, 3};
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
21/36

El tipo ar r ay tiene una serie de mtodos que se estudiarn ms adelante. Sin embargo,
se quiere destacar aqu la propiedad Lengt h, que ser muy til para recorrer el ar r ay.
Esta propiedad devuelve un entero con el nmero de elementos del ar r ay.

En el ejemplo anterior:

Consol e. Wr i t eLi ne( mi Ar r ay. Lengt h) ; / / I mpr i me 5

Un array puede tener ms de una dimensin. Por cada dimensin de un array se
necesitar un nivel de ndices para acceder a sus elementos.

Ejemplo:

st r i ng[ 3, 2] mat r i zSt r i ngs;
i nt [ , ] ot r oAr r ay = {{3, 5, 7}, {6, 89, 21}, {34, 56, 7}};

Tipo Delegate.
Un del egat e es muy similar a un puntero a funcin de C++. Es una estructura de datos
que referencia a un mtodo esttico o a un mtodo de instancia de un objeto.

Existen algunas diferencias:
Un puntero a funcin de C++slo puede referenciar funciones estticas
Un delegate no slo referencia al punto de entrada del mtodo, sino tambin a la
instancia del objeto al que pertenece el mtodo.

Tipo puntero.
Las variables de este tipo son los punteros tradicionales de C y C++. Si se utilizan, al
cdigo donde son utilizados se le denomina cdigo inseguro.
Boxing y UnBoxing.

Una vez estudiados los tipos de datos en C#, se plantean dos cuestiones importantes:
a) Cmo estas diferentes categoras de tipo hacen que el sistema sea ms
eficiente?.
b) Se puede utilizar una variable de tipo valor como si fuera de tipo referencia es
decir, como si fuera un objeto- y viceversa?.

Para responder a ambas cuestiones es necesario comprender los conceptos boxing y
unboxing. Estos dos procesos son muy importantes porque proporcionan un vnculo
entre los tipos valor y los tipos referencia y permiten la conversin entre ellos.

Boxing es la conversin de un tipo valor a un tipo referencia. Unboxing es el proceso
inverso, que se utiliza para convertir un objeto que contiene un valor, al tipo de valor
correspondiente.

Como anteriormente se ha dicho, todo tipo en C#deriva directa o indirectamente del
tipo obj ect , que es la clase raz de la jerarqua de herencia en C#. Por eso, se puede
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
22/36
tratar un tipo valor bien como tipo valor o bien como objeto (como tipo referencia)
indistintamente.

Cuando sea preciso convertir una variable tipo valor al tipo referencia (es decir a un
objeto, al tipo obj ect ) se realiza un boxing o encuadramiento. As, por ejemplo, un i nt
puede ser tratado como un tipo valor o como un tipo referencia (como un objeto).

Por eso es correcto escribir:

Consol e. Wr i t eLi ne( 7. ToSt r i ng( ) ) ;

Realmente, aqu, 7 es un objeto y puede invocar el mtodo ToSt r i ng( ) de obj ect

En general, el boxing o encuadramiento es una operacin se realiza demodo implcito y
consiste en crear un objeto a partir de un tipo valor. Ejemplo:

i nt unVal or = 100; / / var i abl e de t i po val or
obj ect obj Val or = unVal or ; / / r ef er enci a a un obj et o

La segunda lnea realiza implcitamente el boxing ya que se convierte de manera
implcita- un tipo valor a un objeto, que es de tipo referencia.

Para comprender mejor este proceso, debe tenerse en cuenta que tanto la variable de
tipo valor unVal or como la referencia al objeto obj Val or se almacenan en la pila
(stack). El objeto se almacena en el montn (heap).

Si se muestra grficamente el ejemplo anterior paso a paso, la situacin ser:

1) i nt unVal or = 100;


















Figura 3.2

2) obj ect obj Val or = unVal or ;



Pila Montn
unVal or
100
Pila Montn
unVal or
obj Val
100 100
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
23/36












Figura 3.3

Como se puede apreciar, la operacin boxing implica crear un objeto que es una copia
en el montn o heap de la variable tipo valor, pero manteniendo la variable. Por eso,
cualquier cambio que se haga sobre obj Val or no afectar a unVal or .

Unboxing.
Es una operacin explcita y consiste en asignar a una variable de tipo valor el valor de
una instancia u objeto referenciada por una variable de tipo referencia.

Ejemplo:

i nt unVal or =100;
obj ect obj Val or = 200;
unVal or = ( i nt ) obj Val or ; / / el cast i ng o conver si n ha de ser
/ / expl ci t o.

A continuacin se muestra el ejemplo paso a paso:

1) i nt unVal or =100; / / Var i abl e de t i po val or
obj Val or = 200; / / Var i abl e de t i po r ef er enci a













Figura 3.4

2) unVal or =( i nt ) obj Val or ; / / l a conver si n ( unboxi ng) debe ser
/ / expl ci t a.
Pila Montn
unVal or
obj Val
100 200
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
24/36















Figura 3.5

Como se puede observar, el casting o conversin ha de ser explcito.
Adems, aunque se indique explcitamente, si el casting o conversin no es al tipo valor
correcto el Runtime de la plataforma .NET lanzar una excepcin de la clase
I nval i dCast Except i on en tiempo de ejecucin.



Pila Montn
unVal or
obj Val
200 200
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
25/36
Variables y Expresiones.

Variables.
Las variables representan zonas de memoria donde se almacenan datos. Toda variable
est asociada a un tipo que determina qu es lo que puede almacenar.

Puede ser utilizada desde el cdigo mediante un identificador -A, var 1, x_3, etc...-. Para
declarar una variable slo hay que definir un nombre y especificar el tipo. La sintaxis
es:

Ti po Nombr eDeLaVar i abl e;

Por ejemplo:

i nt unEnt er o;
obj ect unObj et o;


Una variable puede ser definida

a) Como miembro de una clase
b) Como variable local
c) Como parmetro de un mtodo

Si una variable es declarada pero no inicializada, el compilador lo har por nosotros,
con unos valores que dependen del tipo- preestablecidos, como se ha estudiado
previamente.

Para crear una variable, se debe distinguir entre tipos valor y tipos referencia. Para crear
un objeto de una clase, se utiliza la siguiente sintaxis:

Nombr eDeCl ase nombr eDeLaRef er enci a = new Nombr eDeCl ase( Par met r os
opt
) ;

Por ejemplo: Suponiendo que en un determinado lugar del programa se ha definido la
clase Rect ngul o, se puede crear un objeto de esa clase del siguiente modo:

Rect ngul o unRect angul o=new Rect ngul o( 4, 9) ;

Esta sentencia crea un objeto de tipo Rect ngul o, inicializado con los valores 4 y 9. El
objeto se almacena en el montn y la referencia en la pila.

En las variables de tipo valor y en algunas de tipo referencia se puede crear e inicializar
de manera simultnea el objeto o variable de la siguiente forma:

i nt unEnt er o=5;
st r i ng unaCadena=Hol a Mundo;
obj ect unObj et o=45;
Mi Cl ase unaCl ase=nul l ;

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
26/36
El lenguaje C#es de tipos-seguros, lo que significa que el compilador garantiza que
los valores almacenados en las variables son del tipo adecuado.

El valor de una variable puede ser modificado a travs de la operacin de asignacin o
mediante el uso de los operadores de incremento y decremento (++, - - ).

En C#se definen siete categoras de variables:
- variables st at i c.
- variables de instancia.
- elementos de array.
- parmetros valor.
- parmetros r ef o de referencia.
- parmetros out o de salida.
- variables locales.

Las variables st at i c, de instancia y los elementos de array son automticamente
inicializadas al valor por defecto del tipo al que pertenecen.
Variables static o variables de clase.
Se llama variable st at i c a cualquier campo declarado con el modificador st at i c. Las
variables st at i c se crean cuando el tipo en el que son declaradas se carga. El valor
inicial de una variable st at i c es el valor por defecto del tipo al que pertenece.

Por ejemplo:

cl ass Pr ueba
{
publ i c st at i c i nt x;
. . .
. . .
}

Su uso podra ser:

Pr ueba. x = 5;
Pr ueba p1 = new Pr ueba( ) ;
Pr ueba p2 = new Pr ueba( ) ;

p1. x = 10;

Lo relevante de las variables estticas -st at i c- es que slo hay una para todas las
instancias u objetos que se creen del tipo que las contiene, no una por cada objeto que se
cree. Por eso se les llama tambin variables de clase y pueden invocarse a travs del
nombre de la clase: no es necesario crear un objeto de la clase. Tras el ejemplo anterior,
tanto p1. x como p2. x valdrn 10, ya que slo existir una variable x para ambos. Ms
adelante, al hablar del concepto de clase, se ampliar este concepto.
Variables de instancia.
Cualquier campo declarado sin el modificador st at i c se considera una variable de
instancia.
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
27/36

Una variable de instancia puede pertenecer a un tipo cl ass o a un tipo st r uct .
Cada objeto de un determinado tipo tendr sus propias variables de instancia.

Por ejemplo:

cl ass Pr ueba
{
publ i c i nt x;
. . .
. . .
}

Su uso podra ser:

Pr ueba p1 = new Pr ueba( ) ;
Pr ueba p2 = new Pr ueba( ) ;

p1. x = 10;
p2. x = 20;

En este ejemplo, la variable x de la instancia referenciada por p1 valdr 10 y la de la
instancia referenciada por p2 valdr 20.

No tiene sentido lo que se indica a continuacin, ya que x es una variable que no est
asociada a cada objeto y existe una variable x distinta para cada objeto:

Pr ueba. x = 5; / / est a i nst r ucci n dar un er r or de compi l aci n.

Al estudiar los modificadores de acceso, se tratarn con ms profundidad los conceptos
de variable esttica o de clase y campo o variable de objeto o instancia
Elementos de Array.
Los elementos de un array son creados cuando se crea la instancia del array y se
desasignan cuando la instancia del array deja de ser referenciada. El valor inicial de
cada uno de los elementos del array es el valor por defecto del tipo de los elementos del
array.
Ejemplo:

i nt [ ] ar r Numer osEnt er os = {5, 7 , 9};
i nt [ 5] ar r Numer osEnt er os2;
st r i ng[ 3, 5] mat r i zSt r i ngs;
. . .
ar r Numer osEnt er os[ 0] = 20;
ar r Numer osEnt er os2[ 0] = 25;
mat r i zSt r i ngs[ 2, 2] = Hol a
. . .

Existe una clase Syst em. Ar r ay en el Framework .NET que encapsula el manejo de los
arrays tradicionales.

Parmetros.
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
28/36
Pueden ser de tres tipos:

Parmetros valor: son los parmetros que no tienen modificador. Un parmetro valor
se crea para pasar una variable por valor a un mtodo. Se crea una copia del valor del
parmetro y se destruye cuando la funcin acaba y devuelve el control (es similar a
una variable local).

Ejemplo:

/ / Suma dos nmer os
usi ng Syst em;
publ i c cl ass Cl aseSumador a
{
publ i c st at i c l ong Aadi r ( l ong i , l ong j )
{
r et ur n( i +j ) ;
}
}

La llamada es de la forma:

Cl aseSumador a. Aadi r ( 20, 50) ;

Parmetros referencia: se declaran utilizando el modificador r ef . Un parmetro
referencia representa la referencia a una instancia existente de un tipo.

Ejemplos:

cl ass Pr ueba
{
st at i c voi d F( r ef obj ect x) {. . . }
st at i c voi d Mai n( ) {
obj ect [ ] a = new obj ect [ 10] ;
F( r ef a[ 0] ) ;
}
}

cl ass Pr ueba2
{
st at i c voi d Swap( r ef i nt x, r ef i nt y) {
i nt t emp = x;
x = y;
y = t emp;
}
st at i c voi d Mai n( ) {
i nt i = 1, j = 2;
Swap( r ef i , r ef j ) ;
Consol e. Wr i t eLi ne( " i = {0}, j = {1}" , i , j ) ;
}
}


Parmetros out (de salida): se declaran utilizando el modificador out . Un parmetro
de tipo out o salida es realmente una referencia a una instancia ya existente. La
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
29/36
diferencia con un parmetro referencia es que la instancia referenciada por el
parmetro out no tiene porqu estar inicializada.

cl ass Pr ueba3
{
st at i c voi d Sal i da( out i nt x) {
x = 5;
}
st at i c voi d Mai n( ) {
i nt i ;
Sal i da( out i ) ;
Consol e. Wr i t eLi ne( " i = " , i ) ;
}
}

Variables Locales.
Una variable local puede ser declarada dentro de un bloque, una sentencia f or o una
sentencia swi t ch, etc. El ciclo de vida de una variable local es el bloque o sentencia en
el que ha sido declarado.

Una variable local no es inicializada automticamente y no tiene valor por defecto, por
lo tanto ha de ser inicializada explcitamente.

En el ejemplo siguiente, la variable i es local a f or :

cl ass Mi Cl ase
{
st at i c voi d Mai n( st r i ng[ ] ar gs)
{
f or ( i nt i =0; i <3; i ++)
{
Consol e. Wr i t e( " El ement o {0}" , i ) ;
Consol e. Wr i t eLi ne( " {0}" , i *i ) ;
}
}

}


Operadores.
Existen tres tipos de operadores:
- Unarios: Se asocian a un solo operando. Algunos pueden ir delante (++x, - x) y
otros detrs del operando (x++).
- Binarios: Se asocian a dos operandos. Por ejemplo: x+y.
- Ternarios: se asocian a tres operandos. Slo existe un operador ternario, ?: . Por
ejemplo: var 1? val or 2: val or 3.

El orden de evaluacin de los operadores en una expresin est determinado por la
precedencia y asociatividad de los operadores.

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
30/36
La tabla 3.10 muestra la precedencia de los operadores. Est ordenada de mayor a
menor precedencia:

Categora Operadores
Primarios
( x) x. y f ( x) a[ x] x++ x- - new
t ypeof si zeof checked unchecked
Unarios
+ - ! ~ ++x - - x ( T) x
Multiplicativos
* / %
Aditivos
+ -
Desplazamiento
<< >>
Relacionales
< > <= >= i s
Igualdad
== ! =
AND Lgico
&
XOR Lgico
^
OR Lgico
|
AND Condicional
&&
OR Condicional
| |
Condicionales
?:
Asignacin
= *= / = %= += - = <<= >>= &= ^= | =

Tabla 3.10. Precedencia de los operandos.

Cuando un operando se encuentra entre dos operadores con la misma precedencia, la
asociatividad de los operadores controla el orden en el cual se realizan las operaciones.

- Excepto los operadores de asignacin, todos los operadores binarios son
asociativos a izquierdas, es decir, la expresin:

x + y + z

se evala como

( x + y) + z

- El operador de asignacin y el operador condicional son asociativos a derechas.
Por ejemplo:

x = y = z

se evala como

x = ( y = z) .

- La precedencia y asociatividad pueden ser modificadas mediante el uso de
parntesis.

Por ejemplo:

( x = y) = z

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
31/36
se evala de izquierda a derecha. El orden preestablecido sin parntesis es de
derecha a izquierda.

Operadores de informacin de Tipo.
typeof.
El operador t ypeof se utiliza para obtener el objeto Syst em. Type correspondiente a un
tipo. Se utiliza mucho en la reflexin, cuando se quiere obtener informacin acerca de
un determinado tipo dinmicamente. La sintaxis es:

Type t ypeof ( tipo)

donde:

tipo
Es el tipo para el cual se quiere obtener el objeto Syst em. Type.

t ypeof devuelve un objeto de tipo Type.

Ejemplo:

Type t 1=t ypeof ( Mi Cl ase) ;
Type t 2=t ypeof ( i nt ) ;

Para obtener el tipo de una determinada expresin, objeto, o instancia, C#proporciona
el mtodo Get Type( ) , cuya estructura es:

Syst em. Type unObj et o. Get Type( ) ;

Get Type( ) es un mtodo que todos los tipos heredan de la clase obj ect . Devuelve un
objeto del tipo Type del objeto unObj et o.

Por ejemplo:

doubl e unDoubl e=98. 34;
Type t =unDoubl e. Get Type( ) ;

Un ejemplo completo:

usi ng Syst em;

namespace Pr uebaNamespace
{

cl ass Mi Cl ase
{
i nt unEnt er o;
publ i c doubl e unDoubl e;
st at i c voi d Mai n( st r i ng[ ] ar gs)
{
Mi Cl ase unaCl ase=new Mi Cl ase( ) ;
Type t 1=t ypeof ( Mi Cl ase) ;
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
32/36
Consol e. Wr i t eLi ne( t 1. ToSt r i ng( ) ) ;
Type t 2=t ypeof ( i nt ) ;
Consol e. Wr i t eLi ne( t 2. ToSt r i ng( ) ) ;
Type t 3=unaCl ase. unEnt er o. Get Type( ) ;
Consol e. Wr i t eLi ne( t 3. ToSt r i ng( ) ) ;
/ / unaCl ase. unDoubl e.
Type t 4=unaCl ase. unDoubl e. Get Type( ) ;
Consol e. Wr i t eLi ne( t 4. ToSt r i ng( ) ) ;


}
}
}
La salida de este programa es:

Pr uebaNamespace. Mi Cl ase
Syst em. I nt 32
Syst em. I nt 32
Syst em. Doubl e
is.
El operador i s se utiliza para chequear en tiempo de ejecucin si el tipo de una
expresin es compatible con un tipo de objeto dado.

expresion is tipo

donde:

expresion
Es una expresin de tipo referencia.

tipo
Es un tipo referencia.

Este operador no puede ser sobrecargado. Devuelve Tr ue o Fal se.

Por ejemplo:

usi ng Syst em;

namespace Pr uebaNamespace
{

cl ass Mi Cl ase
{
st at i c voi d Mai n( st r i ng[ ] ar gs)
{
i nt unEnt er o=7;
Mi Cl ase unaCl ase=new Mi Cl ase( ) ;
Consol e. Wr i t eLi ne( 3*5 i s i nt ) ;
Consol e. Wr i t eLi ne( unaCl ase i s Mi Cl ase) ;
i f ( unEnt er o i s obj ect )
Consol e. Wr i t eLi ne( " unEnt er o es un obj et o" ) ;
}
}
}
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
33/36

La salida es

Tr ue
Tr ue
unEnt er o es un obj et o

as.
El operador as se utiliza para realizar conversiones entre tipos compatibles. Se utiliza
del siguiente modo:

expresion as tipo

donde:

expresion
Es una expresin de tipo referencia.

tipo
Es un tipo referencia.

El operador as realiza una conversin. Si dicha conversin no se realiza con xito, se
devuelve el resultado de la conversin. En caso contrario se devuelve nul l pero sin
lanzar una excepcin.

En realidad, la expresin:

expr esi on as tipo

es equivalente a:

expr esi on i s tipo? ( t i po) expr esi on : ( t i po) nul l

con la diferencia de que la expresin se evala slo una vez.

Ejemplo:

usi ng Syst em;

namespace Pr uebaNamespace
{
cl ass Mi Cl ase1
{
}

cl ass Mi Cl ase2
{
}

cl ass Mi Cl ase
{
publ i c st at i c voi d Mai n( )
{
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
34/36
obj ect [ ] mi sObj et os = new obj ect [ 6] ;
mi sObj et os[ 0] = new Mi Cl ase1( ) ;
mi sObj et os[ 1] = new Mi Cl ase2( ) ;
mi sObj et os[ 2] = " hol a" ;
mi sObj et os[ 3] = 123;
mi sObj et os[ 4] = 123. 4;
mi sObj et os[ 5] = nul l ;

f or ( i nt i =0; i < mi sObj et os. Lengt h; ++i )
{
st r i ng s = mi sObj et os[ i ] as st r i ng;
Consol e. Wr i t e ( " {0}: " , i ) ;
i f ( s ! = nul l )
Consol e. Wr i t eLi ne ( " ' " + s + " ' " ) ;
el se
Consol e. Wr i t eLi ne ( " no es un st r i ng" ) ;
}
}

}
}

La salida de este programa es:

0: no es un st r i ng
1: no es un st r i ng
2: hol a
3: no es un st r i ng
4: no es un st r i ng
5: no es un st r i ng

Sobrecarga de operadores.
Existe una implementacin predefinida para todos los operadores unarios y binarios. No
obstante, en clases y estructuras es posible sobrecargar ciertos operadores. Un operador
sobrecargado siempre tiene preferencia sobre el operador predefinido.

Los operadores unarios que es posible sobrecargar son:

+ - ! ~ ++ - - Tr ue Fal se

Los binarios son:

+ - * / % & | ^ << >> == ! = > < >= <=

No es posible sobrecargar:
- el acceso a miembros de un tipo.
- la invocacin de mtodos.
- los operadores =, &&, | | , ?: , new, t ypeof , si zeof e i s.

Cuando se sobrecarga un operador binario, el correspondiente operador de asignacin es
sobrecargado implcitamente. Por ejemplo, una sobrecarga del operador +es tambin
una sobrecarga del operador +=.

Marco Besteiro y Miguel Rodrguez Los Tipos en C#
35/36
Ms adelante, cuando se hable de la sobrecarga de mtodos, se tratar con ms detalle la
sobrecarga de operadores.

Conversiones.
Conversiones implcitas.

Cualquier tipo puede convertirse de modo implcito a otro tipo segn el orden que se
adjunta a continuacin:

sbyt e shor t i nt l ong f l oat doubl e o deci mal

byt e shor t ushor t i nt ui nt l ong ul ong f l oat
doubl e o deci mal

char ushor t

En todos esos casos no se pierden datos.

Adems se pueden realizar las siguientes conversiones implcitas:

- conversiones implcitas de enumeraciones: permiten convertir un literal entero
decimal a un tipo enum.
- conversiones implcitas de referencia (estndar):

o De cualquier tipo referencia a obj ect .
o De cualquier tipo cl ass a otro tipo cl ass que sea superclase suya.
o De cualquier tipo cl ass a cualquier tipo i nt er f ace, si el primero
implementa la i nt er f ace.
o De cualquier tipo ar r ay a Syst em. Ar r ay.
o De cualquier tipo del egat e a Syst em. Del egat e.
o De cualquier tipo ar r ay o tipo del egat e a Syst em. I Cl oneabl e.
o De tipo nul l a cualquier tipo referencia.

- Boxing (estndar).

- Conversiones implcitas de constantes (estndar):

o Una expresin constante de tipo i nt puede ser convertida a tipo sbyt e,
byt e, shor t , ushor t , ui nt , o ul ong.
o Una expresin const ant de tipo l ong puede ser convertida a tipo ul ong.

- Conversiones implcitas definidas por el usuario.

Conversiones explcitas.

Las conversiones explcitas han de ser indicadas explcitamente y se pueden aplicar a:

- Todas las conversiones implcitas.
- Unboxing.
Marco Besteiro y Miguel Rodrguez Los Tipos en C#
36/36
- conversiones numricas.
- conversiones de referencia.
- conversiones de enumeraciones.
- conversiones de interfaces.
- conversiones explcitas definidas para el usuario.

You might also like