C# - Cinco erros que você deve evitar
Hoje veremos cinco erros que você deve e pode evitar ao programar na linguagem C#. |
Errar é humano , e, os programadores sempre cometerão erros..
Geralmente uma grande parte dos desenvolvedores C#, aprendem e se aprimoram por tentativa e erro.
Embora essa "estratégia" de tentativa e
erro funcione, se um desenvolvedor não detectar os erros, eles podem causar
muitos problemas no software desenvolvido.
Neste artigo, veremos 5 erros mais comuns que muitos programadores C# cometem e
como evitá-los.
1- Concatenação de strings sem usar StringBuilder
A maneira mais comum de concatenar
strings é muito simples de entender. Mas você deve se lembrar que strings
são imutáveis.
Assim, cada vez que algo é adicionado a uma string, um novo endereço é
alocado na memória automaticamente. A string anterior é copiada para a nova
parte com a localização alterada, e isso não é de forma alguma eficiente.
Veja o exemplo abaixo:
List<string> nomes = new List<string>() { "Maria", "Manoel", "Pedro" };
string lista = string.Empty;
foreach (var nome in nomes)
{
lista += nome; // Cria uma cópia da string
}
|
A maneira de resolver isso é simples,
você deve usar o objeto StringBuilder em vez
da concatenação de string que manterá a mesma posição na memória sem realizar
nenhuma cópia.
Isso torna o processo de concatenação de strings muito mais simples e
eficiente, para que possamos anexar perfeitamente todas as operações que
desejamos.
using System.Text;
List<string> nomes = new List<string>() { "Maria", "Manoel", "Pedro" };
StringBuilder lista = new StringBuilder();
foreach (var nome in nomes)
{
lista.Append(nome);
}
|
2- Iterando com valores usando um laço foreach
Este erro ocorre quando você tenta iterar listas de registros com um laço foreach. E isso não é nada ideal.
foreach (Cliente cliente in listaClientes)
{
if (cliente.Estado == "SP") {
taxa += cliente.Valor;
}
|
A forma mais eficiente é usar LINQ que permite consultar os objetos facilmente:
taxa = ListaClientes.Where(cliente => cliente.Estado.Equals("SP")).Sum(c=>c.Valor);
|
3- Não usar o return yield
Isso é para quando você precisa criar uma enumeração de objeto para algum outro chamador. O uso desta função melhorará muito o desempenho.
Em geral, usamos a palavra reservada yield em métodos que retornam o tipo IEnumerable ou IEnumerable<T>.
O tipo de retorno do método iterador é IEnumerable que é um tipo de interface de iterador. Quando o método iterador é chamado, ele retorna um objeto enumerável que contém o resultado.
Podemos então usar o yield para gerar um Enumerable de qualquer coisa como por exemplo gerar um coleção de números inteiros:
class Program
{
static void Main(string[] args)
{
var numeros = Numeros(0, 10);
foreach(int num in numeros)
{
Console.WriteLine(num);
}
Console.ReadKey();
}
public static IEnumerable<int> Numeros(int inicio, int fim)
{
for (int i = inicio; i <= fim; i++)
yield return i;
}
}
|
4- Não conhecer a importância do USING para o descarte de objetos
Muitos desenvolvedores C# não estão
familiarizados com o conceito de que a palavra-chave using
não é apenas usada como uma diretiva para adicionar
namespaces, mas também é muito benéfica para a remoção de objetos.
Se você tiver certeza de que um objeto deve ser excluído ao executar certas
ações, simplesmente use a instrução using para
certificar-se de que o objeto foi excluído corretamente.
Exemplo de código usando using para descartar os objetos usados:
private static void UsandoUsing() { string texto = ""; string sConnString = "Data Source=Macoratti;Initial Catalog=Northwind;Integrated Security=True"; string sSql = "SELECT CategoryID, CategoryName FROM Categories ORDER BY CategoryName"; try { using (SqlConnection cn = new SqlConnection(sConnString)) { using (SqlCommand cmd = new SqlCommand(sSql, cn)) { cn.Open(); using (SqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { texto += rdr["CategoryName"].ToString() + Environment.NewLine; } Console.WriteLine(texto); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } |
Qualquer coisa declarada na instrução using somente pode ser acessada apenas dentro do seu bloco. Se você quiser fazer referência a variáveis ou objetos fora da instrução using (ou bloco try), tem que declará-los antes de iniciar a instrução.
Então usamos a instrução
using pois ela chama o método 'dispose'
internamente, sempre que qualquer exceção ocorrer.
Assim todo o tipo que implementa IDisposable em um
bloco using terá os recursos liberados da
memória sem precisar esperar o coletor de lixo.
7.
Usar algoritmos criptográficos fracos
Este é um erro que é simplesmente baseado no fato de que muitos desenvolvedores
usam algoritmos de criptografia obsoletos ou vulneráveis (o que é muito fácil
de evitar).
Neste caso temos um exemplo onde estamos usando SHA1 ou
RIPEMD160, que não oferecem um nível de segurança atual e muito bom.
using System.Security.Cryptography;
...
var cifragem = SHA1.Create();
|
A solução para isso é usar algoritmos de criptografia mais fortes, por exemplo:
Usar SHA256 em vez de SHA1, usar
SHA512 em vez de RIPEMD160 e usar
AES em vez de TripleDES.
Acompanhe o meu mini-curso de Criptografia neste link : Mini-Curso Criptografia
E estamos conversados...
"A minha porção é
o Senhor, diz a minha alma; portanto esperarei nele."
Lamentações 3:24
Referências: