tag:blogger.com,1999:blog-73090971013478839372024-03-13T14:59:09.875+01:00Programmatiumrecursos de programaciónIgner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-7309097101347883937.post-60460417818601186012008-01-31T03:37:00.001+01:002010-01-10T02:07:41.509+01:00Incorporar hojas de propiedades (PropertyGrid) a nuestros proyectos<p><a href="http://lh3.google.com/ignereldar/R6E0Txbec0I/AAAAAAAAALY/Gobpu8tTN1o/image21%5B5%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" height="307" alt="image" src="http://lh6.google.com/ignereldar/R6E0Uhbec1I/AAAAAAAAALc/6Wk9G7ggahA/image21_thumb%5B4%5D" width="129" align="left" border="0" /></a> El control <em>PropertyGrid</em> (hoja o rejilla de propiedades), es un componente que podemos incluir en nuestros proyectos, como editor de propiedades de aquellos controles u objetos contenidos en el mismo. Su utilización nos permite modificar el valor de una propiedad en tiempo de ejecución, del mismo modo que la ventana de propiedades del IDE de Visual Studio nos permite hacerlo en tiempo de diseño.</p> <p>Su estructura está formada por dos columnas y tantas filas, como propiedades tenga el control u objeto asociado. La primera columna contiene el nombre de la propiedad y la segunda el valor de la misma. Dichos valores pueden ser introducidos directamente o a través del editor apropiado, que variará en función del tipo de valor.</p> <p>El control <em>PropertyGrid</em> nos permite dotar de una mayor funcionalidad a nuestras aplicaciones, es una interesante forma de mecanizar la manipulación de propiedades,  y ofrece al usuario la posibilidad de personalizar aquellos aspectos para los que hubiese sido programado.</p> <p></p> <p><span class="fullpost"></span><strong>AÑADIENDO UN CONTROL PropertyGrid A NUESTRO PROYECTO</strong></p> <p>En primer lugar debemos añadir a nuestro proyecto un control <em>PropertyGrid</em>. Ello lo podemos realizar con la siguiente línea de código.</p> <p><font face="Courier New"><font color="#2c92af">PropertyGrid</font> HojaPropiedades = <font color="#0000ff">new</font> <font color="#2c92af">PropertyGrid</font>();</font>  </p> <p> </p> <h5>ASOCIANDO CONTROLES Y OBJETOS</h5> <p>Como hemos dicho anteriormente, un control <em>PropertyGrid</em> estará normalmente asociado a un control (instancia de una clase perteneciente a Visual Studio u otra suite de terceros), o a un objeto (instancia de una clase creada por nosotros). El control u objeto asociado se seleccionará mediante el uso de la propiedad <strong>SelectedObject,</strong> y como valor se introducirá el nombre de la instancia elegida.</p> <p><font face="Courier New">HojaPropiedades.SelectedObject = <font color="#2c92af">Label1</font>; <font color="#008000">//Selecciona las propiedades del control Label1</font></font></p> <p><font face="Courier New">HojaPropiedades.SelectedObject = <font color="#2c92af">Button1</font>; <font color="#008000">//Selecciona las propiedades del control Button1</font></font></p> <p><font face="Courier New" color="#008000"><font color="#000000">HojaPropiedades.SelectedObject =</font> <font color="#2c92af">Entidad3D</font><font color="#000000">;</font> //Selecciona las propiedades del objeto Entidad3D</font></p> <p>En los dos primeros casos, el control <em>HojaPropiedades</em> mostraría las propiedades de cada uno de los controles asociados. En el tercer caso, las propiedades mostradas serían las que la clase de la que deriva la instancia <em>Entidad3D</em>, tuviese declaradas.</p> <p> </p> <h5>DEFINIENDO LAS PROPIEDADES DE UNA CLASE</h5> <p>Para definir una propiedad dentro de una clase se utiliza la siguiente sintaxis: </p> <pre>[<font color="#2c92af">Atributos de la Propiedad</font>]
<font color="#0000ff">TipoPropiedad</font> NombrePropiedad
<b>{
<font color="#0000ff">set</font> {</b>código para la escritura de los valores<b>}
<font color="#0000ff">get</font> {</b>código para la lectura de los valores<b>}
}</b></pre>
<pre><strong></strong> </pre>
<p>Así de este modo, la definición de la clase <em>Entidad3D</em>, quedaría de la siguiente forma.</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Entidad3D</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum2" style="color: #606060"> 2:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #008000">/// Los campos siguientes son los campos privados de las propiedades</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #008000">/// visibles en la hoja de propiedades.</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #008000">/// categoría General</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum6" style="color: #606060"> 6:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _Nombre;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum7" style="color: #606060"> 7:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _Clase;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum8" style="color: #606060"> 8:</span> <span style="color: #0000ff">private</span> Color _ColorLineas = SystemColors.ControlLight;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum9" style="color: #606060"> 9:</span> <span style="color: #0000ff">private</span> Color _ColorFondo = SystemColors.ControlDarkDark;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum10" style="color: #606060"> 10:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> _Grupo;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum11" style="color: #606060"> 11:</span> <span style="color: #008000">/// categoría Coordenadas XYZ</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum12" style="color: #606060"> 12:</span> <span style="color: #0000ff">private</span> XYZ _Coordenadas=<span style="color: #0000ff">new</span> XYZ();</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum13" style="color: #606060"> 13:</span> <span style="color: #0000ff">private</span> XYZ _CoordenadasEjes=<span style="color: #0000ff">new</span> XYZ();</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum14" style="color: #606060"> 14:</span> <span style="color: #008000">/// categoría Modificadores 3D</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum15" style="color: #606060"> 15:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _EscalaX;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum16" style="color: #606060"> 16:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _EscalaY;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum17" style="color: #606060"> 17:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _EscalaZ;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum18" style="color: #606060"> 18:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _RotacionX;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum19" style="color: #606060"> 19:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _RotacionY;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum20" style="color: #606060"> 20:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">float</span> _RotacionZ;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum21" style="color: #606060"> 21:</span> <span style="color: #008000">/// categoría Estados</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum22" style="color: #606060"> 22:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> _Activada;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum23" style="color: #606060"> 23:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> _Visible;</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum24" style="color: #606060"> 24:</span> <span style="color: #0000ff">private</span> Font _Fuente = <span style="color: #0000ff">new</span> Font(<span style="color: #006080">"Arial"</span>, 8, FontStyle.Regular); </pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum25" style="color: #606060"> 25:</span>  </pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum26" style="color: #606060"> 26:</span> <span style="color: #008000">/// Definición del código para las propiedades</span></pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum27" style="color: #606060"> 27:</span> [CategoryAttribute(<span style="color: #006080">"General"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum28" style="color: #606060"> 28:</span> DescriptionAttribute (<span style="color: #006080">"Establece el nombre para la instancia de la clase."</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum29" style="color: #606060"> 29:</span> DefaultValueAttribute(<span style="color: #006080">"Entidad"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum30" style="color: #606060"> 30:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Nombre</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum31" style="color: #606060"> 31:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum32" style="color: #606060"> 32:</span> get{<span style="color: #0000ff">return</span> _Nombre;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum33" style="color: #606060"> 33:</span> set{_Nombre = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum34" style="color: #606060"> 34:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum35" style="color: #606060"> 35:</span> [CategoryAttribute(<span style="color: #006080">"General"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum36" style="color: #606060"> 36:</span> DescriptionAttribute (<span style="color: #006080">"Muestra el nombre de la clase origen."</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum37" style="color: #606060"> 37:</span> ReadOnlyAttribute(<span style="color: #0000ff">true</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum38" style="color: #606060"> 38:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Clase</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum39" style="color: #606060"> 39:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum40" style="color: #606060"> 40:</span> get{<span style="color: #0000ff">return</span> _Clase;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum41" style="color: #606060"> 41:</span> set { _Clase = <span style="color: #0000ff">value</span>; }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum42" style="color: #606060"> 42:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum43" style="color: #606060"> 43:</span> [CategoryAttribute(<span style="color: #006080">"General"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum44" style="color: #606060"> 44:</span> DescriptionAttribute (<span style="color: #006080">"Establece el color de las líneas en la representación alámbrica."</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum45" style="color: #606060"> 45:</span> <span style="color: #0000ff">public</span> Color ColorLineas</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum46" style="color: #606060"> 46:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum47" style="color: #606060"> 47:</span> get{<span style="color: #0000ff">return</span> _ColorLineas;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum48" style="color: #606060"> 48:</span> set{_ColorLineas = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum49" style="color: #606060"> 49:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum50" style="color: #606060"> 50:</span> [CategoryAttribute(<span style="color: #006080">"General"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum51" style="color: #606060"> 51:</span> DescriptionAttribute(<span style="color: #006080">"Establece el color del fondo en la representación alámbrica."</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum52" style="color: #606060"> 52:</span> <span style="color: #0000ff">public</span> Color ColorFondo</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum53" style="color: #606060"> 53:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum54" style="color: #606060"> 54:</span> get { <span style="color: #0000ff">return</span> _ColorFondo; }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum55" style="color: #606060"> 55:</span> set { _ColorFondo = <span style="color: #0000ff">value</span>; }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum56" style="color: #606060"> 56:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum57" style="color: #606060"> 57:</span> [CategoryAttribute(<span style="color: #006080">"General"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum58" style="color: #606060"> 58:</span> DescriptionAttribute (<span style="color: #006080">"Muestra el grupo al que pertenece la entidad."</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum59" style="color: #606060"> 59:</span> DefaultValueAttribute(<span style="color: #006080">"Ninguno"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum60" style="color: #606060"> 60:</span> ReadOnlyAttribute(<span style="color: #0000ff">true</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum61" style="color: #606060"> 61:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Grupo</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum62" style="color: #606060"> 62:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum63" style="color: #606060"> 63:</span> get { <span style="color: #0000ff">return</span> _Grupo; }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum64" style="color: #606060"> 64:</span> set { _Grupo = <span style="color: #0000ff">value</span>; }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum65" style="color: #606060"> 65:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum66" style="color: #606060"> 66:</span> [CategoryAttribute(<span style="color: #006080">"Coordenadas XYZ"</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum67" style="color: #606060"> 67:</span> DescriptionAttribute (<span style="color: #006080">"Desplegar para establecer las coordenadas de la entidad."</span>),</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum68" style="color: #606060"> 68:</span> DefaultValueAttribute(<span style="color: #006080">"0, 0, 0"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum69" style="color: #606060"> 69:</span> <span style="color: #0000ff">public</span> XYZ Coordenadas</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum70" style="color: #606060"> 70:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum71" style="color: #606060"> 71:</span> get{<span style="color: #0000ff">return</span> _Coordenadas;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum72" style="color: #606060"> 72:</span> set{_Coordenadas = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum73" style="color: #606060"> 73:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum74" style="color: #606060"> 74:</span> [CategoryAttribute(<span style="color: #006080">"Coordenadas XYZ"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum75" style="color: #606060"> 75:</span> <span style="color: #0000ff">public</span> XYZ CoordenadasEjes</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum76" style="color: #606060"> 76:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum77" style="color: #606060"> 77:</span> get{<span style="color: #0000ff">return</span> _CoordenadasEjes;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum78" style="color: #606060"> 78:</span> set{_CoordenadasEjes = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum79" style="color: #606060"> 79:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum80" style="color: #606060"> 80:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum81" style="color: #606060"> 81:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> EscalaX</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum82" style="color: #606060"> 82:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum83" style="color: #606060"> 83:</span> get{<span style="color: #0000ff">return</span> _EscalaX;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum84" style="color: #606060"> 84:</span> set{_EscalaX = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum85" style="color: #606060"> 85:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum86" style="color: #606060"> 86:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum87" style="color: #606060"> 87:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> EscalaY</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum88" style="color: #606060"> 88:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum89" style="color: #606060"> 89:</span> get{<span style="color: #0000ff">return</span> _EscalaY;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum90" style="color: #606060"> 90:</span> set{_EscalaY = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum91" style="color: #606060"> 91:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum92" style="color: #606060"> 92:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum93" style="color: #606060"> 93:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> EscalaZ</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum94" style="color: #606060"> 94:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum95" style="color: #606060"> 95:</span> get{<span style="color: #0000ff">return</span> _EscalaZ;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum96" style="color: #606060"> 96:</span> set{_EscalaZ = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum97" style="color: #606060"> 97:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum98" style="color: #606060"> 98:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum99" style="color: #606060"> 99:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> RotacionX</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum100" style="color: #606060"> 100:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum101" style="color: #606060"> 101:</span> get{<span style="color: #0000ff">return</span> _RotacionX;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum102" style="color: #606060"> 102:</span> set{_RotacionX = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum103" style="color: #606060"> 103:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum104" style="color: #606060"> 104:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum105" style="color: #606060"> 105:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> RotacionY</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum106" style="color: #606060"> 106:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum107" style="color: #606060"> 107:</span> get{<span style="color: #0000ff">return</span> _RotacionY;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum108" style="color: #606060"> 108:</span> set{_RotacionY = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum109" style="color: #606060"> 109:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum110" style="color: #606060"> 110:</span> [CategoryAttribute(<span style="color: #006080">"Modificadores 3D"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum111" style="color: #606060"> 111:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">float</span> RotacionZ</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum112" style="color: #606060"> 112:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum113" style="color: #606060"> 113:</span> get{<span style="color: #0000ff">return</span> _RotacionZ;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum114" style="color: #606060"> 114:</span> set{_RotacionZ = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum115" style="color: #606060"> 115:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum116" style="color: #606060"> 116:</span> [CategoryAttribute(<span style="color: #006080">"Estados"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum117" style="color: #606060"> 117:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">bool</span> Activada</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum118" style="color: #606060"> 118:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum119" style="color: #606060"> 119:</span> get{<span style="color: #0000ff">return</span> _Activada;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum120" style="color: #606060"> 120:</span> set {_Activada = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum121" style="color: #606060"> 121:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum122" style="color: #606060"> 122:</span> [CategoryAttribute(<span style="color: #006080">"Estados"</span>)]</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum123" style="color: #606060"> 123:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">bool</span> Visible</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum124" style="color: #606060"> 124:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum125" style="color: #606060"> 125:</span> get{<span style="color: #0000ff">return</span> _Visible;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum126" style="color: #606060"> 126:</span> set{_Visible = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum127" style="color: #606060"> 127:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum128" style="color: #606060"> 128:</span> <span style="color: #0000ff">public</span> Font Fuente</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum129" style="color: #606060"> 129:</span> {</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum130" style="color: #606060"> 130:</span> get{<span style="color: #0000ff">return</span> _Fuente;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum131" style="color: #606060"> 131:</span> set{_Fuente = <span style="color: #0000ff">value</span>;}</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum132" style="color: #606060"> 132:</span> }</pre>
<!--CRLF-->
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum133" style="color: #606060"> 133:</span> }</pre>
<!--CRLF--></div>
</div>     <h5><a name="Atributos de las propiedades"><font color="#000000">ATRIBUTOS</font></a> DE LAS PROPIEDADES</h5>
<p>En la definición de las propiedades de la clase <em>Entidad3D</em>, se han utilizado algunos atributos especiales. Ello es debido, a que podemos configurar determinadas características de las propiedades de las clases cuyos objetos asociamos a un control <em>PropertyGrid</em>, mediante atributos opcionales incluidos en el espacio <strong>System.ComponentModel</strong>. Dichos atributos son los siguientes. </p>
<ul>
<li>
<p><strong>CategoryAttribute(String)</strong> Clasifica las propiedades en grupos.</p>
</li>
<li>
<p><strong>DescriptionAttribute(String)</strong> Texto descriptivo que aparece en la parte inferior del <em>PropertyGrid</em> cuando se selecciona la propiedad.</p>
</li>
<li>
<p><strong>BrowsableAttribute(Boolean)</strong> Determina si la propiedad se muestra o no en el control. Por defecto el valor es <strong>True</strong> (verdadero).</p>
</li>
<li>
<p><strong>ReadOnlyAttribute(Boolean)</strong> Permite o prohíbe al usuario editar la propiedad para introducir valores. Por defecto el valor es <strong>False</strong> (falso).</p>
</li>
<li>
<p><strong>DefaultValueAttribute(Object)</strong> Establece el valor por defecto de la propiedad.</p>
</li>
<li>
<p><strong>DefaultPropertyAttribute(String)</strong> Este atributo no se aplica a una propiedad sino a la clase. Establece la propiedad que aparece seleccionada cuando se entrega el objeto al control.</p>
</li>
</ul>
<h5> </h5>
<h5>RESULTADO FINAL</h5>
<p><a href="http://lh3.google.com/ignereldar/R6E0Txbec0I/AAAAAAAAALY/Gobpu8tTN1o/image21%5B5%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" height="498" alt="image" src="http://lh6.google.com/ignereldar/R6E0Uhbec1I/AAAAAAAAALc/6Wk9G7ggahA/image21_thumb%5B4%5D" width="207" align="left" border="0" /></a>El resultado de lo expuesto en las líneas anteriores sería una hoja de propiedades del objeto <em>Entidad3D</em>, tal y como podemos observar en la imagen de la izquierda.</p>
<p>Espero que os haya gustado.</p>
<p>Un saludo y hasta otra.</p>
<br />
<br />
<br /><!-- AddThis Bookmark Post Dropdown BEGIN -->
<div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script>
<p></p>
</div> Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com7tag:blogger.com,1999:blog-7309097101347883937.post-58787813665681105702008-01-29T02:39:00.001+01:002008-01-30T01:18:46.106+01:00Aplicando estilos con Infragistics AppStylist<div>Infragistics NetAdvantage for .NET es una completa y detallada suite de desarrollo para ASP.NET, que incluye nuevos controles para su uso dentro de formularios, nuevos componentes y herramientas para la plataforma .NET. Particularmente es la colección de controles que más me gusta de todas las existentes (a parte de Xtreme ToolkitPro de Codejock Software), aunque su implementación dentro de nuestras aplicaciones puede resultar algo compleja.</div> <div> </div> <div><a href="http://lh6.google.com/ignereldar/R56D2RbecyI/AAAAAAAAAKo/pj74SHXgYSE/image%5B12%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="430" alt="image" src="http://lh4.google.com/ignereldar/R56D3xbeczI/AAAAAAAAAKw/t4VSFnisIys/image_thumb%5B10%5D" width="532" border="0"></a></div> <div> </div> <div>Una de las herramientas más atractivas de NetAdvantage for .NET, es <em>AppStylist for Windows Forms.</em> Mediante ella podemos personalizar el aspecto visual de nuestras aplicaciones dotándolas de un look completamente profesional, al estilo de Office 2007. No debemos olvidar que la personalización solo afectará a los controles incluidos en la suite NetAdvantage, y no a los pertenecientes a Visual Studio o a otros desarrolladores. </div> <div> </div><span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/aplicando-estilos-con-infragistics.html">Seguir Leyendo... </a></span><span class="fullpost"> <div>Su utilización es bastante sencilla, permitiéndonos configurar tanto los colores como los estilos de visualización. Una vez modificadas las propiedades deseadas (en la mayoría de los casos basta con seleccionar una paleta de colores y dejar el resto a la aplicación), podremos guardar el estilo recien creado en un fichero que posteriormente utilizaremos para dar el look definitivo a nuestra aplicación.</div> <div> </div> <div>Es ahí donde echaremos mano de la programación para insertar las líneas de código adecuadas. </div> <div> </div> <div> </div> <div><strong>[Ejemplo en Visual Basic]</strong></div> <p><font face="Courier New"><font color="#000080"><font color="#0000ff">Public Sub New</font><font color="#000000">()</font><br> </font><font color="#0000ff">MyBase</font><font color="#000000">.New() </font></font></p> <p><font face="Courier New"></font> </p> <p><font face="Courier New"> <font color="#008000">'Windows Form Designer requiere la siguiente línea de código.</font></font></p> <p><font face="Courier New"> InitializeComponent() </font></p> <p><font face="Courier New"></font> </p> <p><font face="Courier New"> '<font color="#008000">La estilización de la aplicación comienza cuando la librería de estilos</font></font></p> <p><font face="Courier New" color="#008000"> 'es cargada mediante una llamada al método Load del StyleManager. Esto</font></p> <p><font face="Courier New"><font color="#008000"> 'ocurre normalmente durante el arranque de la aplicación.<br></font><br><font color="#0000a0"> <font color="#000000">Infragistics.Win.AppStyling.StyleManager.Load(</font><font color="#800000">"MiEstilo.isl"</font><font color="#000000">)</font> </font></font></p> <p> </p> <p><font face="Courier New"> <font color="#008000">'Dentro de la librería existirá un estilo marcado como estilo por</font></font></p> <p><font face="Courier New" color="#008000"> 'defecto. Además pueden existir otros estilos marcados por defecto para</font></p> <p><font face="Courier New" color="#008000"> 'tipos concretos de componentes como UltraGrid, UltraCombo, etc.</font></p> <p><font face="Courier New"></font> </p> <p><font color="#008000"><font face="Courier New"> 'En el siguiente ejemplo, no queremos usar el estilo por defecto </font><font face="Courier New">para</font></font></p> <p><font color="#008000"><font face="Courier New"> 'el componente UltraToolbarsManager, sino otro específico, por </font><font face="Courier New">lo</font><font face="Courier New"> que</font></font></p> <p><font face="Courier New" color="#008000"> 'cambiamos el valor de la propiedad StyleSetName, asignándole el nombre </font></p> <p><font face="Courier New" color="#008000"> 'del estilo deseado.</font></p><font face="Courier New"> <p><br><br><font color="#0000a0"> <font color="#0000ff">Me</font></font><font color="#000000">.UltraToolbarsManager1.StyleSetName = <font color="#800000">"EstiloDeComponente"</font> </font></p> <p></font> </p> <p><font face="Courier New" color="#008000"> 'En el caso de que no quisiéramos asignar estilo alguno a un componente, </font></p> <p><font face="Courier New" color="#008000"> 'desactivaríamos su capacidad de estilización.</font></p> <p><font face="Courier New"></font> </p> <p><font face="Courier New" color="#0000a0"> <font color="#0000ff">Me</font><font color="#000000">.UltraButton1.UseAppStyling = </font><font color="#0000ff">False</font> </font></p> <p><font face="Courier New"><font color="#0000ff">End Sub</font> </font> <p><strong></strong> <p><strong>[Ejemplo en C#]</strong> <p><font face="Courier New" color="#000080"><font color="#0000ff">public</font> <font color="#000000">MainForm()<br>{</font></font></p> <p><font face="Courier New"> <font color="#008000">//Windows Form Designer requiere la siguiente línea de código.</font></font></p> <p><font face="Courier New" color="#000080"> <font color="#000000"> InitializeComponent(); </font></font></p> <p><font face="Courier New"></font> </p> <p><font face="Courier New"> <font color="#008000">//La estilización de la aplicación comienza cuando la librería de </font></font> <p><font color="#008000"><font face="Courier New"> //estilos es cargada mediante una llamada al método Load </font><font face="Courier New">de</font><font face="Courier New">l</font></font> <p><font color="#008000"><font face="Courier New"> //</font><font face="Courier New">StyleManager. </font><font face="Courier New">Esto ocurre normalmente durante el arranque de la </font></font> <p><font face="Courier New" color="#008000"> //aplicación. </font> <p><font face="Courier New"><font color="#000080"> </font><font color="#000000"> Infragistics.Win.AppStyling.StyleManager.Load(</font><font color="#0000ff"><font color="#800000">"MiEstilo.isl"</font><font color="#000000">);</font> </font></font> <p><font face="Courier New" color="#0000ff"></font> <p><font face="Courier New"> <font color="#008000">//Dentro de la librería existirá un estilo marcado como estilo por </font></font> <p><font color="#008000"><font face="Courier New"> //defecto.</font><font face="Courier New"> Además pueden existir otros estilos marcados por defecto para </font></font> <p><font color="#008000"><font face="Courier New"> //tipos </font><font face="Courier New">concretos de componentes como UltraGrid, UltraCombo, etc. </font></font> <p><font face="Courier New" color="#008000"></font> <p><font face="Courier New" color="#008000"> //En el siguiente ejemplo, no queremos usar el estilo por defecto para</font> <p><font face="Courier New" color="#008000"> //el componente UltraToolbarsManager, sino otro específico, por lo que</font> <p><font face="Courier New" color="#008000"> //cambiamos el valor de la propiedad StyleSetName, asignándole el nombre</font> <p><font face="Courier New" color="#008000"> //del estilo deseado. </font> <p><font face="Courier New"><font color="#000080"> <font color="#0000ff">this</font></font><font color="#000000">.ultraToolbarsManager1.StyleSetName = <font color="#800000">"EstiloDeComponente"</font>; </font></font> <p><font face="Courier New"></font> <p><font face="Courier New"> <font color="#008000">//En el caso de que no quisiéramos asignar estilo alguno a un</font></font> <p><font color="#008000"><font face="Courier New"> //componente, d</font><font face="Courier New">esactivaríamos su capacidad de estilización. </font></font> <p><font face="Courier New"><font color="#000080"> <font color="#0000ff">this</font></font><font color="#000000">.ultraButton1.UseAppStyling = false;<br>} </font></font> <div> </div> <div> </div> <div>Y he aquí, que con estas escuetas líneas de código, habremos conseguido dotar de un aspecto único a los formularios y componentes de nuestra aplicación.</div> <div> </div> <div>Espero que os haya gustado.</div> <div> </div> <div>Un saludo y hasta otra.</div> <div> </div><!-- AddThis Bookmark Post Dropdown BEGIN --> <div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script><script src="http://s7.addthis.com/js/addthis_widget.php?v=12" type="text/javascript"></script></div> <!-- AddThis Bookmark Post Dropdown END --> </span></span> Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com3tag:blogger.com,1999:blog-7309097101347883937.post-18198238749579268732008-01-26T19:08:00.001+01:002008-01-29T01:34:55.714+01:00El lenguaje de programación C#. Aspectos léxicos.<style type="text/css">
<!--
p.msonormal {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.cdigofuentecar {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:10.0pt;
font-family:"Arial","sans-serif";
}
p.ventanaconsola {
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";
}
p.msobodytext {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.msocaption {
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:6.0pt;
margin-left:0cm;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;
}
--></style>
<style type="text/css">
<!--
li.msonormal {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
table.msonormaltable {
font-size:10.0pt;
font-family:"Times New Roman","serif";
}
p.msotoc2 {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
font-variant:small-caps;
font-weight:bold;
}
p.consola {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:10.0pt;
font-family:"Courier New";
}
span.msofootnotereference {
vertical-align:super;
}
p.cdigocarcarcarcarcarcarcarcar {
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Arial","sans-serif";
}
p.msobodytextindent {
margin-top:0cm;
margin-right:0cm;
margin-bottom:.0001pt;
margin-left:35.25pt;
text-align:justify;
tab-stops:list 36.0pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.msofootnotetext {
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Times New Roman","serif";
}
.style2 {color: #ffffff}
--></style>
<div class="indice">Autor: <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a> <br><br>Curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. <br></div>
<ul>
<li><strong>ASPECTOS LÉXICOS </strong>
<ul><br>
<li><a href="#apartado1">Comentarios</a> </li></ul>
<ul>
<li><a href="#apartado2">Identificadores</a> </li></ul>
<ul>
<li><a href="#apartado3">Palabras reservadas</a> </li></ul>
<ul>
<li><a href="#apartado4">Literales</a> </li></ul>
<ul>
<li><a href="#apartado5">Operadores</a> </li></ul></li></ul><br><a id="apartado1" name="apartado1"></a><strong><span style="font-size: 130%; color: #990000">Comentarios</span></strong> <br><br>Un <strong>comentario</strong> es texto que se incluye en el código fuente para facilitar su lectura a los programadores y cuyo contenido es, por defecto, completamente ignorado por el compilador. Suelen usarse para incluir información sobre el autor del código, para aclarar el significado o el porqué de determinadas secciones de código, para describir el funcionamiento de los métodos de las clases, etc. <br><br>En C# hay dos formas de escribir comentarios. La primera consiste en encerrar todo el texto que se desee comentar entre caracteres <strong>/*</strong> y <strong>*/</strong> siguiendo la siguiente sintaxis: <pre class="style11" style="color: #000099"><strong>/*</strong><texto><strong>*/</strong></pre>Estos comentarios pueden abarcar tantas líneas como sea necesario. Por ejemplo: <pre class="style11" style="color: #000099">/* Esto es un comentario
que ejemplifica cómo se escribe comentarios que ocupen varias líneas */ </pre>Ahora bien, hay que tener cuidado con el hecho de que no es posible anidar comentarios de este tipo. Es decir, no vale escribir comentarios como el siguiente: <pre class="style11" style="color: #000099">/* Comentario contenedor /* Comentario contenido */ */</pre>Esto se debe a que como el compilador ignora todo el texto contenido en un comentario y sólo busca la secuencia <strong>*/</strong> que marca su final, ignorará el segundo <strong>/*</strong> y cuando llegue al primer <strong>*/</strong> considerará que ha acabado el comentario abierto con el primer <strong>/*</strong> (no el abierto con el segundo) y pasará a buscar código. Como el <strong>*/</strong> sólo lo admite si ha detectado antes algún comentario abierto y aún no cerrado (no mientras busca código), cuando llegue al segundo <strong>*/</strong> considerará que ha habido un error ya que encontrará el <strong>*/</strong> donde esperaba encontrar código. <br><br>Dado que muchas veces los comentarios que se escriben son muy cortos y no suelen ocupar más de una línea, C# ofrece una sintaxis alternativa más compacta para la escritura este tipo de comentarios en las que se considera como indicador del comienzo del comentario la pareja de caracteres <strong>//</strong> y como indicador de su final el fin de línea. Por tanto, la sintaxis que siguen estos comentarios es: <pre class="style11" style="color: #000099">// <texto></pre>Y un ejemplo de su uso es: <pre class="style11" style="color: #000099">// Este comentario ejemplifica como escribir comentarios abreviados de
una sola línea</pre>Estos comentarios de una sola línea sí que pueden anidarse sin ningún problema. Por ejemplo, el siguiente comentario es perfectamente válido: <pre class="style11" style="color: #000099">// Comentario contenedor // Comentario contenido</pre><span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c-aspectos.html">Seguir Leyendo... </a></span><span class="fullpost"><br><br><a id="apartado2" name="apartado2"></a><strong><span style="font-size: 130%; color: #990000">Identificadores</span></strong><br><br>Al igual que en cualquier lenguaje de programación, en C# un <strong>identificador</strong> no es más que, como su propio nombre indica, un nombre con el que identificaremos algún elemento de nuestro código, ya sea una clase, una variable, un método, etc. <br><br>Típicamente el nombre de un identificador será una secuencia de cualquier número de caracteres alfanuméricos –incluidas vocales acentuadas y eñes- tales que el primero de ellos no sea un número. Por ejemplo, identificadores válidos serían: Arriba, caña, C3P0, áëÎò, etc; pero no lo serían 3com, 127, etc. <br><br>Sin embargo, y aunque por motivos de legibilidad del código no se recomienda, C# también permite incluir dentro de un identificador caracteres especiales imprimibles tales como símbolos de diéresis, subrayados, etc. siempre y cuando estos no tengan un significado especial dentro del lenguaje. Por ejemplo, también serían identificadores válidos, _barco<em>_</em>,<em> </em>c¨k y A·B; pero no C# (<strong>#</strong> indica inicio de directiva de preprocesado) o a!b (<strong>!</strong> indica operación lógica “not”) <br><br>Finalmente, C# da la posibilidad de poder escribir identificadores que incluyan caracteres Unicode que no se puedan imprimir usando el teclado de la máquina del programador o que no sean directamente válidos debido a que tengan un significado especial en el lenguaje. Para ello, lo que permite es escribir estos caracteres usando <strong>secuencias de escape</strong>, que no son más que secuencias de caracteres con las sintaxis: <pre class="style11" style="color: #000099"> <strong>\u</strong><dígito><dígito><dígito><dígito>
ó <strong>\U</strong><dígito><dígito><dígito><dígito><dígito><dígito><dígito><dígito></pre>Estos dígitos indican es el código Unicode del carácter que se desea incluir como parte del identificador, y cada uno de ellos ha de ser un dígito hexadecimal válido. (0-9, a-f ó A-F) Hay que señalar que el carácter <strong>u</strong> ha de escribise en minúscula cuando se indiquen caracteres Unicode con 4 dígitos y en mayúscula cuando se indiquen con caracteres de ocho. Ejemplos de identificadores válidos son C\u0064 (equivale a C#, pues 64 es el código de <strong>#</strong> en Unicode) ó a\U00000033b (equivale a a!b>) <br><br><br><a id="apartado3" name="apartado3"></a><strong><span style="font-size: 130%; color: #990000">Palabras reservadas</span></strong><br><br>Aunque antes se han dado una serie de restricciones sobre cuáles son los nombres válidos que se pueden dar en C# a los identificadores, falta todavía por dar una: los siguientes nombres no son válidos como identificadores ya que tienen un significado especial en el lenguaje: <pre class="style11" style="color: #000099"><center>abstract, as, base, bool, break, byte, case, catch, char, checked, class,
const, continue, decimal, default, delegate, do, double, else, enum, event,
explicit, extern, false, finally, fixed, float, for, foreach, goto, if,
implicit, in, int, interface, internal, lock, is, long, namespace, new,
null, object, operator, out, override, params, private, protected, public,
readonly, ref, return, sbyte, sealed, short, sizeof, stackalloc, static,
string, struct, switch, this, throw, true, try, typeof, uint, ulong,
unchecked, unsafe, ushort, using, virtual, void, while
</center></pre>Aparte de estas palabras reservadas, si en futuras implementaciones del lenguaje se decidiese incluir nuevas palabras reservadas, Microsoft dice que dichas palabras habrían de incluir al menos dos símbolos de subrayado consecutivos (__>) Por tanto, para evitar posibles conflictos futuros no se recomienda dar a nuestros identificadores nombres que contengan dicha secuencia de símbolos. <br><br>Aunque directamente no podemos dar estos nombres a nuestros identificadores, C# proporciona un mecanismo para hacerlo indirectamente y de una forma mucho más legible que usando secuencias de escape. Este mecanismo consiste en usar el carácter <strong>@</strong> para prefijar el nombre coincidente con el de una palabra reservada que queramos dar a nuestra variable. Por ejemplo, el siguiente código es válido: <pre class="style11" style="color: #000099">class @class
{
static void @static(bool @bool)
{
if (@bool)
Console.WriteLine("cierto");
else
Console.WriteLine("falso");
}
}</pre>Lo que se ha hecho en el código anterior ha sido usar <strong>@</strong> para declarar una clase de nombre class con un método de nombre static que toma un parámetro de nombre bool, aún cuando todos estos nombres son palabras reservadas en C#. <br><br>Hay que precisar que aunque el nombre que nosotros escribamos sea por ejemplo @class, el nombre con el que el compilador va a tratar internamente al identificador es solamente class. De hecho, si desde código escrito en otro lenguaje adaptado a .NET distinto a C# hacemos referencia a éste identificador y en ese lenguaje su nombre no es una palabra reservada, el nombre con el que deberemos referenciarlo es class, y no @class (si también fuese en ese lenguaje palabra reservada habría que referenciarlo con el mecanismo que el lenguaje incluyese para ello, que quizás también podría consistir en usar <strong>@</strong> como en C#) <br><br>En realidad, el uso de @ no se tiene porqué limitar a preceder palabras reservadas en C#, sino que podemos preceder cualquier nombre con él. Sin embargo, hacer esto no se recomienda, pues es considerado como un mal hábito de programación y puede provocar errores muy sutiles como el que muestra el siguiente ejemplo: <pre class="style11" style="color: #000099">class A
{
int a; // (1)
int @a; // (2)
<br>
public static void Main()
{}
}</pre>Si intentamos compilar este código se producirá un error que nos informará de que el campo de nombre a ha sido declarado múltiples veces en la clase A. Esto se debe a que como <strong>@</strong> no forma parte en realidad del nombre del identificador al que precede, las declaraciones marcadas con comentarios como (1) y (2) son equivalentes. <br><br>Hay que señalar por último una cosa respecto al carácter <strong>@</strong>: sólo puede preceder al nombre de un identificador, pero no puede estar contenido dentro del mismo. Es decir, identificadores como i5322@fie.us.es no son válidos. <br><br><br><a id="apartado4" name="apartado4"></a><strong><span style="font-size: 130%; color: #990000">Literales</span></strong><br><br>Un <strong>literal</strong> es la representación explícita de los valores que pueden tomar los tipos básicos del lenguaje. A continuación se explica cuál es la sintaxis con que se escriben los literales en C# desglosándolos según el tipo de valores que representan: <br><br>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Literales enteros:</u></strong> Un número entero se puede representar en C# tanto en formato decimal como hexadecimal. En el primer caso basta escribir los dígitos decimales (<0-9) del número unos tras otros, mientras que en el segundo hay que preceder los dígitos hexadecimales (0-9, a-f, A-F) con el prefijo <strong>0x</strong>. En ambos casos es posible preceder el número de los operadores <strong>+</strong> ó <strong>–</strong> para indicar si es positivo o negativo, aunque si no se pone nada se considerará que es positivo. Ejemplos de literales enteros son 0, 5, +15, -23, 0x1A, -0x1a, etc <br><br>En realidad, la sintaxis completa para la escritura de literales enteros también puede incluir un sufijo que indique el tipo de dato entero al que ha de pertenecer el literal. Esto no lo veremos hasta el <em>Tema 7: Variables y tipos de datos</em>. <br><br>
<li class="MsoNormal" style="text-align: justify"><strong><u>Literales reales:</u></strong> Los números reales se escriben de forma similar a los enteros, aunque sólo se pueden escribir en forma decimal y para separar la parte entera de la real usan el tradicional punto decimal (carácter <em><strong>.</strong></em>) También es posible representar los reales en formato científico, usándose para indicar el exponente los caracteres <strong>>e</strong> ó <strong>E</strong>. Ejemplos de literales reales son 0.0, 5.1, -5.1, +15.21, 3.02e10, 2.02e-2, 98.8E+1, etc. <br><br>Al igual que ocurría con los literales enteros, los literales reales también pueden incluir sufijos que indiquen el tipo de dato real al que pertenecen, aunque nuevamente no los veremos hasta el <em>Tema 7: Variables y tipos de datos</em> <br><br>
<li class="MsoNormal" style="text-align: justify"><strong><u>Literales lógicos:</u></strong> Los únicos literales lógicos válidos son <strong>true</strong> y <strong>false</strong>, que respectivamente representan los valores lógicos cierto y falso. <br><br>
<li class="MsoNormal" style="text-align: justify"><strong><u>Literales de carácter: </u></strong>Prácticamente cualquier carácter se puede representar encerrándolo entre comillas simples. Por ejemplo, 'a' (letra a), ' ' (carácter de espacio), '?' (símbolo de interrogación), etc. Las únicas excepciones a esto son los caracteres que se muestran en la <strong><u>Tabla</u></strong><strong><u> 4.1</u></strong>, que han de representarse con secuencias de escape que indiquen su valor como código Unicode o mediante un formato especial tal y como se indica a continuación: </li></ul>
<table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" width="515" align="center" border="0">
<tbody>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #17365d; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 120.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="161" bgcolor="#17365d">
<h5 class="style2" style="text-align: left" align="left">Carácter</h5></td>
<td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #17365d; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="202" bgcolor="#17365d">
<p class="MsoToc2 style2"><span style="font-variant: normal! important"><strong>Código de escape Unicode</strong></span></p></td>
<td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #17365d; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" width="152" bgcolor="#17365d">
<p class="MsoNormal style2"><strong>Código de </strong><strong>escape especial</strong></p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Comilla simple </p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="202">
<p class="CdigofuenteCar">\u0027</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="152">
<p class="CdigofuenteCar">\'</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Comilla doble</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\u0022</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\″</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Carácter nulo</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202">
<p class="CdigofuenteCar">\u0000</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152">
<p class="CdigofuenteCar">\0</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Alarma</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\u0007</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\a</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Retroceso</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202">
<p class="CdigofuenteCar">\u0008</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152">
<p class="CdigofuenteCar">\b</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Salto de página</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\u000C</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\f</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Nueva línea</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202">
<p class="CdigofuenteCar">\u000A</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152">
<p class="CdigofuenteCar">\n</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Retorno de carro</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\u000D</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\r</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Tabulación horizontal</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202">
<p class="CdigofuenteCar">\u0009</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152">
<p class="CdigofuenteCar">\t</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Tabulación vertical</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\u000B</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152" bgcolor="#c6d9f1">
<p class="CdigofuenteCar">\v</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 120.5pt; padding-top: 0cm" valign="top" width="161">
<p class="MsoNormal" style="text-align: justify">Barra invertida</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 90.65pt; padding-top: 0cm" valign="top" width="202">
<p class="CdigofuenteCar">\u005C</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 86.85pt; padding-top: 0cm" valign="top" width="152">
<p class="CdigofuenteCar">\\</p></td></tr></tbody></table>
<p class="MsoNormal" style="text-align: center" align="center"><u><span style="font-size: 10pt">Tabla 4.1:</span></u><span style="font-size: 10pt"> Códigos de escape especiales</span></p>
<br><br>
En realidad, de la tabla anterior hay que matizar que el carácter de comilla doble también puede aparecer dentro de un literal de cadena directamente, sin necesidad de usar secuencias de escape. Por tanto, otros ejemplos de literales de carácter válidos serán '\″', '″', '\f', '\u0000', '\\', '\'', etc.
<br><br>
Aparte de para representar los caracteres de la tabla anterior, también es posible usar los códigos de escape Unicode para representar cualquier código Unicode, lo que suele usarse para representar literales de caracteres no incluidos en los teclados estándares.
<br><br>
Junto al formato de representación de códigos de escape Unicode ya visto, C# incluye un formato abreviado para representar estos códigos en los literales de carácter si necesidad de escribir siempre cuatro dígitos aún cuando el código a representar tenga muchos ceros en su parte izquierda. Este formato consiste en preceder el código de <strong>\x</strong> en vez de <strong>\u</strong>. De este modo, los literales de carácter ‘\U00000008’, '\u0008', '\x0008', '\x008', '\x08' y '\x8' son todos equivalentes. Hay que tener en cuenta que este formato abreviado sólo es válido en los literales de carácter, y no a la hora de dar nombres a los identificadores.
<ul></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Literales de cadena:</u></strong> Una <strong>cadena</strong> no es más que una secuencia de caracteres encerrados entre comillas dobles. Por ejemplo ″Hola, mundo″, ″camión″, etc. El texto contenido dentro estos literales puede estar formado por cualquier número de literales de carácter concatenados y sin las comillas simples, aunque si incluye comillas dobles éstas han de escribirse usando secuencias de escape porque si no el compilador las interpretaría como el final de la cadena.<strong><u></u></strong>
<br><br>
Aparte del formato de escritura de literales de cadenas antes comentado, que es el comúnmente utilizado en la mayoría de lenguajes de programación, C# también admite uno nuevo consistente en precederlos de un símbolo <strong>@</strong>, caso en que todo el contenido de la cadena sería interpretado tal cual, sin considerar la existencia de secuencias de escape. A este tipo de literales se les conoce como <strong>literales de</strong> <strong>cadena planos</strong> o <strong>literales</strong> <strong>verbatim</strong> y pueden incluso ocupar varias líneas. La siguiente tabla recoge algunos ejemplos de cómo se interpretan:
<br><br>
<table class="MsoNormalTable" style="margin-left: -50.25pt; border-collapse: collapse" cellspacing="0" cellpadding="0" align="center" border="0">
<tbody>
<tr>
<td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #17365d; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 157.85pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="210" bgcolor="#17365d">
<p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Literal de cadena</span></strong></p></td>
<td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #17365d; padding-bottom: 0cm; width: 122.4pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="163" bgcolor="#17365d">
<p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Interpretado como...</span></strong></p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 157.85pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="210">
<p class="MsoNormal">″Hola\tMundo″</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 122.4pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="163">
<p class="MsoNormal" style="text-align: justify">Hola Mundo</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 157.85pt; padding-top: 0cm" valign="top" width="210" bgcolor="#c6d9f1">
<p class="MsoNormal">@”Hola\tMundo″</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 122.4pt; padding-top: 0cm" valign="top" width="163" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">Hola\tMundo</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 157.85pt; padding-top: 0cm" valign="top" width="210">
<p class="MsoNormal">@″Hola</p>
<p class="MsoNormal"> Mundo″</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 122.4pt; padding-top: 0cm" valign="top" width="163">
<p class="MsoNormal" style="text-align: justify">Hola</p>
<p class="MsoNormal" style="text-align: justify"> Mundo</p></td></tr>
<tr>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 157.85pt; padding-top: 0cm" valign="top" width="210" bgcolor="#c6d9f1">
<p class="MsoNormal">@”””Hola Mundo””″</p></td>
<td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #c6d9f1; padding-bottom: 0cm; width: 122.4pt; padding-top: 0cm" valign="top" width="163" bgcolor="#c6d9f1">
<p class="MsoNormal" style="text-align: justify">“Hola Mundo”</p></td></tr></tbody></table>
<p class="MsoNormal" style="text-align: center" align="center"><u><span style="font-size: 10pt">Tabla 4.2:</span></u><span style="font-size: 10pt"> Ejemplos de literales de cadena planos</span></p>
<br>El último ejemplo de la tabla se ha aprovechado para mostrar que si dentro de un literal de cadena plano se desea incluir caracteres de comilla doble sin que sean confundidos con el final de la cadena basta duplicarlos. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Literal nulo:</u></strong> El <strong>literal nulo</strong> es un valor especial que se representa en C# con la palabra reservada <strong>null</strong> y se usa como valor de las variables de objeto no inicializadas para así indicar que contienen referencias nulas.<strong><u></u></strong> </li></ul>
<br>
<a id="apartado5" name="apartado5"></a><strong><span style="font-size: 130%; color: #990000">Operadores</span></strong>
<br><br>Un <strong>operador</strong> en C# es un símbolo formado por uno o más caracteres que permite realizar una determinada operación entre uno o más datos y produce un resultado.
<br><br>
A continuación se describen cuáles son los operadores incluidos en el lenguaje clasificados según el tipo de operaciones que permiten realizar, aunque hay que tener en cuenta que C# permite la redefinición del significado de la mayoría de los operadores según el tipo de dato sobre el que se apliquen, por lo que lo que aquí se cuenta se corresponde con los usos más comunes de los mismos:
<br><br>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones aritméticas</u></strong><u>:</u> Los operadores aritméticos incluidos en C# son los típicos de suma (<strong>+></strong>), resta (<strong>-</strong>), producto (<strong>*</strong>), división (<strong>/</strong>) y módulo (<strong>%</strong>) También se incluyen operadores de “menos unario” (<strong>–</strong>) y “más unario” (<strong>+</strong>)
<br><br>
Relacionados con las operaciones aritméticas se encuentran un par de operadores llamados <strong>checked</strong><strong> </strong>y <strong>unchecked</strong><strong> </strong>que permiten controlar si se desea detectar los desbordamientos que puedan producirse si al realizar este tipo de operaciones el resultado es superior a la capacidad del tipo de datos de sus operandos. Estos operadores se usan así: <pre class="style11" style="color: #000099"><strong>checked (</strong><expresiónAritmética><strong>)</strong>
<strong>unchecked(</strong><expresiónAritmética><strong>)</strong></pre>Ambos operadores calculan el resultado de <expresiónAritmética> y lo devuelven si durante el cálculo no se produce ningún desbordamiento. Sin embargo, en caso de que haya desbordamiento cada uno actúa de una forma distinta: <strong>checked</strong> provoca un error de compilación si <expresiónAritmética> es una expresión constante y una excepción <strong>System.OverflowException</strong> si no lo es, mientras que <strong>unchecked</strong> devuelve el resultado de la expresión aritmética truncado para que quepa en el tamaño esperado.
<br><br>
Por defecto, en ausencia de los operadores <strong>checked</strong><strong> </strong>y <strong>unchecked</strong> lo que se hace es evaluar las operaciones aritméticas entre datos constantes como si se les aplicase <strong>checked</strong><strong> </strong>y las operaciones entre datos no constantes como si se les hubiese aplicado <strong>unchecked</strong>. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones lógicas:</u></strong><strong> </strong>Se incluyen operadores que permiten realizar las operaciones lógicas típicas: “and” (<strong>&&</strong> y<strong> </strong><strong>&</strong>), “or” (<strong>||</strong> y<strong> </strong><strong>|</strong>), “not” (<strong>!</strong>) y “xor” (<strong>^</strong>)
<br><br>
Los operadores <strong>&&</strong> y <strong>||</strong> se diferencia de <strong>&</strong> y <strong>|</strong> en que los primeros realizan evaluación perezosa y los segundos no. La evaluación perezosa consiste en que si el resultado de evaluar el primer operando permite deducir el resultado de la operación, entonces no se evalúa el segundo y se devuelve dicho resultado directamente, mientras que la evaluación no perezosa consiste en evaluar siempre ambos operandos. Es decir, si el primer operando de una operación <strong>&&</strong> es falso se devuelve <strong>false</strong> directamente, sin evaluar el segundo; y si el primer operando de una <strong>||</strong> es cierto se devuelve <strong>true</strong> directamente, sin evaluar el otro.
<ul style="margin-top: 0cm" type="disc"></ul>
<br>
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones relacionales:</u></strong><strong> </strong>Se han incluido los tradicionales operadores de igualdad (<strong>==</strong>), desigualdad (<strong>!=</strong>), “mayor que” (<strong>></strong>), “menor que” (<strong><</strong>), “mayor o igual que” (<strong>>=</strong>) y “menor o igual que” (<=)<strong><u></u></strong> </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de manipulación de bits</u></strong><u>:</u> Se han incluido operadores que permiten realizar a nivel de bits operaciones “and” (<strong>&</strong>), “or” (<strong>|</strong>), “not” (<strong>~</strong>), “xor” (<strong>^</strong>), desplazamiento a izquierda (<em><strong><<</strong></em>) y desplazamiento a derecha (<strong>>></strong>) El operador <strong><<</strong> desplaza a izquierda rellenando con ceros, mientras que el tipo de relleno realizado por <strong>>></strong> depende del tipo de dato sobre el que se aplica: si es un dato con signo mantiene el signo, y en caso contrario rellena con ceros. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de asignación:</u></strong> Para realizar asignaciones se usa en C# el operador <strong>=</strong>, operador que además de realizar la asignación que se le solicita devuelve el valor asignado. Por ejemplo, la expresión a = b asigna a la variable a el valor de la variable b y devuelve dicho valor, mientras que la expresión c = a = b asigna a las variables c y a el valor de b (el operador <strong>=</strong> es asociativo por la derecha)<strong><u></u></strong>
<br><br>
También se han incluido operadores de asignación compuestos que permiten ahorrar tecleo a la hora de realizar asignaciones tan comunes como: <pre class="style11" style="color: #000099">temperatura = temperatura + 15; // Sin usar asignación compuesta
temperatura += 15; // Usando asignación compuesta</pre>
Las dos líneas anteriores son equivalentes, pues el operador compuesto <strong>+=</strong><strong> </strong>asigna a su primer operando el valor que tenía más el de su segundo operando (o sea, le suma el segundo operando) Como se ve, permite compactar bastante el código.
<br><br>
Aparte del operador de asignación compuesto <strong>+=</strong>, también se ofrecen operadores de asignación compuestos para la mayoría de los operadores binarios ya vistos. Estos son: <strong>+=</strong>,<strong> -=</strong>,<strong> *=</strong>,<strong> /=</strong>,<strong> %=</strong>,<strong> &=</strong>,<strong> |=</strong>,<strong> ^=</strong>,<strong> </strong><strong><<=</strong> y <strong>>>=</strong>. Nótese que no hay versiones compuestas para los operadores binarios <strong>&&</strong> y <strong>||></strong>.
<br><br>
Otros dos operadores de asignación incluidos son los de incremento(<strong>++</strong>) y decremento (<strong>--</strong>) Estos operadores permiten, respectivamente, aumentar y disminuir en una unidad el valor de la variable sobre el que se aplican. Así, estas líneas de código son equivalentes: <pre class="style11" style="color: #000099">temperatura = temperatura + 1; // Sin usar asignación compuesta ni incremento
temperatura += 1; // Usando asignación compuesta
temperatura++; // Usando incremento</pre>Si el operador <strong>++</strong> se coloca tras el nombre de la variable (como en el ejemplo) devuelve el valor de la variable antes de incrementarla, mientras que si se coloca antes, devuelve el valor de ésta tras incrementarla; y lo mismo ocurre con el operador <strong>--</strong>. Por ejemplo: <pre class="style11" style="color: #000099">c = b++; // Se asigna a c el valor de b y luego se incrementa b
c = ++b; // Se incrementa el valor de b y luego se asigna a c</pre>La ventaja de usar los operadores <strong>++</strong> y <strong>--</strong> es que en muchas máquinas son más eficientes que el resto de formas de realizar sumas o restas de una unidad, pues el compilador puede traducirlos en una única instrucción en código máquina. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones con cadenas:</u></strong><strong> </strong>Para realizar operaciones de concatenación de cadenas se puede usar el mismo operador que para realizar sumas, ya que en C# se ha redefinido su significado para que cuando se aplique entre operandos que sean cadenas o que sean una cadena y un carácter lo que haga sea concatenarlos. Por ejemplo, ″Hola″+″ mundo″ devuelve ″Hola mundo″, y ″Hola mund″ + ′o′ también.<strong><u></u></strong> </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de acceso a tablas:</u></strong> Una <strong>tabla</strong> es un conjunto de ordenado de objetos de tamaño fijo. Para acceder a cualquier elemento de este conjunto se aplica el operador postfijo <strong>[] </strong>sobre la tabla para indicar entre corchetes la posición que ocupa el objeto al que se desea acceder dentro del conjunto. Es decir, este operador se usa así:<strong><u></u></strong> <pre class="style11" style="color: #000099"><strong>[<</strong>posiciónElemento><strong>]</strong></pre>Un ejemplo de su uso en el que se asigna al elemento que ocupa la posición 3 en una tabla de nombre tablaPrueba el valor del elemento que ocupa la posición 18 de dicha tabla es el siguiente: <pre class="style11" style="color: #000099">tablaPrueba[3] = tablaPrueba[18];</pre>Las tablas se estudian detenidamente en el <em>Tema 7: Variables y tipos de datos</em> </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operador condicional:</u></strong> Es el único operador incluido en C# que toma 3 operandos, y se usa así:<strong><u></u></strong> <pre class="style11" style="color: #000099"><condición> <strong>?</strong> <expresión1> <strong>:</strong> <expresión2></pre>El significado del operando es el siguiente: se evalúa <condición> Si es cierta se devuelve el resultado de evaluar <expresión1>, y si es falsa se devuelve el resultado de evaluar <condición2>. Un ejemplo de su uso es: <pre class="style11" style="color: #000099">b = (a>0)? a : 0; // Suponemos a y b de tipos enteros</pre>En este ejemplo, si el valor de la variable a es superior a 0 se asignará a b el valor de a, mientras que en caso contrario el valor que se le asignará será 0.
<br><br>
Hay que tener en cuenta que este operador es asociativo por la derecha, por lo que una expresión como a?b:c?d:e es equivalente a a?b:(c?d:e)
<br><br>
No hay que confundir este operador con la instrucción condicional <strong>if</strong> que se tratará en el <em>Tema 8:Instrucciones</em>, pues aunque su utilidad es similar al de ésta, <strong>?</strong> devuelve un valor e <strong>if</strong> no. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de delegados:</u></strong><strong> </strong>Un <strong>delegado</strong> es un objeto que puede almacenar en referencias a uno o más métodos y a través del cual es posible llamar a estos métodos. Para añadir objetos a un delegado se usan los operadores <strong>+</strong> y <strong>+=</strong>, mientras que para quitárselos se usan los operadores <strong>–</strong><strong> </strong>y <strong>-=</strong>. Estos conceptos se estudiarán detalladamente en el <em>Tema 13: Eventos y delegados</em><strong><u></u></strong> </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de acceso a objetos:</u></strong> Para acceder a los miembros de un objeto se usa el operador <strong>.</strong>, cuya sintaxis es: <strong><u></u></strong><pre class="style11" style="color: #000099"><objeto><strong>.</strong><miembro></pre>Si a es un objeto, ejemplos de cómo llamar a diferentes miembros suyos son: <pre class="style11" style="color: #000099">a.b = 2; // Asignamos a su propiedad a el valor 2
a.f(); // Llamamos a su método f()
a.g(2); // Llamamos a su método g() pasándole como parámetro el valor entero 2</pre>No se preocupe si no conoce los conceptos de métodos, propiedades, eventos y delegados en los que se basa este ejemplo, pues se explican detalladamente en temas posteriores. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones con punteros:</u></strong> Un <strong>puntero</strong> es una variable que almacena una referencia a una dirección de memoria. Para obtener la dirección de memoria de un objeto se usa el operador <strong>&</strong>, para acceder al contenido de la dirección de memoria almacenada en un puntero se usa el operador <strong>*</strong>, para acceder a un miembro de un objeto cuya dirección se almacena en un puntero se usa <strong>-></strong>, y para referenciar una dirección de memoria de forma relativa a un puntero se le aplica el operador <strong>[] </strong>de la forma puntero[desplazamiento]. Todos estos conceptos se explicarán más a fondo en el <em>Tema 18: Código inseguro</em>.<strong><u></u></strong> </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de obtención de información sobre tipos:</u></strong><strong> </strong>De todos los operadores que nos permiten obtener información sobre tipos de datos el más importante es <strong>typeof</strong>, cuya forma de uso es:<strong><u></u></strong> <pre class="style11" style="color: #000099"><strong>typeof(</strong><nombreTipo><strong>)</strong></pre>Este operador devuelve un objeto de tipo <strong>System.Type</strong> con información sobre el tipo de nombre <nombreTipo> que podremos consultar a través de los miembros ofrecidos por dicho objeto. Esta información incluye detalles tales como cuáles son sus miembros, cuál es su tipo padre o a qué espacio de nombres pertenece.
<br><br>
Si lo que queremos es determinar si una determinada expresión es de un tipo u otro, entonces el operador a usar es <strong>is</strong>, cuya sintaxis es la siguiente: <pre class="style11" style="color: #000099"><expresión> <strong>is</strong> <nombreTipo></pre>El significado de este operador es el siguiente: se evalúa <expresión>.
<br><br>
Si el resultado de ésta es del tipo cuyo nombre se indica en <nombreTipo><strong> </strong>se devuelve <strong>true</strong>; y si no, se devuelve <strong>false</strong>. Como se verá en el <em>Tema 5: Clases</em>, este operador suele usarse en métodos polimórficos.
<br><br>
Finalmente, C# incorpora un tercer operador que permite obtener información sobre un tipo de dato: <strong>sizeof</strong><strong> </strong>Este operador permite obtener el número de bytes que ocuparán en memoria los objetos de un tipo, y se usa así: <pre class="style11" style="color: #000099"><strong>sizeof(</strong><nombreTipo><strong>)</strong></pre><strong>sizeof</strong><strong> </strong>sólo puede usarse dentro de código inseguro, que por ahora basta considerar que son zonas de código donde es posible usar punteros. No será hasta el <em>Tema 18: Código inseguro</em> cuando lo trataremos en profundidad.
<br><br>
Además, <strong>sizeof </strong>sólo se puede aplicar sobre nombres de tipos de datos cuyos objetos se puedan almacenar directamente en pila. Es decir, que sean estructuras (se verán en el <em>Tema 13</em>) o tipos enumerados (se verán en el <em>Tema 14</em>) </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de creación de objetos</u></strong>: El operador más típicamente usado para crear objetos es <strong>new</strong>, que se usa así:<strong><u></u></strong> <pre class="style11" style="color: #000099"><strong>new </strong><nombreTipo><strong>(</strong><em><parametros></em><strong>)</strong><p></p></pre>Este operador crea un objeto de <nombreTipo> pasándole a su método constructor los parámetros indicados en <parámetros> y devuelve una referencia al mismo. En función del tipo y número de estos parámetros se llamará a uno u otro de los constructores del objeto. Así, suponiendo que a1 y a2 sean variables de tipo Avión, ejemplos de uso del operador <strong>new </strong>son: <pre class="style11" style="color: #000099">Avión a1 = new Avión(); // Se llama al constructor sin parámetros de Avión
Avión a2 = new Avión(“Caza”); // Se llama al constructor de Avión que toma // como parámetro una cadena</pre>En caso de que el tipo del que se haya solicitado la creación del objeto sea una clase, éste se creará en memoria dinámica, y lo que <strong>new</strong><strong> </strong>devolverá será una referencia a la dirección de pila donde se almacena una referencia a la dirección del objeto en memoria dinámica. Sin embargo, si el objeto a crear pertenece a una estructura o a un tipo enumerado, entonces éste se creará directamente en la pila y la referencia devuelta por el <strong>new </strong>se referirá directamente al objeto creado. Por estas razones, a las clases se les conoce como <strong>tipos referencia </strong>ya que de sus objetos en pila sólo se almacena una referencia a la dirección de memoria dinámica donde verdaderamente se encuentran; mientras que a las estructuras y tipos enumerados se les conoce como <strong>tipos valor </strong>ya sus objetos se almacenan directamente en pila.
<br><br>
C# proporciona otro operador que también nos permite crear objetos. Éste es <strong>stackalloc</strong>, y se usa así: <pre class="style11" style="color: #000099"><strong>stackalloc</strong> <nombreTipo><strong>[</strong><nElementos><strong>]</strong></pre>Este operador lo que hace es crear en pila una tabla de tantos elementos de tipo <nombreTipo> como indique <nElementos> y devolver la dirección de memoria en que ésta ha sido creada. Por ejemplo: <pre class="style11" style="color: #000099">int * p = stackalloc[100]; // p apunta a una tabla de 100 enteros.</pre><strong>stackalloc</strong><strong> </strong>sólo puede usarse para inicializar punteros a objetos de tipos valor declarados como variables locales. </li></ul>
<ul style="margin-top: 0cm" type="disc">
<li class="MsoNormal" style="text-align: justify"><strong><u>Operaciones de conversión:</u></strong> Para convertir unos objetos en otros se utiliza el operador de conversión, que no consiste más que en preceder la expresión a convertir del nombre entre paréntesis del tipo al que se desea convertir el resultado de evaluarla. Por ejemplo, si l es una variable de tipo <strong>long</strong><strong> </strong>y se desea almacenar su valor dentro de una variable de tipo <strong>int</strong><strong> </strong>llamada i, habría que convertir previamente su valor a tipo <strong>int</strong><strong> </strong>así:<strong><u></u></strong> <pre class="style11" style="color: #000099">i = (int) l; // Asignamos a i el resultado de convertir el valor de l a tipo int</pre>Los tipos <strong>int</strong><strong> </strong>y <strong>long</strong><strong>> </strong>están predefinidos en C# y permite almacenar valores enteros con signo. La capacidad de <strong>int</strong> es de 32 bits, mientras que la de <strong>long </strong>es de 64 bits. Por tanto, a no ser que hagamos uso del operador de conversión, el compilador no nos dejará hacer la asignación, ya que al ser mayor la capacidad de los <strong>long</strong>, no todo valor que se pueda almacenar en un <strong>long</strong><strong> </strong>tiene porqué poderse almacenar en un <strong>int</strong>. Es decir, no es válido: <pre class="style11" style="color: #000099">i = l; //ERROR: El valor de l no tiene porqué caber en i</pre>Esta restricción en la asignación la impone el compilador debido a que sin ella podrían producirse errores muy difíciles de detectar ante truncamientos no esperados debido al que el valor de la variable fuente es superior a la capacidad de la variable destino. <br><br>
Existe otro operador que permite realizar operaciones de conversión de forma muy similar al ya visto. Éste es el operador <strong>as</strong>, que se usa así: <pre class="style11" style="color: #000099"><expresión> <strong>as</strong> <tipoDestino></pre>Lo que hace es devolver el resultado de convertir el resultado de evaluar <expresión>al tipo indicado en <tipoDestino> Por ejemplo, para almacenar en una variable p el resultado de convertir un objeto t a tipo tipo Persona se haría: <pre class="style11" style="color: #000099">p = t as Persona; </pre>Las únicas diferencias entre usar uno u otro operador de conversión son: </li></ul>
<ul>
<li><strong>as</strong> sólo es aplicable a tipos referencia y sólo a aquellos casos en que existan conversiones predefinidas en el lenguaje. Como se verá más adelante, esto sólo incluye conversiones entre un tipo y tipos padres suyos y entre un tipo y tipos hijos suyos.
<br><br>
Una consecuencia de esto es que el programador puede definir cómo hacer conversiones de tipos por él definidos y otros mediante el operador <strong>()</strong>, pero no mediante <strong>as</strong>.Esto se debe a que <strong>as</strong> únicamente indica que se desea que una referencia a un objeto en memoria dinámica se trate como si el objeto fuese de otro tipo, pero no implica conversión ninguna. Sin embargo, <strong>()</strong> sí que implica conversión si el <tipoDestino> no es compatible con el tipo del objeto referenciado. Obviamente, el operador se aplicará mucho más rápido en los casos donde no sea necesario convertir. </li></ul>
<ul>
<li>En caso de que se solicite hacer una conversión inválida <strong>as</strong> devuelve <strong>null </strong>mientras que <strong>()</strong> produce una excepción <strong>System.InvalidCastException</strong>. </li></ul><br><a href="http://www.josanguapo.com/">(C) 2001 José Antonio González Seco </a>
<br><br>
<!-- AddThis Bookmark Post Dropdown BEGIN -->
<div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script><script src='http://s7.addthis.com/js/addthis_widget.php?v=12' type='text/javascript'></script></div>
<!-- AddThis Bookmark Post Dropdown END -->
</span>Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com0tag:blogger.com,1999:blog-7309097101347883937.post-67439340561985003082008-01-23T23:10:00.001+01:002008-01-28T02:05:14.487+01:00El lenguaje de programación C#. El preprocesador.<style type="text/css">
<!--
p.msonormal {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.cdigofuentecar {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:10.0pt;
font-family:"Arial","sans-serif";
}
p.ventanaconsola {
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Courier New";
}
p.msobodytext {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.msocaption {
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:6.0pt;
margin-left:0cm;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;
}
--></style>
<div class="indice">Autor: <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a> <br><br>Curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. <br></div>
<ul>
<li><strong>EL PREPROCESADOR</strong>
<ul><br>
<li><a href="#apartado1">Concepto de preprocesador</a> </li></ul>
<ul>
<li><a href="#apartado2">Directivas de preprocesado</a> </li></ul></li></ul><br><a id="apartado1" name="apartado1"></a><strong><span style="font-size: 130%; color: #990000">Concepto de preprocesador</span></strong> <br><br>El <strong>preprocesado</strong> es un paso previo a la compilación mediante el que es posible controlar la forma en que se realizará ésta. El <strong>preprocesador</strong> es el módulo auxiliar que utiliza el compilador para realizar estas tareas, y lo que finalmente el compilador compila es el resultado de aplicar el preprocesador al fichero de texto fuente, resultado que también es un fichero de texto. Nótese pues, que mientras que el compilador hace una traducción de texto a binario, lo que el preprocesador hace es una traducción de texto a texto. <br><br>Aquellos que tengan experiencia en el uso del preprocesador en lenguajes como C++ y conozcan los problemas que implica el uso del mismo pueden respirar tranquilos, ya que en C# se han eliminado la mayoría de características de éste que provocaban errores difíciles de detectar (macros, directivas de inclusión, etc.) y prácticamente sólo se usa para permitir realizar compilaciones condicionales de código.
<p><span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c-el.html">Seguir Leyendo... </a></span><span class="fullpost"><br><br><a id="apartado2" name="apartado2"></a><strong><span style="font-size: 130%; color: #990000">Directivas de preprocesado</span></strong> <br><br><strong><span style="font-size: 100%; color: #990000">Concepto de directiva. Sintaxis</span></strong> <br><br>El preprocesador no interpreta de ninguna manera el código fuente del fichero, sino que sólo interpreta de dicho fichero lo que se denominan <strong>directivas de preprocesado</strong>. Estas directivas son líneas de texto del fichero fuente que se caracterizan porque en ellas el primer carácter no blanco que aparece es una almohadilla (carácter <strong>#</strong>) Por ejemplo: <pre class="style11" style="color: #000099">#define TEST
Ha habido un error fatal</pre>No se preocupe ahora si no entiendo el significado de estas directivas, ya que se explicarán más adelante. Lo único debe saber es que el nombre que se indica tras el símbolo # es el nombre de la directiva, y el texto que se incluye tras él (no todas las directivas tienen porqué incluirlo) es el valor que se le da. Por tanto, la sintaxis de una directiva es: <pre class="style11" style="color: #000099"><strong>#</strong><nombreDirectiva> <em><valorDirectiva></em></pre>Es posible incluir comentarios en la misma línea en que se declara una directiva, aunque estos sólo pueden ser comentarios de una línea que empiecen con <strong>//</strong>. Por ejemplo, el siguiente comentario es válido: <pre class="style11" style="color: #000099">#define TEST // Ha habido algún error durante el preprocesado</pre>Pero este otro no, pues aunque ocupa una línea tiene la sintaxis de los comentarios que pueden ocupar varias líneas: <pre class="style11" style="color: #000099">#define TEST /* Ha habido algún error durante el preprocesado */</pre><strong><span style="font-size: 100%; color: #990000">Definición de identificadores de preprocesado</span></strong>
<br><br>
Como ya se ha comentado, la principal utilidad del preprocesador en C# es la de permitir determinar cuáles regiones de código de un fichero fuente se han de compilar. Para ello, lo que se hace es encerrar las secciones de código opcionales dentro de directivas de compilación condicional, de modo que sólo se compilarán si determinados identificadores de preprocesado están definidos. Para definir un identificador de este tipo la directiva que se usa sigue esta sintaxis: <pre class="style11" style="color: #000099"><strong>#define</strong> <nombreIdentificador></pre>Esta directiva define un identificador de preprocesado <nombreIdentificador>. Aunque más adelante estudiaremos detalladamente cuáles son los nombres válidos como identificadores en C#, por ahora podemos considerar que son válidos aquellos formados por uno o más caracteres alfanuméricos tales que no sean ni <strong>true</strong> ni <strong>false </strong>y no empiecen con un numero. Por ejemplo, para definir un identificador de preprocesado de nombre PRUEBA se haría: <pre class="style11" style="color: #000099">#define PRUEBA</pre>Por convenio se da a estos identificadores nombres en los que todas las letras se escriben en mayúsculas, como en el ejemplo anterior. Aunque es sólo un convenio y nada obliga a usarlo, ésta será la nomenclatura que usaremos en el presente documento ya que es la que sigue Microsoft en sus códigos de ejemplo. Conviene familiarizarse con ella porque hay mucho código escrito que la usa y porque emplearla facilitará a los demás la lectura de nuestro código ya que es la notación que esperarán encontrar.
<br><br>
Es importante señalar que cualquier definición de identificador ha de preceder a cualquier aparición de código en el fichero fuente. Por ejemplo, el siguiente código no es válido puesto que en él antes del <strong>#define </strong>se ha incluido código fuente (el class A): <pre class="style11" style="color: #000099">class A
#define PRUEBA
{}</pre>Sin embargo, aunque no pueda haber código antes de un <strong>#define</strong> sí que existe total libertad para precederlo de otras directivas de preprocesado.
<br><br>
Existe una forma alternativa de definir un identificador de preprocesado y que además permite que dicha definición sólo sea válida en una compilación en concreto. Esta forma consiste en pasarle al compilador en su llamada la opción <strong>/d:<nombreIdentificador></strong> (forma abreviada de <strong>/define:<nombreIdentificador></strong>), caso en que durante la compilación se considerará que al principio de todos los ficheros fuente a compilar se encuentra definido el identificador indicado. Las siguientes tres formas de llamar al compilador son equivalentes y definen identificadores de preprocesado de nombres PRUEBA y TRAZA durante la compilación de un fichero fuente de nombre ejemplo.cs <pre class="style11" style="color: #000099">csc /d:PRUEBA /d:TRAZA ejemplo.cs
csc /d:PRUEBA,TRAZA ejemplo.cs
csc /d:PRUEBA;TRAZA ejemplo.cs</pre>
Nótese en el ejemplo que si queremos definir más de un identificador usando esta técnica tenemos dos alternativas: incluir varias opciones <strong>/d</strong> en la llamada al compilador o definir varios de estos identificadores en una misma opción <strong>/d</strong> separándolos mediante caracteres de coma (<strong>,</strong>) o punto y coma (<strong>;</strong>)
<br><br>
Si se trabaja con Visual Studio.NET en lugar de directamente con el compilador en línea de comandos, entonces puede conseguir mismo efecto a través de <strong>View </strong><strong><span style="font-size: 10pt; font-family: wingdings">à</span></strong><strong> Property Pages </strong><strong><span style="font-size: 10pt; font-family: wingdings">à</span></strong><strong> Configuration Options </strong><strong><span style="font-size: 10pt; font-family: wingdings">à</span></strong><strong> Build </strong><strong><span style="font-size: 10pt; font-family: wingdings">à</span></strong><strong> Conditional Compilation Constants</strong>, donde nuevamente usado el punto y coma (<strong>;</strong>) o la coma (<strong>,</strong>) como separadores, puede definir varias constantes. Para que todo funcione bien, antes de seleccionar <strong>View</strong> ha de seleccionar en el <strong>Solution Explorer</strong> (se abre con <strong>View </strong><strong><span style="font-size: 10pt; font-family: wingdings">à</span></strong><strong> Solution Explorer</strong>) el proyecto al que aplicar la definición de las constantes.
<br><br>
Finalmente, respecto al uso de <strong>#define</strong><strong> </strong>sólo queda comentar que es posible definir varias veces una misma directiva sin que ello provoque ningún tipo de error en el compilador, lo que permite que podamos pasar tantos valores a la opción <strong>/d</strong> del compilador como queramos sin temor a que entren en conflicto con identificadores de preprocesado ya incluidos en los fuentes a compilar.
<br><br>
<strong><span style="font-size: 100%; color: #990000">Eliminación de identificadores de preprocesado</span></strong>
<p class="MsoNormal" style="text-align: justify">Del mismo modo que es posible definir identificadores de preprocesado, también es posible eliminar definiciones de este tipo de identificadores previamente realizadas. Para ello la directiva que se usa tiene la siguiente sintaxis: </p><pre class="style11" style="color: #000099"><strong>#undef </strong><nombreIdentificador></pre>En caso de que se intente eliminar con esta directiva un identificador que no haya sido definido o cuya definición ya haya sido eliminada no se producirá error alguno, sino que simplemente la directiva de eliminación será ignorada. El siguiente ejemplo muestra un ejemplo de esto en el que el segundo <strong>#undef</strong> es ignorado: <pre class="style11" style="color: #000099">#define VERSION1
#undef VERSION1
#undef VERSION1</pre>Al igual que ocurría con las directivas <strong>#define</strong>, no se puede incluir código fuente antes de las directivas <strong>#undef</strong>, sino que, todo lo más, lo único que podrían incluirse antes que ellas serían directivas de preprocesado.
<br><br>
<strong><span style="font-size: 100%; color: #990000">Compilación condicional</span></strong>
<br><br>
Como se ha repetido varias veces a lo largo del tema, la principal utilidad del preprocesador en C# es la de permitir la compilación de código condicional, lo que consiste en sólo permitir que se compile determinadas regiones de código fuente si las variables de preprocesado definidas cumplen alguna condición determinada. Para conseguir esto se utiliza el siguiente juego de directivas: <pre class="style11" style="color: #000099"><strong>#if</strong> <condición1>
<código1>
<strong>#elif</strong> <condición2>
<código2>
...
#else
<códigoElse>
<strong>#endif</strong></pre>El significado de una estructura como esta es que si se cumple <condición1> >entonces se pasa al compilador el <código1>, si no ocurre esto pero se cumple <condición2> entonces lo que se pasaría al compilador sería <código2>, y así continuamente hasta que se llegue a una rama <strong>#elif</strong> cuya condición se cumpla. Si no se cumple ninguna pero hay una rama <strong>#else</strong> se pasará al compilador el <códigoElse>, pero si dicha rama no existiese entonces no se le pasaría código alguno y se continuaría preprocesando el código siguiente al <strong>#endif</strong> en el fuente original.
<br><br>
Aunque las ramas <strong>#else </strong>y <strong>#eldif</strong> son opcionales, hay que tener cuidado y no mezclarlas, ya que la rama <strong>#else</strong> sólo puede aparecer como última rama del bloque <strong>#if</strong>...<strong>#endif</strong>.
<br><br>
Es posible anidar varias estructuras <strong>#if</strong>...<strong>#endif</strong>, como muestra el siguiente código: <pre class="style11" style="color: #000099">#define PRUEBA
<br>
using System;
<br>
class A
{
public static void Main()
{
#if PRUEBA
Console.Write (“Esto es una prueba”);
#if TRAZA
Console.Write(“ con traza”);
#elif !TRAZA
Console.Write(“ sin traza”);
#endif
#endif
}
}</pre>Como se ve en el ejemplo, las condiciones especificadas son nombres de identificadores de preprocesado, considerándose que cada condición sólo se cumple si el identificador que se indica en ella está definido. O lo que es lo mismo: un identificador de preprocesado vale cierto (<strong>true</strong> en C#) si está definido y falso (<strong>false</strong> en C#) si no.
<br><br>
El símbolo <strong>!</strong> incluido en junto al valor de la directiva <strong>#elif</strong> es el símbolo de “no” lógico, y el <strong>#elif</strong><strong> </strong>en el que se usa lo que nos permite es indicar que en caso de que no se encuentre definido el identificador de preprocesado TRAZA se han de pasar al compilador las instrucciones a continuación indicadas (o sea, el Console.Write(“sin traza”);
<br><br>
El código fuente que el preprocesador pasará al compilador en caso de que compilemos sin especificar ninguna opción <strong>/d</strong> en la llamada al compilador será: <pre class="style11" style="color: #000099">using System;
<br>
class A
{
static void Main()
{
Console.Write(“Esto es una prueba”);
Console.Write(“ sin traza”);
}
}</pre>Nótese como en el código que se pasa al compilador ya no aparece ninguna directiva de preprocesado, pues lo que el preprocesador le pasa es el código resultante de aplicar al original las directivas de preprocesado que contuviese. <br><br>
Asimismo, si compilásemos el código fuente original llamando al compilador con /d:TRAZA, lo que el preprocesador pasaría al compilador sería: <pre class="style11" style="color: #000099">using System;
<br>
class A
{
public static void Main()
{
Console.Write(“Esto es una prueba”);
Console.Write(“ sin traza”);
}
}</pre>Hasta ahora solo hemos visto que la condición de un <strong>#if</strong> o <strong>#elif</strong> puede ser un identificador de preprocesado, y que éste valdrá true o false según esté o no definido. Pues bien, éstos no son el único tipo de condiciones válidas en C#, sino que también es posible incluir condiciones que contengan expresiones lógicas formadas por identificadores de preprocesado, operadores lógicos (<strong>!</strong> para “not”, <strong>&&</strong> para “and” y <strong>||</strong> para “or”), operadores relacionales de igualdad (<strong>==</strong>) y desigualdad (<strong>!=</strong>), paréntesis (<strong>(</strong> y <strong>)</strong>) y los identificadores especiales <strong>true</strong><strong> </strong>y <strong>false</strong>. Por ejemplo: <pre class="style11" style="color: #000099">#if TRAZA // Se cumple si TRAZA esta definido.
#if TRAZA==true // Ídem al ejemplo anterior aunque con una sintaxis menos cómoda
#if !TRAZA // Sólo se cumple si TRAZA no está definido.
#if TRAZA==false // Ídem a al ejemplo anterior aunque con una sintaxis menos cómoda
#if TRAZA == PRUEBA // Solo se cumple si tanto TRAZA como PRUEBA están
// definidos o si no ninguno lo está.
#if TRAZA != PRUEBA // Solo se cumple si TRAZA esta definido y PRUEBA no o
// viceversa
#if TRAZA && PRUEBA // Solo se cumple si están definidos TRAZA y PRUEBA.
#if TRAZA || PRUEBA // Solo se cumple si están definidos TRAZA o PRUEBA.
#if false // Nunca se cumple (por lo que es absurdo ponerlo)
#if true // Siempre se cumple (por lo que es absurdo ponerlo)</pre>Es fácil ver que la causa de la restricción antes comentada de que no es válido dar un como nombre <strong>true</strong> o <strong>false</strong> a un identificador de preprocesado se debe al significado especial que éstos tienen en las condiciones de los <strong>#if</strong> y <strong>#elif</strong><strong> </strong>
<br><br>
<strong><span style="font-size: 100%; color: #990000">Generación de avisos y errores</span></strong>
<br><br>
El preprocesador de C# también ofrece directivas que permiten generar avisos y errores durante el proceso de preprocesado en caso de llegar a ser interpretadas por el preprocesador. Estas directivas tienen la siguiente sintaxis: <pre class="style11" style="color: #000099"><strong>#warning</strong> <mensajeAviso>
<strong>#error</strong> <mensajeError></pre>La directiva <strong>#warning</strong> lo que hace al ser procesada es provocar que el compilador produzca un mensaje de aviso que siga el formato estándar usado por éste para ello y cuyo texto descriptivo tenga el contenido indicado en <mensajeAviso>; y <strong>#error</strong> hace lo mismo pero provocando un mensaje de error en vez de uno de aviso.
<br><br>
Usando directivas de compilación condicional se puede controlar cuando se han de producir estos mensajes, cuando se han de procesar estas directivas. De hecho la principal utilidad de estas directivas es permitir controlar errores de asignación de valores a los diferentes identificadores de preprocesado de un código, y un ejemplo de ello es el siguiente: <pre class="style11" style="color: #000099">#warning Código aun no revisado
#define PRUEBA
#if PRUEBA && FINAL
#error Un código no puede ser simultáneamente de prueba y versión final
#endif
class A
{}</pre>En este código siempre se producirá el mensaje de aviso, pero el <strong>#if</strong> indica que sólo se producirá el mensaje de error si se han definido simultáneamente los identificadores de preprocesado PRUEBA y FINAL.
<br><br>
Como puede deducirse del ejemplo, el preprocesador de C# considera que los mensajes asociados a directivas <strong>#warning</strong> o <strong>#error</strong><strong> </strong>son todo el texto que se encuentra tras el nombre de dichas directivas y hasta el final de la línea donde éstas aparecen. Por tanto, todo comentario que se incluya en una línea de este tipo será considerado como parte del mensaje a mostrar, y no como comentario como tal. Por ejemplo, ante la directiva: <pre class="style11" style="color: #000099">#error La compilación ha fallado // Error</pre>Lo que se mostrará en pantalla es un mensaje de la siguiente forma: <pre class="style11" style="color: #000099">Fichero.cs(3,5): error CS1029: La compilación ha fallado // Error</pre>
<strong><span style="font-size: 100%; color: #990000">Cambios en la numeración de líneas</span></strong>
<br><br>
Por defecto el compilador enumera las líneas de cada fichero fuente según el orden normal en que estas aparecen en el mismo, y este orden es el que sigue a la hora de informar de errores o de avisos durante la compilación. Sin embargo, hay situaciones en las que interesa cambiar esta numeración, y para ello se ofrece una directiva con la siguiente sintaxis: <pre class="style11" style="color: #000099"><strong>#line</strong> <número> <strong><em>“</em></strong><em><nombreFichero><strong>”</strong></em></pre>Esta directiva indica al preprocesador que ha de considerar que la siguiente línea del fichero fuente en que aparece es la línea cuyo número se le indica, independientemente del valor que tuviese según la numeración usada en ese momento. El valor indicado en <strong><em>“</em></strong><em><nombreFichero><strong>”</strong></em> es opcional, y en caso de aparecer indica el nombre que se ha de considerar que tiene el fichero a la hora de dar mensajes de error. Un ejemplo: <pre class="style11" style="color: #000099">#line 127 “csmace.cs”</pre>Este uso de <strong>#line</strong><strong> </strong>indica que el compilador ha de considerar que la línea siguiente es la línea 127 del fichero csmace.cs. A partir de ella se seguirá usando el sistema de numeración normal (la siguiente a esa será la 128 de csmace.cs, la próxima la 129, etc.) salvo que más adelante se vuelva a cambiar la numeración con otra directiva <strong>#line</strong>.
<br><br>
Aunque en principio puede parecer que esta directiva es de escasa utilidad, lo cierto es que suele venir bastante bien para la escritura de compiladores y otras herramientas que generen código en C# a partir de código escrito en otros lenguajes.
<br><br>
<strong><span style="font-size: 100%; color: #990000">Marcado de regiones de código</span></strong>
<br><br>
Es posible marcar regiones de código y asociarles un nombre usando el juego de directivas <strong>#region</strong><strong> </strong>y <strong>#endregion</strong>. Estas directivas se usan así: <pre class="style11" style="color: #000099">#region <nombreRegión>
<código>
#endregion</pre>La utilidad que se dé a estas marcaciones depende de cada herramienta, pero en el momento de escribir estas líneas la única herramienta disponible que hacía uso de ellas era Visual Studio.NET, donde se usa para marcar código de modo que desde la ventana de código podamos expandirlo y contraerlo con una única pulsación de ratón. En concreto, en la ventana de código de Visual Studio aparecerá un símbolo [-] junto a las regiones de código así marcadas de manera que pulsando sobre él todo el código contenido en la región se comprimirá y será sustituido por el nombre dado en <nombreRegión>. Tras ello, el [-] se convertirá en un [+] y si volvemos a pulsarlo el código contraído se expandirá y recuperará su aspecto original. A continuación se muestra un ejemplo de cada caso:
<p class="MsoNormal" style="text-align: center" align="center"><a href="http://lh4.google.com/ignereldar/R5e7Mq7W2eI/AAAAAAAAAKI/U_j48tJbbVA/clip_image002%5B3%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="173" alt="clip_image002" src="http://lh3.google.com/ignereldar/R5e7Na7W2fI/AAAAAAAAAKQ/WhtAksa4JqY/clip_image002_thumb" width="244" border="0"></a></p>
<p class="MsoCaption" style="text-align: center" align="center">Ilustración 4: <span style="font-weight: normal">Código de región expandido</span></p>
<br>
<p class="MsoNormal" style="text-align: center" align="center"><a href="http://lh3.google.com/ignereldar/R5e7Oa7W2gI/AAAAAAAAAKY/KTSXwiI0U-8/clip_image002%5B4%5D%5B2%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="170" alt="clip_image002[4]" src="http://lh3.google.com/ignereldar/R5e7Pa7W2hI/AAAAAAAAAKg/9u6QgPL37EI/clip_image002%5B4%5D_thumb" width="244" border="0"></a><span style="font-size: 10pt"> </span></p>
<p class="MsoCaption" style="text-align: center" align="center">Ilustración 5: <span style="font-weight: normal">Código de región contraído</span> </p>
<br>
Hay que tener cuidado al anidar regiones con directivas de compilación condicional, ya que todo bloque <strong>#if</strong>...<strong>#endif</strong><strong> </strong>que comience dentro de una región ha de terminar también dentro de ella. Por tanto, el siguiente uso de la directiva <strong>#region</strong> no es valido ya que RegiónErrónea termina estando el bloque<strong> </strong><strong>#if</strong>...#endif abierto: <pre class="style11" style="color: #000099">#region RegiónErrónea
#if A
#endregion
#endif</pre>
<p><a href="http://www.josanguapo.com/">(C) 2001 José Antonio González Seco </a></p>
<br><br>
<!-- AddThis Bookmark Post Dropdown BEGIN -->
<div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script><script src='http://s7.addthis.com/js/addthis_widget.php?v=12' type='text/javascript'></script></div>
<!-- AddThis Bookmark Post Dropdown END -->
</span>Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com1tag:blogger.com,1999:blog-7309097101347883937.post-61590762439776528952008-01-22T01:16:00.000+01:002008-01-28T01:46:44.968+01:00El lenguaje de programación C#. Introducción a C#.<div class="indice">Autor: <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a> <br /> <br />Curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. <br /></div> <ul> <li><strong>INTRODUCCIÓN A C#</strong> <ul> <br /> <li><a href="#apartado1">Origen y necesidad de un nuevo lenguaje</a> </li> </ul> <ul> <li><a href="#apartado2">Características de C#</a> </li> </ul> <ul> <li><a href="#apartado3">Escritura de aplicaciones</a> </li> </ul> </li> </ul> <br /><a id="apartado1" name="apartado1"></a><strong><span style="font-size: 130%; color: #990000">Origen y necesidad de un nuevo lenguaje</span></strong> <br /> <br /><strong>C#</strong> (leído en inglés “C Sharp” y en español “C Almohadilla”) es el nuevo lenguaje de propósito general diseñado por Microsoft para su plataforma .NET. Sus principales creadores son Scott Wiltamuth y Anders Hejlsberg, éste último también conocido por haber sido el diseñador del lenguaje Turbo Pascal y la herramienta RAD Delphi. <br /> <br />Aunque es posible escribir código para la plataforma .NET en muchos otros lenguajes, C# es el único que ha sido diseñado específicamente para ser utilizado en ella, por lo que programarla usando C# es mucho más sencillo e intuitivo que hacerlo con cualquiera de los otros lenguajes ya que C# carece de elementos heredados innecesarios en .NET. Por esta razón, se suele decir que C# es el <strong>lenguaje nativo de .NET</strong> <br /> <br />La sintaxis y estructuración de C# es muy parecida a la de C++ o Java, puesto que la intención de Microsoft es facilitar la migración de códigos escritos en estos lenguajes a C# y facilitar su aprendizaje a los desarrolladores habituados a ellos. Sin embargo, su sencillez y el alto nivel de productividad son comparables con los de Visual Basic. <br /> <br />Un lenguaje que hubiese sido ideal utilizar para estos menesteres es Java, pero debido a problemas con la empresa creadora del mismo -Sun-, Microsoft ha tenido que desarrollar un nuevo lenguaje que añadiese a las ya probadas virtudes de Java las modificaciones que Microsoft tenía pensado añadirle para mejorarlo aún más y hacerlo un lenguaje orientado al desarrollo de componentes. <br /> <br />En resumen, C# es un lenguaje de programación que toma las mejores características de lenguajes preexistentes como Visual Basic, Java o C++ y las combina en uno solo. El hecho de ser relativamente reciente no implica que sea inmaduro, pues Microsoft ha escrito la mayor parte de la BCL usándolo, por lo que su compilador es el más depurado y optimizado de los incluidos en el <em>.NET Framework SDK</em> <br /> <br /><span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_23.html">Seguir Leyendo... </a></span><span class="fullpost"> <br /> <br /><a id="apartado2" name="apartado2"></a><strong><span style="font-size: 130%; color: #990000">Características de C#</span></strong> <br /> <br />Con la idea de que los programadores más experimentados puedan obtener una visión general del lenguaje, a continuación se recoge de manera resumida las principales características de C# Alguna de las características aquí señaladas no son exactamente propias del lenguaje sino de la plataforma .NET en general, y si aquí se comentan es porque tienen una repercusión directa en el lenguaje: <br /> <br /> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Sencillez:</strong> C# elimina muchos elementos que otros lenguajes incluyen y que son innecesarios en .NET. Por ejemplo: </li> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">El código escrito en C# es <strong>autocontenido</strong>, lo que significa que no necesita de ficheros adicionales al propio fuente tales como ficheros de cabecera o ficheros IDL </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">El tamaño de los tipos de datos básicos es fijo e independiente del compilador, sistema operativo o máquina para quienes se compile (no  como en C++), lo que facilita la portabilidad del código. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">No se incluyen elementos poco útiles de lenguajes como C++ tales como macros, herencia múltiple o la necesidad de un operador diferente del punto (<strong>.</strong>) acceder a miembros de espacios de nombres (<strong>::</strong>) </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Modernidad: </strong>C# incorpora en el propio lenguaje elementos que a lo largo de los años ha ido demostrándose son muy útiles para el desarrollo de aplicaciones y que en otros lenguajes como Java o C++ hay que simular, como un tipo básico <strong><span style="color: #000099">decimal</span></strong> que permita realizar operaciones de alta precisión con reales de 128 bits (muy útil en el mundo financiero), la inclusión de una instrucción <strong><span style="color: #000099">foreach</span></strong> que permita recorrer colecciones con facilidad y es ampliable a tipos definidos por el usuario, la inclusión de un tipo básico <strong><span style="color: #000099">string</span></strong> para representar cadenas o la distinción de un tipo <strong><span style="color: #000099">bool</span></strong> específico para representar valores lógicos. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Orientación a objetos: </strong>Como todo lenguaje de programación de propósito  general  actual, C# es un lenguaje orientado a objetos, aunque eso es más bien una característica del CTS que de C#. Una diferencia de este enfoque orientado a objetos respecto al de otros lenguajes como C++ es que el de C# es más puro en tanto que no admiten ni funciones ni variables globales sino que todo el código y datos han de definirse dentro de definiciones de tipos de datos, lo que reduce problemas por conflictos de nombres y facilita la legibilidad del código. <br> <br />C# soporta todas las características propias del paradigma de programación orientada a objetos: <strong>encapsulación</strong>, <strong>herencia</strong> y <strong>polimorfismo</strong>. <br /> <br />En lo referente a la encapsulación es importante señalar que aparte de los típicos modificadores <strong><span style="color: #000099">public</span></strong>,<strong><span style="color: #000099"> private </span></strong>y<strong><span style="color: #000099"> protected</span></strong>, C# añade un cuarto modificador llamado <strong><span style="color: #000099">internal</span></strong>, que puede combinarse con <strong><span style="color: #000099">protected </span></strong>e indica que al elemento a cuya definición precede sólo puede accederse desde su mismo ensamblado. <br /> <br />Respecto a la herencia -a diferencia de C++ y al igual que Java- C# sólo admite herencia simple de clases ya que la múltiple provoca más quebraderos de cabeza que facilidades y en la mayoría de los casos su utilidad puede ser simulada con facilidad mediante herencia múltiple de interfaces. De todos modos, esto vuelve a ser más bien una característica propia del CTS que de C#. <br /> <br />Por otro lado y a diferencia de Java, en C# se ha optado por hacer que todos los métodos sean por defecto sellados y que los redefinibles hayan de      marcarse con el modificador <strong><span style="color: #000099">virtual </span></strong>(como en C++), lo que permite evitar errores derivados de redefiniciones accidentales. Además, un efecto secundario   de esto es que las llamadas a los métodos serán más eficientes por defecto al no tenerse que buscar en la tabla de funciones virtuales la implementación de los mismos a la que se ha de llamar. Otro efecto secundario es que permite que las llamadas a los métodos virtuales se puedan hacer más eficientemente al contribuir a que el tamaño de dicha tabla se reduzca. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Orientación a componentes:</strong> La propia sintaxis de C# incluye elementos propios del diseño de componentes que otros lenguajes tienen que simular mediante construcciones más o menos complejas. Es decir, la sintaxis de C# permite definir cómodamente <strong>propiedades </strong>(similares a campos de acceso controlado), <strong>eventos </strong>(asociación controlada de funciones de respuesta a notificaciones) o <strong>atributos </strong>(información sobre un tipo o sus miembros)<strong></strong> </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Gestión automática de memoria:</strong> Como ya se comentó, todo lenguaje de .NET tiene a su disposición el recolector de basura del CLR. Esto tiene el efecto en el lenguaje de que no es necesario incluir instrucciones de destrucción de objetos. Sin embargo, dado que la destrucción de los objetos a través del recolector de basura es indeterminista y sólo se realiza cuando éste se active –ya sea por falta de memoria, finalización de la aplicación o solicitud explícita en el fuente-, C# también proporciona un mecanismo de liberación de recursos determinista a través de la instrucción <strong><span style="color: #000099">using</span></strong>. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Seguridad de tipos: </strong>C# incluye mecanismos que permiten asegurar que los accesos a tipos de datos siempre se realicen correctamente, lo que permite evita que se produzcan errores difíciles de detectar por acceso a memoria no perteneciente a ningún objeto y es especialmente necesario en un entorno gestionado por un recolector de basura. Para ello se toman medidas del tipo:<strong></strong> </li> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Sólo se admiten <strong>conversiones entre tipos compatibles</strong>. Esto es, entre un tipo y antecesores suyos, entre tipos para los que explícitamente se haya definido un operador de conversión, y entre un tipo y un tipo hijo suyo del que un objeto del primero almacenase una referencia del segundo (<strong>downcasting</strong>) Obviamente, lo último sólo puede comprobarlo en tiempo de ejecución el CLR y no el compilador, por lo que en realidad el CLR y el compilador colaboran para asegurar la corrección de las conversiones. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">No se pueden usar <strong>variables no inicializadas</strong>. El compilador da a los campos un valor por defecto consistente en ponerlos a cero y controla mediante análisis del flujo de control del fuente que no se lea ninguna variable local sin que se le haya asignado previamente algún valor. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Se comprueba que todo <strong>acceso a los elementos de una tabla</strong> se realice con índices que se encuentren dentro del rango de la misma. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Se puede controlar la <strong>producción de desbordamientos</strong> en operaciones aritméticas, informándose de ello con una excepción cuando ocurra. Sin embargo, para conseguirse un mayor rendimiento en la aritmética estas comprobaciones no se hacen por defecto al operar con variables sino sólo con constantes (se pueden detectar en tiempo de compilación) </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">A diferencia de Java, C# incluye <strong>delegados</strong>, que son similares a los punteros a funciones de C++ pero siguen un enfoque orientado a objetos,  pueden almacenar referencias a varios métodos simultáneamente, y se comprueba que los métodos a los que apunten tengan parámetros y valor de retorno del tipo indicado al definirlos. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Pueden definirse métodos que admitan un número indefinido de parámetros de un cierto tipo, y a diferencia lenguajes como C/C++, en C# siempre se comprueba que los valores que se les pasen en cada llamada sean de los tipos apropiados. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Instrucciones seguras: </strong>Para evitar errores muy comunes, en C# se han impuesto una serie de restricciones en el uso de las instrucciones de control más comunes. Por ejemplo, la guarda de toda condición ha de ser una expresión condicional y no aritmética, con lo que se evitan errores por confusión del operador de igualdad (<strong><span style="color: #000099">==</span></strong>) con el de asignación (<strong><span style="color: #000099">=</span></strong>); y todo caso de un <strong><span style="color: #000099">switch</span></strong> ha de terminar en un <strong><span style="color: #000099">break</span></strong> o <strong><span style="color: #000099">goto</span></strong> que indique cuál es la siguiente acción a realizar, lo que evita la ejecución accidental de casos y facilita su reordenación. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Sistema de tipos unificado: </strong>A diferencia de C++, en C# todos los tipos de datos que se definan siempre derivarán, aunque sea de manera implícita, de una clase base común llamada <strong><span style="color: #000099">System.Object</span></strong>, por lo que dispondrán de todos los miembros definidos en ésta clase (es decir, serán “objetos”) <br> <br />A diferencia de Java, en C# esto también es aplicable a los tipos de datos básicos. Además, para conseguir que ello no tenga una repercusión negativa en su nivel de rendimiento, se ha incluido un mecanismo transparente de <strong><span style="color: #000099">boxing</span></strong> y <strong><span style="color: #000099">unboxing </span></strong>con el que se consigue que sólo sean tratados como objetos cuando la situación lo requiera, y  mientras tanto puede aplicárseles optimizaciones específicas. <br /> <br />El hecho de que todos los tipos del lenguaje deriven de una clase común facilita enormemente el diseño de colecciones genéricas que puedan almacenar objetos de cualquier tipo. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Extensibilidad de tipos básicos:</strong> C# permite definir, a través de <strong>estructuras</strong>, tipos de datos para los que se apliquen las mismas optimizaciones que para los tipos de datos básicos. Es decir, que se puedan almacenar directamente en pila (luego su creación, destrucción y acceso serán más rápidos) y se asignen por valor y no por referencia. Para conseguir que lo último no tenga efectos negativos al pasar estructuras como parámetros de métodos, se da la posibilidad de pasar referencias a pila a través del modificador de parámetro <strong><span style="color: #000099">ref</span></strong>. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Extensibilidad de operadores:</strong> Para facilitar la legibilidad del código y conseguir que los nuevos tipos de datos básicos que se definan a través de las estructuras estén al mismo nivel que los básicos predefinidos en el lenguaje, al igual que C++ y a diferencia de Java, C# permite redefinir el significado de la mayoría de los operadores -incluidos los de conversión, tanto para conversiones implícitas como explícitas- cuando se apliquen a diferentes tipos de objetos. <br /> <br />Las redefiniciones de operadores se hacen de manera inteligente, de modo que a partir de una única definición de los operadores <strong><span style="color: #000099">++</span></strong> y <strong><span style="color: #000099">-- </span></strong>el compilador puede deducir automáticamente como ejecutarlos de manera prefijas y postifja; y definiendo operadores simples (como <strong><span style="color: #000099">+</span></strong>), el compilador deduce cómo aplicar su  versión de asignación compuesta (+=) Además, para asegurar la consistencia, el compilador vigila que los operadores con opuesto siempre se redefinan por parejas (por ejemplo, si se redefine <strong><span style="font-size: 10pt; font-family: 'Arial','sans-serif'">==</span></strong>, también hay que redefinir <strong><span style="font-size: 10pt; font-family: 'Arial','sans-serif'">!=</span></strong>) <br /> <br />También se da la posibilidad, a través del concepto de <strong>indizador</strong>, de redefinir el significado del operador <strong><span style="color: #000099">[]</span></strong> para los tipos de dato definidos por el usuario, con lo que se consigue que se pueda acceder al mismo como si fuese una tabla. Esto es muy útil para trabajar con tipos que actúen como colecciones de objetos. </li> </ul> <ul> <li><strong>Extensibilidad de modificadores:</strong> C# ofrece, a través del concepto de <strong>atributos</strong>, la posibilidad de añadir a los metadatos del módulo resultante de la compilación de cualquier fuente información adicional a la generada por el  compilador  que luego podrá ser consultada en tiempo ejecución a través de la librería de reflexión de .NET . Esto, que más bien es una característica propia de la plataforma .NET y no de C#, puede usarse como un mecanismo para definir nuevos modificadores. </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Versionable:</strong> C# incluye una <strong>política de versionado</strong> que permite crear nuevas versiones de tipos sin temor a que la introducción de nuevos miembros provoquen errores difíciles de detectar en tipos hijos previamente desarrollados y ya extendidos con miembros de igual nombre a los recién introducidos. <br /> <br />Si una clase introduce un nuevo método cuyas redefiniciones deban seguir la regla de llamar a la versión de su padre en algún punto de su código, difícilmente seguirían esta regla miembros de su misma signatura definidos en clases hijas previamente a la definición del mismo en la clase padre;  o si introduce un nuevo campo con el mismo nombre que algún método de una  clase hija, la clase hija dejará de funcionar. Para evitar que esto ocurra, en C# se toman dos medidas: </li> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Se obliga a que toda  redefinición deba incluir el modificador <strong><span style="color: #000099">override</span></strong>, con lo que la versión de la clase hija nunca sería considerada como una redefinición de la versión de miembro en la clase padre ya que no incluiría <strong><span style="color: #000099">override</span></strong>. Para evitar que por accidente un programador incluya este modificador, sólo se permite incluirlo en miembros que tengan la misma  signatura que miembros marcados como redefinibles mediante el modificador <strong><span style="color: #000099">virtual</span></strong>. Así además se evita el error tan frecuente en Java de creerse haber redefinido un miembro, pues si el miembro con <strong><span style="color: #000099">override</span></strong> no existe en la clase padre se producirá un error de compilación. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <ul style="margin-top: 0cm" type="circle"> <li class="MsoNormal" style="text-align: justify">Si no se considera redefinición, entonces se considera que lo que se desea es ocultar el método de la clase padre, de modo que para la clase hija sea como si nunca hubiese existido. El compilador avisará de esta decisión a través de un mensaje de aviso que puede suprimirse  incluyendo el modificador <strong><span style="color: #000099">new </span></strong>en la definición del miembro en la clase hija para así indicarle explícitamente la intención de ocultación. </li> </ul> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Eficiente: </strong>En principio, en C# todo el código incluye numerosas restricciones para asegurar su seguridad y no permite el uso de punteros. Sin embargo, y a diferencia de Java, en C# es posible saltarse dichas restricciones manipulando  objetos a través de punteros. Para ello basta marcar regiones de código como inseguras (modificador <strong><span style="color: #000099">unsafe</span></strong>) y podrán usarse en ellas punteros de forma similar a cómo se hace en C++, lo que puede resultar vital para situaciones donde se necesite una eficiencia y velocidad procesamiento muy grandes.<strong></strong> </li> </ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>Compatible: </strong>Para facilitar la migración de programadores, C# no sólo mantiene una sintaxis muy similar a C, C++  o Java que permite incluir directamente en código escrito en C# fragmentos de código escrito en estos lenguajes, sino que el CLR también ofrece, a través de los llamados <strong>Platform Invocation Services </strong>(<strong>PInvoke</strong>), la posibilidad de acceder a código nativo escrito como funciones sueltas no orientadas a  objetos tales como las DLLs de la API Win32. Nótese que la capacidad de usar punteros en código inseguro permite que se  pueda acceder con facilidad a este tipo de funciones, ya que éstas muchas veces esperan recibir o devuelven punteros. <br /> <br />También es posible acceder desde código escrito en C# a objetos COM. Para facilitar esto, el <em>.NET Framework SDK </em>incluye una herramientas llamadas <strong><span style="color: #000099">tlbimp </span></strong>y <strong><span style="color: #000099">regasm</span></strong><strong><span style="font-size: 10pt; font-family: 'Arial','sans-serif'"> </span></strong>mediante las que es posible generar automáticamente clases proxy que permitan, respectivamente, usar objetos COM desde .NET como si de objetos .NET se tratase y registrar objetos .NET para su uso desde COM. <br /><br>Finalmente, también se da la posibilidad de usar controles ActiveX desde código .NET y viceversa. Para lo primero se utiliza la utilidad <strong><span style="color: #000099">aximp</span></strong>, mientras que para lo segundo se usa la ya mencionada <strong><span style="color: #000099">regasm</span></strong>. </li> </ul> <br /><a id="apartado3" name="apartado3"></a><strong><span style="font-size: 130%; color: #990000">Escritura de aplicaciones</span></strong> <br /> <br /><strong><span style="font-size: 100%; color: #990000">Aplicación básica ¡Hola Mundo!</span></strong> <br /> <br />Básicamente una aplicación en C# puede verse  como un conjunto de uno o más ficheros de código fuente con las instrucciones necesarias para que la aplicación funcione como se desea y que son pasados al compilador para que genere un ejecutable. Cada uno de estos ficheros no es más que un fichero de texto plano escrito usando caracteres Unicode y siguiendo la sintaxis propia de C#. <br /><br> Como primer contacto con el lenguaje, nada mejor que el típico programa de iniciación “¡Hola Mundo!” que lo único que hace al ejecutarse es mostrar por pantalla el mensaje ¡Hola Mundo! Su código es: <pre class="style11" style="color: #000099">1: class HolaMundo
2:  {
3:     static void Main()
4:    {
5:        System.Console.WriteLine(“¡Hola Mundo!”);
6:     }
7:  }</pre>
Todo el código escrito en C# se ha de escribir dentro de una definición de clase, y lo que en la línea <strong>1:</strong> se dice es que se va a definir una clase (<strong>class</strong>) de nombre HolaMundo1 cuya definición estará comprendida entre la llave de apertura de la línea <strong>2:</strong> y su correspondiente llave de cierre en  la línea línea <strong>7:</strong>
<br><br>
Dentro de la definición de la clase (línea <strong>3:</strong>) se define un método de nombre Main cuyo código es el indicado entre la llave de apertura de la línea <strong>4:</strong> y su respectiva llave de cierre (línea <strong>6:</strong>) Un método no es más que un conjunto de instrucciones a las que se les asocia un nombre, de modo que para posteriormente ejecutarlas baste referenciarlas por su nombre en vez de tener que rescribirlas.
<br><br>
La partícula que antecede al nombre del método indica cuál es el tipo de valor que se devuelve tras la ejecución del método, y en este caso es <strong><span style="color: #000099">void</span></strong> que significa que no se devuelve nada. Por su parte, los paréntesis colocados tras el nombre del método indican cuáles son los parámetros que éste toma, y el que estén vacíos significa que el método no toma ninguno. Los parámetros de un método permiten modificar el resultado de su ejecución en función de los valores que se les dé en cada llamada.
<br><br>
La palabra <strong><span style="color: #000099">static </span></strong>que antecede a la declaración del tipo de valor devuelto es un  <strong>modificador </strong>del significado de la declaración de método que indica que el método  está asociado a la clase dentro de la que se define y no a los objetos que se creen a partir de ella. Main() es lo que se denomina el <strong>punto de entrada</strong> de la aplicación, que no es más que el método por el que comenzará su ejecución. Necesita del modificador <strong><span style="color: #000099">static </span></strong>para evitar que para llamarlo haya que crear algún objeto de la clase donde se haya definido.
<br><br>
Finalmente, la línea <strong>5:</strong> contiene la instrucción con el código a ejecutar, que lo que se  hace es solicitar la ejecución del método <strong><span style="color: #000099">WriteLine()</span></strong> de la clase <strong><span style="color: #000099">Console</span></strong> definida en el espacio de nombres <strong><span style="color: #000099">System </span></strong>pasándole como parámetro la cadena de texto con el contenido ¡Hola Mundo! Nótese que las cadenas de textos son secuencias  de caracteres delimitadas por comillas dobles aunque dichas comillas no forman parte de la cadena. Por su parte, un espacio de nombres puede considerarse que es para las clases algo similar a lo que un directorio es para los ficheros: una forma de agruparlas.
<br><br>
El método <strong><span style="color: #000099">WriteLine()</span></strong> se usará muy a menudo en los próximos temas, por lo que es conveniente señalar ahora que una forma de llamarlo que se utilizará en repetidas ocasiones consiste en pasarle un número indefinido de otros  parámetros de cualquier tipo e incluir en el primero subcadenas de  la forma <span style="color: #000099"><strong>{i}</strong></span>. Con ello se consigue que se muestre por la ventana de consola la cadena que se le pasa como primer parámetro pero sustituyéndole las subcadenas <span style="color: #000099"><strong>{i}</strong></span> por el valor convertido en cadena de texto del parámetro que ocupe la posición i+2 en la llamada a <strong><span style="color: #000099">WriteLine()</span></strong>. Por ejemplo, la siguiente instrucción mostraría <strong>Tengo 5 años</strong> por pantalla si x valiese 5:
<pre class="style11" style="color: #000099">System.Console.WriteLine(“Tengo {0} años”, x);</pre>
Para indicar cómo convertir cada objeto en un cadena de texto basta redefinir su método <strong><span style="color: #000099">ToString()</span></strong>, aunque esto es  algo que no se verá hasta el <em>Tema 5: Clases</em>.
<br><br>
Antes de seguir es importante resaltar que C# es sensible a las mayúsculas, los que significa que no da igual la capitalización con la que se escriban los identificadores. Es decir, no es lo mismo escribir Console que COnsole o CONSOLE, y si se hace de alguna de las dos últimas formas el compilador producirá un error debido a que en el espacio de nombres <strong><span style="color: #000099">System </span></strong>no existe ninguna clase con dichos nombres. En este sentido, cabe señalar que un error común entre programadores acostumbrados a Java es llamar al punto de entrada main en vez de Main, lo que provoca un error al compilar ejecutables en tanto que el compilador no detectará ninguna definición de punto de entrada.
<br><br>
<strong><span style="font-size: 100%; color: #990000">Puntos de entrada</span></strong>
<br><br>
Ya se ha dicho que el  <strong>punto de entrada </strong>de una aplicación es un método de nombre Main que contendrá el código por donde se ha de iniciar la ejecución de la misma. Hasta ahora sólo se ha visto una versión de <span style="color: #000099"><strong>Main() </strong></span>que no toma parámetros y tiene como tipo de retorno <strong><span style="color: #000099">void</span></strong>, pero en realidad todas sus posibles versiones son:
<br><br>
<pre class="style11" style="color: #000099"><strong>static void Main()<br />static int Main()<br />static int Main(string[] </strong>args<strong>)<br />static void Main(string[] </strong>args<strong>)</strong></pre>
Como se ve, hay versiones de <span style="color: #000099"><strong>Main() </strong></span>que devuelven un valor de tipo <strong>int</strong>. Un <strong>int</strong> no es más que un tipo de datos capaz de almacenar valor enteros comprendidos entre –2.147<sub>1</sub>483.648 y 2.147<sub>1</sub>483.647, y el número devuelto por <span style="color: #000099"><strong>Main() </strong></span>sería interpretado como código de retorno de la aplicación. Éste valor suele usarse para indicar si la aplicación a terminado con éxito (generalmente valor 0) o no (valor según la causa de la terminación anormal), y en el <em>Tema 8: Métodos</em> se explicará como devolver valores.
<br><br>
También hay versiones de <span style="color: #000099"><strong>Main()</strong></span> que toman un parámetro donde se almacenará la lista de argumentos con los que se llamó a la aplicación, por lo que sólo es útil usar estas versiones del punto de entrada si la aplicación va a utilizar dichos argumentos para algo. El tipo de este parámetro es <strong><span style="color: #000099">string[]</span></strong>, lo que significa que es una tabla de cadenas de texto (en el <em>Tema 5: Clases </em>se explicará detenidamente qué son las tablas y las cadenas), y su nombre -que es el que habrá de usarse dentro del código de Main() para hacerle referencia- es args en el ejemplo, aunque podría dársele cualquier otro.
<br><br>
<strong><span style="font-size: 100%; color: #990000">Compilación en línea de comandos</span></strong>
<br><br>
Una vez escrito el código anterior con algún editor de textos –como el <strong>Bloc de Notas </strong>de Windows- y almacenado en formato de texto plano en un fichero HolaMundo.cs, para compilarlo basta abrir una ventana de consola (MS-DOS en Windows), colocarse en el directorio donde se encuentre y pasárselo como parámetro al compilador así:
<pre class="style11"><strong><span style="color: #000099">csc HolaMundo.cs</span></strong></pre>
<strong>csc.exe</strong> es el compilador de C# incluido en el .NET Framework SDK para Windows de Microsoft. Aunque en principio el programa de instalación del SDK lo añade automáticamente al path para poder llamarlo sin problemas desde cualquier directorio, si lo ha instalado a través de VS.NET esto no ocurrirá y deberá configurárselo ya sea manualmente, o bien  ejecutando el fichero por lotes <strong>Common7\Tools\vsvars32.bat</strong> que VS.NET incluye bajo su directorio de instalación, o abriendo la ventana de consola desde el icono <strong>Herramientas de Visual Studio.NET </strong><strong><span style="font-family: wingdings">à</span></strong><strong> Símbolo del sistema de Visual Studio.NET </strong>correspondiente al grupo de programas de VS.NET en el menú Inicio de Windows que no hace más que abrir la ventana de consola y llamar automáticamente a <strong>vsvars32.bat</strong>. En cualquier caso, si usa otros compiladores de C# puede que varie la forma de realizar la  compilación, por lo que lo que aquí se explica en  principio sólo será válido para los compiladores de C# de Microsoft para Windows.
<br><br>
Tras la compilación se obtendría un ejecutable llamado HolaMundo.exe cuya ejecución produciría la siguiente salida por la ventana de consola:
<pre class="style11"><strong><span style="color: #000099">¡Hola Mundo!</span></strong></pre>
Si la aplicación que se vaya a compilar no utilizase la ventana de consola para mostrar su salida sino una interfaz gráfica de ventanas, entonces habría que compilarla pasando  al compilador la opción <strong>/t </strong>con el valor <strong>winexe </strong>antes del nombre del fichero a compilar. Si no se hiciese así se abríría la ventana de consola cada vez que ejecutase la aplicación de ventanas, lo que suele ser indeseable en este tipo de aplicaciones. Así, para compilar Ventanas.cs como ejecutable de ventanas sería conveniente escribir:
<pre class="style11"><strong><span style="color: #000099">csc /t:winexe Ventanas.cs</span></strong></pre>
Nótese que aunque el nombre <strong>winexe </strong>dé la sensación de que este valor para la opción <strong>/t </strong>sólo permite generar ejecutables de ventanas, en realidad lo que permite es generar ejecutables sin ventana de consola asociada. Por tanto, también puede usarse para generar ejecutables que no tengan ninguna interfaz asociada, ni de consola ni gráfica.
<br><br>
Si en lugar de un ejecutable -ya sea de consola o de ventanas- se desea obtener una librería, entonces al compilar hay que pasar al compilador la opción <strong>/t </strong>con el valor <strong>library></strong>. Por ejemplo, siguiendo con el ejemplo inicial habría que escribir:
<pre class="style11"><strong><span style="color: #000099">csc /t:library HolaMundo.cs</span></strong></pre>
En este caso se generaría un fichero HolaMundo.dll cuyos tipos de datos podrían utilizarse desde otros fuentes pasando al compilador una referencia a los mismos mediante la opción <strong>/r</strong>. Por ejemplo, para compilar como ejecutable un fuente A.cs que use la clase HolaMundo de la librería HolaMundo.dll se escribiría:
<pre class="style11"><strong><span style="color: #000099">csc /r:HolaMundo.dll A.cs</span></strong></pre>
En general <strong>/r </strong>permite referenciar a tipos definidos en cualquier ensamblado, por lo que  el valor que se le indique también puede ser el nombre de un ejecutable. Además, en cada compilación es posible referenciar múltiples ensamblados ya sea incluiyendo la opción <strong>/r </strong>una vez por cada uno o incluiyendo múltiples referencias en una única opción <strong>/r</strong> usando comas o puntos y comas como separadores. Por ejemplo, las siguientes tres llamadas al compilador son equivalentes:
<pre class="style11"><strong><span style="color: #000099">csc /r:HolaMundo.dll;Otro.dll;OtroMás.exe  A.cs
csc /r:HolaMundo.dll,Otro.dll,OtroMás.exe A.cs
csc /t:HolaMundo.dll /r:Otro.dll /r:OtroMás.exe A.cs</span></strong></pre>
Hay que señalar que aunque no se indique nada, en toda compilación siempre se referencia por defecto a la librería <strong>mscorlib.dll</strong> de la BCL, que incluye los tipos de uso más frecuente. Si se usan tipos de la BCL no incluidos en ella habrá que incluir al compilar referencias a las librerías donde estén definidos (en la documentación del SDK sobre cada tipo de la BCL puede encontrar información sobre donde se definió)
<br><br>
Tanto las librerías como los ejecutables son ensamblados. Para generar un módulo de código que no forme parte de ningún ensamblado sino que contenga definiciones de tipos que puedan añadirse a ensamblados que se compilen posteriormente, el valor que ha de darse al compilar a la opción <strong>/t</strong> es <strong>module</strong>. Por ejemplo:
<pre class="style11"><strong><span style="color: #000099">csc /t:module HolaMundo.cs</span></strong></pre>
Con la instrucción anterior se generaría un módulo llamado HolaMundo.netmodule que  podría ser añadido a compilaciones de ensamblados incluyéndolo como valor de la opción <strong>/addmodule</strong>. Por  ejemplo, para añadir el módulo anterior a la compilación del fuente librería Lib.cs como librería se escribiría:
<pre class="style11"><strong><span style="color: #000099">csc /t:library /addmodule:HolaMundo.netmodule Lib.cs</span></strong></pre>
Aunque hasta ahora todas las compilaciones de ejemplo se han realizado utilizando un único fichero de código fuente, en realidad nada impide que se puedan utilizar más. Por ejemplo, para compilar los ficheros A.cs y B.cs en una librería A.dll se ejecutaría:
<pre class="style11"><strong><span style="color: #000099">csc /t:library A.cs B.cs</span></strong></pre>
Nótese que el nombre que por defecto se dé al ejecutable generado siempre es igual al del primer fuente especificado pero con la extensión propia del tipo de compilación realizada (<strong>.exe </strong>para ejecutables, <strong>.dll </strong>para librerías y <strong>.netmodule </strong>para módulos) Sin embargo, puede especificárse  como valor en la opción <strong>/out </strong>del compilador cualquier otro tal y como muestra el siguiente ejemplo que compila el fichero A.cs >como una librería de nombre Lib.exe:
<pre class="style11"><strong><span style="color: #000099">csc /t:library /out:Lib.exe A.cs</span></strong></pre>
Véase que aunque se haya dado un nombre terminado en <strong>.exe </strong>al fichero resultante, éste sigue siendo una librería y no un ejecutable e intentar ejecutarlo produciría un mensaje de error. Obviamente no tiene mucho sentido darle esa extensión, y sólo se le ha dado en este ejemplo para demostrar que, aunque recomendable, la extensión del fichero no tiene porqué corresponderse realmente con el tipo de fichero del que se trate.
<br><br>
A la hora de especificar ficheros a compilar también se pueden utilizar los caracteres de comodín típicos del sistema operativo.  Por ejemplo, para compilar todos los ficheros con extensión .cs del directorio actual en una librería llamada Varios.dll se haría:
<pre class="style11"><strong><span style="color: #000099">csc /t:library /out:varios.dll *.cs</span></strong></pre>
Con lo que hay que tener cuidado, y en especial al compilar varios fuentes, es con que no se compilen a la vez más de un tipo de dato con punto de entrada, pues entonces el compilador no sabría cuál usar como inicio de la aplicación. Para orientarlo, puede especificarse como valor de la opción <strong>/main </strong>el  nombre del tipo que contenga el Main() ha usar como punto de entrada. Así, para compilar los ficheros A.cs y B.cs en un ejecutable cuyo punto de entrada sea el definido en el tipo Principal, habría que escribir:
<pre class="style11"><strong><span style="color: #000099">csc /main:Principal A.cs B.cs</span></strong></pre>
Lógicamente, para que esto funcione A.cs o B.cs tiene que contener alguna definición de algún tipo llamado Principal con un único método válido como punto de entrada (obviamente, si contiene varios se volvería a tener el problema de no saber cuál utilizar)
<br><br>
<strong><span style="font-size: 100%; color: #990000">Compilación con Visual Studio.NET</span></strong>
<br><br>
Para compilar una aplicación en Visual Studio.NET primero hay que incluirla dentro de algún proyecto. Para ello basta pulsar el botón <strong>New Project </strong>en la página de inicio que se muestra nada más arrancar dicha herramienta, tras lo que se obtendrá una pantalla con el aspecto mostrado en la <strong>Ilustración 1</strong>.
<br><br>
En el recuadro de la ventana mostrada etiquetado como <strong>Project Types</strong> se ha de  seleccionar el tipo de proyecto a crear. Obviamente, si se va a trabajar en C# la opción que habrá que escoger en la misma será siempre Visual C# Projects.
<br><br>
En el recuadro <strong>Templates</strong> se ha de seleccionar la plantilla correspondiente al subtipo  de proyecto dentro del tipo indicado en <strong>Project Types </strong>que se va a realizar. Para realizar un ejecutable de consola, como es nuestro caso, hay que seleccionar el icono etiquetado como Console Application. Si se quisiese realizar una librería habría que seleccionar Class Library>, y si se quisies realizar un ejecutable de ventanas habría que seleccionar Windows Application. Nótese que no se ofrece ninguna plantilla para realizar módulos, lo que se debe a que desde Visual Studio.NET no pueden crearse.
<br><br>
Por último, en el recuadro de texto <strong>Name </strong>se ha de escribir el nombre a dar al proyecto y en <strong>Location </strong>el del directorio base asociado al mismo. Nótese que bajo de <strong>Location</strong> aparecerá un mensaje informando sobre cual será el directorio donde finalmente se almacenarán los archivos del proyecto, que será el resultante de concatenar la ruta especificada para el directorio base y el nombre del proyecto.
<p class="MsoNormal" style="text-align: center" align="center"><a href="http://lh5.google.com/ignereldar/R5aHOi2wx4I/AAAAAAAAAJY/9XycZN5UpqA/clip_image002%5B2%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="clip_image002" src="http://lh4.google.com/ignereldar/R5aHPS2wx5I/AAAAAAAAAJg/oqVTXbuCM7w/clip_image002_thumb" width="244" border="0" /></a></p>
<p class="MsoFootnoteText" style="text-align: center" align="center">Ilustración 1 : Ventana de creación de nuevo proyecto en Visual Studio.NET</p>
<br>
Una vez configuradas todas estas opciones, al pulsar botón <strong>OK</strong> Visual Studio creará toda la infraestructura adecuada para empezar a trabajar cómodamente en el proyecto. Como puede apreciarse en la <strong>Ilustración 2</strong>, esta infraestructura consistirá en la generación de un fuente que servirá de plantilla para la realización de proyectos del tipo elegido (en nuestro caso, aplicaciones de  consola en C#):
<p class="MsoNormal" style="text-align: center" align="center"><a href="http://lh4.google.com/ignereldar/R5aHQS2wx6I/AAAAAAAAAJo/sOsbih5bqKM/clip_image004%5B2%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="183" alt="clip_image004" src="http://lh3.google.com/ignereldar/R5aHRC2wx7I/AAAAAAAAAJw/pFredt02bgY/clip_image004_thumb" width="244" border="0" /></a></p>
<p class="MsoFootnoteText" style="text-align: center" align="center">Ilustración 2 : Plantilla para aplicaciones de consola generada por Visual Studio.NET</p>
<br>
A partir de esta plantilla, escribir el código de la aplicación de ejemplo es tan sencillo con simplemente teclear <span style="color: #000099"><strong>System.Console.WriteLine(“¡Hola Mundo!”)</strong></span> dentro de la definición del método <span style="color: #000099"><strong>Main()</strong></span> creada por Visual Studio.NET. Claro está, otra posibilidad es borrar toda la plantilla y sustituirla por el código para HolaMundo mostrado anteriormente.
<br><br>
Sea haga como se haga, para compilar y ejecutar tras ello la aplicación sólo hay que pulsar <strong>CTRL+F5 </strong>o seleccionar <strong>Debug <span style="font-family: wingdings">à</span> </strong><strong>Start Without Debugging</strong> en el menú principal de Visual Studio.NET. Para sólo compilar el proyecto, entonces hay que seleccionar <strong>Build <span style="font-family: wingdings">à</span> Rebuild All</strong>. De todas formas, en ambos casos el ejecutable generado se almacenará en el subdirectorio<strong> Bin\Debug</strong> del directorio del  proyecto.
<br><br>
En el extremo derecho de la ventana principal de Visual Studio.NET puede encontrar el denominado <strong>Solution Explorer </strong>(si no lo encuentra, seleccione <strong>View <span style="font-family: wingdings">à</span> Solution </strong><strong>Explorer</strong>), que es una herramienta que permite consultar cuáles son los archivos que forman el proyecto. Si selecciona en él el icono correspondiente al proyecto en que estamos trabajando y pulsa <strong>View <span style="font-family: wingdings">à</span> Property Pages </strong>obtendrá una hoja de propiedades del proyecto con el aspecto mostrado en la <strong>Ilustración 3</strong>:
<p class="MsoNormal" style="text-align: center" align="center"><a href="http://lh3.google.com/ignereldar/R5aHSC2wx8I/AAAAAAAAAJ4/yRxkdoYCYus/clip_image006%5B2%5D"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="184" alt="clip_image006" src="http://lh3.google.com/ignereldar/R5aHTC2wx9I/AAAAAAAAAKA/LWg6nYq41Iw/clip_image006_thumb" width="244" border="0" /></a> </p>
<p class="MsoFootnoteText" style="text-align: center" align="center">Ilustración 3 : Hoja de propiedades del proyecto en Visual Studio.NET</p>
<br>
Esta ventana permite configurar de manera visual la mayoría de opciones con las que se llamará al compilador en línea de comandos. Por ejemplo, para cambiar el nombre del fichero de salida (opción <strong>/out</strong>) se indica su nuevo nombre en el cuadro de texto <strong>Common Properties <span style="font-family: wingdings">à</span> General <span style="font-family: wingdings">à</span> Assembly Name</strong>, para cambiar el tipo de proyecto a generar (opción <strong>/t</strong>) se utiliza <strong>Common Properties <span style="font-family: wingdings">à</span> General <span style="font-family: wingdings">à</span> Output Type </strong>(como verá si intenta cambiarlo, no es posible generar módulos desde Visual Studio.NET), y el tipo que contiene el punto de entrada a utilizar (opción <strong>/main</strong>) se indica en <strong>Common Properties <span style="font-family: wingdings">à</span> General <span style="font-family: wingdings">à</span> Startup Object</strong>
<br><br>
Finalemente, para añadir al  proyecto referencias a ensamblados externos (opción <strong>/r</strong>) basta seleccionar <strong>Project <span style="font-family: wingdings">à</span> Add Reference</strong> en el menú principal de VS.NET.
<br><br>
<p><a href="http://www.josanguapo.com/">(C) 2001 José Antonio González Seco </a></p>
<br><br>
<!-- AddThis Bookmark Post Dropdown BEGIN -->
<div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script><script src='http://s7.addthis.com/js/addthis_widget.php?v=12' type='text/javascript'></script></div>
<!-- AddThis Bookmark Post Dropdown END -->
</span>Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com3tag:blogger.com,1999:blog-7309097101347883937.post-3618234556841290162008-01-15T15:52:00.001+01:002008-02-01T14:59:05.005+01:00El lenguaje de programación C#. Introducción a Microsoft.NET. <style type="text/css">
<!--
table.msonormaltable {
font-size:11.0pt;
font-family:"Calibri","sans-serif";
}
p.msonormal {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
-->
</style> <style type="text/css">
<!--
p.msobodytext {
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
p.cdigofuente {
margin:0cm;
margin-bottom:.0001pt;
font-size:10.0pt;
font-family:"Arial","sans-serif";
}
p.msocaption {
margin-top:6.0pt;
margin-right:0cm;
margin-bottom:6.0pt;
margin-left:0cm;
font-size:10.0pt;
font-family:"Times New Roman","serif";
font-weight:bold;
}
li.msonormal {
margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman","serif";
}
.style4 {font-weight: bold}
.style6 {font-weight: bold; color: #000099; }
-->
</style> <div class="indice">Autor: <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a> <br><br>Curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. <br></div> <div class="indice"> <ul> <li><strong>INTRODUCCION A MICROSOFT.NET</strong> <ul><br> <li><a href="#apartado1">Microsoft.NET</a> <br> <li><a href="#apartado2">Common Language Runtime (CLR)</a> <br> <li><a href="#apartado3">Microsoft Intermediate Language (MSIL)</a> <br> <li><a href="#apartado4">Metadatos</a> <br> <li><a href="#apartado5">Ensamblados</a> <br> <li><a href="#apartado6">Librería de clase base (BCL)</a> <br> <li><a href="#apartado7">Common Type System (CTS)</a> <br> <li><a href="#apartado8">Common Language Specification (CLS)</a> </li></ul></li></ul></div> <p><br><a id="apartado1" name="apartado1"></a><strong><span style="font-size: 130%; color: #990000">Microsoft.NET</span></strong></p><br>Microsoft.NET es el conjunto de nuevas tecnologías en las que Microsoft ha estado trabajando durante los últimos años con el objetivo de obtener una plataforma sencilla y potente para distribuir el software en forma de servicios que puedan ser suministrados remotamente y que puedan comunicarse y combinarse unos con otros de manera totalmente independiente de la plataforma, lenguaje de programación y modelo de componentes con los que hayan sido desarrollados. Ésta es la llamada <strong>plataforma .NET</strong>, y a los servicios antes comentados se les denomina <strong>servicios Web</strong>. <br><br>Para crear aplicaciones para la plataforma .NET, tanto servicios Web como aplicaciones tradicionales (aplicaciones de consola, aplicaciones de ventanas, servicios de Windows NT, etc.), Microsoft ha publicado el denominado kit de desarrollo de software conocido como <strong>.NET Framework SDK</strong>, que incluye las herramientas necesarias tanto para su desarrollo como para su distribución y ejecución y <strong>Visual Studio.NET</strong>, que permite hacer todo la anterior desde una interfaz visual basada en ventanas. Ambas herramientas pueden descargarse gratuitamente desde <a href="http://www.msdn.microsoft.com/net">http://www.msdn.microsoft.com/net</a>, aunque la última sólo está disponible para subscriptores MSDN Universal (los no subscriptores pueden pedirlo desde dicha dirección y se les enviará gratis por correo ordinario) <br><br>El concepto de Microsoft.NET también incluye al conjunto de nuevas aplicaciones que Microsoft y terceros han (o están) desarrollando para ser utilizadas en la plataforma .NET. Entre ellas podemos destacar aplicaciones desarrolladas por Microsoft tales como Windows.NET, Hailstorm, Visual Studio.NET, MSN.NET, Office.NET, y los nuevos servidores para empresas de Microsoft (SQL Server.NET, Exchange.NET, etc.) <br><span class="summarypost"><br><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_4609.html">Seguir Leyendo... </a><br></span><br><span class="fullpost"><br><br><a id="apartado2" name="apartado2"></a><strong><span style="font-size: 130%; color: #990000">Common Language Runtime (CLR)</span></strong> <br><br>El <strong>Common Language Runtime </strong>(<strong>CLR</strong>) es el núcleo de la plataforma .NET. Es el motor encargado de gestionar la ejecución de las aplicaciones para ella desarrolladas y a las que ofrece numerosos servicios que simplifican su desarrollo y favorecen su fiabilidad y seguridad. Las principales características y servicios que ofrece el CLR son: <br><br> <ul class="style1" style="margin-top: 0cm" type="disc"> <li class="MsoNormal style1" style="text-align: justify"><strong>Modelo de programación consistente: </strong>A todos los servicios y facilidades ofrecidos por el CLR se accede de la misma forma: a través de un modelo de programación orientado a objetos. Esto es una diferencia importante respecto al modo de acceso a los servicios ofrecidos por los algunos sistemas operativos actuales (por ejemplo, los de la familia Windows), en los que a algunos servicios se les accede a través de llamadas a funciones globales definidas en DLLs y a otros a través de objetos (objetos COM en el caso de la familia Windows) <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Modelo de programación sencillo:</strong> Con el CLR desaparecen muchos elementos complejos incluidos en los sistemas operativos actuales (registro de Windows, GUIDs, HRESULTS, IUnknown, etc.) El CLR no es que abstraiga al programador de estos conceptos, sino que son conceptos que no existen en la plataforma .NET <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Eliminación del “infierno de las DLLs”: </strong>En la plataforma .NET desaparece el problema conocido como “infierno de las DLLs” que se da en los sistemas operativos actuales de la familia Windows, problema que consiste en que al sustituirse versiones viejas de DLLs compartidas por versiones nuevas puede que aplicaciones que fueron diseñadas para ser ejecutadas usando las viejas dejen de funcionar si las nuevas no son 100% compatibles con las anteriores. En la plataforma .NET las versiones nuevas de las DLLs pueden coexistir con las viejas, de modo que las aplicaciones diseñadas para ejecutarse usando las viejas podrán seguir usándolas tras instalación de las nuevas. Esto, obviamente, simplifica mucho la instalación y desinstalación de software. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Ejecución multiplataforma: </strong>El CLR actúa como una máquina virtual, encargándose de ejecutar las aplicaciones diseñadas para la plataforma .NET. Es decir, cualquier plataforma para la que exista una versión del CLR podrá ejecutar cualquier aplicación .NET. Microsoft ha desarrollado versiones del CLR para la mayoría de las versiones de Windows: Windows 95, Windows 98, Windows ME, Windows NT 4.0, Windows 2000, Windows XP y Windows CE (que puede ser usado en CPUs que no sean de la familia x86) Por otro lado Microsoft ha firmado un acuerdo con Corel para portar el CLR a Linux y también hay terceros que están desarrollando de manera independiente versiones de libre distribución del CLR para Linux. Asimismo, dado que la arquitectura del CLR está totalmente abierta, es posible que en el futuro se diseñen versiones del mismo para otros sistemas operativos. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Integración de lenguajes: </strong>Desde cualquier lenguaje para el que exista un compilador que genere código para la plataforma .NET es posible utilizar código generado para la misma usando cualquier otro lenguaje tal y como si de código escrito usando el primero se tratase. Microsoft ha desarrollado un compilador de C# que genera código de este tipo, así como versiones de sus compiladores de Visual Basic (Visual Basic.NET) y C++ (C++ con extensiones gestionadas) que también lo generan y una versión del intérprete de JScript (JScript.NET) que puede interpretarlo. La integración de lenguajes es tal que es posible escribir una clase en C# que herede de otra escrita en Visual Basic.NET que, a su vez, herede de otra escrita en C++ con extensiones gestionadas. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Gestión de memoria: </strong>El CLR incluye un <strong>recolector de basura</strong> que evita que el programador tenga que tener en cuenta cuándo ha de destruir los objetos que dejen de serle útiles. Este recolector es una aplicación que se activa cuando se quiere crear algún objeto nuevo y se detecta que no queda memoria libre para hacerlo, caso en que el recolector recorre la memoria dinámica asociada a la aplicación, detecta qué objetos hay en ella que no puedan ser accedidos por el código de la aplicación, y los elimina para limpiar la memoria de “objetos basura” y permitir la creación de otros nuevos. Gracias a este recolector se evitan errores de programación muy comunes como intentos de borrado de objetos ya borrados, agotamiento de memoria por olvido de eliminación de objetos inútiles o solicitud de acceso a miembros de objetos ya destruidos. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Seguridad de tipos:</strong> El CLR facilita la detección de errores de programación difíciles de localizar comprobando que toda conversión de tipos que se realice durante la ejecución de una aplicación .NET se haga de modo que los tipos origen y destino sean compatibles.<strong> </strong><br><br> <li class="MsoNormal" style="text-align: justify"><strong>Aislamiento de procesos:</strong> El CLR asegura que desde código perteneciente a un determinado proceso no se pueda acceder a código o datos pertenecientes a otro, lo que evita errores de programación muy frecuentes e impide que unos procesos puedan atacar a otros. Esto se consigue gracias al sistema de seguridad de tipos antes comentado, pues evita que se pueda convertir un objeto a un tipo de mayor tamaño que el suyo propio, ya que al tratarlo como un objeto de mayor tamaño podría accederse a espacios en memoria ajenos a él que podrían pertenecer a otro proceso. También se consigue gracias a que no se permite acceder a posiciones arbitrarias de memoria. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Tratamiento de excepciones: </strong>En el CLR todo los errores que se puedan producir durante la ejecución de una aplicación se propagan de igual manera: mediante excepciones. Esto es muy diferente a como se venía haciendo en los sistemas Windows hasta la aparición de la plataforma .NET, donde ciertos errores se transmitían mediante códigos de error en formato Win32, otros mediante HRESULTs y otros mediante excepciones. <br><br>El CLR permite que excepciones lanzadas desde código para .NET escrito en un cierto lenguaje se puedan capturar en código escrito usando otro lenguaje, e incluye mecanismos de depuración que pueden saltar desde código escrito para .NET en un determinado lenguaje a código escrito en cualquier otro. Por ejemplo, se puede recorrer la pila de llamadas de una excepción aunque ésta incluya métodos definidos en otros módulos usando otros lenguajes. <br> <li class="MsoNormal" style="text-align: justify"><strong>Soporte multihilo: </strong>El CLR es capaz de trabajar con aplicaciones divididas en múltiples hilos de ejecución que pueden ir evolucionando por separado en paralelo o intercalándose, según el número de procesadores de la máquina sobre la que se ejecuten. Las aplicaciones pueden lanzar nuevos hilos, destruirlos, suspenderlos por un tiempo o hasta que les llegue una notificación, enviarles notificaciones, sincronizarlos, etc. </li></ul> <ul class="style1" style="margin-top: 0cm" type="disc"> <li><strong>Distribución transparente: </strong>El CLR ofrece la infraestructura necesaria para crear objetos remotos y acceder a ellos de manera completamente transparente a su localización real, tal y como si se encontrasen en la máquina que los utiliza. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>Seguridad avanzada: </strong>El CLR proporciona mecanismos para restringir la ejecución de ciertos códigos o los permisos asignados a los mismos según su procedendecia o el usuario que los ejecute. Es decir, puede no darse el mismo nivel de confianza a código procedente de Internet que a código instalado localmente o procedente de una red local; puede no darse los mismos permisos a código procedente de un determinado fabricante que a código de otro; y puede no darse los mismos permisos a un mismo códigos según el usuario que lo esté ejecutando o según el rol que éste desempeñe. Esto permite asegurar al administrador de un sistema que el código que se esté ejecutando no pueda poner en peligro la integridad de sus archivos, la del registro de Windows, etc.<strong> </strong><br><br> <li class="MsoNormal" style="text-align: justify"><strong>Interoperabilidad con código antiguo: </strong>El CLR incorpora los mecanismos necesarios para poder acceder desde código escrito para la plataforma .NET a código escrito previamente a la aparición de la misma y, por tanto, no preparado para ser ejecutando dentro de ella. Estos mecanismos permiten tanto el acceso a objetos COM como el acceso a funciones sueltas de DLLs preexistentes (como la API Win32) </li></ul>Como se puede deducir de las características comentadas, el CLR lo que hace es gestionar la ejecución de las aplicaciones diseñadas para la plataforma .NET. Por esta razón, al código de estas aplicaciones se le suele llamar <strong>código</strong> <strong>gestionado</strong>, y al código no escrito para ser ejecutado directamente en la plataforma .NET se le suele llamar <strong>código no gestionado</strong>. <br><br><br><a id="apartado3" name="apartado3"></a><strong><span style="font-size: 130%; color: #990000">Microsoft Intermediate Language (MSIL)</span></strong> <br><br>Ninguno de los compiladores que generan código para la plataforma .NET produce código máquina para CPUs x86 ni para ningún otro tipo de CPU concreta, sino que generan código escrito en el lenguaje intermedio conocido como <strong>Microsoft Intermediate Lenguage</strong> (<strong>MSIL</strong>) El CLR da a las aplicaciones la sensación de que se están ejecutando sobre una máquina virtual, y precisamente MSIL es el código máquina de esa máquina virtual. Es decir, MSIL es el único código que es capaz de interpretar el CLR, y por tanto cuando se dice que un compilador genera código para la plataforma .NET lo que se está diciendo es que genera MSIL. <br><br>MSIL ha sido creado por Microsoft tras consultar a numerosos especialistas en la escritura de compiladores y lenguajes tanto del mundo académico como empresarial. Es un lenguaje de un nivel de abstracción mucho más alto que el de la mayoría de los códigos máquina de las CPUs existentes, e incluye instrucciones que permiten trabajar directamente con objetos (crearlos, destruirlos, inicializarlos, llamar a métodos virtuales, etc.), tablas y excepciones (lanzarlas, capturarlas y tratarlas) <br><br>Ya se comentó que el compilador de C# compila directamente el código fuente a MSIL, que Microsoft ha desarrollado nuevas versiones de sus lenguajes Visual Basic (Visual Basic.NET) y C++ (C++ con extensiones gestionadas) cuyos compiladores generan MSIL, y que ha desarrollado un intérprete de JScript (JScript.NET) que genera código MSIL. Pues bien, también hay numerosos terceros que han anunciado estar realizando versiones para la plataforma .NET de otros lenguajes como APL, CAML, Cobol, Eiffel, Fortran, Haskell, Java (J#), Mercury, ML, Mondrian, Oberon, Oz, Pascal, Perl, Python, RPG, Scheme y Smalltalk. <br><br>La principal ventaja del MSIL es que facilita la ejecución multiplataforma y la integración entre lenguajes al ser independiente de la CPU y proporcionar un formato común para el código máquina generado por todos los compiladores que generen código para .NET. Sin embargo, dado que las CPUs no pueden ejecutar directamente MSIL, antes de ejecutarlo habrá que convertirlo al código nativo de la CPU sobre la que se vaya a ejecutar. De esto se encarga un componente del CLR conocido como compilador JIT (Just-In-Time) o jitter que va convirtiendo dinámicamente el código MSIL a ejecutar en código nativo según sea necesario. Este jitter se distribuye en tres versiones: <br><br> <ul class="style1" style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>jitter normal: </strong>Es el que se suele usar por defecto, y sólo compila el código MSIL a código nativo a medida que va siendo necesario, pues así se ahorra tiempo y memoria al evitarse tener que compilar innecesariamente código que nunca se ejecute. Para conseguir esto, el cargador de clases del CLR sustituye inicialmente las llamadas a métodos de las nuevas clases que vaya cargando por llamadas a funciones auxiliares (stubs) que se encarguen de compilar el verdadero código del método. Una vez compilado, la llamada al stub es sustituida por una llamada directa al código ya compilado, con lo que posteriores llamadas al mismo no necesitarán compilación. <br><br> <li class="MsoNormal" style="text-align: justify"><strong>jitter económico:</strong> Funciona de forma similar al jitter normal solo que no realiza ninguna optimización de código al compilar sino que traduce cada instrucción MSIL por su equivalente en el código máquina sobre la que se ejecute. Esta especialmente pensado para ser usado en dispositivos empotrados que dispongan de poca potencia de CPU y poca memoria, pues aunque genere código más ineficiente es menor el tiempo y memoria que necesita para compilar. Es más, para ahorrar memoria este jitter puede descargar código ya compilado que lleve cierto tiempo sin ejecutarse y sustituirlo de nuevo por el stub apropiado. Por estas razones, este es el jitter usado por defecto en Windows CE, sistema operativo que se suele incluir en los dispositivos empotrados antes mencionados. <br><br>Otra utilidad del jitter económico es que facilita la adaptación de la plataforma .NET a nuevos sistemas porque es mucho más sencillo de implementar que el normal. De este modo, gracias a él es posible desarrollar rápidamente una versión del CLR que pueda ejecutar aplicaciones gestionadas aunque sea de una forma poco eficiente, y una vez desarrollada es posible centrarse en desarrollar el jitter normal para optimizar la ejecución de las mismas. </li></ul> <ul class="style1" style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"><strong>prejitter: </strong>Se distribuye como una aplicación en línea de comandos llamada <strong><span>ngen.exe</span></strong> mediante la que es posible compilar completamente cualquier ejecutable o librería (cualquier ensamblado en general, aunque este concepto se verá más adelante) que contenga código gestionado y convertirlo a código nativo, de modo que posteriores ejecuciones del mismo se harán usando esta versión ya compilada y no se perderá tiempo en hacer la compilación dinámica. </li></ul>La actuación de un jitter durante la ejecución de una aplicación gestionada puede dar la sensación de hacer que ésta se ejecute más lentamente debido a que ha de invertirse tiempo en las compilaciones dinámicas. Esto es cierto, pero hay que tener en cuenta que es una solución mucho más eficiente que la usada en otras plataformas como Java, ya que en .NET cada código no es interpretado cada vez que se ejecuta sino que sólo es compilado la primera vez que se llama al método al que pertenece. Es más, el hecho de que la compilación se realice dinámicamente permite que el jitter tenga acceso a mucha más información sobre la máquina en que se ejecutará la aplicación del que tendría cualquier compilador tradicional, con lo que puede optimizar el código para ella generado (por ejemplo, usando las instrucciones especiales del Pentium III si la máquina las admite, usando registros extra, incluyendo código <em>inline</em>, etc.) Además, como el recolector de basura de .NET mantiene siempre compactada la memoria dinámica las reservas de memoria se harán más rápido, sobre todo en aplicaciones que no agoten la memoria y, por tanto, no necesiten de una recolección de basura. Por estas razones, los ingenieros de Microsoft piensan que futuras versiones de sus jitters podrán incluso conseguir que el código gestionado se ejecute más rápido que el no gestionado. <br><br><br><a id="apartado4" name="apartado4"></a><strong><span style="font-size: 130%; color: #990000">Metadatos</span></strong> <br><br>En la plataforma .NET se distinguen dos tipos de <strong>módulos</strong> de código compilado: <strong>ejecutables</strong> (extensión <strong>.exe</strong>) y <strong>librerías de enlace dinámico</strong> (extensión <strong>.dll</strong> generalmente) Ambos son ficheros que contienen definiciones de tipos de datos, y la diferencia entre ellos es que sólo los primeros disponen de un método especial que sirve de punto de entrada a partir del que es posible ejecutar el código que contienen haciendo una llamada desde la línea de comandos del sistema operativo. A ambos tipos de módulos se les suele llamar <strong>ejecutables portables</strong> (PE), ya que su código puede ejecutarse en cualquiera de los diferentes sistemas operativos de la familia Windows para los que existe alguna versión del CLR. <br><br>El contenido de un módulo no es sólo MSIL, sino que también consta de otras dos áreas muy importantes: la cabecera de CLR y los metadatos: <br> <ul class="style1"> <li>La <strong>cabecera de CLR</strong> es un pequeño bloque de información que indica que se trata de un módulo gestionado e indica es la versión del CLR que necesita, cuál es su firma digital, cuál es su punto de entrada (si es un ejecutable), etc. <br><br> <li>Los <strong>metadatos</strong> son un conjunto de datos organizados en forma de tablas que almacenan información sobre los tipos definidos en el módulo, los miembros de éstos y sobre cuáles son los tipos externos al módulo a los que se les referencia en el módulo. Los metadatos de cada modulo los genera automáticamente el compilador al crearlo, y entre sus tablas se incluyen: <br></li></ul> <table class="MsoNormalTable" style="border-top-style: none; border-right-style: none; border-left-style: none; border-collapse: collapse; border-bottom-style: none" cellspacing="0" cellpadding="0" align="center" border="1"> <tbody> <tr> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #244061; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 84.15pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="112" bgcolor="#244061"> <p class="style4"><span style="color: white">Tabla</span></p></td> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #244061; padding-bottom: 0cm; width: 348.05pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="464" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Descripción</span></strong></p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>ModuleDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Define las características del módulo. Consta de un único elemento que almacena un identificador de versión de módulo (GUID creado por el compilador) y el nombre de fichero que se dio al módulo al compilarlo (así este nombre siempre estará disponible, aunque se renombre el fichero)</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>TypeDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Define las características de los tipos definidos en el módulo. De cada tipo se almacena su nombre, su tipo padre, sus modificadores de acceso y referencias a los elementos de las tablas de miembros correspondientes a sus miembros.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>MethodDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Define las características de los métodos definidos en el módulo. De cada método se guarda su nombre, signatura (por cada parámetro se incluye una referencia al elemento apropiado en la tabla ParamDef), modificadores y posición del módulo donde comienza el código MSIL de su cuerpo.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>ParamDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Define las características de los parámetros definidos en el módulo. De cada parámetro se guarda su nombre y modificadores.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>FieldDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Define las características de los campos definidos en el módulo. De cada uno se almacena información sobre cuál es su nombre, tipo y modificadores.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>PropertyDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Define las características de las propiedades definidas en el módulo. De cada una se indica su nombre, tipo, modificadores y referencias a los elementos de la tabla MethodDef correspondientes a sus métodos set/get.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>EventDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Define las características de los eventos definidos en el módulo. De cada uno se indica su nombre, tipo, modificadores. y referencias a los elementos de la tabla MethodDef correspondientes a sus métodos add/remove.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>AssemblyRef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Indica cuáles son los ensamblados externos a los que se referencia en el módulo. De cada uno se indica cuál es su nombre de fichero (sin extensión), versión, idioma y marca de clave pública.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>ModuleRef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Indica cuáles son los otros módulos del mismo ensamblado a los que referencia el módulo. De cada uno se indica cuál es su nombre de fichero.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>TypeRef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Indica cuáles son los tipos externos a los que se referencia en el módulo. De cada uno se indica cuál es su nombre y, según donde estén definidos, una referencia a la posición adecuada en la tabla AssemblyRef o en la tabla ModuleRef.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 84.15pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="112" bgcolor="white"> <p class="MsoNormal" style="text-align: justify"><strong>MemberRef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: white; padding-bottom: 0cm; width: 348.05pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="464" bgcolor="white"> <p class="MsoNormal" style="text-align: justify">Indican cuáles son los miembros definidos externamente a los que se referencia en el módulo. Estos miembros pueden ser campos, métodos, propiedades o eventos; y de cada uno de ellos se almacena información sobre su nombre y signatura, así como una referencia a la posición de la tabla TypeRef donde se almacena información relativa al tipo del que es miembro.</p></td></tr></tbody></table><span class="fullpost"> <p class="MsoCaption" style="text-align: center" align="center"><u>Tabla </u><u>1</u><u>:</u><span style="font-weight: normal"> Principales tablas de metadatos</span> <p>Nótese que el significado de los metadatos es similar al de otras tecnologías previas a la plataforma .NET como lo son los ficheros IDL. Sin embargo, los metadatos tienen dos ventajas importantes sobre éstas: contiene más información y siempre se almacenan incrustados en el módulo al que describen, haciendo imposible la separación entre ambos. Además, como se verá más adelante, es posible tanto consultar los metadatos de cualquier módulo a través de las clases del espacio de nombres <b>System.Reflection</b> de la BCL como añadirles información adicional mediante <b>atributos </b>(se verá más adelante) <br><br><br><a id="apartado5" name="apartado5"></a><strong><span style="font-size: 130%; color: #990000">Ensamblados</span></strong> <p>Un <b>ensamblado </b>es una agrupación lógica de uno o más módulos o ficheros de recursos (ficheros .GIF, .HTML, etc.) que se engloban bajo un nombre común. Un programa puede acceder a información o código almacenados en un ensamblado sin tener que conocer cuál es el fichero en concreto donde se encuentran, por lo que los ensamblados nos permiten abstraernos de la ubicación física del código que ejecutemos o de los recursos que usemos. Por ejemplo, podemos incluir todos los tipos de una aplicación en un mismo ensamblado pero colocando los más frecuentemente usados en un cierto módulo y los menos usados en otro, de modo que sólo se descarguen de Internet los últimos si es que se van a usar.</p> <p>Todo ensamblado contiene un <b>manifiesto</b>, que son metadatos con información sobre las características del ensamblado. Este manifiesto puede almacenarse en cualquiera de los módulos que formen el ensamblado o en uno específicamente creado para ello, siendo lo último necesario cuando sólo contiene recursos (<b>ensamblado satélite</b>)</p> <p>Las principales tablas incluidas en los manifiestos son las siguientes:</p></span><br> <table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" align="center" border="0"> <tbody> <tr> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #244061; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 131.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="175" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Tabla</span></strong></p></td> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #244061; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="401" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Descripción</span></strong></p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 131.1pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="175"> <p class="MsoNormal" style="text-align: justify"><strong>AssemblyDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 301.1pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="401"> <p class="MsoNormal" style="text-align: justify">Define las características del ensamblado. Consta de un único elemento que almacena el nombre del ensamblado sin extensión, versión, idioma, clave pública y tipo de algoritmo de dispersión usado para hallar los valores de dispersión de la tabla FileDef.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 131.1pt; padding-top: 0cm" valign="top" width="175" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>FileDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm" valign="top" width="401" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Define cuáles son los archivos que forman el ensamblado. De cada uno se da su nombre y valor de dispersión. Nótese que sólo el módulo que contiene el manifiesto sabrá qué ficheros que forman el ensamblado, pero el resto de ficheros del mismo no sabrán si pertenecen o no a un ensamblado (no contienen metadatos que les indique si pertenecen a un ensamblado)</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 131.1pt; padding-top: 0cm" valign="top" width="175"> <p class="MsoNormal" style="text-align: justify"><strong>ManifestResourceDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm" valign="top" width="401"> <p class="MsoNormal" style="text-align: justify">Define las características de los recursos incluidos en el módulo. De cada uno se indica su nombre y modificadores de acceso. Si es un recurso incrustado se indica dónde empieza dentro del PE que lo contiene, y si es un fichero independiente se indica cuál es el elemento de la tabla FileDef correspondiente a dicho fichero. </p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 131.1pt; padding-top: 0cm" valign="top" width="175" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>ExportedTypesDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm" valign="top" width="401" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Indica cuáles son los tipos definidos en el ensamblado y accesibles desde fuera del mismo. Para ahorrar espacio sólo recogen los que no pertenezcan al módulo donde se incluye el manifiesto, y de cada uno se indica su nombre, la posición en la tabla FileDef del fichero donde se ha implementado y la posición en la tabla TypeDef correspondiente a su definición.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 131.1pt; padding-top: 0cm" valign="top" width="175"> <p class="MsoNormal" style="text-align: justify"><strong>AssemblyProccesorDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm" valign="top" width="401"> <p class="MsoNormal" style="text-align: justify">Indica en qué procesadores se puede ejecutar el ensamblado, lo que puede ser útil saberlo si el ensamblado contiene módulos con código nativo (podría hacerse usando C++ con extensiones gestionadas) Suele estar vacía, lo que indica que se puede ejecutar en cualquier procesador; pero si estuviese llena, cada elemento indicaría un tipo de procesador admitido según el formato de identificadores de procesador del fichero WinNT.h incluido con Visual Studio.NET (por ejemplo, 586 = Pentium, 2200 = Arquitectura IA64, etc.)</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 131.1pt; padding-top: 0cm" valign="top" width="175" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify"><strong>AssemblyOSDef</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 301.1pt; padding-top: 0cm" valign="top" width="401" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Indica bajo qué sistemas operativos se puede ejecutar el ensamblado, lo que puede ser útil si contiene módulos con tipos o métodos disponibles sólo en ciertos sistemas. Suele estar vacía, lo que indica que se puede ejecutar en cualquier procesador; pero si estuviese llena, indicaría el identificador de cada uno de los sistemas admitidos siguiendo el formato del WinNT.h de Visual Studio.NET (por ejemplo, 0 = familia Windows 9X, 1 = familia Windows NT, etc.) y el número de la versión del mismo a partir de la que se admite.<span style="font-size: 11pt"> </span></p></td></tr></tbody></table> <p class="MsoCaption" style="text-align: center" align="center"><u>Tabla </u><u>2</u><u>:</u><span style="font-weight: normal"> Principales tablas de un manifiesto</span></p> <p class="MsoNormal" style="text-align: justify">Para asegurar que no se haya alterado la información de ningún ensamblado se usa el criptosistema de clave pública RSA. Lo que se hace es calcular el código de dispersión SHA-1 del módulo que contenga el manifiesto e incluir tanto este valor cifrado con RSA (<strong>firma digital</strong>) como la clave pública necesaria para descifrarlo en algún lugar del módulo que se indicará en la cabecera de CLR. Cada vez que se vaya a cargar en memoria el ensamblado se calculará su valor de dispersión de nuevo y se comprobará que es igual al resultado de descifrar el original usando su clave pública. Si no fuese así se detectaría que se ha adulterado su contenido. <br><br>Para asegurar también que los contenidos del resto de ficheros que formen un ensamblado no hayan sido alterados lo que se hace es calcular el código de dispersión de éstos antes de cifrar el ensamblado y guardarlo en el elemento correspondiente a cada fichero en la tabla FileDef del manifiesto. El algoritmo de cifrado usado por defecto es SHA-1, aunque en este caso también se da la posibilidad de usar MD5. En ambos casos, cada vez que se accede al fichero para acceder a un tipo o recurso se calculará de nuevo su valor de dispersión y se comprobará que coincida con el almacenado en FileDef. <br><br>Dado que las claves públicas son valores que ocupan muchos bytes (2048 bits), lo que se hace para evitar que los metadatos sean excesivamente grandes es no incluir en las referencias a ensamblados externos de la tabla AssemblyRef las claves públicas de dichos ensamblados, sino sólo los 64 últimos bits resultantes de aplicar un algoritmo de dispersión a dichas claves. A este valor recortado se le llama <strong>marca de clave pública</strong>. <br><br>Hay dos tipos de ensamblados: <strong>ensamblados privados</strong> y <strong>ensamblados compartidos</strong>. Los privados se almacenan en el mismo directorio que la aplicación que los usa y sólo puede usarlos ésta, mientras que los compartidos se almacenan en un <strong>caché de ensamblado global</strong> (GAC) y pueden usarlos cualquiera que haya sido compilada referenciándolos. <br><br>Los compartidos han de cifrase con RSA ya que lo que los identifica es en el GAC es su nombre (sin extensión) más su clave pública, lo que permite que en el GAC puedan instalarse varios ensamblados con el mismo nombre y diferentes claves públicas. Es decir, es como si la clave pública formase parte del nombre del ensamblado, razón por la que a los ensamblados así cifrados se les llama <strong>ensamblados de nombre fuerte</strong>. Esta política permite resolver los conflictos derivados de que se intente instalar en un mismo equipo varios ensamblados compartidos con el mismo nombre pero procedentes de distintas empresas, pues éstas tendrán distintas claves públicas. <br><br>También para evitar problemas, en el GAC se pueden mantener múltiples versiones de un mismo ensamblado. Así, si una aplicación fue compilada usando una cierta versión de un determinado ensamblado compartido, cuando se ejecute sólo podrá hacer uso de esa versión del ensamblado y no de alguna otra más moderna que se hubiese instalado en el GAC. De esta forma se soluciona el problema del <strong>infierno de las DLL</strong> comentado al principio del tema. <br><br>En realidad es posible modificar tanto las políticas de búsqueda de ensamblados (por ejemplo, para buscar ensamblados privados fuera del directorio de la aplicación) como la política de aceptación de ensamblados compartidos (por ejemplo, para que se haga automáticamente uso de las nuevas versiones que se instalen de DLLs compartidas) incluyendo en el directorio de instalación de la aplicación un fichero de configuración en formato XML con las nuevas reglas para las mismas. Este fichero ha de llamarse igual que el ejecutable de la aplicación pero ha de tener extensión <strong>.cfg</strong>.</p> <p class="MsoNormal" style="text-align: justify"> </p><br><a id="apartado6" name="apartado6"></a><strong><span style="font-size: 130%; color: #990000">Librería de clase base (BCL)</span></strong><br><br>La Librería de Clase Base (BCL) es una librería incluida en el <em>.NET Framework</em> formada por cientos de tipos de datos que permiten acceder a los servicios ofrecidos por el CLR y a las funcionalidades más frecuentemente usadas a la hora de escribir programas. Además, a partir de estas clases prefabricadas el programador puede crear nuevas clases que mediante herencia extiendan su funcionalidad y se integren a la perfección con el resto de clases de la BCL. Por ejemplo, implementando ciertos interfaces podemos crear nuevos tipos de colecciones que serán tratadas exactamente igual que cualquiera de las colecciones incluidas en la BCL. <br><br>Esta librería está escrita en MSIL, por lo que puede usarse desde cualquier lenguaje cuyo compilador genere MSIL. A través de las clases suministradas en ella es posible desarrollar cualquier tipo de aplicación, desde las tradicionales aplicaciones de ventanas, consola o servicio de Windows NT hasta los novedosos servicios Web y páginas ASP.NET. Es tal la riqueza de servicios que ofrece que incluso es posible crear lenguajes que carezcan de librería de clases propia y sólo se basen en la BCL -como C#. <br><br>Dada la amplitud de la BCL, ha sido necesario organizar las clases en ella incluida en <strong>espacios de nombres</strong> que agrupen clases con funcionalidades similares. Por ejemplo, los espacios de nombres más usados son: <p></p><br> <table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" align="center" border="0"> <tbody> <tr> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #244061; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 150.65pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="201" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Espacio de nombres</span></strong></p></td> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #244061; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="375" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Utilidad de los tipos de datos que contiene</span></strong></p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="201"> <p class="Cdigofuente"><strong>System</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Tipos muy frecuentemente usados, como los los tipos básicos, tablas, excepciones, fechas, números aleatorios, recolector de basura, entrada/salida en consola, etc.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.Collections</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Colecciones de datos de uso común como pilas, colas, listas, diccionarios, etc.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201"> <p class="Cdigofuente"><strong>System.Data</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Manipulación de bases de datos. Forman la denominada arquitectura <strong>ADO.NET</strong>.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.IO</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Manipulación de ficheros y otros flujos de datos.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201"> <p class="Cdigofuente"><strong>System.Net</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Realización de comunicaciones en red.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.Reflection</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Acceso a los metadatos que acompañan a los módulos de código.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201"> <p class="Cdigofuente"><strong>System.Runtime.Remoting</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Acceso a objetos remotos.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.Security</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Acceso a la política de seguridad en que se basa el CLR.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201"> <p class="Cdigofuente"><strong>System.Threading</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Manipulación de hilos.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.Web.UI.WebControls</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Creación de interfaces de usuario basadas en ventanas para aplicaciones Web.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201"> <p class="Cdigofuente"><strong>System.Windows.Forms</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375"> <p class="MsoNormal" style="text-align: justify">Creación de interfaces de usuario basadas en ventanas para aplicaciones estándar.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 150.65pt; padding-top: 0cm" valign="top" width="201" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>System.XML</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 281.55pt; padding-top: 0cm" valign="top" width="375" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Acceso a datos en formato XML.</p></td></tr></tbody></table> <p class="MsoCaption" style="text-align: center" align="center"><u>Tabla </u><u>3</u><u>:</u><span style="font-weight: normal"> Espacios de nombres de la BCL más usados</span></p> <p class="MsoNormal" style="text-align: justify"> </p><br><a id="apartado7" name="apartado7"></a><strong><span style="font-size: 130%; color: #990000">Common Type System (CTS)</span></strong> <br><br>El <strong>Common Type System </strong>(CTS) o Sistema de Tipo Común es el conjunto de reglas que han de seguir las definiciones de tipos de datos para que el CLR las acepte. Es decir, aunque cada lenguaje gestionado disponga de su propia sintaxis para definir tipos de datos, en el MSIL resultante de la compilación de sus códigos fuente se han de cumplir las reglas del CTS. Algunos ejemplos de estas reglas son: <p></p><br> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Cada tipo de dato puede constar de cero o más miembros. Cada uno de estos miembros puede ser un campo, un método, una propiedad o un evento. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">No puede haber herencia múltiple, y todo tipo de dato ha de heredar directa o indirectamente de <strong><span style="color: #000099">System.Object</span></strong>. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Los modificadores de acceso admitidos son: </li></ul> <div align="center"> <table class="MsoNormalTable" style="border-collapse: collapse" cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; background: #244061; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 106.4pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="142" bgcolor="#244061"> <p><strong><span style="color: white">Modificador</span></strong></p></td> <td style="border-right: windowtext 1pt solid; padding-right: 3.5pt; border-top: windowtext 1pt solid; padding-left: 3.5pt; border-left-width: 1pt; border-left-color: windowtext; background: #244061; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="331" bgcolor="#244061"> <p class="MsoNormal" style="text-align: justify"><strong><span style="color: white">Código desde el que es accesible el miembro</span></strong></p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 106.4pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="142"> <p class="Cdigofuente"><strong>public</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 248.1pt; border-top-style: none; padding-top: 0cm; border-right-style: none; border-left-style: none; border-bottom-style: none" valign="top" width="331"> <p class="MsoNormal" style="text-align: justify">Cualquier código</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 106.4pt; padding-top: 0cm" valign="top" width="142" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>private</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm" valign="top" width="331" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Código del mismo tipo de dato</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 106.4pt; padding-top: 0cm" valign="top" width="142"> <p class="Cdigofuente"><strong>family</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm" valign="top" width="331"> <p class="MsoNormal" style="text-align: justify">Código del mismo tipo de dato o de hijos de éste.</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 106.4pt; padding-top: 0cm" valign="top" width="142" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>assembly</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm" valign="top" width="331" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Código del mismo ensamblado</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 106.4pt; padding-top: 0cm" valign="top" width="142"> <p class="Cdigofuente"><strong>family and assembly</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm" valign="top" width="331"> <p class="MsoNormal" style="text-align: justify">Código del mismo tipo o de hijos de éste ubicado en el mismo ensamblado</p></td></tr> <tr> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 106.4pt; padding-top: 0cm" valign="top" width="142" bgcolor="#dbe5f1"> <p class="Cdigofuente"><strong>family or assembly</strong></p></td> <td style="padding-right: 3.5pt; padding-left: 3.5pt; background: #dbe5f1; padding-bottom: 0cm; width: 248.1pt; padding-top: 0cm" valign="top" width="331" bgcolor="#dbe5f1"> <p class="MsoNormal" style="text-align: justify">Código del mismo tipo o de hijos de éste, o código ubicado en el mismo ensamblado</p></td></tr></tbody></table></div> <p class="MsoCaption" style="text-align: center" align="center"><u>Tabla </u><u>4</u><u>:</u> <span style="font-weight: normal">Modificadores de acceso a miembros admitidos por el CTS</span></p> <p class="MsoNormal" style="text-align: justify"> </p><br><a id="apartado8" name="apartado8"></a><strong><span style="font-size: 130%; color: #990000">Common Language Specification (CLS)</span></strong> <p class="MsoNormal" style="text-align: justify"> </p>El <strong>Common Language Specification </strong>(CLS) o Especificación del Lenguaje Común es un conjunto de reglas que han de seguir las definiciones de tipos que se hagan usando un determinado lenguaje gestionado si se desea que sean accesibles desde cualquier otro lenguaje gestionado. Obviamente, sólo es necesario seguir estas reglas en las definiciones de tipos y miembros que sean accesibles externamente, y no la en las de los privados. Además, si no importa la interoperabilidad entre lenguajes tampoco es necesario seguirlas. A continuación se listan algunas de reglas significativas del CLS: <p></p><br> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Los tipos de datos básicos admitidos son <strong><span style="color: #000099">bool</span></strong>,<strong><span style="color: #000099"> char</span></strong>,<strong><span style="color: #000099"> byte</span></strong>,<strong><span style="color: #000099"> short</span></strong>,<strong><span style="color: #000099"> int</span></strong>,<strong><span style="color: #000099"> long</span></strong>,<strong><span style="color: #000099"> float</span></strong>,<strong><span style="color: #000099"> double</span></strong>,<strong><span style="color: #000099"> string</span></strong> y <strong><span style="color: #000099">object</span></strong> Nótese pues que no todos los lenguajes tienen porqué admitir los tipos básicos enteros sin signo o el tipo <strong><span style="color: #000099">decimal </span></strong>como lo hace C#. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Las tablas han de tener una o más dimensiones, y el número de dimensiones de cada tabla ha de ser fijo. Además, han de indexarse empezando a contar desde 0. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Se pueden definir tipos abstractos y tipos sellados. Los tipos sellados no pueden tener miembros abstractos. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Las excepciones han de derivar de <strong><span style="color: #000099">System.Exception</span></strong>, los delegados de <strong><span style="color: #000099">System.Delegate</span></strong>, las enumeraciones de <strong><span style="color: #000099">System.Enum</span></strong>, y los tipos por valor que no sean enumeraciones de <strong><span style="color: #000099">System.ValueType</span></strong>. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">Los métodos de acceso a propiedades en que se traduzcan las definiciones get/set de éstas han de llamarse de la forma <strong><span style="color: #000099">get_X </span></strong>y <strong><span style="color: #000099">set_X </span></strong>respectivamente, donde X es el nombre de la propiedad; los de acceso a indizadores han de traducirse en métodos <strong><span style="color: #000099">get_Item </span></strong>y <strong><span style="color: #000099">set_Item</span></strong>; y en el caso de los eventos, sus definiciones add/remove han de traducirse en métodos <strong><span style="color: #000099">add_X</span></strong> y <strong><span style="color: #000099">remove_X</span></strong>. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">En las definiciones de atributos sólo pueden usarse enumeraciones o datos de los siguientes tipos: <strong><span style="color: #000099">System.Type</span></strong>,<strong><span style="color: #000099"> string</span></strong>,<strong><span style="color: #000099"> char</span></strong>,<strong><span style="color: #000099"> bool</span></strong>,<strong><span style="color: #000099"> byte</span></strong>,<strong><span style="color: #000099"> short</span></strong>,<strong><span style="color: #000099"> int</span></strong>,<strong><span style="color: #000099"> long</span></strong>,<strong><span style="color: #000099"> float</span></strong>,<strong><span style="color: #000099"> double</span></strong> y <strong><span style="color: #000099">object</span></strong>. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify">En un mismo ámbito no se pueden definir varios identificadores cuyos nombres sólo difieran en la capitalización usada. De este modo se evitan problemas al acceder a ellos usando lenguajes no sensibles a mayúsculas. </li></ul> <ul style="margin-top: 0cm" type="disc"> <li class="MsoNormal" style="text-align: justify"> <p>Las enumeraciones no pueden implementar interfaces, y todos sus campos han de ser estáticos y del mismo tipo. El tipo de los campos de una enumeración sólo puede ser uno de estos cuatro tipos básicos: <strong><span style="color: #000099">byte</span></strong>,<strong><span style="color: #000099"> short</span></strong>,<strong><span style="color: #000099"> int </span></strong>o<strong><span style="color: #000099"> long</span></strong>.</p></li></ul><br><a href="http://www.josanguapo.com/">(C) 2001 Jos? Antonio Gonz?lez Seco </a></span> Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com0tag:blogger.com,1999:blog-7309097101347883937.post-6995509352606362692008-01-14T15:40:00.000+01:002008-01-28T01:33:36.544+01:00El lenguaje de programación C#. Introducción a la obra.<div class="indice">Autor: <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a>
<br><br>
Curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. </div>
<div class="indice">
<ul>
<li><strong>INTRODUCCION A LA OBRA</strong> <br><br>
<ul>
<li><a href="#apartado1">Requisitos previos recomendados</a>
<li><a href="#apartado2">Estructura de la obra</a>
<li><a href="#apartado3">Convenios de notación</a> </li></ul></li></ul></div>
<p><strong><span style="color: #666666"><span style="color: #004080"><a name="apartado1"></a><span style="font-size: 130%; color: #990000">Requisitos previos recomendados</span> </span></span></strong><br><br>
En principio, para entender con facilidad esta obra es recomendable estar familiarizado con los conceptos básicos de programación orientada a objetos, en particular con los lenguajes de programación C++ o Java de los que C# deriva. Sin embargo, estos no son requisitos fundamentales para entenderla ya que cada vez que en ella se introduce algún elemento del lenguaje se definen y explican los conceptos básicos que permiten entenderlo. Aún así, sigue siendo recomendable disponer de los requisitos antes mencionados para poder moverse con mayor soltura por el libro y aprovecharlo al máximo.
<br><br>
<span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_9669.html">Seguir Leyendo... </a></span><span class="fullpost">
<br><br><a name="apartado2"></a><span style="color: #666666"><strong><span style="font-size: 130%"><span style="color: #990000">Estructura de la obra</span> </span></strong></span>
<br><br>
Básicamente el eje central de la obra es el lenguaje de programación C#, del que no sólo se describe su sintaxis sino que también se intenta explicar cuáles son las razones que justifican las decisiones tomadas en su diseño y cuáles son los errores más difíciles de detectar que pueden producirse al desarrollar de aplicaciones con él. Sin embargo, los 20 temas utilizados para ello pueden descomponerse en tres grandes bloques: </p>
<ul>
<li><strong><u>Bloque 1: Introducción a C# y .NET</u></strong>: Antes de empezar a describir el lenguaje es obligatorio explicar el porqué de su existencia, y para ello es necesario antes introducir la plataforma .NET de Microsoft con la que está muy ligado. Ese es el objetivo de los temas 1 y 2, donde se explican las características y conceptos básicos de C# y .NET, las novedosas aportaciones de ambos y se introduce la programación y compilación de aplicaciones en C# con el típico ¡Hola Mundo! </li></ul>
<ul>
<li><strong><u>Bloque 2: Descripción del lenguaje:</u></strong> Este bloque constituye el grueso de la obra y está formado por los temas comprendidos entre el 3 y el 19. En ellos se describen pormenorizadamente los aspectos del lenguaje mostrando ejemplos de su uso, explicando su porqué y avisando de cuáles son los problemas más difíciles de detectar que pueden surgir al utilizarlos y cómo evitarlos. <br><br>
<li><strong><u>Bloque 3: Descripción del compilador</u></strong>: Este último bloque, formado solamente por el tema 20, describe cómo se utiliza el compilador de C# tanto desde la ventana de consola como desde la herramienta Visual Studio.NET. Como al describir el lenguaje, también se intenta dar una explicación lo más exhaustiva, útil y fácil de entender posible del significado, porqué y aplicabilidad de las opciones de compilación que ofrece. </li></ul><br><a name="apartado3"></a><span style="font-size: 130%; color: #990000"><strong>Convenios de notación</strong></span>
<br><br>
Para ayudar a resaltar la información clave se utilizan diferentes convenciones respecto a los tipos de letra usados para representar cada tipo de contenido. Éstas son:
<ul>
<li>El texto correspondiente a explicaciones se ha escrito usando la fuente Arial, como es el caso de este párrafo. </li></ul>
<ul>
<li>Los fragmentos de código fuente se han escrito usando la fuente de paso fijo tal y como se muestra a continuación: <pre class="style11"><span style="color: #000099">class HolaMundo
{
static void Main()
{
System.Console.WriteLine("¡Hola Mundo!");
}
}</span></pre></li></ul>
<ul>
<li>
<p>Esta misma fuente es la que se usará desde las explicaciones cada vez que se haga referencia a algún elemento del código fuente. Si además dicho elemento es una palabra reservada del lenguaje o viene predefinido en la librería de .NET, su nombre se escribirá en negrita para así resaltar el carácter especial del mismo </p></li></ul>
<ul>
<li>
Las referencias a textos de la interfaz del sistema operativo (nombres de ficheros y directorios, texto de la línea de comandos, etc. ) se han escrito usando la misma fuente de paso fijo. Por ejemplo:
<pre class="style11"><span style="color: #000099">csc HolaMundo.cs</span></pre>
<p>Cuando además este tipo de texto se utilice para hacer referencia a elementos predefinidos tales como extensiones de ficheros recomendadas o nombres de aplicaciones incluidas en el SDK, se escribirá en negrita. </p></li></ul>
<ul>
<li>Al describirse la sintaxis de definición de los elementos del lenguaje se usará fuente de paso fija y se representarán en cursiva los elementos opcionales en la misma, en negrita los que deban escribirse tal cual, y sin negrita y entre símbolos < y > los que representen de texto que deba colocarse en su lugar. Por ejemplo, cuando se dice que una clase ha de definirse así: <pre class="style11"><span style="color: #000099"><pre class="style11"><span style="color: #000099"><strong>class</strong> <nombreClase> </span>
<span style="color: #000099"><strong>{</strong></span><span style="color: #000099"> </span><em>
<span style="color: #000099"> <miembros></span></em>
<span style="color: #000099"><strong>}</strong></span></pre></span></pre>Lo que se está diciendo es que ha de escribirse la palabra reservada class, seguida de texto que represente el nombre de la clase a definir, seguido de una llave de apertura ({), seguido opcionalmente de texto que se corresponda con definiciones de miembros y seguido de una llave de cierre (}) </li></ul>
<p><a href="http://www.josanguapo.com/">(C) 2001 José Antonio González Seco </a></p>
<br><br>
<!-- AddThis Bookmark Post Dropdown BEGIN -->
<div><script type='text/javascript'>addthis_url='<data:post.url/>'; addthis_title='<data:post.title/>'; addthis_pub='igner';</script><script src='http://s7.addthis.com/js/addthis_widget.php?v=12' type='text/javascript'></script></div>
<!-- AddThis Bookmark Post Dropdown END -->
</span>Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com0tag:blogger.com,1999:blog-7309097101347883937.post-65541518270824459262008-01-13T15:32:00.000+01:002008-01-29T01:00:58.113+01:00El lenguaje de programación C#. Indice.<div class="indice">Comenzamos nuestra andadura con una serie de post, donde os ofrecemos gratuitamente un excelente curso de C#, creado por <a href="mailto:josanguapo@hotmail.com">José Antonio González Seco</a></div>
<div class="indice">
También podéis acceder al curso completo disponible en formato DOC y PDF en la <a href="http://www.josanguapo.com/">web del autor</a>. </div><br>
<div class="indice"><span class="summarypost"></span></div>
<div class="indice"><span class="summarypost"><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_15.html">Seguir Leyendo... </a></span></div>
<p><span class="fullpost"><strong>El LENGUAJE DE PROGRAMACION C#</strong></p>
<div class="indice"></div>
<div class="indice"></div>
<ul>
<li>
<div class="indice"><strong>INDICE</strong></div></li></ul>
<div class="indice">
<ul>
<li><a href="http://programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_9669.html"><span style="color:#333399;"><strong>Introducción a la obra</strong></span> </a><span style="color:#000000;">
<br>Requisitos previos recomendados
<br>Estructura de la obra
<br>Convenios de notación</span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><a href="http//programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_4609.html"><strong><span style="color:#333399;">Tema 1: Introducción a Microsoft.NET</span></strong> </a></span><span style="color:#000000;">
<br>Microsoft.NET Common Language Runtime (CLR)
<br>Microsoft Intermediate Language (MSIL)
<br>Metadatos
<br>Ensamblados
<br>Librería de clase base (BCL)
<br>Common Type System (CTS)
<br>Common Language Specification (CLS) </span>
<br>
<br>
<li><span style="color:#000000;"></span><strong><a href="http//programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c_23.html"><span style="color:#333399;">Tema 2: Introducción a C#</span></a> </strong><span style="color:#000000;">
<br>Origen y necesidad de un nuevo lenguaje
<br>Características de C#
<br>Escritura de aplicaciones</span>
<br>
<br>
<li><span style="color:#000000;"></span><a href="http//programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c-el.html"><span style="color:#333399;"><strong>Tema 3: El preprocesador</strong></span> </a><span style="color:#990000;"><span style="color:#000000;">
<br>Concepto de preprocesador
<br>Directivas de preprocesado</span> </span>
<br>
<br>
<li><span style="color:#990000;"></span><a href="http//programmatium.blogspot.com/2008/01/el-lenguaje-de-programacin-c-aspectos.html"><span style="color:#333399;"><strong>Tema 4: Aspectos léxicos</strong></span> </a><span style="color:#000000;">
<br>Comentarios
<br>Identificadores
<br>Palabras reservadas
<br>Literales
<br>Operadores </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 5: Clases</strong> </span><span style="color:#000000;">
<br>Definición de clases
<br>Creación de objetos
<br>Herencia y métodos virtuales
<br>La clase primigenia: System.Object
<br>Polimorfismo
<br>Ocultación de miembros
<br>Miembros de tipo
<br>Encapsulación </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 6: Espacios de nombres</strong></span> <span style="color:#000000;">
<br>Concepto de espacio de nombres
<br>Definición de espacios de nombres
<br>Importación de espacios de nombres
<br>Espacio de nombres distribuidos </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 7: Variables y tipos de datos</strong></span> <span style="color:#000000;">
<br>Definición de variables
<br>Tipos de datos básicos
<br>Tablas
<br>Cadenas de texto
<br>Constantes
<br>Variables de sólo lectura
<br>Orden de inicialización de variables </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 8: Métodos </strong></span><span style="color:#000000;">
<br>Concepto de método
<br>Definición de métodos
<br>Llamada a métodos
<br>Tipos de parámetros
<br>Sintaxis de definición
<br>Métodos externos
<br>Constructores
<br>Destructores </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 9: Propiedades</strong> </span><span style="color:#000000;">
<br>Concepto de propiedad
<br>Definición de propiedades
<br>Acceso a propiedades
<br>Implementación interna de propiedades</span>
<br>
<br>
<li><span style="color:#333399;"><strong>Tema 10: Indizadores</strong></span> <span style="color:#000000;">
<br>Concepto de indizador
<br>Definición de indizador
<br>Acceso a indizadores
<br>Implementación interna de indizadores </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 11: Redefinición de operadores</strong> </span><span style="color:#000000;">
<br>Concepto de redefinición de operador
<br>Definición de redefiniciones de operadores
<br>Redefiniciones de operadores de conversión </span>
<br>
<br>
<li><span style="color:#000000;"></span><strong><span style="color:#333399;">Tema 12: Delegados y eventos</span> </strong><span style="color:#000000;">
<br>Concepto de delegado
<br>Definición de delegados
<br>Manipulación de objetos delegados
<br>La clase System.MulticastDelegate
<br>Llamadas asíncronas
<br>Implementación interna de los delegados
<br>Eventos </span>
<br>
<br>
<li><span style="color:#000000;"></span><strong><span style="color:#333399;">Tema 13: Estructuras</span> </strong><span style="color:#000000;">
<br>Concepto de estructura
<br>Diferencias entre clases y estructuras
<br>Boxing y unboxing
<br>Constructores </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 14: Enumeraciones</strong></span> <span style="color:#000000;">
<br>Concepto de enumeración
<br>Definición de enumeraciones
<br>Uso de enumeraciones
<br>La clase System.Enum
<br>Enumeraciones de flags </span>
<br>
<br>
<li><span style="color:#000000;"></span><strong><span style="color:#333399;">Tema 15: Interfaces</span> </strong><span style="color:#000000;">
<br>Concepto de interfaz
<br>Definición de interfaces
<br>Implementación de interfaces
<br>Acceso a miembros de una interfaz </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 16: Instrucciones</strong></span> <span style="color:#000000;">
<br>Concepto de instrucción
<br>Instrucciones básicas
<br>Instrucciones condicionales
<br>Instrucciones iterativas
<br>Instrucciones de excepciones
<br>Instrucciones de salto
<br>Otras instrucciones </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 17: Atributos </strong></span><span style="color:#000000;">
<br>Concepto de atributo
<br>Utilización de atributos
<br>Definición de nuevos atributos
<br>Lectura de atributos en tiempo de ejecución
<br>Atributos de compilación </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 18: Código inseguro </strong></span><span style="color:#000000;">
<br>Concepto de código inseguro
<br>Compilación de códigos inseguros
<br>Marcación de códigos inseguros
<br>Definición de punteros
<br>Manipulación de punteros
<br>Operadores relacionados con código inseguro
<br>Fijación de variables apuntadas </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Tema 19: Documentación XML</strong> </span><span style="color:#000000;">
<br>Concepto y utilidad de la documentación XML
<br>Introducción a XML
<br>Comentarios de documentación XML
<br>Etiquetas recomendadas para documentación XML
<br>Generación de documentación XML
<br>Estructura de la documentación XML
<br>Separación entre documentación XML y código fuente</span>
<br>
<br>
<li><span style="color:#333399;"><strong>Tema 20: El compilador de C# de Microsoft</strong> </span><span style="color:#000000;">
<br>Introducción
<br>Sintaxis general de uso del compilador
<br>Opciones de compilación </span><span style="color:#000000;">
<br>Acceso al compilador desde Visual Studio.NET </span>
<br>
<br>
<li><span style="color:#000000;"></span><span style="color:#333399;"><strong>Documentación de referencia </strong></span><span style="color:#000000;">
<br>Bibliografía
<br>Información en Internet sobre C#
<br>Portales
<br>Grupos de noticias y listas de correo </span></li></ul></div>
<br>
<p><a href="http://www.josanguapo.com/">(C) 2001 José Antonio González Seco </a></p>
<br>
<!-- AddThis Bookmark Post Dropdown BEGIN -->
<script src="http://s7.addthis.com/js/addthis_widget.php?v=12" type="text/javascript"></script>
<!-- AddThis Bookmark Post Dropdown END -->
</span>Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com0tag:blogger.com,1999:blog-7309097101347883937.post-85555616415424860282008-01-12T19:30:00.000+01:002008-01-28T01:01:28.802+01:00Arrancando motoresPROGRAMMATIUM nace con la intención de servir de referencia a todos los que necesiten ayuda en el desarrollo de aplicaciones gráficas 3D, en el uso e implementación de componentes dentro de formularios, bases de datos, y en general en la utilización de tecnologías orientadas a la programación de videojuegos. El lenguaje de programación utilizado en todos los ejemplos y tutoriales será C#, salvo en los casos en que se haga especial referencia a otros entornos de trabajo.
<br><br>
Espero que este sea el comienzo de un largo y prometedor viaje.
<br><br>
Un saludo.Igner Eldarhttp://www.blogger.com/profile/06973213028224561214noreply@blogger.com0