Manual C#

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