protected: Desde una clase slo puede accederse a miembros protected de
objetos de esa misma clase o de subclases suyas. As, en el siguiente cdigo las instrucciones comentadas con // Error no son vlidas por lo escrito junto a ellas private: Slo puede ser accedido desde el cdigo de la clase a la que pertenece. Es lo considerado por defecto. internal: Slo puede ser accedido desde cdigo perteneciente al ensamblado en que se ha definido. protected internal: Slo puede ser accedido desde cdigo perteneciente al ensamblado en que se ha definido o desde clases que deriven de la clase donde se ha definido. Conceptos de clase y objeto C# es un lenguaje orientado a objetos puro[6], lo que significa que todo con lo que vamos a trabajar en este lenguaje son objetos. Un objeto es un agregado de datos y de mtodos que permiten manipular dichos datos, y un programa en C# no es ms que un conjunto de objetos que interaccionan unos con otros a travs de sus mtodos. Una clase es la definicin de las caractersticas concretas de un determinado tipo de objetos. Es decir, de cules son los datos y los mtodos de los que van a disponer todos los objetos de ese tipo. Por esta razn, se suele decir que el tipo de dato de un objeto es la clase que define las caractersticas del mismo[7]. Sintaxis de definicin de clases La sintaxis bsica para definir una clase es la que a continuacin se muestra:
class <nombreClase> { <miembros> } Campos: Un campo es un dato comn a todos los objetos de una determinada clase. Para definir cules son los campos de los que una clase dispone se usa la siguiente sintaxis dentro de la zona sealada como <miembros> en la definicin de la misma:
<tipoCampo> <nombreCampo>; A continuacin se muestra un ejemplo de definicin de una clase de nombre Persona que dispone de tres campos:
class Persona { string Nombre;// Campo de cada objeto Persona que almacena su nombre int Edad; // Campo de cada objeto Persona que almacena su edad string NIF; // Campo de cada objeto Persona que almacena su NIF } Metodos:Un mtodo es un conjunto de instrucciones a las que se les asocia un nombre de modo que si se desea ejecutarlas basta referenciarlas a travs de dicho nombre en vez de tener que escribirlas. Dentro de estas instrucciones es posible acceder con total libertad a la informacin almacenada en los campos pertenecientes a la clase dentro de la que el mtodo se ha definido, por lo que como al principio del tema se indic, los mtodos permiten manipular los datos almacenados en los objetos. Creacin de objetos Operador new Ahora que ya sabemos cmo definir las clases de objetos que podremos usar en nuestras aplicaciones ha llegado el momento de explicar cmo crear objetos de una determinada clase. Algo de ello ya se introdujo en el Tema 4: Aspectos Lxicos cuando se coment la utilidad del operador new, que precisamente es crear objetos y cuya sintaxis es:
new <nombreTipo>(<parametros>) Constructor por defecto No es obligatorio definir un constructor para cada clase, y en caso de que no definamos ninguno el compilador crear uno por nosotros sin parmetros ni instrucciones. Es decir, como si se hubiese definido de esta forma:
<nombreTipo>(){} Concepto de herencia El mecanismo de herencia es uno de los pilares fundamentales en los que se basa la programacin orientada a objetos. Es un mecanismo que permite definir nuevas clases a partir de otras ya definidas de modo que si en la definicin de una clase indicamos que sta deriva de otra, entonces la primera -a la que se le suele llamar clase hija- ser tratada por el compilador automticamente como si su definicin incluyese la definicin de la segunda a la que se le suele llamar clase padre o clase base. Las clases que derivan de otras se definen usando la siguiente sintaxis:
class <nombreHija>:<nombrePadre> { <miembrosHija> } Mtodos virtuales Ya hemos visto que es posible definir tipos cuyos mtodos se hereden de definiciones de otros tipos. Lo que ahora vamos a ver es que adems es posible cambiar dichar definicin en la clase hija, para lo que habra que haber precedido con la palabra reservada virtual la definicin de dicho mtodo en la clase padre. A este tipo de mtodos se les llama mtodos virtuales, y la sintaxis que se usa para definirlos es la siguiente:
Clases abstractas Una clase abstracta es aquella que forzosamente se ha de derivar si se desea que se puedan crear objetos de la misma o acceder a sus miembros estticos (esto ltimo se ver ms adelante en este mismo tema) Para definir una clase abstracta se antepone abstract a su definicin, como se muestra en el siguiente ejemplo:
public abstract class A { public abstract void F(); } abstract public class B: A { public void G() {} } class C: B { public override void F(){} } Polimorfismo Concepto de polimorfismo El polimorfismo es otro de los pilares fundamentales de la programacin orientada a objetos. Es la capacidad de almacenar objetos de un determinado tipo en variables de tipos antecesores del primero a costa, claro est, de slo poderse acceder a travs de dicha variable a los miembros comunes a ambos tipos. Sin embargo, las versiones de los mtodos virtuales a las que se llamara a travs de esas variables no seran las definidas como miembros del tipo de dichas variables, sino las definidas en el verdadero tipo de los objetos que almacenan. A continuacin se muestra un ejemplo de cmo una variable de tipo Persona puede usarse para almacenar objetos de tipo Trabajador. En esos casos el campo Sueldo del objeto referenciado por la variable no ser accesible, y la versin del mtodo Cumpleaos() a la que se podra llamar a travs de la variable de tipo Persona sera la definida en la clase Trabajador, y no la definida en Persona: Encapsulacin Ya hemos visto que la herencia y el polimorfismo eran dos de los pilares fundamentales en los que es apoya la programacin orientada a objetos. Pues bien, el tercero y ltimo es la encapsulacin, que es un mecanismo que permite a los diseadores de tipos de datos determinar qu miembros de los tipos creen pueden ser utilizados por otros programadores y cules no. Las principales ventajas que ello aporta son: Se facilita a los programadores que vaya a usar el tipo de dato (programadores clientes) el aprendizaje de cmo trabajar con l, pues se le pueden ocultar todos los detalles relativos a su implementacin interna y slo dejarle visibles aquellos que puedan usar con seguridad. Adems, as se les evita que cometan errores por manipular inadecuadamente miembros que no deberan tocar. Se facilita al creador del tipo la posterior modificacin del mismo, pues si los programadores clientes no pueden acceder a los miembros no visibles, sus aplicaciones no se vern afectadas si stos cambian o se eliminan. Gracias a esto es posible crear inicialmente tipos de datos con un diseo sencillo aunque poco eficiente, y si posteriormente es necesario modificarlos para aumentar su eficiencia, ello puede hacerse sin afectar al cdigo escrito en base a la no mejorada de tipo. Concepto de mtodo Un mtodo es un conjunto de instrucciones a las que se les da un determinado nombre de tal manera que sea posible ejecutarlas en cualquier momento sin tenerlas que rescribir sino usando slo su nombre. A estas instrucciones se les denomina cuerpo del mtodo, y a su ejecucin a travs de su nombre se le denomina llamada al mtodo. Constructores Concepto de constructores Los constructores de un tipo de datos son mtodos especiales que se definen como miembros de ste y que contienen cdigo a ejecutar cada vez que se cree un objeto de ese tipo. ste cdigo suele usarse para labores de inicializacin de los campos del objeto a crear, sobre todo cuando el valor de stos no es constante o incluye acciones ms all de una asignacin de valor (aperturas de ficheros, accesos a redes, etc.) Hay que tener en cuenta que la ejecucin del constructor siempre se realiza despus de haberse inicializado todos los campos del objeto, ya sea con los valores iniciales que se hubiesen especificado en su definicin o dejndolos con el valor por defecto de su tipo. Aparte de su especial sintaxis de definicin, los constructores y los mtodos normales tienen una diferencia muy importante: los constructores no se heredan. Definicin de constructores La sintaxis bsica de definicin de constructores consiste en definirlos como cualquier otro mtodo pero dndoles el mismo nombre que el tipo de dato al que pertenecen y no indicando el tipo de valor de retorno debido a que nunca pueden devolver nada. Es decir, se usa la sintaxis:
<modificadores> <nombreTipo>(<parmetros>) { <cdigo> } Destructores Al igual que es posible definir mtodos constructores que incluyan cdigo que gestione la creacin de objetos de un tipo de dato, tambin es posible definir un destructor que gestione cmo se destruyen los objetos de ese tipo de dato. Este mtodo suele ser til para liberar recursos tales como los ficheros o las conexiones de redes abiertas que el objeto a destruir estuviese acaparando en el momento en que se fuese a destruir. La destruccin de un objeto es realizada por el recolector de basura cuando realiza una recoleccin de basura y detecta que no existen referencias a ese objeto ni en pila, ni en registros ni desde otros objetos s referenciados. Las recolecciones se inician automticamente cuando el recolector detecta que queda poca memoria libre o que se va a finalizar la ejecucin de la aplicacin, aunque tambin puede forzarse llamando al mtodo Collect() de la clase System.GC La sintaxis que se usa para definir un destructor es la siguiente:
~<nombreTipo>() { <cdigo> } Atributos Un atributo es informacin que se puede aadir a los metadatos de un mdulo de cdigo. Esta informacin puede ser referente tanto al propio mdulo o el ensamblado al que pertenezca como a los tipos de datos definidos en l, sus miembros, los parmetros de sus mtodos, los bloques set y get de sus propiedades e indizadores o los bloques add y remove de sus eventos. En C# se incluyen numerosos modificadores que nos permiten asociar informacin a los metadatos de un mdulo. Por ejemplo, con los modificadores public, protected, private, internal o protected internal podemos aadir informacin sobre la visibilidad de los tipos del mdulo y de sus miembros. Pues bien, los atributos pueden verse como un mecanismo mediante el cual el programador puede crear sus propios modificadores. Los parmetros de un atributo pueden ser de dos tipos: Parmetros sin nombre: Se usan de forma similar a los parmetros de los mtodos, slo que no pueden contar con modificadores ref u out. Parmetros con nombre: Son opcionales y pueden colocarse en cualquier posicin en la lista de <parmetros> del atributo. Lo ltimo se debe a que para darles valor se usa la sintaxis <nombreParmetro>=<valor>, con lo el compilador no depender de la posicin en que se les pasen los valores para determinar a qu parmetro se le est dando cada valor, sino que recibe explcita su nombre.
Caractersticas de C# Con la idea de que los programadores ms experimentados puedan obtener una visin general del lenguaje, a continuacin se recoge de manera resumida las principales caractersticas de C# Alguna de las caractersticas aqu sealadas no son exactamente propias del lenguaje sino de la plataforma .NET en general, y si aqu se comentan es porque tienen una repercusin directa en el lenguaje: Sencillez: C# elimina muchos elementos que otros lenguajes incluyen y que son innecesarios en .NET. Por ejemplo: o El cdigo escrito en C# es autocontenido, lo que significa que no necesita de ficheros adicionales al propio fuente tales como ficheros de cabecera o ficheros IDL o El tamao de los tipos de datos bsicos es fijo e independiente del compilador, sistema operativo o mquina para quienes se compile (no como en C++), lo que facilita la portabilidad del cdigo. o No se incluyen elementos poco tiles de lenguajes como C++ tales como macros, herencia mltiple o la necesidad de un operador diferente del punto (.) acceder a miembros de espacios de nombres (::) Modernidad: C# incorpora en el propio lenguaje elementos que a lo largo de los aos ha ido demostrndose son muy tiles para el desarrollo de aplicaciones y que en otros lenguajes como Java o C++ hay que simular, como un tipo bsico decimal que permita realizar operaciones de alta precisin con reales de 128 bits (muy til en el mundo financiero), la inclusin de una instruccin foreach que permita recorrer colecciones con facilidad y es ampliable a tipos definidos por el usuario, la inclusin de un tipo bsico string para representar cadenas o la distincin de un tipo bool especfico para representar valores lgicos. Orientacin a objetos: Como todo lenguaje de programacin de propsito general actual, C# es un lenguaje orientado a objetos, aunque eso es ms bien una caracterstica del CTS que de C#. Una diferencia de este enfoque orientado a objetos respecto al de otros lenguajes como C++ es que el de C# es ms puro en tanto que no admiten ni funciones ni variables globales sino que todo el cdigo y datos han de definirse dentro de definiciones de tipos de datos, lo que reduce problemas por conflictos de nombres y facilita la legibilidad del cdigo.
C# soporta todas las caractersticas propias del paradigma de programacin orientada a objetos: encapsulacin, herencia y polimorfismo.
En lo referente a la encapsulacin es importante sealar que aparte de los tpicos modificadores public, private y protected, C# aade un cuarto modificador llamado internal, que puede combinarse con protected e indica que al elemento a cuya definicin precede slo puede accederse desde su mismo ensamblado.
Rangos Tipo Descripcin Bits Rango de valores Alias SByte Bytes con signo 8 -128 127 sbyte Byte Bytes sin signo 8 0 255 byte Int16 Enteros cortos con signo 16 [-32.768, 32.767] short UInt16 Enteros cortos sin signo 16 [0, 65.535] ushort Int32 Enteros normales 32 [-2.147.483.648, 2.147.483.647] int UInt32 Enteros normales sin signo 32 [0, 4.294.967.295] uint Int64 Enteros largos 64 [-9.223.372.036.854.775.808, 9.223.372.036.854.775.807] long UInt64 Enteros largos sin signo 64 [0-18.446.744.073.709.551.615] ulong Single Reales con 7 dgitos de precisin 32 [1,510 -45 - 3,410 38 ] float Double Reales de 15-16 dgitos de precisin 64 [5,010 -324 - 1,710 308 ] double Decimal Reales de 28-29 dgitos de precisin 128 [1,010 -28 - 7,910 28 ] decimal Boolean Valores lgicos 32 true, false bool Char Caracteres Unicode 16 [\u0000, \uFFFF] char String Cadenas de caracteres Variable El permitido por la memoria string Object Cualquier objeto Variable Cualquier objeto object