Fundamentos da Linguagem C#

Para ilustrar os fundamentos da linguagem c#, iremos olhar programaticamente o .NET base class libraries e construir aplicações exemplos, fazendo uso de vários tipos dentro do System namespace.

Anatomia de um simples programa em C#

No C#, não é possível criar funções globais e ponteiros de dados globais. Um simples programa em C# pode ser escrito como abaixo:

// Por convenção, arquivos em c# são finalizados com a extensão *.cs.

using System;

class HelloClass

{

public static int Main(string[] args)

{

Console.WriteLine("Alô Mundo!");

Console.ReadLine();

return 0;

}

}

Aqui, uma definição é criada para um tipo de classe (HelloClass) que suporta um simples método chamado Main(). Todo executável em c# precisa conter uma classe definindo um método Main(). Isso significa o ponto de entrada da aplicação. Como você pode ver, a assinatura de Main() é adornada com public e static keywords. O método Main() possui um simples parametro array de strings (string[] args). Esse parametro pode conter várias entradas através do command-line.

A lógica do programa AloClass é o método Main(). Aqui você faz uso da classe Console, que é definida com o namespace System. O membro WriteLine da classe Console, exibe os dados na saida padrão. O membro ReadLine exibe o comando prompt até teclar enter.

Porque o método Main() foi definido para retornar um inteiro (integer data type), nós retornamos zero antes de sair.

Variações do Método Main()

No exemplo anterior do Main(), foi definido ter um simples parametro (array de strings) e retornar o tipo inteiro (integer). Isso não é a única possibilidade. É permitido construir o ponto de entrada de sua aplicação usando qualquer das assinaturas a seguir (assumindo que ela contém classes e estruturas):

// Não retorna tipo, array de strings como argumentos

public static void Main(string[] args)

{

}

// Não retorna tipo, não possui argumentos

public static void Main()

{

}

// Retorna tipo, não possui argumentos

public static int Main()

{

}

Obviamente, sua opção de como construir o método Main(), será baseada em duas questões. Primeira, se haverá necessidade de processar comandos vindos de usuários através do command-line e segundo, se precisará retornar um valor para o System quando o Main() terminar.

Processando Command-Line Arguments

Assuma que você agora terá que alterar o HelloClass para processar possíveis parametros command-line.

// Verifica se foi enviado algum command-line arguments

using System;

class HeloClass

{

public static int Main(string[] args)

{

Console.WriteLine("***** Command line args *****");

for(int i = 0; i < args.Length; i++)

{

Console.WriteLine("Argumento: {0} ", args[i]);

}

....

}

}

Como uma alternativa, você pode interagir com a keyword em C# foreach.

// Não necessita verificar o tamanho do array de strings quando usa o foreach

public static int Main(string[] args)

{

.....

foreach(string s in args)

{

Console.WriteLine("Argumento: {0} ", s);

}

.....

}

Finalmente, você pode acessar command-line arguments usando o método static GetCommandLineArgs() do tipo System.Environment. O valor de retorno desse método é um array de strings. O primeiro índice é o diretório da aplicação, enquanto o restante são elementos contidos no command-line arguments.

public static int Main(string[] args)

{

.....

// extrai argumentos usando System.Environment

string[] strArgs = Environment.GetCommandLineArgs();

Console.WriteLine("Diretório da Aplicação: {0}, strArgs[0]);

.....

}

A classe System.Environment, permite você obter detalhes sobre o ambiente do sistema operacional usando vários membros estáticos. Para ilustrar o poderio dessa classe, vamos alterar o método Main() com o codigo abaixo:

public static int Main(string[] args)

{

.....

// Qual é o sistema operacional que esta rodando a aplicação?

Console.WriteLine("Sistema Operacional: {0} ", Environment.OSVersion);

// Em que diretório?

Console.WriteLine("Diretório: {0} ", Environment.CurrentDirectory);

// Lista de drives instalados

string[] drives = Environment.GetLogicalDrives();

for(int i = 0; i < drives.Length; i++)

{

Console.WriteLine("Drive {0} : {1} ", i, drives[i]);

}

// Qual é a versão do .NET que esta rodando

Console.WriteLine("Versão .NET: {0} ", Environment.Version);