# Primer programa
## Primer programa ¡Hola Mundo!

En un alarde de originalidad, empezaremos con un simple programa que desplegará la frase “¡Hola Mundo!”. Con este programa introduciremos las bases de nuestro estudio. Debido a que la plataforma .NET es independiente del sistema operativo en este libro procuraremos mantenernos imparciales en cuanto este asunto, eso sí, cuando llegue el tiempo de compilar y ejecutar daremos ejemplos de como hacerlo tanto en Windows como en Linux (en otras plataformas como MacOS será lo mismo que en Linux).
Si estáis utilizando un entorno de desarrollo integrado debéis abrir un nuevo proyecto de consola en C#, escribir o copiar lo que se muestra en el ejemplo 2.1 y compilad el proyecto para ver su resultado. Si preferís programar con un editor de textos, abrid vuestro editor de texto favorito y grabad en un directorio conocido lo que se encuentra en el ejemplo 2.1 como Programa.cs, abrid una ventana de terminal (en linux) o una ventana de comandos (Ejecutar(Run) -> cmd) en Windows y compilad vuestro proyecto con el siguiente comando:
en linux con MONO(en el directorio donde habéis grabado vuestro programa):
en linux con dotGNU(en el directorio donde habéis grabado vuestro programa):
en Windows (en el directorio donde habéis grabado vuestro programa):
de esta forma obtendréis vuestro primer programa. Para ejecutarlo simplemente escribid:
con MONO:
con dotGNU:
o en Windows:
Ejemplo 2.1 Programa Hola Mundo
Analicemos paso a paso nuestro programa de ejemplo:

## Comentarios

En la primera línea de nuestro programa encontramos lo siguiente: //Ejemplo 2.1 .... Esta línea es un ejemplo de comentarios. Un comentario es una parte en vuestro programa que será ignorado por el compilador.
Existen tres tipos de comentarios en C#. El primer tipo es comentario de un sola línea. El segundo es comentario de varias líneas. El tercer tipo es para crear documentación. Este último tipo de comentario lo estudiaremos en el capítulo 13 de este libro.
Los comentarios de una sola línea pueden ser incluidos en líneas independientes, en líneas que ya incluyen código para comentar sobre lo que hace esa línea o para comentar una línea de código que no necesitamos.
Los comentarios de varias líneas sirven para incluir muchas líneas de texto o código como un comentario. Tienen una marca de inicio que dice cuando empieza el comentario y una marca que indica el final de dicho comentario. La marca de inicio es /* y la marca para finalizar es */ Así por ejemplo tenemos:

## Clases, Objetos y tipos

La esencia de la programación orientada a objetos es la creación de nuevos tipos. Un tipo es la representación de un componente (Pensado en un ordenador (un computador) que está compuesto de varios componentes). En programación un componente es algo que cumple una función. Por ejemplo, un componente puede ser un botón en un programa. En una aplicación podemos tener varios botones del mismo tipo como por ejemplo botones de Aceptar, Cancelar, etc. Porque son del mismo tipo estos botones tienen propiedades y comportamientos similares. Pueden tener propiedades como cambiar de "tamaño", "posición", etc. Las propiedades son las mismas pero los valores almacenados en sus atributos pueden ser diferentes. Por ejemplo, un botón puede tener tamaño 10 y otro tamaño 6. Podemos decir entonces que tenemos varias instancias del mismo componente (o varios botones del mismo tipo) con diferentes valores en sus atributos.
La programación orientada a objetos es esto. Crear componentes que puedan ser reusados. Así no tenemos que programar varios componentes que cumplan funciones similares sino solo uno que podrá llevar diferentes atributos y que podrá ser reproducido (o instanciado) tantas veces como lo necesitemos.
Como en varios lenguajes de programación orientado a objetos, en C# los tipos o componentes son definidos por una clase (class en inglés). Las diferentes reproducciones o instancias de un componente del mismo tipo se conoce como objetos. Posteriormente en nuestro estudio veremos que en C# hay más tipos además de las clases. Aprenderemos sobre enums, structs y delegates. Pero por el momento nos dedicaremos a las clases.
Como hemos visto en nuestro primer programa (Ejemplo 2.1), empezamos nuestro programa declarando el tipo de componente que vamos a utilizar (un componente de tipo class) y su nombre HolaMundo. Para declarar nuestro componente como una clase, primero introducimos la palabra clave class, y después el nombre de nuestro componente, después de lo cual declaramos las funciones que va a cumplir su comportamiento y sus propiedades. Todas las funciones, comportamiento y propiedades de nuestro componente (en este caso nuestra clase) deberán estar encerrados entre llaves { }. Las llaves delimitan el inicio y el final de dicho componente.

