A biblioteca fundamental do .NET, Base Class Library ou BCL, constitui o núcleo da plataforma. Não importa o perfil ou tecnologia escolhida para o front-end, classes da BCL serão usadas em suas aplicações. Aqui exploramos as principais novidades e melhorias no BCL do .NET 4.5.
System.IO
As classes Stream, TextReader e TextWriter têm novos métodos assíncronos para as operações mais custosas. Quanto ao uso de métodos assíncronos em geral, Immo Landwerth, autor do MSDN, sugere:
A orientação geral é agrupar ao máximo as operações assíncronas. Por exemplo, se é preciso ler mil valores Int32 de um stream usando BinaryReader, será melhor executar e aguardar uma tarefa que lê sincronamente todas as 1.000, do que individualmente executar e aguardar a conclusão de mil tarefas, cada uma lendo um único Int32.
Com relação a BinaryReader, agora se pode fazer com que não seja fechado automaticamente o stream subjacente. O mesmo recurso está disponível para BinaryWriter, StreamWriter e StreamReader.
Landwerth também menciona que a .NET BCL agora está usando a biblioteca de código aberto zlib para implementar o namespace System.IO.Compression, o que inclui a melhora do desempenho de DeflateStream, bem como a nova classe ZipArchive. Não é a primeira vez que a zlib foi licenciada pela Microsoft; também foi usada no suporte a arquivos zip no Windows e na WPF.
System.Collection
O InfoQ.com já tratou das coleções somente leitura no .NET 4.5; nada de significativo mudou desde então. Uma característica ainda ausente é IReadOnlySet, para combinar HashSet e ISet.
A classe abstrata Comparer<T> ganhou funcionalidades inspiradas na programação funcional. Em vez de implementar a classe explicitamente, pode-se chamar Comparer<T>.Create passando uma função de comparação e deixar que a biblioteca cuide do resto.
A pouco conhecida estrutura ArraySegment<T> recebeu melhorias importantes. Pela primeira vez implementa interfaces tais como IEnumerable e IList. Ainda assim, só funciona com arrays simples, e a maioria dos desenvolvedores prefere usar as classes de coleçções mais abstratas, como List<T>.
Outras mudanças
O atributo AssemblyMetadataAttribute é agora a maneira padrão de atribuir pares chave-valor arbitrários para um assembly. E a classe Console agora permite identificar se as streams de entrada, de saída e de erros foram redirecionadas. Essa funcionalidade é útil usada para desabilitar recursos que dependem da definiçaõ da posição do cursor ou de mudanças na cor da tela. Também se pode alterar a codificação para Encoding.Unicode, se for preciso o suporte a caracteres adicionais.
A classe WeakReference<T> oferece uma alternativa tipada à WeakReference. A fim de eliminar um problema antigo de concorrência, a WeakReference não oferece mais os métodos IsAlive e TryGetTarget separadamente. Em vez disso, as funcionalidades foram combinadas no método TryGetTarget.
Finalmente, a classe Regex agora suporta uma propriedade Timeout, que é uma ferramenta essencial para evitar ataques de negação de serviço, em que usuários conseguem injetar expressões regulares arbitrárias.