 C#
- Apresentando classes internas
 C#
- Apresentando classes internas
|  | Da mesma forma que em Java em C# também podemos trabalhar com inner class ou classes internas. | 
Você deve estar se perguntando qual seria a utilidade disto. ????
Podemos pensar em alguns cenários onde talvez precisamos definir uma coleção de variáveis ; ou funções e eventos a serem definidos e chamados usando um nome único (o nome da classe).
As classes internas são úteis por sua relação íntima com a classe externa. Dessa forma, se você precisa de um objeto que será usado apenas pela classe que você está escrevendo e por mais nenhuma outra, você não precisa escrever uma nova classe dentro do projeto, basta tornar este código uma classe interna.
Isso faz com que a classe interna tenha acesso a todas as variáveis e métodos (inclusive os privados) da classe que a contém, ou seja, a classe externa.
Abra o Visual C# Express Edition e crie um novo projeto do tipo Console Application com o nome InnerClass;
A seguir um exemplo de utilização de classe interna onde temos:
-  uma classe abstrata Admin que define 
dois métodos : getDetalhes() e mostraDetalhes();
-  uma classe Aluno que trata a informação básica : codigo e nome
-  as classe definidas dentro da classe Aluno : 
             - a 
estrutura interna Exame que armazena detalhes de exames;
             - a 
classe interna Faculdade  que estende a classe abstrata admin;
| //classe abstrata admin
    
    abstract class Admin {abstract public void getDetalhes(string x,string y); abstract public void mostraDetalhes(); } //classe Aluno ( a classe externa)class Aluno {public string codigo; public string nome; //construtor da classe Alunos public Aluno()    {codigo = " "; nome = " "; } public void getDados(string str1, string str2)     {codigo = str1; nome = str2; } public void Exibir()     {      Console.WriteLine("Aluno Codigo {0} ", codigo);      Console.WriteLine("Aluno Nome {0} ", nome);} //Declara a estrutura interna para armazenar detalhes dos exames public struct Exame     {public string codigoExame; public string nomeExame; public void setDetalhes(string str1, string str2)       {codigoExame = str1; nomeExame = str2; } public string[] getDetalhes()       {string[] temp; temp = new string[2]; temp[0] = codigoExame; temp[1] = nomeExame; return temp; } }//estrutura interna exame //Declara uma classe interna faculdade que estende a classe Admin public class Faculdade : Admin      {public string fcodigo; public string fnome; public faculdade()       {fcodigo = " "; fnome = " "; }     
     //implementa o m‚todo getDetalhespublic override void getDetalhes(string str1, string str2)       {fcodigo = str1; fnome = str2; } //implementa o m‚todo mostraDetalhes public override void mostraDetalhes()       {        Console.WriteLine("\nFaculdade Codigo {0} ", fcodigo);        Console.WriteLine("Faculdade Nome {0} ", fnome);} } //classe interna faculdade }//classe Aluno | 
- A classe abstrata Admin é externa 
a classe Alunos();
- A classe Aluno expõe somente o seu construtor e os método getDados 
e Exibir ( ambos são do tipo Public);
- Todas as outras definições estão encapsuladas na classe;
- Na classe Aluno eu estou usando a classe interna 
Faculdade() e a estrutura Exame() visíveis somente dentro 
da classe Alunos();
Para testamos o código acima e verificar se as classes internas realmente funcionam vamos incluir o código abaixo no método Main():
| static void Main(string[] 
    args) { //Instancia um objeto do tipo AlunoAluno aluno = new Aluno(); 
 //Instancia um objeto do tipo classe interna FaculdadeAluno.Faculdade faculdade = new Aluno.Faculdade(); 
 //Atribuindo valores no campo publico do objeto to tipo Aluno aluno.getDados("S0089", "Macoratti"); 
 //Exibino os conteudo do objeto Aluno aluno.Exibir(); 
 //Invocando a fun‡Æo getDetalhes9) da calsse interna Faculdade//para por valores nos campos publicos faculdade.getDetalhes("V0078", "Faculdades do Norte"); 
 //Exibe os componentes da classe interna faculdade.mostraDetalhes(); 
 //cria uma instƒncia da estrutura interna exameAluno.Exame exame = new Aluno.Exame(); 
 // atribuindo valores na estrutura da classe interna exame exame.setDetalhes("RT9870", "Matematica"); 
 //exibindo o conteudo da estrutura interna exameforeach (string x in exame.getDetalhes()) { Console.Write("{0} ", x); } 
 //Sobrescrevendo aluno.faculdade com a classe abstrata AdminConsole.WriteLine("\nSaida apos ligação tardia"); 
 Admin adm = new Aluno.Faculdade(); adm.getDetalhes("P009", "Janice Lima"); adm.mostraDetalhes(); 
 Console.Read(); } 
 | 
Executando o projeto teremos:

A primeira vista pode parecer um tanto confuso mas 
é um recurso que um dia você pode precisar usar por isso é bom conhecer.

Até o próximo artigo .NET.

Pegue o projeto aqui:
 InnerClass.zip
InnerClass.zip
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
C# - Tratando com Números Complexos - Macoratti
C# - Gerando números aleatórios - Macoratti
C# - Resolvendo 10 problemas de matemática em uma ... - Macora
C# - Números de Armstrong - Macoratti.net
C# - Convertendo Números para valores Reais em extenso
José Carlos Macoratti