## Métodos o Funciones

Los métodos o funciones son trozos de código que realizan una acción, esto es, toman unos argumentos y devuelven un valor. En C#, las funciones deben ser declaradas dentro de un objeto, normalmente dentro de una clase.
Las funciones normalmente llevan nombre que definen su función. Por ejemplo, la función WriteLine de la clase Console como debéis suponer "Escribe una Línea en la consola". De forma similar se pueden declarar clases a las que se le añaden un número ilimitado de métodos. En nuestro ejemplo 2.1 la única función que hemos definido lleva el nombre de Main la cual es una función especial que indica la entrada principal de ejecución de un programa. Cada programa en C# debe tener una función Main.

### Crear nuevos métodos o funciones

Para declarar un método o función utilizamos el siguiente formato:
de acuerdo con nuestro ejemplo 2.1, la función Main cumple con el formato establecido:
* entorno: static
* tipo_a_retornar: void
* Nombre_de_la_Función: Main
* Argumentos: ninguno
En nuestro ejemplo la función Main tiene como entorno la palabra clave static y como tipo_a_retornar la palabra clave void. Cuando la función no retorna ningún tipo, utilizamos la palabra void. Más adelante veremos más tipos además de void. La palabra static también la veremos más adelante en nuestro estudio, por el momento debéis confiar en el ejemplo y utilizarla aún sin saber lo que hace.
Podemos añadir a nuestro componente o clase un ilimitado número de funciones. Por ejemplo, para añadir más funciones a nuestro primer ejemplo procederemos a crear una función que suma dos valores. Como ya habéis aprendido en esta sección, crearemos nuestra función de la forma establecida. Después del final de la función Main crearemos una función con entorno static que retorne el tipo int, que se llame Suma y que acepte dos argumentos de tipo int. Para hacerla funcionar vamos a llamarla desde nuestra función principal:
Ejemplo 2.2 - Añadiendo funciones a nuestro programa
probad vuestro programa, compiladlo y ejecutadlo. El resultado será el siguiente:
Ésta es una pequeña introducción a funciones, más adelante estudiaremos más detalladamente como crear y utilizar funciones.

## Aplicaciones de consola

Las aplicaciones de consola no poseen una interfaz gráfica, no tienen botones o ventanas, poseen una interfaz basada simplemente en texto. El ejemplo que hemos realizado hasta ahora es una aplicación de consola que despliega texto en la pantalla, para ello hemos utilizado la función WriteLine.
Como habíamos visto en la introducción, la plataforma .NET posee más de 4000 componentes cada cual con diferentes funciones internas. En el caso de nuestro programa hemos usado la función WriteLine que se encuentra dentro del componente Console. Para poder hacer uso de funciones estáticas que se encuentran en otros componentes, en C# como en la mayoría de lenguajes de programación orientados a objetos, debemos especificar el nombre del componente en primer lugar seguido por un punto y a continuación en el nombre de la función. Es por esto que utilizamos la frase Console.WriteLine. Dentro del componente Console la plataforma .NET tiene disponibles muchísimas otras funciones que nos ayudan a diseñar programas de consola. El lenguaje C# esta orientado con el paradigma de objetos y hereda muchos elementos de C++.

## Namespaces

