foreach – C#

Nesta nova versão da linguagem C#, temos novas formas de percorrermos Arrays. Nas versões anteriores (1.x), faríamos algo do tipo:

     string[] categorias = new string[] {“ASP.NET”, “VB.NET”, “C#”}
     foreach(string s in categorias)
          Console.WriteLine(s);

Agora temos duas opções para isso: utilizarmos o método ForEach da classe Array com um método auxiliar para processar o que queremos fazer com cada elemento do Array ou mesmo utilizando métodos anonimos:

     [ Usando um método auxiliar ]
     string[] categorias = new string[] {“ASP.NET”, “VB.NET”, “C#”}
     Array.ForEach(categorias, Escrever);
     //…
     private void Escrever(string s){
          Console.WriteLine(s);
     }

     [ Usando um método anonimo ]
     string[] categorias = new string[] {“ASP.NET”, “VB.NET”, “C#”}
     Array.ForEach(categorias, delegate(string s)
     {
          Console.WriteLine(s);
     });

Eu custei a entender esses métodos anonimos, e particularmente agora, um pouco mais acostumado com eles acho mais prático que a criação de um método auxiliar.

Retornando DataReaders através de Funções

Há casos onde é retornado ao Cliente pela camada de acesso à dados objetos do tipo DataReader. Seja ele qual for (OleDb, Sql, Odbc ou Oracle) é um tanto perigoso. Como já sabemos, para que o DataReader resgate os valores da Fonte de Dados, é necessário ter uma conexão ativa com o mesmo, caso contrário, não conseguirá.

Neste cenário, o que realmente é comum são funções que retornam DataReaders, utilizando a opção CloseConnection do Enumerador CommandBehavior, que faz sentido, deixando a cargo do DataReader fechar a conexão com a Fonte de Dados assim que finalizar seu trabalho. Com isso, temos dois problemas:

• Ao retornar XXXDataReader para a camada de negócios, ou mesmo para a camada de apresentação, gera-se uma dependência do Provider, ou seja, se futuramente pretender migrar de Base Dados/Provider terá que rescrever tudo;
 
• Quando não se utiliza alguma DAL (Data Access Layer) para executar comandos e gerir as conexões com a Fonte de Dados, fica a cargo* do Cliente fechar o DataReader, pois sabemos que temos uma conexão o servindo qual será/deverá ser fechada quando o DataReader for fechado e, em muitos casos por algum descuido, pode não ser fechado o DataReader, e consequentemente “estourando” o pool de conexões com a Fonte de Dados, impedindo assim que se abram novas conexões.

* DALs também permitem que se retarde o fechamento da conexão com a Base de Dados, o qual deve se feita explicitamente.

Panel.DefaultButton

Agora dentro do controle Panel, temos uma propriedade chamada DefaultButton, que recebe uma string com o nome do controle (Button) que será “clicado” quando a tecla ENTER for pressionada pelo usuário dentro do Panel respectivo. O exemplo é algo como:

     <asp:Panel ID=”Panel1″ … DefaultButton=”Button1″></asp:Panel>
     <asp:Panel ID=”Panel2″ … DefaultButton=”Button2″></asp:Panel>

Eis uma boa “feature”, já que nas versões anteriores, tínhamos que utilizar Javascript.

C# 3.0 – Language Innovations

Agora que estou me habituando no C# 2.0, já vem o 3.0: http://msdn.microsoft.com/events/pdc/agenda/default.aspx

From Visual Basic to Visual C# to Visual C++, from compiler internals to architecture diagrams, from build to test, join the product team in this set of sessions to learn how Visual Studio, the .NET Framework, and WinFX are evolving to meet your software development lifecycle needs. Microsoft architects, program managers, and developers will drill into programming language enhancements, software development lifecycle management with Visual Studio Team System, Visual Studio productivity features, Office and application programmability, and the new unified build system. Whether you’re writing Win32 code, MFC code, or managed code, this track has something new for you.
  • C# 3.0 Language Innovations
  • C++ Interop: Under the Hood
  • Visual Basic Language Innovations
  • Visual Basic: Under the Hood
  • Visual Studio Team System: Bringing Development and Test Together for Building and Testing Distributed Applications
  • Monad: Bringing Scripting and Extensibility to Your Build Environment
  • Enabling Rich Design-time Support for Your Custom Avalon Controls in Visual Studio