Mono es una implementación open source de .NET Framework. Incluye componentes que están asociados con las plataformas Linux y Mac OS X aparte de Windows. Esto hace que se puedan ejecutar y desarrollar aplicaciones bajo .NET/Mono en cualquier plataforma.
Programa simple
using System;
namespace EjemploSimple
{
class HolaMono
{
[STAThread]
public static void Main()
{
Console.WriteLine("Hola Mono-Project");
}
}
}
$ gmcs HelloMono.cs $ mono HelloMono.exe Hola Mono-Project
Analizando nuestro programa tenemos en la primer línea using System;, con esto especificamos que utilizaremos las clases que se encuentren en la librería System, en este caso utilizaremos la clase Console.
En la siguiente línea tenemos la palabra namespace con la que declaramos el nombre de espacio con la que será asociada nuestra clase “HolaMono”. Un namespace es una librería que puede contener varias clases .Los namespace son lo equivalente a package en Java.
using System;
namespace EjemploSimple
{
}
La tercer línea a analizar se encuentra nuestra clase declarada HolaMono. Las clases deben ir dentro de nuestro nombre de espacio.
class HolaMono
{
}
Posteriormente se encuentra el método Main() seguido del atributo STAThread.
El atributo STAThread es algo complejo. Esto permite que un objeto acceda a un apartado Multithreading y se comunique sincronicamente.
El método Main() debe ser publico, estático y no debe regresar algún valor.
[STAThread]
public static void Main()
{
}
Y por último, dentro del método Main() tenemos la función que muestra el mensaje en pantalla.
Console es una clase que se encuentra en la librería System y contiene el método WriteLine que imprime una cadena y un salto de línea por lo que no sera necesario colocar \n.
Console.WriteLine("Hola Mono-Project");
C# al igual que Java es case sensitive, esto quiere decir que las variables int valorNumerico; e int ValorNumerico son distintas.
Pasando argumentos a Main()
Ahora veamos un ejemplo con argumentos:
using System;
namespace EjemploSimple
{
class HolaMonoArgs
{
[STAThread]
public static void Main(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
string frase = args[i];
Console.WriteLine(frase);
}
}
}
}
$ gmcs HelloMonoArgs.cs $ mono HelloMonoArgs.exe "No todo es como Java" No todo es como Java
Cuando el programa es ejecutado por la linea de comandos el interprete analiza si contiene argumentos. Estos argumentos son un arreglo del tipo string.
Normalmente los argumentos se pasan separados por un espacio y como podemos ver en el ejemplo anterior pasamos un solo argumento pero fue necesario agregar comillas a la frase para que se tome como un solo argumento.
Métodos múltiples Main()
Es posible tener varios métodos main() dentro de un mismo archivo cs.
using System;
namespace EjemploSimple
{
class HolaMono
{
[STAThread]
public static void Main()
{
Console.WriteLine("Hola Mono-Project");
}
}
class HolaMonoArgs
{
[STAThread]
public static void Main(string[] args)
{
for (int i = 0; i < args.Length; i++)
{
string frase = args[i];
Console.WriteLine(frase);
}
}
}
}
Este ejemplo contiene dos clases con el método Main(). Si tratamos de compilarlo es su forma habitual nos mostrará los siguientes errores:
$ gmcs MultipleMain.cs
MultipleMain.cs(8,36): error CS0017: Program `MultipleMain.exe' has more than one entry point defined: `EjemploSimple.HolaMono.Main()'
MultipleMain.cs(17,36): error CS0017: Program `MultipleMain.exe' has more than one entry point defined: `EjemploSimple.HolaMonoArgs.Main(string[])'
Compilation failed: 2 error(s), 0 warnings
Es por esto que debemos especificar al compilador cual método vamos a utilizar. Para esto debemos usar la opción del compilador -main: y especificar en nombre de espacio y la clase que contiene en método Main().
$ gmcs -main:EjemploSimple.HolaMono MultipleMain.cs $ mono MultipleMain.exe Hola Mono-Project $ gmcs -main:EjemploSimple.HolaMonoArgs MultipleMain.cs $ mono MultipleMain.exe "No todo es como Java" No todo es como Java