Quizá algunos de vosotros os habréis preguntado ¿qué significa la palabra System que está al inicio de cada programa?. Pues bien, System en este caso representa un Espacio de nombres (namespace en inglés).
Los espacios de nombres (namespaces) se crearon principalmente para dar más organización a los componentes. La plataforma .NET tiene incorporados muchísimos componentes y sería una tarea imposible tratar de memorizar todos los nombres de ellos para no repetirlos. Tarde o temprano querréis crear un componente y no sabréis si el nombre que queréis darle ya existe o no. Para evitarnos este problema y para poder distinguir a dónde pertenecen ciertos componentes se han creado los espacios de nombres.
Pongamos un ejemplo para comprender este concepto. Supongamos que deseamos crear varios componentes para una institución educativa que se compone de educación primaria y educación secundaria. ¿Cómo podríamos crear un componente que se llame Presidente si existen 2 presidentes que tienen funciones distintas uno para la sección primaria y otro para la sección secundaria? En este caso podríamos aplicar un espacio de nombres para poder crear los componentes Presidente que cumplen distintas funciones. Podríamos crear el espacio de nombres Primaria y dentro de éste el componente Presidente. De igual forma el espacio de nombres Secundaria y dentro de éste el componente Presidente cada uno componentes podrá tener definiciones distintas. Para acceder a las funciones de los componentes Presidente podríamos usar:
Cada una de las dos definiciones de Presidente son independientes, no tienen relación entre sí ya que pertenecen a dos espacios de nombre distintos.
De ésta forma podremos crear componentes y funciones con el nombre que deseemos siempre y cuando especifiquemos a qué espacio de nombres pertenecen.
De acuerdo con la línea de código estudiada: System.Console.WriteLine ("Hola {0}!", var); existe una función llamada WriteLine dentro del componente Console dentro del nombre de espacio System. Cualquier otro componente llamado Console dentro de otro espacio de nombres, es un componente diferente con funciones diferentes que quizás no posea la función WriteLine.
Algo importante que debemos notar es que los espacios de nombres pueden tener sub-espacios de nombres y estos a su vez sub-espacios de nombres. El objetivo de esto, como lo hemos dicho, es mantener una organización de los componentes. Los espacios de nombres, componentes y métodos se accederán de la misma forma como lo hemos visto a través de un punto.

## La palabra clave using

En ciertos proyectos tendremos que usar cierto espacio de nombres muchas veces. Supongamos que estamos implementando un programa de consola y tenemos que usar el componente Console repetidamente. Una forma de ahorrarnos escribir System varias veces es especificar el espacio de nombres que vamos a usar al inicio de nuestro programa con la palabra clave using. Por ejemplo en nuestro ejemplo 2.2 si añadimos la línea de código using System; al inicio de nuestro programa, podemos llamar al componente Console sin escribir System al inicio:
Ejemplo 2.2 Modificado - La palabra clave using
Comparando con nuestro ejemplo 2.2 original se ve en el ejemplo que ya no es necesario poner la palabra system.Console.WriteLine, quedando Console.WriteLine
Algo importante para tener en cuenta es que la palabra clave using no puede ser utilizada para ahorrarse el escribir el nombre de la clase. Por ejemplo la línea de código using System.Console es inválida y producirá errores de compilación.

## Caracteres sensibles

C# como todos los lenguajes de programación derivados de C hace diferencia entre caracteres en mayúscula y caracteres en minúscula. Esto quiere decir que las palabras Using y using son distintas y por lo tanto no cumplen la misma función. Debido a esto debemos tener mucho cuidado cuando escribimos nuestros programas.
system.console.writeLine es diferente a system.Console.WriteLine y es diferente a System.Console.WriteLine que es el nombre de espacio, componente y método que C# incorpora para desplegar texto en la consola.
Finalizada esta pequeña introducción a nuestro primer programa en C#, pasamos al capítulo 3 en donde examinaremos mas profundamente los fundamentos de C#.