<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux, Java y programación &#187; ejercicio</title>
	<atom:link href="http://casidiablo.net/tag/ejercicio/feed/" rel="self" type="application/rss+xml" />
	<link>http://casidiablo.net</link>
	<description>Blog de Java, Programación y Linux</description>
	<lastBuildDate>Mon, 08 Mar 2010 03:41:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Obtener información del sistema [memoria disponible, %CPU, espacio en disco] en Java</title>
		<link>http://casidiablo.net/capturar-informacion-sistema-operativo-java/</link>
		<comments>http://casidiablo.net/capturar-informacion-sistema-operativo-java/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 22:00:33 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[espacio]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[informacion]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memoria]]></category>
		<category><![CDATA[ram]]></category>
		<category><![CDATA[sistema]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3382</guid>
		<description><![CDATA[

En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:

Información de la CPU.
Espacio en disco disponible.
Cantidad de espacio que consume un directorio en específico.
Cantidad de memoria RAM disponible y en uso.
Información de red (dirección IP, nombre de la NIC, puertos [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fcapturar-informacion-sistema-operativo-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Obtener%20informaci%C3%B3n%20del%20sistema%20%5Bmemoria%20disponible%2C%20%25CPU%2C%20espacio%20en%20disco%5D%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;">En esta guía aprenderemos a obtener información de los recursos sistema en Java, usando la librería Sigar. Los datos que podremos extraer son los siguientes:</p>
<ul style="text-align: justify;">
<li><strong>Información de la CPU.</strong></li>
<li><strong>Espacio en disco disponible.</strong></li>
<li>Cantidad de espacio que consume un directorio en específico.</li>
<li><strong>Cantidad de memoria RAM disponible y en uso.</strong></li>
<li>Información de red (dirección IP, nombre de la NIC, puertos abiertos, tablas de enrutamiento, etc.)</li>
<li>Información de los procesos que se están ejecutando en el sistema.</li>
<li>Asignación de <a href="http://casidiablo.net/obtener-variables-entorno-informacion-sistema-java/">variables de entorno</a>.</li>
<li><strong>Uptime, o cantidad de tiempo que el equipo ha estado encendido.</strong></li>
<li><strong>Nombre y versión del sistema operativo.</strong></li>
<li>Usuarios logueados actualmente.</li>
</ul>
<p style="text-align: justify;">Resaltadas en negrita está la información en la que nos concentraremos en el ejemplo. Pero antes aclaremos un poco que es Sigar: el API de Sigar nos proporciona una serie de métodos que nos permiten obtener información del sistema operativo; consta de una librería de Java (.jar) y otras librerías nativas específicas para cada sistema operativo soportado (<code>libsigar-amd64-linux.so</code>, para Linux de 64 bits o <code>sigar-x86-winnt.dll</code> para Windows de 32 bits, por poner un ejemplo).</p>
<p style="text-align: justify;">Teniendo esto en cuenta, para hacer funcionar dicha API en una de nuestras aplicaciones, bastaría con tener el archivo .jar y la librería específica de nuestro sistema operativo. En el desarrollo del ejemplo se usará Eclipse y, aunque se explicará cómo añadir las librerías en el proyecto, se da por conocido el funcionamiento del flag <code>--classpath</code> de los comandos <code>javac</code> y <code>java</code> (obligatorio si no se usa ningún IDE).</p>
<h3>El resultado&#8230;</h3>
<p style="text-align: justify;">Siempre pongo primero el resultado ya que nos aclara la visión de hacia donde vamos, y de paso saber si lo que está aquí es lo que buscamos. Esta es la salida del programa en mi Gentoo Linux:</p>
<p><span id="more-3382"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: plain;">====Informacion del sistema====
Descripcion del SO	Gentoo 2.1.6
Nombre del SO		Linux
Arquitectura del SO	x86_64
Version del SO		2.6.31-gentoo
Nivel de parches	unknown
Fabricante		Gentoo
Version SO		2.1.6
Encendido durante:	6:15

==== Informacion de la CPU ====
Fabricante:		Intel
Modelo			Core(TM)2 Duo CPU     T5750  @ 2.00GHz
Mhz			1994
Total CPUs		2
CPUs fisiscas		1
Nucleos por CPU		2
Tamanio cache		2048

Consumo de CPU 0	22.0%
Consumo de CPU 1	2.0%
Consumo total de CPU	6.0%

====Informacion del sistema de archivos====

dispos.|total|usado|disponible|%uso|dir|tipo

/dev/root|24042944|10698228|12123376|47%|/|ext4
/dev/sda1|175457764|155825380|10719932|94%|/home|ext3

====Informacion de la memoria====
Cantidad de memoria RAM: 3968MB
Total: 4056984
Usada: 2307076
Disponible: 1749908
Memoria SWAP total: 1052248
Memoria SWAP usada: 0
Memoria SWAP libre: 1052248</pre>
<p><!--INFOLINKS_ON--></p>
<h3>Descargar Sigar</h3>
<p style="text-align: justify;">Puedes descargar Sigar de la página oficial: <a href="http://support.hyperic.com/display/SIGAR/Home">http://support.hyperic.com/display/SIGAR/Home</a> que incluye además ejemplos para Java, Perl, C, Python, Ruby, y más. Puedes además descargar el código fuente que se encuentra licenciado bajo la GPL2.</p>
<h3>Creación del proyecto en Eclipse</h3>
<p style="text-align: justify;">Voy a usar este ejemplo para además enseñar a manipular librerías externas en Eclipse; si lo que te interesa es conocer el código, puedes saltarte a dicha sección directamente.</p>
<p style="text-align: justify;">Creamos un proyecto en Eclipse llamado InfoSistema:</p>
<p style="text-align: center;"><img class="size-full wp-image-3385 aligncenter" title="eclipse1" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse1.png" alt="eclipse1" width="457" height="381" /></p>
<p style="text-align: justify;">Ahora creamos una carpeta dentro del proyecto llamada lib, en donde guardaremos las librerías de Sigar (.jar, .so, .dll, etc.):</p>
<p style="text-align: center;"><img class="size-full wp-image-3386 aligncenter" title="eclipse2" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse2.png" alt="eclipse2" width="600" height="372" /></p>
<p style="text-align: justify;">Ahora descomprimimos el archivo que descargamos de Sigar, y copiamos los archivos que se encuentran en la carpeta <code>sigar-bin/lib</code> a la carpeta <code>lib</code> de nuestro proyecto. En mi caso la copia la hice con este comando:</p>
<div class="consola">cp sigar-bin/lib/* /home/compartido/workspace/InfoSistema/lib/</div>
<p style="text-align: justify;">Cabe resaltar que bastaría con copiar el archivo llamado <code>sigar.jar</code> y la librería del sistema donde vamos a correr nuestro programa (<code>libsigar-amd64-linux.so</code> en mi caso).</p>
<p style="text-align: justify;">Una vez hecha la copia, hacemos clic en la raiz del proyecto en Eclipse y presionamos F5 para actualizar el árbol de ficheros; de esta manera Eclipse sabrá de los nuevos archivos que hemos copiado. Y lo que haremos a continuación será enlazar la librería <code>sigar.jar</code> a nuestro proyecto, para lo cual hacemos clic derecho en el mismo, <em>Build Path</em> -&gt; <em>Configure Build Path&#8230;</em></p>
<p style="text-align: center;"><img class="size-full wp-image-3388 aligncenter" title="eclipse3" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse3.png" alt="eclipse3" width="600" height="345" /></p>
<p style="text-align: justify;">En la ventana que aparece, seleccionaremos la pestaña <em>Libraries</em> y hacemos clic en el botón <em>Add JARs&#8230;</em> Seleccionamos el archivo <code>sigar.jar</code> y hacemos clic en <em>OK</em>:</p>
<p style="text-align: center;"><img class="size-full wp-image-3389 aligncenter" title="eclipse4" src="http://casidiablo.net/wordpress/wp-content/uploads/2009/10/eclipse4.png" alt="eclipse4" width="373" height="336" /></p>
<p style="text-align: justify;">Ahora que la librería se encuentra añadida, podemos utilizar el API que Sigar nos ofrece. ¡Pasemos entonces al código!</p>
<h3>Información del sistema&#8230;</h3>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema operativo, como el nombre, la versión, la arquitectura, etc. Creamos una nueva clase llamada <code>InfoSO</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoSO {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() {
		OperatingSystem sys = OperatingSystem.getInstance();
		System.out.println(&quot;Descripcion del SO\t&quot; + sys.getDescription());
		System.out.println(&quot;Nombre del SO\t\t&quot; + sys.getName());
		System.out.println(&quot;Arquitectura del SO\t&quot; + sys.getArch());
		System.out.println(&quot;Version del SO\t\t&quot; + sys.getVersion());
		System.out.println(&quot;Nivel de parches\t&quot; + sys.getPatchLevel());
		System.out.println(&quot;Fabricante\t\t&quot; + sys.getVendor());
		System.out.println(&quot;Version SO\t\t&quot; + sys.getVendorVersion());
		try {
			imprimirUptime();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
	public void imprimirUptime() throws SigarException {
		double uptime = sigar.getUptime().getUptime();
		String resultado = &quot;&quot;;
		int dias = (int) uptime / (60 * 60 * 24);
		int minutos, horas;
		if (dias != 0)
			resultado += dias + &quot; &quot; + ((dias &gt; 1) ? &quot;dias&quot; : &quot;dia&quot;) + &quot;, &quot;;
		minutos = (int) uptime / 60;
		horas = minutos / 60;
		horas %= 24;
		minutos %= 60;
		if (horas != 0)
			resultado += horas + &quot;:&quot; + (minutos &lt; 10 ? &quot;0&quot; + minutos : minutos);
		else
			resultado += minutos + &quot; min&quot;;
		System.out.println(&quot;Encendido durante:\t&quot; + resultado);
	}
}
</pre>
<p><!--INFOLINKS_ON-->
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li>La clase que nos proporciona los métodos para recuperar información del sistema operativo es <code>OperatingSystem</code>.</li>
<li>Con los métodos <code>getName</code> y <code>getDescription</code> obtenemos el nombre del sistema operativo y descripción (por ejemplo: nombre = Linux; descripción = Gentoo 2.1.6).</li>
<li style="text-align: justify;">El método <code>getUptime</code> de la clase Sigar nos permite conocer cuanto tiempo ha estado prendido el equipo analizado.</li>
</ul>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Información de la CPU&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permitirá conocer el modelo del procesador, sus capacidades, la cantidad de núcleos y el uso de los mismos, etc. Creamos una nueva clase llamada <code>InfoCPU</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;

public class InfoCPU {
	private Sigar sigar;

	public void imprimirInfoCPU() {
		sigar = new Sigar();
		CpuInfo[] infos = null;
		CpuPerc[] cpus = null;
		try {
			infos = sigar.getCpuInfoList();
			cpus = sigar.getCpuPercList();
		} catch (SigarException e) {
			e.printStackTrace();
		}

		CpuInfo info = infos[0];
		long tamanioCache = info.getCacheSize();
		System.out.println(&quot;Fabricante:\t\t&quot; + info.getVendor());
		System.out.println(&quot;Modelo\t\t\t&quot; + info.getModel());
		System.out.println(&quot;Mhz\t\t\t&quot; + info.getMhz());
		System.out.println(&quot;Total CPUs\t\t&quot; + info.getTotalCores());
		if ((info.getTotalCores() != info.getTotalSockets())
				|| (info.getCoresPerSocket() &gt; info.getTotalCores())) {
			System.out.println(&quot;CPUs fisiscas\t\t&quot; + info.getTotalSockets());
			System.out
					.println(&quot;Nucleos por CPU\t\t&quot; + info.getCoresPerSocket());
		}

		if (tamanioCache != Sigar.FIELD_NOTIMPL)
			System.out.println(&quot;Tamanio cache\t\t&quot; + tamanioCache);
		System.out.println(&quot;&quot;);

		for (int i = 0; i &lt; cpus.length; i++)
			System.out.println(&quot;Consumo de CPU &quot; + i + &quot;\t&quot;
					+ CpuPerc.format(cpus[i].getUser()));

		try {
			System.out.println(&quot;Consumo total de CPU\t&quot;
					+ CpuPerc.format(sigar.getCpuPerc().getUser()));
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Se deben usar objetos de <code>CpuInfo</code> y <code>CpuPerc</code> que proporcionan los métodos para recuperar información del procesador. Dichos objetos se crean a partir de un objeto principal de tipo <code>Sigar</code>.</li>
<li style="text-align: justify;">Para extraer información acerca del  procesador usamos los métodos de la clase CpuInfo (por ejemplo <code>getVendor</code> o <code>getModel</code>).</li>
<li style="text-align: justify;">Los datos específicos de cada núcleo de nuestro procesador se extraen con los métodos de la clase <code>CpuPerc</code> (getUser para obtener el uso de un núcleo, por ejemplo).</li>
</ul>
<p style="text-align: justify;">
<h3>Información del sistema de archivos&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite obtener información del sistema de archivos: unidades montadas, espacio en disco, tipo de sistema de archivos, etc. Creamos una nueva clase llamada <code>InfoSistemaArchivos</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.NfsFileSystem;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache;

public class InfoSistemaArchivos {
	private SigarProxy proxy;
	private Sigar sigar;

	public InfoSistemaArchivos() {
		sigar = new Sigar();
		proxy = SigarProxyCache.newInstance(sigar);
	}

	public void imprimirInfo() throws SigarException {
		FileSystem[] listaSistemaArchivos = proxy.getFileSystemList();
		System.out.println(&quot;\ndispos.|total|usado|disponible|%uso|dir|tipo\n&quot;);
		for (int i = 0; i &lt; listaSistemaArchivos.length; i++)
			imprimirSistemaArchivos(listaSistemaArchivos[i]);
	}

	public void imprimirSistemaArchivos(FileSystem sistemaArchivos)
			throws SigarException {
		long usado, disponible, total, porcentaje;

		try {
			FileSystemUsage uso;
			if (sistemaArchivos instanceof NfsFileSystem) {
				NfsFileSystem nfs = (NfsFileSystem) sistemaArchivos;
				if (!nfs.ping()) {
					System.out.println(nfs.getUnreachableMessage());
					return;
				}
			}
			uso = sigar.getFileSystemUsage(sistemaArchivos.getDirName());

			usado = uso.getTotal() - uso.getFree();
			disponible = uso.getAvail();
			total = uso.getTotal();

			porcentaje = (long) (uso.getUsePercent() * 100);
		} catch (SigarException e) {
			// por ejemplo, si en al procesar D:\ en windows falla
			// con &quot;Device not ready&quot;
			usado = disponible = total = porcentaje = 0;
		}

		String porcentajeUso;
		if (porcentaje == 0)
			porcentajeUso = &quot;-&quot;;
		else
			porcentajeUso = porcentaje + &quot;%&quot;;

		System.out.print(sistemaArchivos.getDevName());
		System.out.print(&quot;|&quot; + total);
		System.out.print(&quot;|&quot; + usado);
		System.out.print(&quot;|&quot; + disponible);
		System.out.print(&quot;|&quot; + porcentajeUso);
		System.out.print(&quot;|&quot; + sistemaArchivos.getDirName());
		System.out.println(&quot;|&quot; + sistemaArchivos.getSysTypeName());
	}
}
</pre>
<p><!--INFOLINKS_ON-->Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase que nos proporciona los métodos para obtener información de una unidad en específico es <code>FileSystem</code>.</li>
<li style="text-align: justify;">El método <code>getDevName</code> nos devuelve el nombre del dispositivo referenciado por el objeto de la clase <code>FileSystem</code>.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getAvail</code> devuelven un <code>long</code> que representa el espacio total del dispositivo y espacio disponible, respectivamente.</li>
<li style="text-align: justify;">Para conocer el tipo de sistema de archivos (ext4, ntfs, fat, btrfs, etc.) utilizamos el método <code>getSysTypeName</code>.</li>
</ul>
<p style="text-align: justify;">
<h3>Información de la memoria&#8230;</h3>
</p>
<p style="text-align: justify;">La siguiente clase nos permite conocer la cantidad de memoria RAM que tiene el equipo, así como la que se está usando actualmente (tanto memoria física como virtual, aka, swap). Creamos una nueva clase llamada <code>InfoMemoria</code> con el siguiente código:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.Mem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.Swap;
import org.hyperic.sigar.SigarException;

public class InfoMemoria {
	private Sigar sigar = new Sigar();
	public void imprimirInfo() throws SigarException {
		Mem memoria = sigar.getMem();
		Swap intercambio = sigar.getSwap();

		System.out.println(&quot;Cantidad de memoria RAM: &quot;+ memoria.getRam() + &quot;MB&quot;);

		System.out.println(&quot;Total: &quot;+enBytes(memoria.getTotal()));
		System.out.println(&quot;Usada: &quot;+enBytes(memoria.getUsed()));
		System.out.println(&quot;Disponible: &quot;+enBytes(memoria.getFree()));

		System.out.println(&quot;Memoria SWAP total: &quot;+enBytes(intercambio.getTotal()));
		System.out.println(&quot;Memoria SWAP usada: &quot;+enBytes(intercambio.getUsed()));
		System.out.println(&quot;Memoria SWAP libre: &quot;+enBytes(intercambio.getFree()));

	}
	private Long enBytes(long valor) {
		return new Long(valor / 1024);
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Aspectos importantes:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">La clase <code>Mem</code> nos proporciona métodos para obtener información de la memoria del sistema.</li>
<li style="text-align: justify;">La clase <code>Swap</code> hace lo mismo que Mem, pero para la memoria virtual.</li>
<li style="text-align: justify;">Los métodos <code>getTotal</code> y <code>getUsed</code> nos devuelven un long que representa (en bits) la cantidad de memoria del equipo y lo que está usando, respectivamente.</li>
</ul>
<p style="text-align: justify;">
<h3>La clase main&#8230;</h3>
</p>
<p style="text-align: justify;">El main de nuestro proyecto estará contenido en la clase <code>InfoSistema</code>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import org.hyperic.sigar.SigarException;
public class InfoSistema {
	public static void main(String[] args) {
		try {
			System.out.println(&quot;====Informacion del sistema====&quot;);
			new InfoSO().imprimirInfo();
			System.out.println(&quot;\n==== Informacion de la CPU ====&quot;);
			new InfoCPU().imprimirInfoCPU();
			System.out.println(&quot;\n====Informacion del sistema de archivos====&quot;);
			new InfoSistemaArchivos().imprimirInfo();
			System.out.println(&quot;\n====Informacion de la memoria====&quot;);
			new InfoMemoria().imprimirInfo();
		} catch (SigarException e) {
			e.printStackTrace();
		}
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>Eso es todo, solo nos queda ejecutar el proyecto y, opcionalmente, crear un archivo .jar para ejecutar en cualquier lado.</p>
<p style="text-align: justify;">
<h3>Descargas&#8230;</h3>
</p>
<ul style="text-align: justify;">
<li><a href="http://casidiablo.net/descargar/Informacion+Sistema+Java" class="tooltip" title="Proyecto de Eclipse comprimido en ZIP (contiene las librerías de Sigar)">Descarga del código fuente usado en esta entrada</a></li>
<li><a href="https://sourceforge.net/project/showfiles.php?group_id=172552">Descargar librerías de Sigar de SourceForge</a></li>
</ul>
<p><br/><br/></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/cpu/" rel="tag nofollow">cpu</a>, <a href="http://casidiablo.net/tag/disco/" rel="tag nofollow">disco</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejemplos/" rel="tag nofollow">ejemplos</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/espacio/" rel="tag nofollow">espacio</a>, <a href="http://casidiablo.net/tag/ide/" rel="tag nofollow">ide</a>, <a href="http://casidiablo.net/tag/informacion/" rel="tag nofollow">informacion</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/linux/" rel="tag nofollow">linux</a>, <a href="http://casidiablo.net/tag/memoria/" rel="tag nofollow">memoria</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/ram/" rel="tag nofollow">ram</a>, <a href="http://casidiablo.net/tag/sistema/" rel="tag nofollow">sistema</a>, <a href="http://casidiablo.net/tag/wordpress/" rel="tag nofollow">wordpress</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/capturar-informacion-sistema-operativo-java/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Ejemplo fullscreen y cómo crear ventanas sin bordes en Java</title>
		<link>http://casidiablo.net/pantalla-completa-java/</link>
		<comments>http://casidiablo.net/pantalla-completa-java/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 15:11:41 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[ejercicios en java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[fullscreen]]></category>
		<category><![CDATA[pantalla completa]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=3028</guid>
		<description><![CDATA[

Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).
En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:

Método setUndecorated de la [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fpantalla-completa-java%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplo%20fullscreen%20y%20c%C3%B3mo%20crear%20ventanas%20sin%20bordes%20en%20Java%22%20%7D);"></div>
<p style="text-align: justify;">Este es un tip bastante útil que nos permitirá poner las ventanas de nuestras aplicaciones en Fullscreen (pantalla completa), y de paso aprenderemos a crear ventanas sin bordes (lo cual es útil si queremos hacer algún splash de inicio para nuestra aplicación).</p>
<p style="text-align: justify;">En el siguiente ejemplo usaremos básicamente los siguientes métodos y clases:</p>
<ul style="text-align: justify;">
<li>Método <code>setUndecorated</code> de la clase <code>JFrame</code>, el cual recibe un parámetro <code>boolean</code>. Si le enviamos true, quitará los bordes de la ventana.</li>
<li>La clase <code>GraphicsDevice</code> nos permite manejar objetos que representan dispositivos gráficos, como la pantalla del computador. En este caso creamos el  objeto con la instrucción <code>GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();</code> que nos devuelve un objeto que representa la pantalla en donde se está mostrando nuestro programa.</li>
<li>El método <code>setFullScreenWindow</code>, de la clase <code>GraphicsDevice</code>, nos permite poner nuestro programa en pantalla completa. Además, aunque no lo usemos en el ejemplo, contamos con el método <code>isFullScreenSupported</code> que nos permite saber si es posible poner la ventana en modo fullscreen o no.</li>
</ul>
<h3>Código fuente del ejemplo&#8230;</h3>
<p><!--INFOLINKS_OFF-->
<pre class="brush: java;">import javax.swing.*;
import java.awt.GraphicsEnvironment;
import java.awt.GraphicsDevice;
import java.awt.event.*;

public class EjemploFullscreen extends JFrame implements ActionListener{
        private JButton boton;
        private boolean estaFull = false;
        static GraphicsDevice grafica=
                GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        public EjemploFullscreen() {
                super(&quot;Ejemplo pantalla completa en Java&quot;);

                boton = new JButton(&quot;Presioname&quot;);
                boton.addActionListener(this);
                getContentPane().add(boton);

                setSize(640, 400);
                setUndecorated(true);
                setVisible(true);
        }

        public static void main(String[] args) {
                new EjemploFullscreen();
        }

        public void actionPerformed(ActionEvent e) {
                if(!estaFull)
                        grafica.setFullScreenWindow(this);
                else
                        grafica.setFullScreenWindow(null);
                estaFull = !estaFull;
        }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="tooltip descargacodigo" title="Descarga las fuentes del ejemplo" href="http://casidiablo.net/descargar/Ejemplo+Pantalla+Completa">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/fullscreen/" rel="tag nofollow">fullscreen</a>, <a href="http://casidiablo.net/tag/java/" rel="tag nofollow">java</a>, <a href="http://casidiablo.net/tag/pantalla-completa/" rel="tag nofollow">pantalla completa</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/pantalla-completa-java/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Constantes en C#</title>
		<link>http://casidiablo.net/constantes-en-c/</link>
		<comments>http://casidiablo.net/constantes-en-c/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 13:44:58 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[constantes]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2280</guid>
		<description><![CDATA[

Existen dos maneras de definir constantes en C Sharp: usando const o readonly. Cuando se usa const, es posible acceder a la variable directamente desde la clase (sin instanciar un objeto), como si se tratase de un atributo estático; mientras que con readonly, es un tipo de constantes que funciona como un atributo normal, y [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fconstantes-en-c%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Constantes%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Existen dos maneras de definir constantes en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C Sharp</a>: usando <code>const</code> o <code>readonly</code>. Cuando se usa <code>const</code>, es posible acceder a la variable directamente desde la clase (sin instanciar un objeto), como si se tratase de un <a href="http://casidiablo.net/atributos-estaticos-destructores-c-sharp/">atributo estático</a>; mientras que con <code>readonly</code>, es un tipo de constantes que funciona como un atributo normal, y que una vez inicializada no se le puede cambiar el valor.</p>
<p>Veamos un ejemplo sencillo para aclararnos:<span id="more-2280"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
public class Constantes {
  // crear constante PI
  public const double PI = 3.14159;
  // radio es una constante esta sin iniciar
  public readonly int radio;
  public Constantes( int radioValue ) {
     radio = radioValue;
  }
}
// Clase UsarConstantes
public class UsarConstantes {
  // metodo Main crea un objeto de tipo 'Constantes'
  // y muestra los valores
  static void Main( string[] args ) {
     Random random = new Random();
     Constantes valoresConstantes =
        new Constantes( random.Next( 1, 20 ) );
     Console.WriteLine( &quot;Radio = &quot; + valoresConstantes.radio +
        &quot;\nCircunferencia = &quot; +
        2 * Constantes.PI * valoresConstantes.radio);
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><strong>Resultado&#8230;<strong></strong></strong></p>
<div class="consola"><strong><strong>Radio = 10<br />
Circunferencia = 62.8318 </strong></strong></div>
<p><strong><strong><a class="tooltip descargacodigo" title="Constantes en C#::Contiene archivo fuente .cs" href="http://casidiablo.net/descargar/Constantes+C+Sharp">Descargar código fuente</a></strong></strong></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag nofollow">.net</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/constantes/" rel="tag nofollow">constantes</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/constantes-en-c/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Variables estáticas y destructores en C#</title>
		<link>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/</link>
		<comments>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 11:52:32 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[destructor]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[estatico]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2283</guid>
		<description><![CDATA[

Las variables estáticas son atributos de una clase que están disponibles para todas las instancias de dicha clase, y a los cuales puedes acceder directamente (sin instanciar un objeto) de la forma Clase.Variable.
Los destructores son métodos que se ejecutan cuando se elimina un objeto; son especialmente útiles si deseamos hacer algo en particular, antes de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fatributos-estaticos-destructores-c-sharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Variables%20est%C3%A1ticas%20y%20destructores%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Las variables estáticas son atributos de una clase que están disponibles para todas las instancias de dicha clase, y a los cuales puedes acceder directamente (sin instanciar un objeto) de la forma Clase.Variable.</p>
<p style="text-align: justify;">Los destructores son métodos que se ejecutan cuando se elimina un objeto; son especialmente útiles si deseamos hacer algo en particular, antes de eliminar la referencia al objeto. A continuación un sencillo ejercicio, en donde se ejemplifica el uso de las variables estáticas y de los destructores en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C Sharp</a>:</p>
<p><span id="more-2283"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
namespace Estatico{
   public class Clase {
      //un atributo normal
      private string variable;
      //esta variable esta disponible para todas
      //las instancias de esta clase
      private static int contador;
      //constructor
      public Clase(string x) {
         variable = x;
         //aumentar valor de la variable estatica
         ++contador;
         Console.WriteLine(&quot;Constructor de &quot;+variable);
      }
      ~Clase(){
         --contador;
         Console.WriteLine(&quot;Se destruyo una de las instancias (&quot;+variable+&quot;)&quot;+contador);
      }
      public static int Contador{
         get{
            return contador;
         }
      }
   }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>Clase que utiliza los valores estáticos de la clase anterior:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
namespace Estatico{
   public class Principal{
      static void Main(string[] args){
         Console.WriteLine(&quot;Contador antes de crear objetos: &quot;+Clase.Contador);
         //crear 2 instancias de la clase
         Clase objeto1 = new Clase(&quot;primero&quot;);
         Clase objeto2 = new Clase(&quot;segundo&quot;);
         Console.WriteLine(&quot;Contador despues de crear objetos: &quot;+Clase.Contador);
         //eliminar referencias a los objetos
         objeto1 = null;
         objeto2 = null;
         //forzar al recolector de basura a ejecutarse
         System.GC.Collect();
         //esperar hasta que el recolector de basura termine su trabajo
         System.GC.WaitForPendingFinalizers();
         //despues de la recolecta de basura...
         Console.WriteLine(&quot;Despues de la recolecta de basura, contador: &quot;+Clase.Contador);
      }
   }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="tooltip descargacodigo" title="Estáticas y destructores en C#::Contiene archivo fuente .cs" href="http://casidiablo.net/descargar/Variables+estaticas+constructrores+C+Sharp">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag nofollow">.net</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/destructor/" rel="tag nofollow">destructor</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/estatico/" rel="tag nofollow">estatico</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/atributos-estaticos-destructores-c-sharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Uso de propiedades para acceder a los atributos de objetos en C#</title>
		<link>http://casidiablo.net/get-set-c-sharp/</link>
		<comments>http://casidiablo.net/get-set-c-sharp/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 14:56:07 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[getter]]></category>
		<category><![CDATA[setter]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2276</guid>
		<description><![CDATA[

Al momento de acceder a los atributos de una clase, podemos usar métodos para asignar y obtener dichos datos (normalmente llamados getters y setters). En C Sharp podemos usar una caracterí­stica llamada &#8216;propiedades&#8217;, por medio de la cual declaramos un alias de acceso público para los atributos de acceso privado.
Me explico. Cuando declaramos atributos en [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fget-set-c-sharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Uso%20de%20propiedades%20para%20acceder%20a%20los%20atributos%20de%20objetos%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Al momento de acceder a los atributos de una clase, podemos usar métodos para asignar y obtener dichos datos (normalmente llamados getters y setters). En C Sharp podemos usar una caracterí­stica llamada &#8216;propiedades&#8217;, por medio de la cual declaramos un alias de acceso público para los atributos de acceso privado.</p>
<p style="text-align: justify;">Me explico. <strong>Cuando declaramos atributos en una clase, lo más aconsejable es crearlos con el modificador de acceso <code>private</code></strong>. Por tal motivo no es posible acceder a dichos atributos directamente desde el objeto (de la manera: objeto.atributo), porque como vimos en esta entrada nos arrojará errores de compilación.</p>
<p style="text-align: justify;">Aquí­ es cuando las &#8216;propiedades&#8217; son especialmente útiles. <strong>Una propiedad es como un alias que nos permite acceder a los atributos de manera segura</strong>, y con la que nos ahorramos tiempo y espacio en nuestro código. Vamos directamente con un ejemplo, y posteriormente una breve explicación del mismo.</p>
<p style="text-align: justify;">Clase de ejemplo, que implementa una &#8216;propiedad&#8217; para acceder al atributo:</p>
<p><span id="more-2276"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">public class Clase {
	//atributo
	private int variable;
	//constructor
	public Clase(int variable) {
		this.variable = variable;
	}
	//declaracion de la propiedad
	public int atributo{
		//get sirve para devolver el valor del atributo
		get{
			return variable;
		}
		//set sirve para cambiar el valor del atributo
		set{
			variable = value;
		}
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">En la lí­nea 9 tenemos la declaración de la propiedad; en dicha declaración debemos especificar un nombre (diferente al del atributo al que vamos a acceder), y un tipo (en este caso int, entero). Dentro de la propiedad tenemos dos bloques: <code>get</code> y <code>set</code>. Dentro de get debemos poner los valores a retornar cuando se acceda a la propiedad; mientras que en set podemos usar la palabra clave <code>value</code> para asignar un valor al atributo.</p>
<p style="text-align: justify;">En la siguiente clase se utiliza la propiedad de la clase anterior, para obtener y modificar los valores del atributo:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
public class Propiedades {
	public Propiedades() {
		//declaracion del objeto
		Clase objeto = new Clase(5);
		//obteniendo el valor de la variable 'variable'
		//usando la propiedad 'atributo' (se usa el bloque get)
		Console.WriteLine(&quot;El atributo del objeto es &quot;+ objeto.atributo);
		Console.WriteLine(&quot;Cambiando el valor usando la propiedad 'atributo'...&quot;);
		//cambiando el valor de la variable 'variable'
		//usando la propiedad 'atributo' (se usa get)
		objeto.atributo = 10;
		Console.WriteLine(&quot;Ahora el atributo del objeto es &quot;+ objeto.atributo);
	}
	static void Main(string[] args){
		new Propiedades();
	}
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="text-align: justify;">Como puedes observar, es posible obtener y modificar los datos de un atributo privado usando una &#8216;propiedad&#8217; pública, y todo de una manera totalmente segura, puesto que dentro de la &#8216;propiedad&#8217; podemos verificar la consistencia de los datos.</p>
<p><strong>El resultado&#8230;</strong></p>
<div class="consola">El atributo del objeto es 5<br />
Cambiando el valor usando la propiedad &#8216;atributo&#8217;&#8230;<br />
Ahora el atributo del objeto es 10</div>
<p><a class="tooltip descargacodigo" title="Uso de propiedades en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Propiedades+C+Sharp">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag nofollow">.net</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/getter/" rel="tag nofollow">getter</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a>, <a href="http://casidiablo.net/tag/setter/" rel="tag nofollow">setter</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/get-set-c-sharp/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ejemplo de constructores de clases en C#</title>
		<link>http://casidiablo.net/constructores-clases-c-sharp/</link>
		<comments>http://casidiablo.net/constructores-clases-c-sharp/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 23:45:42 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[orientada]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2271</guid>
		<description><![CDATA[

Tal como veí­amos en el ejemplo anterior, en donde explicabamos las nociones básicas de la programación orientada a objetos en C Sharp, los objetos pueden tener uno o más constructores. El siguiente ejemplo es una modificación del anterior ejercicio, en donde declaramos y usamos varios constructores.
El código&#8230;

La clase Tiempo2 que declara 5 constructores; el primero [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fconstructores-clases-c-sharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ejemplo%20de%20constructores%20de%20clases%20en%20C%23%22%20%7D);"></div>
<p style="text-align: justify;">Tal como veí­amos en el ejemplo anterior, en donde explicabamos las nociones básicas de la <a href="http://casidiablo.net/poo-c-sharp/">programación orientada a objetos en C Sharp</a>, los objetos pueden tener uno o más constructores. El siguiente ejemplo es una modificación del anterior ejercicio, en donde declaramos y usamos varios constructores.</p>
<h3>El código&#8230;</h3>
<p><span id="more-2271"></span></p>
<p style="text-align: justify;">La clase Tiempo2 que declara 5 constructores; el primero de ellos (lí­nea 9) no recibe argumentos e inicia las variables a cero; el segundo recibe solo parámetro e inica solo una de los atributos de la clase; mientras que el quinto constructor (lí­nea 32) recibe como parámetro un objeto del mismo tipo de la clase, y usando los atributos de dicho objeto inicia los atributos propios:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
public class Tiempo2
{
  private int hora;    // 0 -23
  private int minuto;  // 0-59
  private int segundo;  // 0-59
  // Constructor de la clase Tiempo que inicialize
  //las variables a cero para poner la hora en media noche
  public Tiempo2()
  {
     cambiarHora( 0, 0, 0 );
  }
  // Contructor que recibe unicamente la
  // hora, y lo demas lo inicia a 0
  public Tiempo2( int hora )
  {
     cambiarHora( hora, 0, 0 );
  }
  // Contructor que recibe la hora y el
  // minuto, y lo demas lo inicia a 0
  public Tiempo2( int hora, int minuto )
  {
     cambiarHora( hora, minuto, 0 );
  }
  // Contructor que recibe los tres atributos
  public Tiempo2( int hora, int minuto, int segundo )
  {
     cambiarHora( hora, minuto, segundo );
  }
  // Constructor que utiliza los datos de otro
  //metodo de tipo Tiempo2 para inciar los datos
  public Tiempo2( Tiempo2 hora )
  {
     cambiarHora( hora.hora, hora.minuto, hora.segundo );
  }
  // este metodo asigna una nueva hora en formato 24-horas.
  public void cambiarHora(
     int valorHora, int valorMinuto, int valorSegundo )
  {
     hora = ( valorHora &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorHora &lt; 24 ) ?
        valorHora : 0;
     minuto = ( valorMinuto &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorMinuto &lt; 60 ) ?
        valorMinuto : 0;
     segundo = ( valorSegundo &gt;= 0 &amp;amp;amp;&amp;amp;amp; valorSegundo &lt; 60 ) ?
        valorSegundo : 0;
  }
  // convertir a hora universal con el metodo format
  public string horaUniversal()
  {
     return String.Format(
        &quot;{0:D2}:{1:D2}:{2:D2}&quot;, hora, minuto, segundo );
  }
  // convertir a tiempo estandar (12 horas) usando el metodo format
  public string horaEstandar()
  {
     return String.Format( &quot;{0}:{1:D2}:{2:D2} {3}&quot;,
        ( ( hora == 12 || hora == 0 ) ? 12 : hora % 12 ),
        minuto, segundo, ( hora &lt; 12 ? &quot;AM&quot; : &quot;PM&quot; ) );
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>Clase en donde se utilizan los diferentes tipos de constructores:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
class PruebaTiempo2 {
  static void Main( string[] args ) {
     Tiempo2 hora1, hora2, hora3, hora4, hora5, hora6;
     hora1 = new Tiempo2();               // 00:00:00
     hora2 = new Tiempo2( 2 );            // 02:00:00
     hora3 = new Tiempo2( 21, 34 );       // 21:34:00
     hora4 = new Tiempo2( 12, 25, 42 );   // 12:25:42
     hora5 = new Tiempo2( 27, 74, 99 );   // 00:00:00
     hora6 = new Tiempo2( hora4 );        // 12:25:42
     String salida = &quot;Construido con: &quot; +
        &quot;\nhora1: todos los argumentos por defecto&quot; +
        &quot;\n\t&quot; + hora1.horaUniversal() +
        &quot;\n\t&quot; + hora1.horaEstandar();
     salida += &quot;\nhora2: hora especifica; minuto y segundo por defecto&quot; +
        &quot;\n\t&quot; + hora2.horaUniversal() +
        &quot;\n\t&quot; + hora2.horaEstandar();
     salida += &quot;\nhora3: hora y minuto especifico; segundo por defecto&quot; +
        &quot;\n\t&quot; + hora3.horaUniversal() +
        &quot;\n\t&quot; + hora3.horaEstandar();
     salida += &quot;\nhora4: los tres argumentos especificamente&quot; +
        &quot;\n\t&quot; + hora4.horaUniversal() +
        &quot;\n\t&quot; + hora4.horaEstandar();
     salida += &quot;\nhora5: los tres argumentos especificamente&quot; +
        &quot;\n\t&quot; + hora5.horaUniversal() +
        &quot;\n\t&quot; + hora5.horaEstandar();
     salida += &quot;\nhora6: otro objeto de tipo Tiempo2 (hora4)&quot; +
        &quot;\n\t&quot; + hora6.horaUniversal() +
        &quot;\n\t&quot; + hora6.horaEstandar();
     Console.WriteLine( salida );
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p>El resultado del programa es el siguiente:</p>
<div class="consola">Construido con:<br />
hora1: todos los argumentos por defecto<br />
	00:00:00<br />
	12:00:00 AM<br />
hora2: hora especifica; minuto y segundo por defecto<br />
	02:00:00<br />
	2:00:00 AM<br />
hora3: hora y minuto especifico; segundo por defecto<br />
	21:34:00<br />
	9:34:00 PM<br />
hora4: los tres argumentos especificamente<br />
	12:25:42<br />
	12:25:42 PM<br />
hora5: los tres argumentos especificamente<br />
	00:00:00<br />
	12:00:00 AM<br />
hora6: otro objeto de tipo Tiempo2 (hora4)<br />
	12:25:42<br />
	12:25:42 PM</div>
<p><a class="tooltip descargacodigo" title="Constructores en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Constructores+C+Sharp">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/objetos/" rel="tag nofollow">objetos</a>, <a href="http://casidiablo.net/tag/orientada/" rel="tag nofollow">orientada</a>, <a href="http://casidiablo.net/tag/poo/" rel="tag nofollow">poo</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/constructores-clases-c-sharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programación Orientada a Objetos en C Sharp</title>
		<link>http://casidiablo.net/poo-c-sharp/</link>
		<comments>http://casidiablo.net/poo-c-sharp/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 23:30:30 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[orientada]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2268</guid>
		<description><![CDATA[

La POO es un paradigma de programación que intenta abstraer los módulos de cada programa en objetos. Los objetos son instancias de clases, en las que se declaran/especifican al menos dos cosas: los atributos, los métodos y opcionalmente los constructores.
Los atributos son las variables que posee el objeto, mientras que los métodos son las funciones [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fpoo-c-sharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Programaci%C3%B3n%20Orientada%20a%20Objetos%20en%20C%20Sharp%22%20%7D);"></div>
<p style="TEXT-ALIGN: justify">La POO es un paradigma de programación que intenta abstraer los módulos de cada programa en objetos. Los objetos son instancias de clases, en las que se declaran/especifican al menos dos cosas: <strong>los atributos, los métodos</strong> y opcionalmente los constructores.</p>
<p style="TEXT-ALIGN: justify">Los atributos son las variables que posee el objeto, mientras que los métodos son las funciones o procedimientos que podemos invocar para realizar operaciones especí­ficas sobre los atributos.</p>
<p style="TEXT-ALIGN: justify">Como en Java, en C Sharp utilizamos siempre clases y objetos, aún cuando no tengamos claro el concepto. Por ejemplo, el simple <em>hola mundo</em>:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
class Hola{
   static void Main(string[] args){
      Console.WriteLine(&quot;Hola parce!&quot;);
   }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p style="TEXT-ALIGN: justify">En cada lí­nea de código estamos usando la programación orientada a objetos: lí­nea 1, creamos una clase (llamada <em>Hola</em>); lí­nea 2, declaramos un método (función) para nuestra clase; lí­nea 3, usando <strong>la clase</strong> <code>Console</code> invocamos <strong>el método</strong> <code>WriteLine</code>. Todo, programación orientada a objetos.</p>
<h3>Ejemplo de POO en C Sharp</h3>
<p style="TEXT-ALIGN: justify">En el siguiente ejemplo tomado del libro <em>Cómo programar en C Sharp de Deitel</em>, se utiliza una clase llamada <strong>tiempo</strong>. Dicha clase posee tres atributos (hora, minuto, segundo; todos variables enteras), y tres métodos. Vamos con el código, y mí¡s abajo una explicación:</p>
<p><span id="more-2268"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
public class Tiempo
{
  private int hora;    // 0 -23
  private int minuto;  // 0-59
  private int segundo;  // 0-59
  // Constructor de la clase Tiempo que inicialize
  //las variables a cero para poner la hora en media noche
  public Tiempo()
  {
     cambiarHora( 0, 0, 0 );
  }
  // este metodo asigna una nueva hora en formato 24-horas.
  public void cambiarHora(
     int valorHora, int valorMinuto, int valorSegundo )
  {
     hora = ( valorHora &gt;= 0 &amp;&amp; valorHora &lt; 24 ) ?
        valorHora : 0;
     minuto = ( valorMinuto &gt;= 0 &amp;&amp; valorMinuto &lt; 60 ) ?
        valorMinuto : 0;
     segundo = ( valorSegundo &gt;= 0 &amp;&amp; valorSegundo &lt; 60 ) ?
        valorSegundo : 0;
  }
  // convertir a hora universal con el metodo format
  public string horaUniversal()
  {
     return String.Format(
        &quot;{0:D2}:{1:D2}:{2:D2}&quot;, hora, minuto, segundo );
  }
  // convertir a tiempo estandar (12 horas) usando el metodo format
  public string horaEstandar()
  {
     return String.Format( &quot;{0}:{1:D2}:{2:D2} {3}&quot;,
        ( ( hora == 12 || hora == 0 ) ? 12 : hora % 12 ),
        minuto, segundo, ( hora &lt; 12 ? &quot;AM&quot; : &quot;PM&quot; ) );
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<ul>
<li style="text-align: justify;">En la segunda lí­nea vemos la instrucción <code>public class Tiempo</code>; esto no es mí¡s que la declaración de nuestra clase. Las clases por lo general son de tipo <code>public</code>, aunque si usamos clases internas anónimas es recomendable que sean <code>private</code>, aunque eso es otro tema&#8230; sigamos.</li>
<li style="text-align: justify;">En las lí­neas 4, 5 y 6 tenemos la declaración de los atributos de nuestra clase. Fí­jate como todos ellos son <code>private</code>; es un buen tip de programación que los atributos de nuestras clases sean privados, lo que significa que sólamente serí¡n accesibles desde los métodos de la clase.</li>
<li style="text-align: justify;">En la lí­nea 9 tenemos la declaración de un constructor. Los constructores son los métodos invocados en el momento de crear objetos; su función es la darle valores a los atributos del objeto. Podemos tener cuantos constructores necesitemos, por supuesto con diferente tipo de argumentos. Ademí¡s, es necesario tener en cuenta que <strong>los constructores son métodos que NO tienen ningún valor de retorno</strong>, y que <strong>deben llevar el mismo nombre de la clase</strong>.</li>
<li style="text-align: justify;">En las lí­neas 14, 25 y 31 estí¡n declarados los métodos o funciones, que permiten realizar operaciones sobre nuestro objeto. Por ejemplo, el método <code>cambiarHora</code> recibe tres argumentos, con los cuales modifica los atributos. Por lo general, los métodos de las clases son de tipo <code>public</code>, lo que permite invocarlos directamente a través de una instancia de la clase (es decir, un objeto).</li>
</ul>
<p style="text-align: justify;">Con el siguiente código, utilizamos la clase Tiempo:</p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
class PruebaTiempo {
  static void Main( string[] args ) {
     Tiempo tiempo = new Tiempo();  // llamada al constructor de Tiempo
     string salida;
     // mostrar datos iniciales
     salida = &quot;Hora universal inicial es: &quot; +
        tiempo.horaUniversal() +
        &quot;\nHora estandar inicial es: &quot; +
        tiempo.horaEstandar();
     // cambiar hora (valida)
     tiempo.cambiarHora( 13, 27, 6 );
     // aniadir nueva hora a la salida
     salida += &quot;\n\nHora universal despues de cambiada: &quot; +
        tiempo.horaUniversal() +
        &quot;\nHora estandar despues de cambiada: &quot; +
        tiempo.horaEstandar();
     // cambiar hora (invalida)
     tiempo.cambiarHora( 99, 99, 99 );
     salida += &quot;\n\nDespues de poner valores invalidos: &quot; +
        &quot;\nHora universal: &quot; + tiempo.horaUniversal() +
        &quot;\nHora estandar: &quot; + tiempo.horaEstandar();
     Console.WriteLine( salida );
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<ul>
<li style="text-align: justify;">En la lí­nea 3 creamos un objeto de tipo tiempo. Por lo general la sintaxis para crear objetos es la siguiente: <code>Clase objeto = new Clase()</code>. Es decir, el nombre de la clase, el nombre del objeto, y posteriormente se incia el objeto haciendo una invocación al constructor de la clase (anteponiendo la instrucción <code>new</code>).</li>
<li style="text-align: justify;">En la lí­nea 8, invocamos uno de los métodos de la clase (<code>horaUniversal</code>). La sintaxis para la invocación de los métodos es: <code>objeto.nombreMetodo(arg1, arg2, ...)</code>. Así­, en la lí­nea 12 podemos ver otro ejemplo de invocación, en la que pasamos algunos argumentos al método.</li>
</ul>
<p style="text-align: justify;">El resultado del programa es el siguiente:</p>
<div class="consola">Hora universal inicial es: 00:00:00<br />
Hora estandar inicial es: 12:00:00 AM</p>
<p>Hora universal despues de cambiada: 13:27:06<br />
Hora estandar despues de cambiada: 1:27:06 PM</p>
<p>Despues de poner valores invalidos:<br />
Hora universal: 00:00:00<br />
Hora estandar: 12:00:00 AM</p></div>
<p><a class="tooltip descargacodigo" title="Ejemplo POO en C Sharp::Contiene archivos fuentes .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Programacion+Orientada+a+Objetos+C+Sharp">Descargar código fuente</a></p>
<h3>Acceso a los atributos de un objeto</h3>
<p style="text-align: justify;">Si al momento de declarar los atributos de una clase utilizamos el modificador de acceso <code>public</code>, es posible acceder a dichos atributos directamente de la siguiente manera: <code>objeto.variable;</code> ó <code>objeto.variable = unValor;</code>. Esto por supuesto NO es recomendable, es decir, los atributos de una clase deberí­an ser SIEMPRE privados.</p>
<p style="text-align: justify;">De igual forma, si hemos declarado atributos con el modificador de acceso <code>private</code>, NO es posible acceder directamente a ellos. Así­ que para modificarlos, debemos crear métodos de acceso público, algo por supuesto mí¡s seguro. Si intentamos acceder directamente a atributos que se han declarado como privados, obtendremos errores de compilación.</p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/objetos/" rel="tag nofollow">objetos</a>, <a href="http://casidiablo.net/tag/orientada/" rel="tag nofollow">orientada</a>, <a href="http://casidiablo.net/tag/poo/" rel="tag nofollow">poo</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/poo-c-sharp/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Paso de valores por valor y referencia en C # [arreglos] &#8211; 2da parte</title>
		<link>http://casidiablo.net/paso-array-valor-referencia-c-sharp/</link>
		<comments>http://casidiablo.net/paso-array-valor-referencia-c-sharp/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 10:06:49 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2207</guid>
		<description><![CDATA[

En el post anterior decíamos que cuando pasamos un arreglo a un método, &#8217;se pasa la referencia al arreglo por valor&#8217;. En este post veremos entonces cual es la diferencia entre pasar la &#8220;referencia de un arreglo por valor&#8221; y &#8220;referencia de un arreglo por referencia&#8221;.
Ejemplo&#8230;



using System;
using System.Drawing;
using System.Windows.Forms;
public class EjemploArregloReferencia : Form
{
  private [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fpaso-array-valor-referencia-c-sharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Paso%20de%20valores%20por%20valor%20y%20referencia%20en%20C%20%23%20%5Barreglos%5D%20-%202da%20parte%22%20%7D);"></div>
<p style="text-align: justify;">En <a href="http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/">el post anterior decíamos</a> que cuando pasamos un arreglo a un método, &#8217;se pasa la referencia al arreglo por valor&#8217;. En este post veremos entonces cual es la diferencia entre pasar la &#8220;referencia de un arreglo por valor&#8221; y &#8220;referencia de un arreglo por referencia&#8221;.</p>
<h3>Ejemplo&#8230;</h3>
<p style="text-align: center;"><img src="http://casidiablo.net/wordpress/wp-content/uploads/2008/11/ejemploarregloreferencia.png" alt="c sharp" /></p>
<p><span id="more-2207"></span></p>
<p><!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
using System.Drawing;
using System.Windows.Forms;
public class EjemploArregloReferencia : Form
{
  private Label labelSalida;
  private Button botonMostrarSalida;
  public EjemploArregloReferencia()
  {
     InitializeComponent();
  }

  private void InitializeComponent()
  {
     this.labelSalida = new Label();
     this.botonMostrarSalida = new Button();
     this.SuspendLayout();
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(10, 40);
     this.labelSalida.Name = &quot;labelSalida&quot;;
     this.labelSalida.Size = new System.Drawing.Size(272, 280);
     this.labelSalida.TabIndex = 0;
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(101, 8);
     this.botonMostrarSalida.Name = &quot;botonMostrarSalida&quot;;
     this.botonMostrarSalida.Size = new System.Drawing.Size(91, 23);
     this.botonMostrarSalida.TabIndex = 1;
     this.botonMostrarSalida.Text = &quot;Mostrar salida&quot;;
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // EjemploArregloReferencia
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 325);
     this.Controls.AddRange(new Control[] {
                                                                  this.botonMostrarSalida,
                                                                  this.labelSalida});
     this.Name = &quot;EjemploArregloReferencia&quot;;
     this.Text = &quot;EjemploArregloReferencia&quot;;
     this.ResumeLayout(false);

  }
  static void Main()
  {
     Application.Run( new EjemploArregloReferencia() );
  }

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     // crear e iniciar primerArreglo
     int[] primerArreglo = { 1, 2, 3 };

     // copiar primerArreglo en otro arreglo
     int[] copiaPrimerArreglo = primerArreglo;

     labelSalida.Text =
        &quot;Ejemplo pasar la referencia de primerArreglo por valor&quot;;

     labelSalida.Text += &quot;\n\nContenido de primerArreglo &quot; +
        &quot;antes de llamar el metodo primerDoblar:\n\t&quot;;

     // imprimir el contenido del arreglo primerArreglo
     for ( int i = 0; i &lt; primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + &quot; &quot;;

     // pasar referencia de primerArreglo por valor a primerDoblar
     primerDoblar( primerArreglo );

     labelSalida.Text += &quot;\n\nContenido de primerArreglo despues &quot; +
        &quot;de llamar el metodo primerDoblar\n\t&quot;;

     // imprimir contenido de primerArreglo
     for ( int i = 0; i &lt; primerArreglo.Length; i++ )
        labelSalida.Text += primerArreglo[ i ] + &quot; &quot;;

     // probar si la copia cambio
     if ( primerArreglo == copiaPrimerArreglo )
        labelSalida.Text +=
           &quot;\n\nLa copia fue modificada tambien (porque tiene la referencia a dicho arreglo)\n&quot;;
     else
        labelSalida.Text +=
           &quot;\n\nLa copia no fue modificada\n&quot;;

     // crear e inciar segundoArreglo
     int[] segundoArreglo = { 1, 2, 3 };

     // crear una copia de segundoArreglo
     int[] copiaSegundoArreglo = segundoArreglo;

     labelSalida.Text += &quot;\nEjemplo, pasar referencia de segundoArreglo &quot; +
        &quot;por referencia&quot;;

     labelSalida.Text += &quot;\n\nContenido de segundoArreglo &quot; +
        &quot;antes de llamar el metodo segundoDoblar:\n\t&quot;;

     // imprime el contenido de segundoArreglo antes de llamar al metodo
     for ( int i = 0; i &lt; segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + &quot; &quot;;

     segundoDoblar( ref segundoArreglo );

     labelSalida.Text += &quot;\n\nContenido de segundoArreglo &quot; +
        &quot;despues de llamar el metodo segundoDoblar:\n\t&quot;;

     // imprimir el contenido de segundoArreglo despues de llamar al metodo
     for ( int i = 0; i &lt; segundoArreglo.Length; i++ )
        labelSalida.Text += segundoArreglo[ i ] + &quot; &quot;;

     // verificar si la copia ha cambiado
     if ( segundoArreglo == copiaSegundoArreglo )
        labelSalida.Text +=
           &quot;\n\nLa copia ha cambiado\n&quot;;
     else
        labelSalida.Text +=
           &quot;\n\nLa referencia y el arreglo original son distintos (porque el original cambio de referencia)\n&quot;;

  } // fin del metodo botonMostrarSalida_Click

  // modifica elementos del arreglo e intentar modificar la referencia
  void primerDoblar( int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i &lt; array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }

  // modifica elementos del arreglo e intentar modificar la referencia
  void segundoDoblar( ref int[] array )
  {
     // doblar cada elemento del arreglo
     for ( int i = 0; i &lt; array.Length; i++ )
        array[ i ] *= 2;

     // crear una nueva referencia y asignarla al arreglo
     array = new int[] { 11, 12, 13 };
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="tooltip descargacodigo" title="Paso de arreglos por valor y referencia C# (2)::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Ejemplo+Arreglo+Referencia">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag nofollow">.net</a>, <a href="http://casidiablo.net/tag/arreglos/" rel="tag nofollow">arreglos</a>, <a href="http://casidiablo.net/tag/c/" rel="tag nofollow">C++</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/paso-array-valor-referencia-c-sharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paso de valores por valor y referencia en C# [arreglos] &#8211; 1ra parte</title>
		<link>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/</link>
		<comments>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 09:55:43 +0000</pubDate>
		<dc:creator>Cristian</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C-Sharp]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[arreglos]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[ejercicio]]></category>

		<guid isPermaLink="false">http://casidiablo.net/?p=2198</guid>
		<description><![CDATA[

Cuando estamos trabajando con arreglos en C#, debemos tener en cuenta algo importante: si pasamos un arreglo entero, éste será pasado por referencia ; mientras que si pasamos uno de los elementos del arreglo, éste es pasado por valor.
Importante: Bueno, decir que el arreglo se pasa por referencia, en realidad es una manera fácil de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%3A%2F%2Fcasidiablo.net%2Fpaso-arreglos-por-valor-referencia-csharp%2F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Paso%20de%20valores%20por%20valor%20y%20referencia%20en%20C%23%20%5Barreglos%5D%20-%201ra%20parte%22%20%7D);"></div>
<p style="text-align: justify;">Cuando estamos trabajando con arreglos en <a href="http://casidiablo.net/category/programacion/net/c-sharp/">C#</a>, debemos tener en cuenta algo importante: si pasamos un arreglo entero, éste será pasado por referencia ; mientras que si pasamos uno de los elementos del arreglo, éste es pasado por valor.</p>
<div class="nota" style="text-align: justify;"><strong>Importante:</strong> Bueno, decir que el arreglo se pasa por referencia, en realidad es una manera fácil de decirlo. Lo que en verdad sucede es que &#8217;se pasa la referencia al arreglo por valor&#8217;. Esto resulta a veces un poco difícil de entender, pero con el siguiente ejemplo, y el del próximo post quedará mucho más claro.</div>
<p style="text-align: justify;">¿Qué quiere decir esto exactamente? Pues bien, cuando pasamos un arreglo completo a un método, TODAS las modificaciones que hagamos sobre el arreglo en dicho método se verán reflejadas en el arreglo original. Por otro lado, cuando lo que pasamos es un elemento de un arreglo, las modificaciones que hagamos sobre el elemento serán accesibles únicamente desde dicho método, por lo tanto el valor original del elemento no es modificado.</p>
<h3>Ejemplo&#8230;</h3>
<p style="text-align: center;"><img class="aligncenter" src="http://casidiablo.net/wordpress/wp-content/uploads/2008/11/pasararreglo.png" alt="" /></p>
<p><span id="more-2198"></span><br />
<!--INFOLINKS_OFF-->
<pre class="brush: csharp;">using System;
using System.Drawing;
using System.Windows.Forms;
public class PasarArreglo : Form
{
  private Button botonMostrarSalida;
  private Label labelSalida;
  public PasarArreglo()
  {
     InitializeComponent();
  }
  private void InitializeComponent()
  {
     this.botonMostrarSalida = new Button();
     this.labelSalida = new Label();
     this.SuspendLayout();
     //
     // botonMostrarSalida
     //
     this.botonMostrarSalida.Location = new System.Drawing.Point(106, 8);
     this.botonMostrarSalida.Name = &quot;botonMostrarSalida&quot;;
     this.botonMostrarSalida.Size = new System.Drawing.Size(80, 23);
     this.botonMostrarSalida.TabIndex = 0;
     this.botonMostrarSalida.Text = &quot;Mostrar salida&quot;;
     this.botonMostrarSalida.Click += new System.EventHandler(this.botonMostrarSalida_Click);
     //
     // labelSalida
     //
     this.labelSalida.Location = new System.Drawing.Point(8, 48);
     this.labelSalida.Name = &quot;labelSalida&quot;;
     this.labelSalida.Size = new System.Drawing.Size(280, 184);
     this.labelSalida.TabIndex = 1;
     //
     // PasarArreglo
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(292, 237);
     this.Controls.AddRange(new Control[] {
          this.labelSalida,
          this.botonMostrarSalida});
     this.Name = &quot;PasarArreglo&quot;;
     this.Text = &quot;Pasar Arreglo por valor y referencia&quot;;
     this.ResumeLayout(false);

  }
  static void Main()
  {
     Application.Run( new PasarArreglo() );
  }

  private void botonMostrarSalida_Click( object sender,
     System.EventArgs e )
  {
     int[] a = { 1, 2, 3, 4, 5 };

     labelSalida.Text = &quot;Resultado de pasar un arreglo &quot; +
        &quot;por referencia...\n\nLos valores del arreglo original son:\n\t&quot;;

     for ( int i = 0; i &lt; a.Length; i++ )
        labelSalida.Text += &quot;   &quot; + a[ i ];

     ModificarArreglo( a );   // el array es pasado por referencia

     labelSalida.Text +=
        &quot;\n\nEl valor de los datos modificados del arreglo son:\n\t&quot;;

     // mostrar elementos del array a
     for ( int i = 0; i &lt; a.Length; i++ )
        labelSalida.Text += &quot;   &quot; + a[ i ];

     labelSalida.Text += &quot;\n\nResultado de pasar un elemento del array por valor...&quot; +
        &quot;\n\nvalor de a[ 3 ] (antes de ser pasado a ModificarElemento()) &quot; + a[ 3 ];

     // elemento del array pasado por valor
     ModificarElemento( a[ 3 ] );

     labelSalida.Text +=
        &quot;\na[ 3 ] (despues de ser pasado a ModificarElemento()): &quot; + a[ 3 ];
  }

  // metodo que modifica el arreglo que recibe
  // (el original será modificado)
  public void ModificarArreglo( int[] b )
  {
     for ( int j = 0; j &lt; b.Length; j++ )
        b[ j ] *= 2;
  }

  // metodo que modifica el entero recibido
  // (el original no será modificado)
  public void ModificarElemento( int e )
  {
     labelSalida.Text +=
        &quot;\nvalor recibido por el metodo: &quot; + e;
     e *= 2;
     labelSalida.Text +=
        &quot;\nvalor modificado dentro del metodo: &quot; + e;
  }
}</pre>
<p><!--INFOLINKS_ON--></p>
<p><a class="tooltip descargacodigo" title="Paso de arreglos por valor y referencia C#::Contiene archivo fuente .cs, proyecto para Visual Studio y Proyecto para Monodevelop" href="http://casidiablo.net/descargar/Pasar+arreglo+C+Sharp">Descargar código fuente</a></p>


	<div class="etiquetas">Etiquetas: <a href="http://casidiablo.net/tag/net/" rel="tag nofollow">.net</a>, <a href="http://casidiablo.net/tag/arreglos/" rel="tag nofollow">arreglos</a>, <a href="http://casidiablo.net/tag/c/" rel="tag nofollow">C++</a>, <a href="http://casidiablo.net/tag/c-sharp/" rel="tag nofollow">C-Sharp</a>, <a href="http://casidiablo.net/tag/ejemplo/" rel="tag nofollow">ejemplo</a>, <a href="http://casidiablo.net/tag/ejercicio/" rel="tag nofollow">ejercicio</a>, <a href="http://casidiablo.net/tag/programacion/" rel="tag nofollow">programación</a><br /></div>
]]></content:encoded>
			<wfw:commentRss>http://casidiablo.net/paso-arreglos-por-valor-referencia-csharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
