Upload
jorge-g-lopez
View
215
Download
0
Embed Size (px)
DESCRIPTION
Manual C#
Citation preview
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 1/63
QuesC#?C#oCSharpesunlenguajedeprogramacinqueestincluidoenlaPlataforma.NETycorreenelLenguajeComnenTiempodeEjecucin(CLR,CommonLanguageRuntime).ElprimerlenguajeenimportanciaparaelCLResC#,muchodeloquesoportalaPlataforma.NETestescritoenC#.C#intentaserellenguajebaseparaescribiraplicaciones.NETC#derivadeCyC++,esmoderno,simpleyenteramenteorientadoaobjetos,simplificaymodernizaaC++enlasreasdeclases,namespaces,sobrecargademtodosymanejodeexcepciones.SeeliminolacomplejidaddeC++parahacerlomsfcildeutilizarymenospropensoaerrores.AlgunascaractersticasdeC#son:C#proveeelbeneficiodeunambienteeleganteyunificado.No soporta herenciamltiple, solamente el runtime .NET permite la herencia mltiple en la forma de
interfaces,lascualesnopuedencontenerimplementacin.Nomanejaapuntadores,paraemularlafuncindelosapuntadoresseutilizadelegateselcualproveelas
basesparael.NETeventmodel.Pordefaulttrabajaconcdigoadministrado.LaPlataforma .NETproveeun colectordebasuraquees responsabledeadministrar lamemoriaen los
programasC#.Elmanejodeerroresestbasadoenexcepciones.Soporta los conceptos como encapsulacin, herencia y polimorfismo de la programacin orientada a
objetos.ElModelocompletodeclasesestconstruidoenlacimadel.NETVirtualObjectSystem(VOS).Elmodelo
deobjetosespartedelainfraestructurayyanoformapartedellenguajedeprogrmacin.Noexistenfuncionesglobales,variablesoconstantes.Tododeberserencapsuladodentrodelaclase,como
unmiembrodelainstancia(accesibleviaunainstanciadeclase)ounmiembroesttico(viaeltipo).Losmtodosquesedefinenen lasclasessonpordefaultnovirtuales(nopuedensersobreescritosal
derivarclases)Soportalosmodificadoresdeaccesoprivate,protected,publicyagregauncuartomodificadorinternal.Solamentesepermiteunabaseclase,siserequiereherenciamltipleesposibleimplementarintefaces.Noesposibleutilizarvariablesnoinicializadas.Noesposiblehacerelcastdeunenteroauntipodereferencia(objeto).Losparmetrosquesonpasadossontypesafe.ElsoportedeversionesloproveeelCLR.Permite acceder a diferentes APIs a travs de .NET Common Language Specification, el cual define el
estdardeinteroperabilidadentrelenguajesqueseadhieranaesteestndar.LaPlataforma.NETproveeunaccesotransparenteaCOM.SoportaOLEPermitelainteroperabilidadconAPIsalestiloCyDLLs,estacaractersticaparaaccederaAPIsnativases
llamadaPlatformInvocationServices(PInvoke)Pordefaultelcdigoessafemode,peroesposibledeclararclasesoslomtodosunsafe,estadeclaracin
permiteutilizarapuntadores,estructurasyalmacenamientodearreglosestticos.C#dependedelruntimequeproveelaPlataforma.NET,elruntimeadministralaejecucindecdigo.
LenguajeOrientadoaObjetosSegnBjarneStroustrupautordellenguajedeprogramacinC++,paraqueunlenguajeseallamadoOrientadoaObjetosdebesoportartresconceptos:objetos,clasesyherencia.Aunqueloslenguajesorientadosaobjetosseconstruyensobrelosconceptosde:EncapsulacinHerenciaPolimorfismo
ObjetoUnObjetoesunainstanciadeuntipodeclase.La instanciacin es el acto de crear una instancia de un objeto, la instancia es un objeto, la instanciacin usa eloperadornew,despuslainstanciacinesposiblecomunicarnosconelobjetoatravsdesusmiembros.UnObjetoesunacoleccindeinformacinrelacionadayfuncional.Unobjetosecomponede:DatosquedescribenelobjetoyOperacionesquepuedenserrealizadasporelobjeto
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 2/63
HerenciaLaHerencia es la habilidadparaheredar datos y funcionalidaddeunobjetopadre, la herencia esuna caractersticafundamentaldeunsistemaorientadoaobjetos.Atravsdelaherenciaesposiblecrearoderivarunanuevaclasebasadaenunaclaseexistente.Una clase derivada es la nueva clase que esta siendo creada y la clase base es una de las cuales la nueva clase esderivada.Lanuevaclasederivadaheredatodoslosmiembrosdelaclasebaseporconsiguientepermitereusareltrabajoprevio.EnC#sepuedeasumirquelaclasederivadapodraheredartodoslosmiembrosdelaclasebase.Laherenciaesunejemplodeldiseoorientadoaobjetosconocidocomounarelacin"isa"(esun),porejemplo:"unempleadoesunapersona".Al utilizar la herencia la clase base necesita ser diseada teniendo enmente la herencia, si los objetos no tienen laestructuraapropiadalaherencianopodrafuncionarcorrectamente.Una clase derivadanodebera requerirmsni prometermenosque su clase base sobre cualquiera de sus interfacesheredadas.Unainterfazdeclaseesuncontratoentreestaylosprogramadoresqueusanlaclase.upcasting,cuandounprogramadortieneunareferenciaalaclasederivada,elprogramadorsiemprepuedetrataraesaclasecomosifueralaclasebase.Enellenguajecomnentiempodeejecucin.NETtodoslosobjetosheredandelaltimaclasebasellamadaobject yexisteslounaherenciasimpledeobjetos.Unobjetopuedederivarslodeunaclasebase.ClaseUnaClaseesunaplantillaparaunobjeto.UnaClasedefinelasoperacionesqueunobjetopuederealizarydefineunvalorquemantieneelestadodelobjeto,loscomponentesprincipalesdeunaclaseson:mtodos,eventosypropiedades.Unainstanciadeunaclaseesunobjeto,seaccedealafuncionalidaddeunobjetoinvocandosusmtodosyaccediendoasuspropiedades,eventosycampos.Unaclaseutilizamodificadoresparaespecificar laaccesibilidaddelaclaseysuscomponentes, loscomponentesdeunaclasesonllamadosmiembrosporloqueexistendiferentestiposdemiembros.Unareferenciaserefiereaunainstancia,una instancia es la creacin de un objeto del tipo clase que se est declarando. Una clase utiliza ninguno, uno omsconstructoresparaayudaradefinir la instanciadeunaclase.Existeunapalabrareservadallamadathis que sirveparahacerreferenciaalaclaseactualenelmbitoenelcualesutilizada.Cuandosehacereferenciaaunavariabledeinstanciaquetieneelmismonombredeunparmetrosedebeutilizarthis.name.Alcrearymanipularobjetosnoesnecesarioadministrarlamemoriaqueestosocupanyaqueexisteunmecanismoqueseencargadeesto llamadogarbagecollector (recolectordebasura),peroesunabuenaprcticanoolvidar liberar losrecursos.FuncionesMiembroUnaFuncinMiembropuedeserunconstructor,esdecir,unapiezadecdigoquees invocadaenuna instanciadelobjeto.CamposEstticosUnMiembroEstticodefininemiembrosdeunobjetoquenosonasociadosconunainstanciadeclaseespecfica.Un Campo Esttico es el tipo ms simple de un miembro esttico, para declarar un campo esttico se utiliza elmodificadorstatic.Uncampoestticopuedeaccederseatravsdelnombredelaclase,envezdelainstanciadelaclase(objeto): usingSystem; classMiContador{ //CampoEsttico publicstaticintiContador=0; publicMiContador(){ iContador++; } } classApp{ publicstaticvoidMain(){ MiContadorContadorA=newMiContador(); Console.WriteLine(MiContador.iContador); MiContadorContadorB=newMiContador(); Console.WriteLine(MiContador.iContador); } }Elejemplodeterminacuantasinstanciasdelobjetohansidocreadas.ClaseBaseUnaClasebaseesunobjetopadrededondesebasaunnuevotrabajo.ClaseDerivada
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 3/63
UnaClasederivadaesunobjetohijo.ClaseAbstractaUnaClaseAbstractadefinelasfuncionesqueunaclasederivadadebeimplementar.UnaClaseAbstractadefineuncontratoendonde las clasesderivadasdebendefinir las funcionesque la clasepadremarcautilizandolapalabrareservadaabstract,ademsquelaclasepadretambinsedefinecomoabstract. usingSystem; abstractpublicclassPersona{//Indicaquelaclaseesabstracta //Propiedades publicstringsNombre; publicintiEdad; //Constructor publicPersona(stringsNombre,intiEdad){ this.sNombre=sNombre; this.iEdad=iEdad; } //Mtodos abstractpublicstringTipo();//Mtodoquelaclasederivadadebeimplementar } //HerenciaSimple publicclassEmpleado:Persona{ publicEmpleado(stringsNombre,intiEdad):base(sNombre,iEdad){} overridepublicstringTipo(){ return"Empleado"; } } classApp{ //Aplicacin publicstaticvoidMain(){ Console.WriteLine("ArreglodeObjetos"); Empleado[]aProgramadores=newEmpleado[2]; aProgramadores[0]=newEmpleado("BillGates",50); aProgramadores[1]=newEmpleado("EricS.Raymond",60); for(inti=0;i
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 4/63
Losconstructoresnopuedenserheredados,porloqueesnecesarioescribirconstructoresysifuncionalmentenoexistealgunamodificacinseinvocaelconstructordelaclasequeheredautilizandolasintaxisbase.Siseomiteelconstructordelaclasebaseyesinvocadoelcompiladorpodrainvocarelconstructordelaclasebasesinparmetros. usingSystem; publicclassPersona{ //Propiedades publicstringsNombre; publicintiEdad; privatedoubledSueldo; //Constructor publicPersona(stringsNombre,intiEdad){ this.sNombre=sNombre; this.iEdad=iEdad; } //Mtodos publicstringTipo(){ return"Persona"; } publicvoidAsignarSueldo(doubledSueldo){ this.dSueldo=dSueldo; } publicdoubleObtenerSueldo(){ returnthis.dSueldo; } } //HerenciaSimple publicclassEmpleado:Persona{ publicEmpleado(stringsNombre,intiEdad):base(sNombre,iEdad){} publicnewstringTipo(){ return"Empleado"; } doubledSueldo; publicnewvoidAsignarSueldo(doubledSueldo){ this.dSueldo=dSueldo*dSueldo; } publicnewdoubleObtenerSueldo(){ returnthis.dSueldo; } } classApp{ //Aplicacin publicstaticvoidMain(){ PersonaMexicano=newPersona("GeradongelesNava",33); Console.WriteLine("Mexicano.sNombre:"+Mexicano.sNombre); Console.WriteLine("Mexicano.iEdad:"+Mexicano.iEdad); doubledSueldo=123.456; Mexicano.AsignarSueldo(dSueldo); Console.WriteLine("Mexicano.iSueldo:"+Mexicano.ObtenerSueldo()); Console.WriteLine("Mexicano.Tipo:"+Mexicano.Tipo()); Console.WriteLine("HerenciaSimple"); EmpleadoProgramador=newEmpleado("CarlosSalinasG.",53); Console.WriteLine("Programador.sNombre:"+Programador.sNombre); Console.WriteLine("Programador.iEdad:"+Programador.iEdad); Programador.AsignarSueldo(dSueldo); Console.WriteLine("Programador.iSueldo:"+Programador.ObtenerSueldo()); Console.WriteLine("Programador.Tipo:"+Programador.Tipo()); } }PolimorfismoyFuncionesVirtualesEl polimorfismo es la funcionalidad que permite a cdigo antiguo invocar cdigo nuevo, tambin permite extender elsistemasinmodificarelcdigoexistente,estoselograsobreescribiendooredefiniendoelcdigo,paralocualseutilizanfuncionesvirtualesylapalabraclaveoverride.Lasfuncionesabstractassonautomaticamentefuncionesvirtuales,lascualespermitenalprogramadorusarpolimorfismoparahacersucdigosimple.Virtualsignificaquecuandounainvocacinafuncionesmiembro,elcompiladordeberabuscarporeltiporealdelobjetoynoporeltipodelareferencia,einvocarenbasealtipolafuncinapropiada. usingSystem; publicclassPersona{ //Propiedades publicstringsNombre; publicintiEdad; //Constructor
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 5/63
publicPersona(stringsNombre,intiEdad){ this.sNombre=sNombre; this.iEdad=iEdad; } //Mtodos virtualpublicstringTipo(){ return"Persona"; } } //HerenciaSimple publicclassEmpleado:Persona{ publicEmpleado(stringsNombre,intiEdad):base(sNombre,iEdad){} overridepublicstringTipo(){ return"Empleado"; } } classApp{ //Aplicacin publicstaticvoidMain(){ PersonaMexicano=newPersona("GeradongelesNava",33); Console.WriteLine("Mexicano.sNombre:"+Mexicano.sNombre); Console.WriteLine("Mexicano.iEdad:"+Mexicano.iEdad); Console.WriteLine("Mexicano.Tipo:"+Mexicano.Tipo()); Console.WriteLine("ArreglodeObjetos"); Empleado[]aProgramadores=newEmpleado[2]; aProgramadores[0]=newEmpleado("BillGates",50); aProgramadores[1]=newEmpleado("EricS.Raymond",60); for(inti=0;i
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 6/63
LasolucinMicrosoft.NETcomprendecuatrocomponentesfundamentales:Servicios de Bloques de Construccin .NET o acceso programtico para ciertos servicios tales como
almacenamientodearchivos,calendarioypasaporte.NETelcualesunserviciodeverificacindeidentidad.DispositivosdeSoftware.NETelcualpodracorrersobrenuevosdispositivosInternet.La Experiencia de Usuario .NET la cual incluye caractersticas tales como interfaz natural, agentes de
informacin y etiquetas inteligentes es decir una tecnologa que automatiza hiperligas para informacinrelacionadaapalabrasyfrasesendocumentoscreadosporelusuario.La Infraestructura .NET la cual comprende la plataforma .NET, Microsoft Studio .NET, los Servidores
Corporativos.NETyMicrosoftWindows.NET
La Infraestructura .NET se refiere a todas las tecnologas que constituyen el nuevo ambiente para crear y ejecutaraplicaciones robustas, escalables y distribuidas. La parte de .NET que permite desarrollar estas aplicaciones es laplataforma.NET.La Plataforma .NET consiste de un Lenguaje Comn en Tiempo de Ejecucin (CLR) y la Biblioteca de Clases de laPlataforma.NETalgunasvecesllamadalaBibliotecadeClasesBase(CBL).ElCLRescomounamquinavirtual(elcdigoquecorredentrodelCLRenejecucinenunambienteencapsuladoycontrolado,separadosdeotrosprocesosenlamquina)enlacualfuncionanlasaplicaciones.NET,todos los lenguajes.NETtienenlabibliotecadeclasesdelaPlataforma.NETasudisposicin.LabibliotecadeclasesdelaPlataforma.NETincluyensoporteparacualquieradelosarchivosdeentrada/salidaybasededatosdeentrada/salidaparaXMLySOAP.La Plataforma .NET es una plataforma nueva que simplifica la aplicacin del desarrollo en ambientes altamentedistribuidosdeInternet.LaPlataforma.NETestdiseadaparacumplirlossiguientesobjetivos:Proveer un ambiente consistente de programacin orientada a objetos, tanto o si el cdigo objeto es
almacenado y ejecutado localmente, o si es ejecutado localmente pero distribuido en Internet o si esejecutadoremotamente.Proveer un ambiente de ejecucin de cdigo que minimice la distribucin de software y conflictos de
versiones.Proveerunambientedeejecucindecdigoquegarantice laejecucindecdigoseguro, incluyendoel
cdigocreadoporundesconocidoountercerosemiconfiable.Proveerunambientedeejecucindecdigoqueelimine losproblemasdedesempeodeambientesde
scriptsointerpretes.Hacer que la experiencia del desarrollador sea consistente a travs de una amplia variedad de
aplicaciones,talcomoaplicacionesbasadasenWindowsyaplicacionesbasadasenWeb.Construir toda la comunicacin sobreestndares industrialesparaasegurarqueel cdigobasadoen la
Plataforma.NETpuedaintegrarseconcualquierotrocdigo.
LaPlataforma.NETconsistededoscomponentesprincipales:ElLenguajeComnenTiempodeEjecucin(CLR)elcualeselfundamentodelaPlataforma.NETLaBibliotecadeClasesdelaPlataforma.NET,esunacoleccinorientadaaobjetosdetiposreusablesque
puedenutilizarseparadesarrollaraplicacionesenel rangodeaplicaciones tradicionalesdesde la lneadecomandosointerfacesdeusuariogrficas(GUI)hastaaplicacionesbasadasenlasltimasinovacionesqueproveeASP.NETtalescomoWebFormsyservicioswebXML.
Elruntimeesunaagentequeadministraelcdigoentiempodeejecucinalproveerdeservicionesprincipalescomolaadministracindememoria,administracindehilos,tambinimplementatiposestrictosdeseguridadyotrasformasdeverificacindecdigoqueasegurenlaseguridadyrobustez.Elconceptodeadministracindecdigoesprincipio fundamentaldelruntime.Elcdigoquemanipularelruntimeesconocidocomocdigoadministrado,mientrasqueelcdigoquenosermanipuladoporelruntimeesconocidocomouncdigonoadministrado.La plataforma .NETpuede almacenar componentes no administrados que son cargados por el CLR en sus procesos einicializadosporlaejecucindecdigoadministradodeestamanerasecreaunambientedesoftwarequepuedeexplotartantocaractersitcasdecdigoadministradocomolasdelcdigonoadministrado..NETCommonLanguageRuntimeCLREl .NET Common Language Runtime (Lenguage comn en tiempo de ejecucin .NET) es un ambiente basado encomponentes y C# esta diseado para facilitar la creacin de componentes. Todos los objetos son escritos comocomponentes y los componentes son el centro de accin, por ello que reciba el nombre de lenguaje cntrico decomponentes(componentcentric).LoscomponentescreadosenC#sontotalmenteautodescribiblesypuedenserutilizadossinunprocesoderegistro.C#ayudaenlacreacindecomponentesmedianteelruntimeyframework.NET,loscualesproveenunsistemadetipounificadoenelcualtodopuedesertratadocomounobjeto.CaractersticasdelCLRELCLRnoslosoportaelcompiladordeC#,tambineldeVisualBasicyC++,elcdigoquegeneranestoscompiladoresparasersoportadoporCLResllamadomanagedcode.AlgunosdelosbeneficiosquelasaplicacionesobtienendelCLRson:
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 7/63
IntegracindelenguajesatravsdelCommonLanguageSpecificationAdministracinautomaticadememoria,atravsdelrecolectordebasura.Manejodeexcepcionesdelenguajes.Seguridadtypesafety.Soportedeversiones.ModeloSimplificadoparalainteraccindecomponentes.
El CLR provee los beneficios anteriores, el compilador debe emitir los metadatos en el managed code.Losmetadatosdescribenlostiposenelcdigoysonempaquetadosenelcdigoejecutable.
ElCLRadministralamemoria,ejecucindehilos,ejecucindecdigo,verificacindecdigoseguro,compilacinyotrosservicios.EstascaractersticassonintrnsecasalaadministracindecdigoquecorresobreelCLR.LaseguridadyadministracindecomponentesdependedeunnmerodefactoresqueseincluyenensuorigencomoInternetredcorporativa,computadoralocal,esdecir,quizoquiznoestndisponiblesparadesempearoperacionesdeaccesoaarchivos,accesoaregistrosofuncionessensitivas,ansicomienzanautilizarseenelmismaaplicacinactiva.Elruntimeforzaelaccesoacdigoseguro,noesposibleaccederadatospersonales,sistemadearchivosored.El runtime tambin forza la robustez del cdigo implementando una infraestrucutra estricta de verificacin de cdigollamadoCommonTypeSystem(CTS),el cualaseguraque toda laadministracindecdigosedescribeasmisma.Lavariedad de compiladores Microsoft y de terceros genera cdigo administrado que conforma el CTS, es decir, que laadministracindecdigopuedeconsumirotrostiposeinstanciasadministradas,mientrasqueseforzaestrictamentelafidelidaddetipoyseguridaddetipo.Laadministracindelambientedelruntimeeliminacuestionesdesoftwarecomunes,liberandoporejemplorecursosqueyanosonutilizados.Elruntimetambinaceleralaproductividaddeldesarrollador,noimportaellenguajequeunprogramadorutilice,puedeutilizar las ventajas del runtime, biblioteca de clases, y componentes escritos por otros programadores, cualquiercompiladorqueutiliceelruntimepuedehacerlomismo,La interoperabilidad entre cdigo administrado y no administrado permiten a los desarrolladores continuar utilizandocomponentesCOMyDLLs.El runtime est diseado para incrementar el desempeo, atravs del CLR que proveemuchos servicios estndar, elcdigoadministradonuncaesinterpretado,unacaractersticallamadajustintime(JIT)permitecompilartodoelcdigoadministradopara correrenel lenguajenativode lamquinadel sistemaode cualquieraqueseesteejecutando.Eladministradordememoriaeliminalasposibilidadesdefragmentacindememoriaeincrementalareferenciadelocalidaddememoriaparaimpulsarelincrementodeldesempeo.ElruntimesoportaaplicacionesdelladodelservidorcomoMicrosoftSQLServereInternetInformationServices(IIS),estainfraestructurapermiteutilizarcodigoadministradoparaescribirlalgicadelnegocio..NETRuntimeEnvironmentElLenguajeComnenTiempodeEjecucinprovee losserviciosdeejecucinbsica.Lasclasesbaseproveentiposdedatosbsicos,clasescoleccinyotrasclasesgenerales.LasclasesbasesonclasesparatratardatosyXML.Enlapartesuperiordelaarquitecturalasclasesexponenservicioswebytratramientodelaintefazdeusuario.Unaaplicacinpuedehacerinvocacionesencualquiernivelyutilizarclasesdesdecualquiernivel.Organizacin.NETFramework:
ServiciosWeb InterfazdeUsuarioDatosyXMLClasesBase
LenguajeComnenTiempodeEjecucin
Ambiente/EntornodeEjecucinElambienteoentornoproveeunmodelodeprogramacinsimple,seguro,soportadeherramientaspotentesyayudaconladistribucin,empaquetadoysoporte:ModelodeProgramacinSimple,todoslosserviciossonofrecidosatravsdeunmodelocomnquepuede
seraccedidodesdecualquierlenguaje.NETylosserviciospuedenserescritosencualquierlenguaje.NET,elentornooambienteengranparteesunlenguajeagnsticopermitiendolaeleccindelenguaje,estohaceelcdigofcildereusarparaelprogramadorylosproveedoresdebibliotecas.Enelruntime.NETtodosloserroressonreportadosviaexcepciones.El entorno contiene las Bibliotecas de Clase Base (Base Class Libraries BCL) las cuales proveen lasfuncionestradicionalesfundadasenbibliotecasentiempodeejecucin,lafuncionalidaddelBCLincluye:Clasescoleccin,talescomoconsultas,arreglos,pilasytablashash.ClasesdeaccesoabasesdedatosClasesIO(inputoutput)ClasesWinForms,paracrearinterfacesdeusuarioClasesNetwork
Fueradelaclasebaseentiempodeejecucin,existenmuchosotroscomponentesquecontrolanlainterfazdeusuario
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 8/63
(UI)yrealizanotrasoperacionessofisticadas.Seguridad,elentornodelruntime.NETestdiseadoparaserunentornoseguro.Elruntime.NET esun
entorno administrado o controlado, lo cual significa que el runtime administra la memoria por elprogramadoratravsdelrecolectordebasura.Elruntime.NETesunentornoverificado,entiempodeejecucinelentornoverificaque laejecucindelcdigoseadetiposegura(typesafe).Elsistemadeseguridadinteractuaconelverificadorparaasegurarqueelcdigorealicesloloquetienepermitido hacer, esto es posible especificando un requerimiento de seguridad para una pieza de cdigoespecfica.
Soportedeherramientaspotentes,Microsoftsuministracuatrolenguajes.NET:VB,VC++,C#yJScript.Ladepuracin en granmedida es enriquecida por el runtime .NET, el modelo de ejecucin comn hace ladepuracindelenguajessimpleydirecta.Distribucin, empaquetado y soporte,El runtime .NET ayuda simplificando la distribucin y en algunos
casos no existe el paso tradicional de instalacin, porque los paquetes son distribuidos en un formatogenrico, un paquete puede correr en cualquier entorno que soporte .NET, el entorno separa loscomponentesdeunaaplicacinporloqueunaaplicacinslocorreconloscomponentesquesonenviados.
EnsamblajeEnelruntime.NETelmecanismodeempaquetadoeselensamble(assembly),cuandoelcdigoescompiladoporunodeloscompiladores.NET,esconvertidoaunaformaintermediaconocidacomoIL.ElensamblecontienetodoslosIL,metadatosyotrosarchivosrequeridosparaqueunpaqueteseejecuteenunpaquetecompleto.Cadaensamblecontieneunmanifiestoqueenumeratodoslosarchivosqueestncontenidosenelensamble,controlaquetiposyrecursossonexpuestosfueradelensambleyrelacionalasreferenciasdeesostiposyrecursosalosarchivosquecontienenlostiposyrecursos.Elmanifiestotambinlistaotrosensamblesquedependendeunensamble.Losensamblessecontienenasmismo,existesuficienteinformacinenelensambleparaserautodescrito.Cuandosedefineunensamble,elensamblepuedesercontenidoenunsoloarchivoopuedeserdivididoentrevariosarchivos.Utilizandovariosarchivospodrahacerposibleunescenariodondelasseccionesdelensambleseandescargadasslocomosenecesiten.InteroperabilidaddeLenguajeUnadelasmetasdelruntime.NETesserunlenguajeagnstico,permitiendoqueelcdigoseautilizadoyescritodesdecualquierlenguaje,noslolasclasespuedenserescritasenalgnlenguaje.NETcomoVB.NETyserinvocadasdesdeotrolenguaje.NETcomoC#,unaclasequefuescritaenVB.NETpuedeserutilizadacomounaclasebaseescritaenC#yesaclasepodraserutilizadadesdeunaclaseVC++oJScript,esdecir,noimportariaenqueclaseseaescritaunaclase.Parahacerloanteriorposibleexistenalgunosobstaculoscomolaspropiascaractersticasdellenguaje,yaqueunlenguajenopodrasoportarciertascosasqueotrosilassoporte,porejemplolasobrecargadeoperadores.Para que una clase sea utilizada desde un lenguaje .NET, la clase debe adherir la Especificacin Comn deLenguaje(CommonLanguageSpecificationCLS) lacualdescribequecaractersticaspuedenservisiblesen la interfazpblicadelaclase,porejemploelCLSprohibeexponertiposdedatossinsigno,porquenotodosloslenguajespuedenutilizarlos.AtributosEl runtime .NET soporta atributos personalizables, los cuales son en cierto sentido un lugar para colocar informacindescriptiva en losmetadatos junto con un objeto y entonces recuper despus los datos. Los atributos proveen unmecanismogeneralparahacerestoysonutilizadosenexcesoentodoeltiempodeejecucinparaalmacenarinformacinquemodificacomoelruntimeutilizalasclases.Losatributossonextensiblesypermitealosprogramadoresdefiniratributosyutilizarlos.Losatributosseespecificanencerrandolosentrecorchetes:[Version("14/09/2005",Comentario="1.0.1.0")]
Losatributossonanotacionesquesecolocanenelementosdecdigofuente,comoclases,miembros,parmetros,etc.Losatributospuedeserutilizadospara:cambiarelcomportamientodelruntime,proveerinformacinacercadeunobjeto,llevarinformacinorganizacionalaldiseador.Elatributoinformacinesalmacenadoconlosmetadatosdelelementoypuedenserfacilmenterecuperadosentiempodeejecucinatravsdeunprocesoconocidocomoreflection.C#utilizaunAtributoCondicionalparacontrolarcuandolasfuncionesmiembrosoninvocadas.Porconvencinlosatributosseagreganalfinaldelnombredeunaclase,conlafinalidaddeconocercualessonclasesatributoycualessonclasesnormales.TodoslosatributosderivandeSystem.Attribute.Procurequeelatributoparaelelementoseaespecfico,utilizandolosidentificadoressiguientes:
Identificador Descripcinassembly ensamblemodule mdulotype claseoestructura
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px%3 9/63
method mtodoproperty porpiedadevent eventofield campoparam parmetroreturn valorderegreso
Losatributosquesonaplicadosaensamblesomdulosdebencolocarsedespusdecualquierclusulausingyantesdecualquiercdigo.BibliotecadeClasesdelaPlataforma.NETLaBibliotecadeClasesdelaPlataforma.NETesunacoleccindetiposreutilizablesintegradasenelCLR.LostiposdelaPlataforma.NETpermitenllevaracabotareasdeprogramacincomunescomomanipulacindestrings,coleccionesdedatos,conectividadabasesdedatosyaccesoaarchivos.EsposibleutilizarlaPlataforma.NETparadesarrollarlossiguientestiposdeaplicacionesyservicios:AplicacionesdeconsolaWindowsFormsAplicacionesASP.NETServiciosWebXMLServiciosWindows
RequerimientosdeSoftwareTodoloquesenecesitaparadesarrollarenC#eselKitdedesarrollo(SDK),delcualsoloseutilizarelCLRyelcompiladordeC#.LenguajeIntermedioyMetadatosMicrosoftdesarrollounlenguajeparecidoallenguajeensambladorllamadoMicrosoftIntermediateLanguage(MSIL).Paracompilaraplicaciones.NET,loscompiladorestomanelcdigofuentecomoentradayproducenMSILcomosalida.MSILensesunlenguajecompletoconelcualesposibleescribiraplicaciones.ElmanagedcodegeneradoporelcompiladorC#noescdigonativoporqueesuncdigodeLenguajeIntermedio(IL).EstecdigoILseconvierteen laentradapara laadministracindelprocesodeejecucindelCLR.Laventaja finaldelcdigo ILesqueelCPUes independiente, locualsignificaquesenecesitauncompiladoren lamquinadestinoparacambiarelcdigoILenelcdigonativo.ElILesgeneradoporelcompilador,peronoes lonicoqueseproveeparaelruntime,elcompiladortambingenerametadatos acerca del cdigo, los cuales dicenms al runtime del cdigo, por ejemplo la definicin de cada tipo. Losmetadatossonbibliotecasdetipo,entradadedatosalregistry,etc.Losmetadatossonempaquetadosdirectamenteconelcdigoejecutableynoenlocalidadesseparadas.El IL y losmetadatos son colocadosen los archivosqueextiendenel formatoPE (PortableExecutable) utilizadoparaarchivos.exey.dll,cuandosecargaelarchivoPEelruntimecolocayextraelosmetadatosyelILdeestos.CuandosecompilaunaaplicacinC#ocualquieraplicacinescritaenunCLS,laaplicacinescompiladadentrodelMSIL,adems se compila dentrode las instruccionesnativasdeCPU cuando la aplicacines ejecutadapor vezprimeraporelCLR.Elprocesoeselsiguiente:CdigofuenteescritoenC#ElcdigofuenteescompiladousandoelcompiladordeC#(csc.exe)dentrodeunEXE.ElcompiladorC#producecomosalidaelcdigoMSILyunmanifiestoenunapartedeslolecturadelEXE
quetieneunencabezadoestndarPE(Win32PortableExecutable).Cuandoelcompiladorproduceocrealasalidatambinimportaunafuncinllamada_CorExeMaindelruntime.NET.
Cuandolaaplicacinesejecutada,elsistemaoperativocargaelPEcomounaDLLdependientetalcomolanicaqueexportalafuncin_CorExeMain(mscoree.dll)justocomolohaceconcualquierPEvlido.ElsistemaoperativocargayentoncessaltaalpuntodentrodelPEelcualespuestoahporelcompilador
C#.ElsistemaoperativoobviamentenopuedeejecutarelcdigoMSIL,elpuntodeentradaesunpequeapartequesaltaalafuncin_CorExeMainenmscoree.dll.
Lafuncin_CorExeMaincomienzalaejecucindelcdigoMSILquefuecolocadoenelPE.DadoqueelcdigoMSILnopuedeserejecutadodirectamente(porquenoestununformatodemquina
ejecutable)elCLRcompilaelMSILusandouncompiladorjustintime(JIToJITter)dentrodeinstruccionesCPUnativastalcomoprocesaelMSIL.
JITersElmanagedcodegeneradoporC#eselcdigoIL,aunqueelcdigoILesempaquetadoenunformatodearchivoPEvlido,noesposibleejecutarlosinconvertirloaunmanagedcodenativo.Cuandountipoescargado,ellaodercreayagregaunstub(piezapequea)acadamtododeltipo,ascuandoelmtodo
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 10/63
esinvocadoporvezprimera,elstubpasaelcontrolalJIT.El JIT compila el IL a cdigo nativo y cambia el stub para que apunte al cdigo nativo que est en cache, as lassubsecuentesinvocacionespodranejecutarelcdigonativo.ElCLR incluyetresdiferentesJITersquepuedenserusadosparaconvertirMSILencdigonativo,dependiendode lascircunstancias:PreJIT (Generacinde cdigo Installtime), opera comoun compilador tradicional, aunqueestbasado
sobreelcompiladorJITprincipal,seejecutacuandouncomponenteNGWSesintaladoycompilaelcdigoILamanagedcodenativo.La generacin de cdigo en tiempode instalacin compilar un ensamble completo dentro de un cdigobinariodeCPUespecifico,talcomolohaceelcompiladorC++.Unensambleelcdigoempaquetadoqueesenviadoalcompilador.Lacompilacinsehaceentiempodeinstalacin,cuandoelusuariofinalesmenosprobableparanotificarqueelensambleestasiendocompiladoJIT.La ventaja de la generacin de cdigo en tiempo de instalacin, es que permite compilar el ensamblecompletojustounavezantesdeserejecutado.Alsercompiladoelensambleenteronohaypreocupacinreferentealdesempeointermitentecadavezqueunmtodoenelcdigoesejecutadoporprimeravez.Alusarestautilidaddependedeltamaodelsistemaydelambientededistribucin.
JIT,compiladorpordefaultutilizadoporelCLR,esuncompiladoroptimizado,elcualrealizaelanlisisdelflujodedatos,administraelcdigonativocomosalida.ElJITteresinvocadoentiempodeejecucin.
EconoJIT,realizaunaconversinmuyvelozdelILamanagedcodenativoTambin es un JITter en tiempo de ejecucin, esta especialmente diseado para sistemas que tienenrecursos limitados como memoria. La principal diferencia con un JIIter regular es la incorporacin dealgunasinvocacionescodepitching,quepermitenalEconoJITdescartarelcdigogeneradoocompiladosiel sistema comienza a ejecutarse fuera de memoria, siendo el beneficio el reclamo de memoria. Ladesventajaesquesielcdigoespitched(lanzado)esinvocadootravezporloquedebesercompiladodenuevo.
EsposibledeterminarquetipodeJITestasiendoutilizadoycuantamemoriautilizaa travsdeunapequeautilidadllamadaJITCompilerManager(jitman.exe),queresideeneldirectoriobindeldirectoriodeinstalacindelNGWSSDK.SistemadeTipoUnificadoElruntimede.NEThacemsquedaraldesarrolladorunsimplesistemadetipounificadoqueesusadoatravsdetodosloslenguajes,tambindejaaloslenguajesescribirextensionesdesistematipo,agregandonuevostiposqueparezcanyactuencomotiposdesistemasbuilt.in.ElSistemaVirtualdeObjetosVOSLasreglasquesesiguencuandosedeclaran,utilizanyadministrantipossonmodeladasenelSistemaVirtualdeObjetos(VirtualObjectSystemVOS).ElVOSestableceunaplataformaquepermitelaintegracindelenguajesytypesafety.Labasedelaarquitecturadelruntimeeslaplataformaquepuededescribirencuatroreas:VOSTypeSystem,proveeunsistemade tiposque intentasoportar la implementacincompletadeuna
rangoampliodelenguajesdeprogramacin.Metadata,describeyhacereferenciaalostiposdefinidosporelVOS.CommonLanguageSpecificationCLS,defineelsubconjuntodetiposdelVOS.Siunabibliotecadeclases
essoportadaporlasreglasdelCLS,garantizaquelabibliotecadeclasespuedaserutilizadaporlosdemslenguajesqueimplementenelCLS.Virtual Execution System VES, es responsable de la carga y ejecucin de los programas que fueron
escritosporelCLR.
VOSTypeSystemElVOSdefinetiposquedescribenvaloresyespecificanuncontratoendondetodoslosvaloresdetipodebensoportar.Existendosentidades:valoresyobjetos.Paraunvaloreltipodescribelarepresentacindealmacenamientoylasoperacionesquepuederealizar.Losobjetossonmspoderososporqueeltipoesalmacenadoexplicitamenteensurepresentacin,cadaobjetotieneunaidentidadquelodistinguedelosdemsobjetos.MetadataElcompiladorCLStomaelcdigofuentecomoentradayproducecdigoMSILparaelruntimeparacompilaratravsdelosJITtersyejecutar.AdemssemapeaelcdigofuenteasecuenciasdeinstruccionesMSIL,elcompiladorCLStieneotratareaimportante:envolvermetadatosdentrodelEXEresultante.LosMetadatossondatosquedescribendatos.Losmetadatos son la coleccin de elementos programticos que constituyen el EXE, como los tipos declarados y losmtodosimplementados.EstosmetadatossonsimilaresalostiposdebibliotecasgeneradasconcomponentesCOM(ComponentObjectModel).La raznparausarmetadatos es simple yaquepermitenal runtime .NET conocer en tiempodeejecucinque tipos
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 11/63
podranseralmacenadosyquemtodospodranser invocados.Estopermiteal runtimeconfigurarapropiadamenteelambienteparamayoreficienciaalejecutar laaplicacin.El significadoporel cualestosmetadatossonconsultadosesllamadoreflection.Los metadatos por cada objeto .NET registran toda la informacin que es requerida para usar el objeto, con estainformacinelruntime.NETescapazderesolvercomocrearobjetos,invocarfuncionesmiembrooaccederalosdatosdeunobjetoyelcompiladorpuedeutilizarlainformacinparaencontrarqueobjetosestndisponiblesycomoesutilizadounobjeto.Lainformacinincluyelosiguiente:ElnombredelobjetoLosnombresdetodosloscamposdelobjetoysustiposLosnombresdetodaslasfuncionesmiembro,incluyendotiposparmetroynombres
LosmetadatostambinpermitenaotrasherramientasaccederalainformacindetalladaacercadelcdigoExiste un proceso llamado reflection donde el cdigo en tiempo de ejecucin puede consultar los metadatos paraencontrar que objetos estn disponibles y que funciones y campos estn presentes en la clase. La reflection estdisponibleparausuariosfinalesparadeterminarcomosonlosobjetos,bsquedadeatributosoejecutarmtodosenlosquelosnombresnosonconocidoshastaeltiempodeejecucin.Losmetadatossonutilizadosparavariastareas:PararepresentarlainformacinqueelCLRutilizaparalocalizarycargarclases.Parasacarlasinstanciasdelasclasesenmemoria.Pararesolverlainvocacindemtodos.ParatraducirILacdigonativo.Paraforzarlaseguridad.
ElencargadodegenerarlosmetadatoseselcompiladorC#,alpasarelcdigoaIL,emitiendolainformacinbinariadelosmetadatosenunarchivoPE.Laprincipalventajadelacombinacindelosmetadatosconelcdigoejecutableesquelainformacinacercadelostiposespersistente.Una herramienta que toma ventaja de reflection es el ILDASM (Microsoft .NET Framework IL Disassembler), el cualanalizalaaplicacindemetadatosfuenteyentoncespresentainformacinacercadelaaplicacinenlajerarquadelrbol.SeguridadLafacetamsimportantedecualquierambientededesarrollodeaplicacionesdistribuidasescomomanejarlaseguridad.LaseguridadcomienzatanprontocomounaclaseescaragadaporelCLRporquelaclaseloaderespartedelesquemadeseguridad.NET,laseguridadrelacionadaafactorestalescomoreglasdeaccesibilidadyrequerimientosdeconsistenciasonverificados.DeploymentLallaveparaelDeploymentdeaplicaciones.NETeselconceptode(ensambles).Losassembliessonpaquetessimplesdecomportamientosemanticamenterelacionadosquesonconstruidoscomounarchivoindividualoentidadesdearchivosmltiples.Laespecificacindecomodeployunaaplicacinpodravariaryaquesepuedetratardeundesarrolloweboaplicacintradicionaldeescritorio.El runtime .NETmantiene el rastreo delos archivos y de las versiones de los archivos asociados con una aplicacin.Cualquieraplicacinqueesinstaladaesautomticamenteasociadaconlosarchivosquesonpartedeeseensamble.Siunaaplicacinde instalacin intentasobreescribirunarchivonecesarioparaotraaplicacin,el runtime .NETes lobastanteinteligenteparapermitirquelaaplicacindeinstalacin,instalelosarchivosnecesariosperoelCLRnoeliminalasversionespreviasdeelarchivoporquetodavasonrequeridasporlaprimeraplicacin.InteroperabilidadconcdigonoadministradoElcdigonoadministradonotienelasventajasquetieneelcdigoadministrado,comorecoleccindebasura,sistemadetipounificadoymetadatos.Cdigo administrado invocando funciones DLL no administradas, cuando la aplicacin necesita una
interfazparaunaDLLenCylaempresaqueescribelaDLLnoadopta.NETsernecesarioinvocaresaDLLdesdeunaaplicacin.NET.CdigoadministradousandocomponentesCOM,esposible lograrestocreandounwrapper .NETparael
componenteCOM,asqueelclienteadministradotrabajaconclases.NETCdigo no administrado usando servicios .NET, cuando se desea acceder a .NET desde cdigo no
administrado.
CommonLanguageSpecificationCLSEsunconjuntodereglasqueunlenguajedebeadherirparacrearaplicaciones.NETqueseejecutanenelCLR.UnconceptoimportanterelacionadoalaCLReselcdigoadministrado,elcdigoadministradoesjustoelcdigoqueestaejecutandosebajoelauspiciodelaCLRyporconsiguientecomienzaasercontroladoporelCLR.ElCLSdefineunsubconjuntodetiposdelVOS,siunabibliotecadeclasessiguelasreglasdelCLSestagarantizandoserutilizadaporclientesdeotrolenguajedeprogramacinquetambinseadhierenalaCLS.ElCLSserefierealainteroperabilidadentrelenguajes,porloqueesnecesarioseguirlostiposycaractersticasdelCLS,
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 12/63
para ello es necesario conocer los tipos primitivos, arreglos, tipos, miembros tipo, mtodos, campos, propiedades,enumeraciones,excepciones,interfaces,eventos,atributospersonalizables,delegados,identificadores,etc.quelapropiaespecicicacindefine.VirtualExecutionSystemVESEl Sistema Virtual de Ejecucin implementa la VOS y se crea implementando un motor de ejecucin (ExecutionEngineEE).LoscomponentesdelaVESson:LenguajeIntermedio(IntermediateLanguageIL),diseadoparaserfacilmentetraducidoaunaamplia
gamadelenguajes,porloqueelcompiladorC#escapazdegenerarellenguajeintermedio.CargadelCdigoAdministrado(LoadingManagedCode),resuelvenombres,obtieneclasesdelamemoria,
creastubsquesonnecesariosparalacompilacinJIT.Laclassloaderforzalaseguridad.Conversinde ILaCdigoNativovia JIT, el cdigodel lenguaje intermediono estadiseado comoun
interpretetradicionalbytecodeorboldecdigo, laconversindel lenguaje intermedioesrealmenteunacompilacin.CargadeMetadatos,seencargadechecarlaseguridaddetiposylaintegridaddelosmtodos.Recolector de Basura y Manejo de Excepciones (Garbage Collection), el codigo administrado premite
rastrearelapiladoenel runtime,paraqueel runtimeentiendaelapilado individualde framesuncdigoadministradotienequeserproporcionadoporelJITeroporelcompilador.Servicios de debugging, estos servicios dependeran de la informacin producida por el compilador del
lenguajefuenteyseemitendosmapas,unmapadellenguajefuentedelaconstruccindedireccionesenelflujodeinstruccionesyunmapadelasdireccionesdelaslocalidadesenelapiladodeframes.AdministracindeHilos,elVESproprorcionaesteservicioalcdigoadministrado.
TiposdeDatosC#soportaelconjuntodetiposdedatosusual,paracadatipodedatoqueC#soporta,existeunacorrespondenciatipodelenguajecomnentiempodeejecucin.NETsubyacente.TodoslostiposruntimepuedenencontrarseenelnamespaceSystemdellenguajecomnentiempodeejecucin.NET.
Tipo Bytes Tiporuntime Descripcinbyte 1 Byte Unsignedbytesbyte 1 SByte Signedbyteshort 2 Int16 Signedshortushort 2 UInt16 Unsignedshortint 4 Int32 Signedintegeruint 4 UInt32 Unsignedintlong 8 Int64 Signedbigintegerulong 8 UInt64 Unsignedbigintegerfloat 4 Single Floatingpointnumber
double 8 double Doubleprecisionfloatingpointnumberdecimal 8 Decimal Fixedprecisionnumberstring String Unicodestringchar Char Unicodecharacterbool Boolean Booleanvalue
Lostiposdedatossonseparadosenvaluetypesyreferencetypes.Losvaluetypessonasignadosenestructurasdepilasoenlnea.Losreferencetypessonasignadosalaglomerado.Lasreferenciasytiposdevaloressonderivadosdelaltimaclasebaseobjet,deestamaneraencasodequeuntipodevalornecesiteactuar comounobject una envoltura hace que el tipo de valor parezca una referencia asignandolo alaglomerado, y los tipos de valores son copiados a estos. La envoltura esmarcada por lo que el sistema conoce quecontieneporejemploint,aesteprocesoseleconocecomoboxingyelprocesodereversaseleconocecomounboxingLapalabrareservadaclassesempleadaparadeclararuntiporeferencia(heapallocated),ylapalabrareservadastructesempleada para declarar un tipo valor, una estructura es utilizada para objetos ligeros que necesitan actuar comotiposbuiltin,lasclasessonutilizadasencualquierotrocaso.Porejemplountipointesunvalortipoyuntipostringesuntiporeferencias,estotrabajariaas: inti=2005; strings="Septiembre";
i 2005
s o > Septiembre
ConstantesyCamposSoloLecturaEnC#losvalorespuedenserdefinidoscomoconstantesyparaqueunvalorseaconstantesuvalordebeseralgoquepuedaserescritocomounaconstante.
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 13/63
publicconststringsDominio="informatique.com.mx";
Larestriccindetiposconstantesesquesonconociblesentiempodecompilacin,envezdeelloesposibleutilizarelmodificadorreadonlyelcualestdiseadoparaaquellassituacionesendondelasconstantestienenrestriccin.Aplicandoelmodificadorreadonlyunvalorpuedeserestablecidoenelconstructoroenunainicializacinperonopuedesermodificadodespus.EjemploHelloWorld!ElcdigoC#puedeserescritoencualquiereditor,tambinpuedeescribirseconVisualStudio7.ElcdigoC#debealmacenarseenunarchivoconextensin.csParacompilarelcdigoC#esnecesariotenerinstaladolaPlataforma.NETqueincluyeelcompiladorC#,puedebuscarelejecutableenlaruta:C:WINDOWSMicrosoft.NETFrameworkv1.1.4322csc.exe
Aseguresedetenerestarutaenelpathparapoderejecutarelcompiladordesdecualquierubicacin.Paracompilarsuarchivo.csesnecesarioabrirlaconsola(DOS)yescribirelcomandocsseguidodelnombredesuarchivoporejemplo:cdhelloworld.cs
Lasalidaexitosadelacompilacinpodraseras:
Microsoft(R)VisualC#.NETCompilerversion7.10.6001.4 forMicrosoft(R).NETFrameworkversion1.1.4322 Copyright(C)MicrosoftCorporation20012002.Allrightsreserved.
Si existe algn error el compilador lo notificar. El archivo es compilado y ligado ahelloworld.exe, (el archivo .exegeneradotendrelnombredelarchivofuente)paraejecutarelprogramasloesnecesarioescribirelnombredelarchivoejecutable.Algointeresanteesqueesposibleespecificarelnombredelarchivoejecutableatravsdeunswitch: csc/out:nuevoNombre.exenombreArchivoFuente.cs
Elsiguienteeselejemplotpicodeloslenguajesdeprogramacin: classHelloWorld{ publicstaticvoidMain(){ System.Console.WriteLine("HelloWorld"); } }ElmtodoMaindebeestarcontenidoenlaclaseyescritoconlaprimerletraenmayscula.Eltipodeestemtodopuedeservoidoint.Tambinestemtodopuedeespecificarargumentos: publicstaticvoidMain(string[]args)SystemeselmbitodelnamespaceenelcualelobjetoConsoleestcontenido.EsposibleimportarelnamespaceenlasaplicacionesindicandoloaliniciodelcdigoconlapalabrareservadausingqueesunadirectivaparaelnamespaceSystem.ExistenmsnamespacesenlaPlataforma.NET usingSystem;EjemploArgsExaminemoselsiguienteejemplo,elcualrecibelosargumentosconlosqueelcomponentefueinvocado:EjemplodeArgsconfor: usingSystem; classArgs{ publicstaticvoidMain(string[]args){ Console.WriteLine("Argumentos:{0}",args.Length); for(intitera=0;itera
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 14/63
Solamenteseescribe:Console.WriteLine();
usingnopuedeserutilizadoconunnombredeclaseporloquenoespermitidoescribirusingSystem.Console
classArgs,AlnoexistirlasfuncionesglobalesenC#,sedeclaraunaclasellamadaArgs.publicstaticvoidMain(string[]args),LaclaseArgs contieneuna funcinomtodoMain(), el cual sirve
como punto de partida de la ejecucin del componente, este mtodo puede o no ser declarado conargumentos, en este caso es fundamental declarlos porque deseamos precisamente leer y escribir estosargumentosproporcionadosalinvocarelcomponente.Alserunmtododearranquedebeserdeclaradoconelmodificadorstaticporquenoestasociadoconunainstanciadeunobjeto.Elmtodoindicaquerecibeunarreglodetipostringllamadoargs
Console.WriteLine("Argumentos : {0}", args.Length);, invoca el mtodo WriteLine de la clase Console paraescribirenlalneadecomandoloqueseindicaentrelosparntesis.Laprimerpartedeloqueseencierraentreparntesisesunstringdondeesnecesariodestacarque{0},esunanotacinqueindicaentrellavesunndicequehacereferenciaaunavariableasociadaaeste,enestecasoasociadaconargs.Lengthargs.Length,Lengthesunmtododelaclaseargselcualobtieneelnmerodeelementosquecontieneestearreglo.
El ciclo for comienza una iteracin desde 0 hasta el nmero de elementos que contiene elarregloargs.Length, por cadaelementocontenidoenelarregloescribeen la lneadecomandos loqueseindica en ("Argumento {0} : {1}", itera, args[itera]) que como mencionamos anteriormente {0} hacereferencia al orden en que las variables sern escritas, en este caso corresponde al iteradory{1}correspondeaargs[itera],locualindicaobtenerelelementoencuestindelarregloargs.ParacompilarelcomponenteutilicecscArgs.csParaejecutarelcomponentesinparmetrosescribaenlalneadecomando:cscArgs
Salida:Argumentos:0
Paraejecutarelcomponenteconparmetrosescribaenlalneadecomando:cscArgsp1p2p3p4p5p6...pn
Porejemplo:argshttp:www.informatique.com.mxSalida: Argumentos:8 Argumento0:http Argumento1:: Argumento2:www Argumento3:. Argumento4:informatique Argumento5:. Argumento6:com Argumento7:. Argumento8:mx
EjemploInput/OutputEs posible leer datos de la consola utilizando el mtodo ReadLine y es posible mostrarlos utilizando elmtodoWriteoWriteLinedelobjetoConsole: usingSystem; classinOut{ publicstaticvoidMain(){ Console.Write("FechadeNacimiento:"); StringstrFecNac=Console.ReadLine(); Console.WriteLine("FecNac="+strFecNac); } }NotequeimportarladirectivaSystemhaceposibleomitirescribirelnamespace,deestaformasloesnecesarioescribirelnombredelobjetoseguidodelnombredelmtodo.EjemploStringFormatEsposibledarformatoalasalidadedatosauntipostring,utilizandolasintaxis{nmero}dondenmeroesreemplazadoporlavariablecorrespondiente: usingSystem; classstrFormat{ publicstaticvoidMain(){ Console.Write("Nombre:");
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 15/63
StringstrNombre=Console.ReadLine(); Console.Write("Edad:"); StringstrEdad=Console.ReadLine(); Console.Write("Telfono:"); StringstrTel=Console.ReadLine(); Console.Write("Direccin:"); StringstrDir=Console.ReadLine(); Console.WriteLine("Datos:{0}{1}{2}{3}",strNombre ,intEdad,strTel,strDir); } }FuncinMainEs posible incluir una funcin esttica en la clase para poder probarla, enC#esta funcin esttica puede ser escritacomoMain()eindicaeliniciodelaejecucindeunprograma: usingSystem; classApp{ publicstaticvoidMain(){ Console.WriteLine("Helloworld!"); } }ElejemploanteriordefinealafuncinMaincomovoidlocualindicaquenoregresaunvalor,peroesposibleindicarquesiregreseunvalorescribiendoeltipodelafuncincomointporejemplo,queindicaqueregresaunvalordetipoentero: usingSystem; classApp{ publicstaticintMain(){ Console.WriteLine("Helloworld!"); return(1); } }
Tambin es posible que la funcinMain reciba parmetros de la lnea de comandos, para ello es necesario especificarunarreglodestringscomoparmetro: usingSystem; classApp{ publicstaticvoidMain(string[]args){ foreach(stringinputinargs){ Console.WriteLine(input); } } }MltiplesFuncionesMainEsposiblequeexistanenunaaplicacinvariasclasesquecontenganlafuncinMain()yporelloalcompilarseindicarunerror.Para evitar el error o indicar que funcin Main() de que clase deseamos que se ejecute, es necesario utilizar elsiguienteswitchalcompilar:/main:nombreClase
Porejemplo usingSystem; classClaseA{ publicstaticvoidMain(){ Console.WriteLine("MaindelaclaseA"); } } classClaseB{ publicstaticvoidMain(){ Console.WriteLine("MaindelaclaseB"); } } classClaseC{ publicstaticvoidMain(){ Console.WriteLine("MaindelaclaseC"); } }Alcompilarutilice:cscmultiplesmain.cs/main:ClaseBSalida:MaindelaclaseBPreprocesamientoLoms importanteenestepuntoesqueenC#noexisteelpreprocesador,elmotivoporel cualnoexisteespara
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 16/63
simplificar la estructura de compilacin adems de que no hay necesidad de escribir un archivo de encabezados porseparado ymantener en sincronia la implementacin, cuando los archivos fuente C# son compilados el orden de lacompilacindearchivosindividualesnoesimportanteyesequivalenteaunarchivodegrantamao.Unidentificadoreselnombrequeesusadoparaalgnelementodeunprogramacomounavariableofuncinydebentenerunaletraoguinbajocomoprimercaracter.C#soportalassiguientesdirectivasdepreprocesamiento:
Tamao Valor
#define Define un identificador, los identificadores tambin pueden ser definidos via la lnea decomando
#undef Eliminaladefinicindeunidentificador#if Elcdigodelaseccinescompiladosilaexpresinesverdadera
#elif ConstructorElseif,siladirectivaanteriornosecumplioysilaexpresinesverdaderaelcdigodelaseccinescompilado
#else Siladirectivaanteriornosecumplioelcdigodelaseccinescompilado#endif Marcaelfinaldelaseccin
Losidentificadoresdebenprecederacualquiercdigoreal.Esposibleutilizarlossiguientesoperadoresenexpresionespreprocesador:!
==
!=
&&
||
Esposibleutilizarparntesisparaagruparexpresiones.ComentariosEsposiblecomentarelcdigo,paraelloexistendosmodalidades://,queseutilizaparacomentarunalnea,esdecir,todoloquesiguea//esignorado./**/,queseutilizaparacomentarsegmentosdecdigo.
ValueTypesUnavariablecontieneunvalordeciertotipo,C#forzaainicializarlasvariablesantesdeutilizarlasenunaoperacin.Cuandoseasignaunvaloraunvaluetypeelvaloractualescopiadoadiferenciadelosreferencetypesloquesecopiaeslareferenciaactualnoelvalor.C#agrupalosvaluetypesen:TiposSimplesTiposEstructuraTiposEnumeracin
TiposSimplesLosTiposSimples deC# comparten caractersticas como las de alias con los tiposde sistemade .NET, expresionesconstantesconsistendeTiposSimplesevaluadossolamenteentiempodecompilacinnoentiempodeejecucinylosTiposSimplespuedenserinicializadosconliterales.LosTiposSimplesdeC#seagrupanen:Integral
RepresentavaloresenterosyexistennuevetiposintegralenC#:
Tipo Tamao Valorsbyte Enteroconsigno 8bit 128a127byte Enterosinsigno 8bit 0a255short Enteroconsigno 16bit 32,768a32,767ushort Enterosinsigno 16bit 0a65,535int Enteroconsigno 32bit 2,147,483,648a2,147,483,647uint Enterosinsigno 32bit 0a4,294,967,295long Enteroconsigno 64bit 9,223,372,036,854,775,808a9,223,372,036,854,775,807ulong Enterosinsigno 64bit 0a18,446,744,073,709,551,615
BoolRepresenta valores booleanos verdadero y falso, por lo que es posible asignar a una variable un valorbooleanooelresultadodeunaexpresin:boolbContinuar=(a>b);
En C# el valor verdadero no es posible representarlo con algn valor diferente de cero, no hay unaconversinentreeltipointegralaboolqueforceestaconversin.
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 17/63
CharRepresentauncaracterUnicodede16bitdetamao,porejemplo:charcSexo='M';
TambinesposibleasignarunvalorhexadecimalutilizandolasecuenciadeescapexounvalorUnicodeconlasecuenciadeescapeu: charcHexadecimal='x0068'; charcUnicode='u0068';Noexistenconversiones implicitasdechar aotro tipodedatosdisponible,estosignificaporejemploquetratardeconvertirunavariablecharauntipodedatointegralnoesposibleenC#,porloquesetendrquehaceruncastexplicito: charcCaracter=(char)65; intnNumero=(int)'A';
FloatingPointRepresentandostiposdedatos,flotantes(float)ydobles(double):
Tipo Valorfloat 1.5x1045a3.4x1038conunaprecisinde7dgitos
double 5.0x10324a1.7x10308conunaprecisinde1516dgitos
AlrealizaroperacionesconFloatingPointpuedenproducirselossiguientesvalores:CeropositivoynegativoInfinitopositivoynegativoNaN,NotaNumber
Nota: Si una expresin un valor es de tipo Floating Point todos los otros valores son convertidos atiposFloatingPointantesderealizarelclculo.
DecimalRepresenta un tipo de alta precisin de 128 bit el cual es posible utilizarlo para calculos financieros ymonetarios.Losvaloresposiblescomprendenlosrangos1.0x1028a7.9x1028conunaprecisinde28a29dgitos.Nohayconversionesimplicitasentredecimalesydobles,sepodragenerarunoverflowoperderprecisin,porloqueesnecesariounaconversinexplcitaconuncast.Cuandosedefineunavariableyseleasignaunvalorseutilizaelsufijomparadenotarqueesunvalordecimal:decimaldecDecimal=1.0m
Siseomitelaletramlavariablepodrasertratadacomodoubleporelcompiladorantesdeserasignado.
TiposEstructuraUn tipostruct puede declarar constructores, constantes, campos, mtodos, propiedades, ndices, operadores y tiposanidados. Lasestructurasactuandemanera similaraunaclasey conmayores restricciones,porejemplonopuedenheredardecualquierotrotipo,nitampocootraclasepuedeheredardeunaestructura.Lasestructurasdeberanserutilizadassloparatiposquesonrealmenteunapiezadedatos.LadiferenciaentrestructyclassenC#esquestructesunvaluetypeyclassesunareferencetype.LaprincipalideadeutilizarstructesparacrearobjetosligeroscomoPoint,FileInfo,etc.,deestamaneraseconservamemoriaporquenohayreferenciasadicionalesquesoncreadascomosenecesitenporobjetosclase. usingSystem; structIP{ publicbyteb1,b2,b3,b4; } classip{ publicstaticvoidMain(){ IPmiIP; miIP.b1=192; miIP.b2=168; miIP.b3=1; miIP.b4=101; Console.Write("{0}.{1}.",miIP.b1,miIP.b2); Console.Write("{0}.{1}",miIP.b3,miIP.b4); } }TiposEnumeracinEs posible establecer un conjunto de constantes relacionadas, por default los elementos de una enumeracin son de
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 18/63
tipointdondeelprimerelementotieneelvalor0ycadaelementosubsecuenteseincrementaen1.Esposibleestablecerelvalordelprimerelementosimplementeasignandoaesteelvalordeseado,ascomoesposibleespecificareltipodedatode los valores contenidos especificandolo despus del nombre de la enumeracin aunque estn restringidos a lostipos:long,int,shortybyte.Sintaxis: enumNombreEnumeraciones{ constante1, constante2, constante3, . . constanteN }Ejemplo: usingSystem; publicclassEnumeracion{ enumenumDias{Sabado,Domingo,Lunes,Martes,Mircoles,Jueves,Viernes}; enumenumMeses{Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,_ Octubre,Noviembre,Diciembre}; enumenumFecha{Dia=21,Mes=9,Ao=1971};publicstaticvoidMain(){TypeeDias=typeof(enumDias);TypeeMeses=typeof(enumMeses); TypeeFecha=typeof(enumMeses);
Console.WriteLine("Losdasdelasemana,ysuvalorcorrespondienteenlaenumeracines:"); foreach(stringsinEnum.GetNames(eDias))Console.WriteLine("{0,11}={1}",s,Enum.Format(eDias,Enum.Parse(eDias,s),"d"));
Console.WriteLine();Console.WriteLine("Losmesesdelao,ysuvalorcorrespondienteenlaenumeracines:");
foreach(stringsinEnum.GetNames(eMeses))Console.WriteLine("{0,11}={1}",s,Enum.Format(eMeses,Enum.Parse(eMeses,s),"d"));} }TiposBaseLosTiposBaseparalasenumeracionesseespecificanlistandoeltipobasedespusdelnombredelaenumeracin: enumeDias:int{ Lunes, Martes, Mircoles, Jueves, Viernes };Lostiposbasevlidosparalasenumeracionesson:byte,sbyte,short,ushort,int,uint,longyulong.Sieltipobasenoesespecificado,eltipobasepordefaultesint.TiposReferenciaEs contrasteavalue types los reference types no almacenanel dato actual que representan, porquealmacenanunareferenciaaldatoactual.LosreferencetypesqueC#utilizason:TipoObjetoTipoClaseInterfacesDelegadosTipostringArreglos
TipoObjetoElTipoObjetoeslaClaseBasedetodoslostipos,alserlaclasebasedetodoslostiposesposibleasignarlevaloresdecualquiertipo.ElTipoObjetoesutilizadocuandoelvaluetypeestaboxed,esdecir,queestdisponiblecomounobjeto.TipoClaseElTipoClasecontienedatosmiembro,funcionesmiembroytiposanidados.Losdatosmiembrosonconstantes,camposyeventos.Lasfuncionesmiembroincluyenmtodos,propiedades,ndices,operadores,constructoresydestructores.Interfaces
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 19/63
Una interface declara un tipo referencia que tiene slo miembros abstractos. Slo existe la firma pero no tieneimplementadotodoelcdigo,porloquenoesposibleinstanciarunainterface,slounobjetoquederivadelainterface.Paracrearunainterfaceseemplealapalabrareservadainterface: usingSystem; interfaceIuno{ voidAccionUno(); } classImplementa:Iuno{ publicvoidAccionUno(){ Console.WriteLine("Accinuno..."); } } classApp{ publicstaticvoidMain(){ ImplementaI=newImplementa(); I.AccionUno(); } }Es posible definirmtodos, propiedades e ndices en una interface, cuando se define una Clase es posible derivar demltiplesinterfaces,mientrasquealdefinirunainterfacesloesposiblederivardeslounaclase.Lasinterfacesestnestrechamenterelacionadasaclasesabstractas,separecenaunaclaseabstractaquetienetodossusmiembrosabstractos.Cuandounobjetoimplementaunainterface,unareferenciaalainterfacepuedeserobtenidaporuncastdelainterface.Unaclasepuedeimplementarmsdeunainterface.classNombreClase:InterfaceA,InterfaceB{}
ExisteunatcnicallamadaImplementacindelaInterfaceExplcitayseutilizapararesolvercolisionesconnombresdemtodosigualesentreinterfaces: usingSystem; interfaceIuno{ voidAccionUno(); } interfaceIdos{ voidAccionUno(); } classImplementa:Iuno,Idos{ voidIuno.AccionUno(){ Console.WriteLine("ColisinresueltaconelnombredelmtodoIuno"); } voidIdos.AccionUno(){ Console.WriteLine("ColisinresueltaconelnombredelmtodoIdos"); } } classApp{ publicstaticvoidMain(){ ImplementaI=newImplementa(); Iunouno=(Iuno)I; uno.AccionUno(); Idosdos=(Idos)I; dos.AccionUno(); } }Esposibleocultaralusuariodelaclaselaimplementacindeunainterfaz,ascomotambinesposiblecrearinterfacesbasadasdeotrasinterfaces.DelegadosLosdelegadossonsimilaresalasinterfaces,especificanuncontratadoentreuncalleryunimplementer(implementador).Undelegadoespecificalaformadeunafuncinenvezdeespecificartodaunainterface.Lasinterfacessecreanentiempodecompilacinylosdelegadossoncreadosentiempodeejecucin.Undelegado encapsulaunmtodo con cierta firma,bsicamenteundelegadoesun typesafe ysecureversion. Undelegadoesunaimplementacindefunctionpointersorientadaaobjetosysonutilizadosenmuchassituacionesdondeuncomponentenecesitavolverainvocarelcomponentequeloestausando.Esposibleencapsularmtodosestticoseinstanciasenunainstanciadelegado.Elprincipalusodelosdelegadosesconloseventosnoconlasclases.Laespecificacindeldelegadodeterminalaformadelafuncinycreaunainstanciadeldelegado,seusalafuncinquecoincideconlaforma.Losdelegadosalserdenaturalezadinmicaseutilizancuandoelusuariodeseacambiarelcomportamiento,porejemplo
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 20/63
sideseamosqueunaclaseOrdenamientosoportediferentesmtodosdeordenacin,laordenacinpodrasercontroladaenbaseaundelegadoquedefinalafuncindecomparacin.Nota los delegados siempre son creados an si no son usados, pero los delegados podran ser creados al vuelo si sereemplazan las funciones estticas por propiedades, entonces unicamente se crea el delegado solo si se utiliza lapropiedad.TipostringElTipostring se utiliza paramanipular datos string. La clasestring derivadirectamentedeobject y no es posiblederivarla.TodoslosstringsenC#soninstanciasdeltipoSystem.StringenelCLR.stringesunaliasparalaclasepredefinidaSystem.Stringysuusoesmuysencillo:stringsWebSite="http://www.informatique.com.mx";
Paraaccederauncaracter,simplementeaccedaasundice:sWebSite[11];
Es posible hacer un barrido de los caracteres que componen elstring utilizando la propiedadLength que poseen losarreglosyporqueesposibleaccederaestostratandoalstringcomounarreglo: usingSystem; classApp{ publicstaticvoidMain(){ stringsWebSite="http://www.informatique.com.mx"; Console.WriteLine("sWebSitecontiene:"+sWebSite.Length+"caracteres"); for(intiElemento=0;iElemento
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 21/63
Length RecuperaoestablecelalongitudMaxCapacity RecuperalacapacidadmximadelStringBuilder
Mtodo DescripcinAppend() AgregalarepresentacinstringdeunobjetoAppendFormat() Agregalarepresentacinstringdeunobjeto,utilizandounformatoespecficoparaelobjetoEnsureCapacity() AseguraqueStringBuildertienesuficienteespacioparaunnmerodecaracteresespecficoInsert() InsertalarepresentacinstringdeunobjetoespecficoenunaposicinespecficaRemove() EliminaloscaracteresespecficosReplace() Reemplazatodaslasinstanciasdeuncaractesconunnuevocaracter
ArreglosUnarreglocontienevariablesalascualesseaccedeatravsdendices,todaslasvariablescontenidasenelarreglosonreferidoscomoelementosloscualesdebenserdelmismotipo,porloqueeltipodelarreglo.LosarreglosenC#sonreferenciasaobjetos.Unarreglovaluetypenocontieneinstanciasboxed.Elvalorinicialdeunarregloesnull,unarreglodeobjetosescreadoutilizandonew.Cuandounarregloescreadoinicialmentecontienelosvalorespordefaultparalostiposqueestecontendr.Sintaxis:tipo[]identificador;
Notequeparadefinirunarregloseutilizanloscorchetes[]despusdeltipodelarreglo.Ejemplo:string[]aPersonas;
Esposibleinicializarunarregloalmomentodecrearlo:string[]asPersonas=newstring[]{"TimBernersLee","BrendanEich","DennisRitchie","JamesGosling"};
Durantelainicializacinesposibleomitirnewtipo[x]yelcompiladorpodradeterminareltamaodealmacenamientoparaelarreglodelnmerodeitemsenlalistadeinicializacin:string[]asPersonas={"TimBernersLee","BrendanEich","DennisRitchie","JamesGosling"};
Cadaelementodeunarreglodeintsesunintconelvalor0:int[]aiNumeros=newint[5];
Cadaelementodeunarreglodestringsesunstringconelvalornull:string[]asNombres=newstring[5];
Ladimensindelarreglopuedesersimpleomultidimensional,dondecadadimensincomienzaconelndice0,sirequierehacerunbarridodetodosloselementosdelarreglo,comienceapartirdelndice0hastalalongituddelarreglomenosuno(nombreArreglo.Length1onIndice
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 22/63
Ejemplo:usingSystem;classApp{publicstaticvoidMain(){
string[]asPersonas={"TimBernersLee","BrendanEich","DennisM.Ritchie","JamesGosling"}; Console.WriteLine("LongituddelarregloasPersonas:"+asPersonas.Length); int[]aiNumeros=newint[3]{1,2,3}; Console.WriteLine("LongituddelarregloaiNumeros:"+aiNumeros.Length); //Define4arreglosde2dimensiones intiRenglon=4; intiColumna=2; string[,]asBidimensional=newstring[iRenglon,iColumna]; //4renglones*2columnas=8Elementos asBidimensional[0,0]="00"; asBidimensional[0,1]="01"; asBidimensional[1,0]="10"; asBidimensional[1,1]="11";
asBidimensional[2,0]="20"; asBidimensional[2,1]="21";
asBidimensional[3,0]="30"; asBidimensional[3,1]="31";
Console.WriteLine("LongituddelarregloasBidimensional:"+asBidimensional.Length);
int[,]aiBidimensional={{11,22},{33,44},{55,66},{77,88}};
for(inti=0;i
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 23/63
classApp{ //Aplicacin publicstaticvoidMain(){ PersonaMexicano=newPersona("GeradongelesNava",33); Console.WriteLine("Mexicano.sNombre:"+Mexicano.sNombre); Console.WriteLine("Mexicano.iEdad:"+Mexicano.iEdad); Console.WriteLine("Mexicano.Tipo:"+Mexicano.Tipo()); Console.WriteLine("ArreglodeObjetos"); Empleado[]aProgramadores=newEmpleado[2]; aProgramadores[0]=newEmpleado("BillGates",50); aProgramadores[1]=newEmpleado("EricS.Raymond",60); for(inti=0;i
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 24/63
InterfaceIComparableLa funcinsort no trabaja con clases o estructuras porque no conoce su orden, pero si desea ordenarlas utilice lainterfaceIComparable,porejemplounaordenacinutilizandounapropiedadnumrica: usingSystem; publicclassLenguaje:IComparable{ stringnombre; intid; publicLenguaje(stringnombre,intid){ this.nombre=nombre; this.id=id; } intIComparable.CompareTo(objecto){ LenguajelenguajeB=(Lenguaje)o; if(this.id>lenguajeB.id){return1;} if(this.idlenguajeB.id){return1;} if(this.id
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 25/63
LenguajelenA=(Lenguaje)oA; LenguajelenB=(Lenguaje)oB; returnString.Compare(lenA.nombre,lenB.nombre); } } } classApp{ publicstaticvoidMain(){ Lenguaje[]aLenguaje=newLenguaje[5]; aLenguaje[0]=newLenguaje("C",3); aLenguaje[1]=newLenguaje("ActionScript",5); aLenguaje[2]=newLenguaje("JavaScript",2); aLenguaje[3]=newLenguaje("Java",8); aLenguaje[4]=newLenguaje("PHP",1); ArrayListaList=newArrayList(); aList.Add(aLenguaje[0]); aList.Add(aLenguaje[1]); aList.Add(aLenguaje[2]); aList.Add(aLenguaje[3]); aList.Add(aLenguaje[4]); aList.Sort((IComparer)newLenguaje.OrdenaNombres()); foreach(LenguajeleninaList) Console.WriteLine(len); } }Salida: ActionScript5 C3 Java8 JavaScript2 PHP1IComparerComoPropiedadEnelejemploanteriorelusuariotienequecrearunainstanciadelordenamientodeseadoyhaceruncastdeIComparer,peroesposiblesimplificarestoutilizandounapropiedadestticayhacerloporelusuario: usingSystem; usingSystem.Collections; publicclassLenguaje:IComparable{ stringnombre; intid; publicLenguaje(stringnombre,intid){ this.nombre=nombre; this.id=id; } intIComparable.CompareTo(objecto){ LenguajelenguajeB=(Lenguaje)o; if(this.id>lenguajeB.id){return1;} if(this.id
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 26/63
aLenguaje[2]=newLenguaje("JavaScript",2); aLenguaje[3]=newLenguaje("Java",8); aLenguaje[4]=newLenguaje("PHP",1); Array.Sort(aLenguaje,Lenguaje.Ordena); foreach(LenguajeleninaLenguaje) Console.WriteLine(len); } }Salida: ActionScript5 C3 Java8 JavaScript2 PHP1ExpresionesRegularesLasExpresionesRegularesproveenunmtodomuypoderosoparahacerfuncionesdebusquedasyreemplazamiento.OperadorasElOperadoraschecaeltipodeloperadorizquierdoysipuedeserconvertidoexplicitamenteaeloperadorderecho,seobtiene como resultado el objeto convertido a el operador derecho, si no puede ser convertido la operacin falla yregresanull.Esteoperadorslopuedeseutilizadoconclases.SecuenciasdeEscape
SecuenciadeEscape Descripcin' Comillasimple" Comilladoble\ Diagonalinvertida
Nuloa Alertb Retrocesof FormFeedn Nuevalnear Retornodecarrot Tabuladorv Tabuladorvertical
BoxingBoxingesunmecanismoquecreaunaligaentrelostiposdevaloresylastiposdereferenciapermitiendoauntipodevalorserconvertidoauntipoobjetoyviceversa. usingSystem; classApp{ publicstaticvoidMain(){ intiEdad=33; objectoNumero=iEdad;//Box intiNumero=(int)oNumero;//Unbox //castnecesarioporqueoNumeropodracontenercualquiertipodeobjeto } }Nota, durante la conversin unboxing el tipo debe coincidir exactamente, un valor de tipo boxed no puedeserunboxed(convertido)auntipocompatible.Sirequiereobtenerotrotipodevalordiferentealquecontieneelboxed,enesecasoprimeroobtengaelvalorcorrectoydespusrealiceuncastaltipoquerequiera:(valorRequerido)valorRequeridovr=(valorRequerido)(valorBoxed)objeto;
Otra formade definir el conceptoboxing es que estemecanismo permite que losvalue types parezcan o tengan laaparienciadereferencetypes.ConversionesBoxingBoxing un valor se refiere a la conversin implcita de cualquier tipo de valor al tipo objeto.Cuandoun tipo de valoresboxedseasignaespacioaunainstanciadeobjetoyelvalordelvaluetypeescopiadoalnuevoobjeto.Observelassiguienteslneas: int iNumero=2012; object oNumero=iNumero;//invocacinimplicitaaunaoperacinboxing
Alasignarel valorde lavariableenteranNumero a unavariable objeto se realiza internamenteunaoperacinboxing,dondeelvalordelavariablenNumeroescopiadoalobjetooNumero,entonceslasvariablesenterayobjetoexistenenlapilaperolosvaloresdelosobjetosresidenenelreaoespacioasignado,loqueimplicaquelosvaloressonindependientesynohayunaligaentreellos: usingSystem; classBox{
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 27/63
publicstaticvoidMain(){ intiNumero=2012; objectoNumero=iNumero;//invocacinimplicitaaunaoperacinboxing
oNumero=2005; Console.WriteLine(iNumero); Console.WriteLine(oNumero); } }AlejecutarelcdigonotarqueelvalordeoNumeroes2005yelvalordeiNumeronocambiopermaneceen2012.ConversionesUnboxingAl contrario queBoxing,Unboxing es un mecanismo de una operacin explcita, por lo que es necesario indicar alcompiladorquetipodevalordeseamosextraerdeunobjeto,al realizar laoperacinUnboxingC#checaqueelvaluetypequeserequiereestealmacenadoenlainstanciadelobjeto,silaverificacinesexitosaelvaloresUnboxing.Supongaquetieneunavariabledetipointyasignaelvalordeestavariableintaunobjeto,despusdeclaraunavariabledetipodoubleyaplicauncast(double)alobjetoparaasignarsuvaloralavariabledouble,elobjetocontieneslounvalor inty no puede ser asignado a la variable double porque el CLR dispara una excepcin(System.InvalidCastException): intiNumero=2012; objectoNumero=iNumero;//invocacinimplicitaaunaoperacinboxing doubledNumero=(double)oNumero;//invocacionexplcita(cast) //CLRdisparalaexcepcinSystem.InvalidCastExceptionConstructoresyDestructoresAntesdeaccederalosmtodosopropiedadesdeunaclase,primeroseejecutaelconstructordelaclaseelcualcontienecdigodeinicializacin,sinoseescribeunconstructorparalaclaseelcompiladorproveeautomticamenteunconstructordefault.Enelruntime.NETelprogramadornopuedecontrolarladestruccindeobjetos.Unconstructorpuedeinvocarunconstructordeltipobaseutilizandolasintaxisbase.Losconstructoressoninvocadosinvocadosautomaticamenteslocuandounainstanciadeunobjetoescreadaconnew. classNombreClase{ publicNombreClase():base(){}//Constructorqueproveeelcompilador }Lascaractersticasdeunconstructorson:Siempretieneelmismonombrequelaclase.Notienedeclaradountipoderegreso.Porlogeneraltienenelmodificadorpblico.Sonutilizadosparainicializarvaribles.Silaclaseslocontienemiembrosestticos,esposiblecrearunconstructorprivate,locualsignificaque
nopodrseraccesiblefueradelacalseoqueslosepuedeaccederdesdelaclase.Nopuedeserinvocadodesdeladefinicindelaclase.Unobjetonopuedeserinstanciadodesdeladefinicindelaclase.
Alcodificarnoseest limitadoa losparmetrosdel constructor,esposibleenviarargumentos inicialespara inicializarciertosmiembros. usingSystem; classVehiculo{ //Propiedades: privateintiRueda; privateintiPuerta; privateintiVentana; privateintiHelice; privateintiMotor; privateintiAsiento; privatestringsTipo;//Aereo,anfibio,terrestre,espacial //Constructor: publicVehiculo(intRueda,intPuerta,intVentana,intHelice,_ intMotor,intAsiento,stringTipo){ iRueda=Rueda; iPuerta=Puerta; iVentana=Ventana; iHelice=Helice; iMotor=Motor; iAsiento=Asiento; sTipo=Tipo; } //Lectura/escrituradepropiedades:
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 28/63
publicintRuedas{ get{returniRueda;} set{iRueda=value;} } publicintPuertas{ get{returniPuerta;} set{iPuerta=value;} } publicintVentanas{ get{returniVentana;} set{iVentana=value;} } publicintHelices{ get{returniHelice;} set{iHelice=value;} } publicintMotores{ get{returniMotor;} set{iMotor=value;} } publicintAsientos{ get{returniAsiento;} set{iAsiento=value;} } publicstringTipo{ get{returnsTipo;} set{sTipo=value;} } } //Aplicacin: classAplicConstructor{ publicstaticvoidMain(){ VehiculoMiAvion=newVehiculo(2,1,100,0,3,200,"Aereo"); Console.WriteLine("Ruedas:"+MiAvion.Ruedas); Console.WriteLine("Puertas:"+MiAvion.Puertas); Console.WriteLine("Ventanas:"+MiAvion.Ventanas); Console.WriteLine("Helices:"+MiAvion.Helices); Console.WriteLine("Motores:"+MiAvion.Motores); Console.WriteLine("Asientos:"+MiAvion.Asientos); Console.WriteLine("Tipo:"+MiAvion.Tipo); } }EnunsentidoestrictoenC#nosetienendestructores,peroelterminodestructorserefierealaliberacinderecursos.Esposibleescribirunmtodoquelibererecursosdespusdeserutilizados,peroporqueescribirunmtodoparaliberarrecursossiexisteundestructor: public~NombreClase(){ //liberarrecursos }La razn por la cual se debera escribir un mtodo adicional es por el recolector de basura, el cual no es invocadoinmediatamente despus que las variables quedan fuera de mbito, slo se invoca el recolector de basura en ciertosintervalosocondicionesdememoria.Loquepodrasucederesquelosrecursosseagotenantesdeserutilizados,entoncesesbuenaideaproveerunmtodoexplcitoRelease,elcualtambinpuedeserinvocadoporeldestructor: publicvoidRelease(){ //Liberarrecursos } public~NombreClase(){ Release(); }La invocacindelmtodoReleaseeneldestructornoesobligatoria, lacoleccingarbage de cualquier forma realiza laliberacindecualquierobjeto,peroesunabuenaprcticanoolvidarliberarlosrecursos.ConstructorEstticoUnConstructorEsttico podra ser invocado antes de ser creada la primer instancia de un objeto, y es til paraconfigurareltrabajoquenecesitahacerseunavez.Enelruntime.NETelusuarionotienecontrolsobrecuandoelconstructorestticoesinvocado,yaqueelruntimeslo
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 29/63
garantizaquealgoesinvocadodespusdeliniciodelprogramayantesdesercreadalaprimerinstanciadeunobjeto,loquesignificaquenopuedeserdeterminadalainstanciaqueescreadaenelconstructoresttico.Paradeclararunconstructorestticoseutilizaelmodificadorstatic: classNombreClase{ staticNombreClase(){ . . } }
MtodosLamayorpartede la funcionalidades implementadaen losmtodos, losmtodossonpartedelTipo(class),pero losmtodosnosonpartedelainstancia(object).ParmetrosDealgnmodosedebenpasarvaloresaunmtodoytambinsedeberegresarelresultadodeunmtodo,losvaloressonmanipuladosen:ValoresenParmetrosinSeutilizanvaloresenparmetrosparapasarunavariableporvaloraunmtodo,lavariabledelmtodoesinicializadaconunacopiadelvalordelcaller(quienrealizlainvocacin). usingSystem; publicclassFecha{ publicstringMayor(intiDiaA,intiMesA,intiAoA,intiDiaB,intiMesB,intiAoB){ intiA=(iDiaA*10000)+(iMesA+100)+(iAoA); intiB=(iDiaB*10000)+(iMesB+100)+(iAoB); Console.WriteLine(iA+">"+iB); //TestLine(Delete) if(iA>iB){ returniDiaA+"/"+iMesA+"/"+iAoA; }else{ returniDiaB+"/"+iMesB+"/"+iAoB; } } publicstringMenor(intiDiaA,intiMesA,intiAoA,intiDiaB,intiMesB,intiAoB){ intiA=(iDiaA*10000)+(iMesA+100)+(iAoA); intiB=(iDiaB*10000)+(iMesB+100)+(iAoB); Console.WriteLine(iA+"
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 30/63
RefParametro*=RefParametro;//Semodificaelvalordirectamente //Noseregresaunvalor,porquesemodificodemaneradirecta } } classParametros{ publicstaticvoidMain(){ ParamMiParam=newParam(); intiValorRef=5; //Serequiereinicializarelvalor MiParam.ParametroRef(refiValorRef);//Seinvocaelmtodo pasandolareferenciadelvalor Console.WriteLine("ref:"+iValorRef); } }GoodPractice,serecomiendatenerdosvariables,unaenelparmetroyotraenelparmetroref.
Recuerde,elcompiladordeC#nopermiteutilizarvariablesquenohansidoinicializadas,porloqueantesdeutilizaroestablecerlosvaloresdeunavariabledebeserinicializada,paraelloexistendosformasdehacerlo:Inicializarlavariablealdeclararla.
usingSystem;
classMiClase{ privateintMiPropiedad; publicvoidAsignarValor(refintMiRefParam){ this.MiPropiedad=MiRefParam; } publicstaticvoidMain(){ MiClaseMiObjeto=newMiClase(); intMiEdad=33;//Seinicializalavariablealdeclararla MiObjeto.AsignarValor(refMiEdad); Console.WriteLine("MiEdad:"+MiEdad); Console.WriteLine("MiObjeto.MiPropiedad:"+MiObjeto.MiPropiedad); }}
Porejemplocambiarladefinicindelafuncinyutilizarunparmetrooutenvezdeunparmetroref.usingSystem;
classMiClase{ privateintMiPropiedad; publicvoidAsignarValor(outintMiOutParam){//Secambialadefinicindelafuncin MiOutParam=33; this.MiPropiedad=MiOutParam; } publicstaticvoidMain(){ MiClaseMiObjeto=newMiClase(); intMiEdad;//Noseinicializalavariable MiObjeto.AsignarValor(outMiEdad); Console.WriteLine("MiEdad:"+MiEdad); Console.WriteLine("MiObjeto.MiPropiedad:"+MiObjeto.MiPropiedad); }}
Losparmetrosoutsonexactamentecomolosparmetrosrefexceptoqueunavariablesininicializarpuedeserpasadacomoparmetroyelcallerdefineunparmetrooutenvezderef.ValoresenParmetrosoutUn parmetro out puede ser utilizado slo para contener el resultado de un mtodo, es necesario especificar elmodificadorout para indicar el tipo de parmetro, a diferencia de los parmetros ref elcaller no necesita inicializar lavariableantesdeinvocarelmtodo: usingSystem;
publicclassParam{ publicvoidParametroOut(outintOutParametro){ OutParametro=4*4; //Nosegregresaunvalor,porqueesregresadoenelparmetroout } } classParametros{
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 31/63
publicstaticvoidMain(){ ParamMiParam=newParam(); intiValorOut;//Noserequiereinicilizarelvalor MiParam.ParametroOut(outiValorOut);//Seinvocaelmtodoconunparmetroout Console.WriteLine("out:"+iValorOut);//Resultadodelainvocacindelmtodo } }EjemplodeParmetrosIn,RefyOut usingSystem; publicclassParam{ publicintParametroIn(intInParametro){ returnInParametro*InParametro; } publicvoidParametroRef(refintRefParametro){//Noregresaunvalorexplcito RefParametro*=RefParametro;//Semodificaelvalordirectamente //Noseregresaunvalor,porquesemodificodemaneradirecta } publicvoidParametroOut(outintOutParametro){ OutParametro=4*4; //Nosegregresaunvalor,porqueesregresadoenelparmetroout } } classParametros{ publicstaticvoidMain(){ ParamMiParam=newParam(); Console.WriteLine("in:"+MiParam.ParametroIn(3)); intiValorRef=5; //Serequiereinicializarelvalor MiParam.ParametroRef(refiValorRef);//Seinvocaelmtodopasandolareferenciadelvalor Console.WriteLine("ref:"+iValorRef); intiValorOut;//Noserequiereinicilizarelvalor MiParam.ParametroOut(outiValorOut);//Seinvocaelmtodoconunparmetroout
Console.WriteLine("out:"+iValorOut);//Resultadodelainvocacindelmtodo } }RedefinicindeMtodos(Overriding)Unodelosprincipiosbsicosdelaprogramacinorientadaaobjetoseselpolimorfismo,elcualhaceposiblequeunaclase derivada pueda redefinir (override)mtodos de la clase base. Para indicar que se puede redefinir elmtodo seemplealapalabrareservadavirtual:virtualvoidNombreMetodo_PuedeSerRedefinido
Despus,alderivardelaclasebaseseagregalapalabrareservadaoverrideenelnuevomtodo:overridevoidNombreMetodo_PuedeSerRedefinido()
Noesposiblecambiarlaaccesibilidaddeunmtodoqueesredefinido,esdecir,noesposiblecambiarlosmodificadoresquedefinenalmtodo.Cuandoseinvocaunmtodovirtualseestderivandoelmtododeclasequeesinvocadoynoelmtododelaclasebase:((ClaseBase)InstanciaClaseDerivada).NombreMetodo_PuedeSerRedefinido();
Paraindicarqueunaclasederivadeotraseutilizaeloperador:elcualdenotaestaaccin:classClaseDerivada:ClaseBase{}
Elsiguienteejemplomuestracomoseredefineunmtodo: usingSystem; classClaseBase{ publicvirtualintCalculo(intiA,intiB){ returniA+iB; } } classClaseDerivada:ClaseBase{//Sederivadelaclasebase publicoverrideintCalculo(intiA,intiB){//Seespecificaqueelmtodoserredefinido returniAiB;//Seredefinelafuncionalidaddelmtodo } } classRedefinirMetodos{ publicstaticvoidMain(){
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 32/63
ClaseBaseClsBase=newClaseBase(); Console.WriteLine("Clasebase:"+ClsBase.Calculo(5,3)); //Secreaunainstanciadelaclasederivada: ClaseDerivadaClsDer=newClaseDerivada(); //Seinvocaelmtodoredefinidoenlaclasederivada: Console.WriteLine("Clasederivada:"+ClsDer.Calculo(5,3)); } }OcultamientodeMtodos(Hiding)Esposibleocultarmtodosdelaclasebase,estoselograhaciendousodeunacaractersticaespecialdelaredefinicindemtodosllamadaocultamientodemtodosyalderivardelaclasebase: usingSystem; classClaseBase{ //Sincdigo } classClaseDerivada:ClaseBase{//Clasederivadadelaclasebase publicvoidMetodoOculto(){//MtodoOculto Console.WriteLine("HidingMethods"); } } classHiding{ publicstaticvoidMain(){ ClaseDerivadaMiClaseDerivada=newClaseDerivada(); MiClaseDerivada.MetodoOculto(); } }Elcdigoanteriordemuestraqueesposiblederivarunaclasequeimplementaunmtodoquelaclasebasenocontiene.Porotroladosilaclasebasecontieneelmtodoysetratadederivarunaclasequetratadeimplemetarunmtodoquesicontienelaclase,seproduceunerror: usingSystem; classClaseBase{ publicvoidMetodoOculto(){ Console.WriteLine("HidingMethods"); } } classClaseDerivada:ClaseBase{//Clasederivadadelaclasebase publicvoidMetodoOculto(){//Seimplementaunmtodoquesiexiste Console.WriteLine("HidingMethods"); } } classHiding{ publicstaticvoidMain(){ ClaseDerivadaMiClaseDerivada=newClaseDerivada(); MiClaseDerivada.MetodoOculto(); } }Elcompiladorindicarunmensajesimilaralsiguiente: Hiding.cs(10,14):warningCS0108:Thekeywordnewisrequiredon'ClaseDerivada.MetodoOculto()' becauseithidesinheritedmember'ClaseBase.MetodoOculto()' Hiding.cs(4,14):(Locationofsymbolrelatedtopreviouswarning)Elerrorprincipalesquenosehaceusodelmodificadornew,yaquesiesposibleocultarunmtodocontenidoenlaclasebase: usingSystem; classClaseBase{ publicvoidMetodoOculto(){//MtodoOculto Console.WriteLine("HidingMethods"); } } classClaseDerivada:ClaseBase{//Clasederivadadelaclasebase newpublicvoidMetodoOculto(){//MtodoOculto Console.WriteLine("HidingMethodsusingnew"); } } classHidingClassMet{ publicstaticvoidMain(){
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 33/63
ClaseDerivadaMiClaseDerivada=newClaseDerivada(); MiClaseDerivada.MetodoOculto(); } }Alhacerusodelmodificadornew,se le indicaalcompiladorqueseestredefiniendoelmtodode laclasebaseyquedeberaocultarestemtodo.Sepuedeasegurardeinvocarelmtodoqueredefinelaclasederivadautilizandolasiguientesintaxis:((ClaseBase)MiClaseDerivada).MetodoOculto();
PropiedadesLaspropiedadessonconvenientesparasepararlainterfazdeunobjetodesuimplementacin,envezdepermitiraunusuario acceder directamente a un campo o arreglo, una propiedad permite especificar a un conjunto de sentenciasrealizarelaccesomientrassepermitautilizarelcampooarreglo. classNombreClase{ intiNombrePropiedad;//declaracindelapropiedad //Especificacindelaccesoalapropiedad publicintNombrePropiedad{ get{returniNombrePropiedad;} set{iNombrePropiedad=value;} } }Ejemplo: usingSystem; classPropiedades{ privateintiEdad; publicintEdad{ get{returniEdad;} set{iEdad=value;} } privatestringsNombre; publicstringNombre{ get{returnsNombre;} set{sNombre=value;} } privateboolbMexicano; publicboolMexicano{ get{returnbMexicano;} set{bMexicano=value;} } publicstaticvoidMain(){ PropiedadesCiudadano=newPropiedades(); Ciudadano.Edad=33; Console.WriteLine("EdadCiudadano:"+Ciudadano.Edad); Ciudadano.Nombre="GerardongelesNava"; Console.WriteLine("NombreCiudadano:"+Ciudadano.Nombre); Ciudadano.Mexicano=true; Console.WriteLine("MexicanoCiudadano:"+Ciudadano.Mexicano); } }Existendosmanerasdeexponerelnombredelosatributos:Campos(fields)Propiedades(properties)
Losatributossonimplementadoscomovariablesmiembroconaccesopblicoviaaccessors(getoset).Losaccessors(getoset)especificanlassentenciasquesonejecutadascuandoserequiereleeroescribirelvalordeunapropiedad.Losaccessorsparalalecturadelvalordeunapropiedadsonmarcadosconlapalabrareservadagetylosaccessorsparamodificarelvalordeunapropiedadsonmarcadosconlapalabrareservadaset.Elsiguienteejemplomuestracomoseimplentanlosaccessorsparalaspropiedades: usingSystem; classPersona{ privateintiSueldo; publicintSueldo{
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 34/63
get{returniSueldo;} set{iSueldo=value;} } } classAplicPersona{ publicstaticvoidMain(){ PersonaEmpleado=newPersona(); Empleado.Sueldo=33; Console.WriteLine("Edad:"+Empleado.Sueldo); } }Note,queseutilizaelparmetrovalue,yaqueelvaloractualesalmacenadoenestequeesaccesibledentrodelaclase.Sienvezdeutilizarpropiedadesdeseautilizarcamposdeberdejarfueralosaccessorsyredefinirlavariablecomo:publicintSueldo;
AccessorsEsposibleocultar losdetallesde laestructuradealmacenamientode laclasereordenando losaccessors, eneste casoelaccessorssetespasadoenelnuevovalorparalapropiedadenelparmetrovalue.Lasoperacionesquepuedenrealizarseconlosatributosson:Implementargetyset,esposibleteneraccesoalvalordelapropiedadparaleerloyescribirlo.getonly,sloesposibleleerelvalordelapropiedad.setonly,sloesposibleestablecerelvalordelapropiedad.
PropiedadesEstticasPropiedadesestticasnopuedenserdeclaradasconlosmodificadoresvirtual,abstractuoverride.Laspropiedadesestticaspuedenserinicializadashastaqueseanecesariohacerlo,elvalorpuedeserfabricadocuandosenecesitesinalmacenarlo. usingSystem; classPersona{ intiPiernas; intiBrazos; intiOjos; publicPersona(intpiernas,intbrazos,intojos){ this.iPiernas=piernas; this.iBrazos=brazos; this.iOjos=ojos; } publicstaticPersonaPiernas{ get{ return(newPersona(2,0,0)); } } publicstaticPersonaBrazos{ get{ return(newPersona(0,4,0)); } } publicstaticPersonaOjos{ get{ return(newPersona(0,0,8)); } } } classApp{ publicstaticvoidMain(){ PersonaET=Persona.Piernas; Console.WriteLine(ET); } }ndicesEsposibleincluirunaformadeaccesoindexadoalaclasetalcomosilaclasesetratardeunarreglo,paraelloseutilizalacaractersticadeC#indexer,sintaxis:atributosmodificadoresdeclarador{instrucciones}
Losndicesoindexers regresanoestablecenunstringenun ndicedado, los indexers no tienenatributospor loqueutilizanelmodificadorpublic.Lapartedeldeclaradorconsistedeltipostringylapalabrareservadathisparadenotarelindexerdelaclase: publicstringthis[intiIndex]{ get{intrucciones}
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 35/63
set{intrucciones} }Lasreglasdeimplementacinparagetysetsonlasmismasreglasdelaspropiedades,lanicadiferenciaesquelalistadeparmetrossedefinelibrementeentreloscorchetes,tambinexistenrestriccionescomoqueesnecesarioespecificaralmenosunparmetroylosmodificadoresrefyoutnoestnpermitidos.Ejemplo: usingSystem; usingSystem.Net;//DirectivanamespaceparalaclaseDNS classResolverDNS{ IPAddress[]aIPs; publicvoidResolver(stringstrHost){ IPHostEntryIPHE=Dns.GetHostByName(strHost); aIPs=IPHE.AddressList; } publicIPAddressthis[intiIndex]{ get{returnaIPs[iIndex];} } publicintContador{ get{returnaIPs.Length;} } } classAplicResolverDNS{ publicstaticvoidMain(){ ResolverDNSMiDNS=newResolverDNS(); MiDNS.Resolver("www.informatique.com.mx"); intiContador=MiDNS.Contador; Console.WriteLine("Seencontro{0}paraelhost",iContador); for(inti=0;i
14/2/2015 Manuales.NET:ManualC#
data:text/htmlcharset=utf8,%3Cp%20class%3D%22vbTitle%22%20style%3D%22margin%3A%201px%201px%203px%3B%20padding%3A%201px% 36/63
Utiliceestemodificadorparaprevenirherenciaaccidental
Ejemplo: usingSystem; abstractclassClaseAbstracta{ abstractpublicvoidMiMetodo(); } sealedclassClaseDerivada:ClaseAbstracta{ publicoverridevoidMiMetodo(){ Console.WriteLine("Clasesealed"); } } publicclassModificadorClase{ publicstaticvoidMain(){ ClaseDerivadaCD=newClaseDerivada(); CD.MiMetodo(); } }ModificadoresMiembroAlgunosmodificadoresmiembroson:abstractIndicaqueunmtodooaccessornocontieneunaimplementacin,quesonimplicitamentevirtual.Laclasequerecibelaherenciadebeproveerlapalabrareservadaoverride.constEstemodificadoraplicaacamposyvariableslocalesLaexpresinconstanteesevaluadaentiempodecompilacin,porlotantonopuedecontenerreferencias
delaclase.eventDefineuncampoopropiedadcomotipoeventU