Você está na página 1de 8

10 Dicas para aumentar a produtividade C#

1- O operador de avaliao condicional - ?:


O operador condicional (:?) avalia uma expresso booleana e retorna um dentre dois valores. O formato do operador (:?) o seguinte:

condio ? primeira_expresso : segunda_expresso


Se a condio for verdadeira, a primeira expresso avaliada e se torna o resultado, se falsa, a segunda expresso avaliada e se torna o resultado. Apenas uma das duas expresses sempre avaliada. Abaixo temos um exemplo mostra como podemos usar o operador para reduzir a quantidade de cdigo escrita: static void Main(string[] args) { int x = 10; int y = 20; int maximo; if (x > y) maximo = x; else maximo = y; Console.WriteLine(" Mximo = " + maximo); Console.ReadKey(); } A seguir um exemplo que verifica se uma varivel null : Ex: Valor == null ? ValorSeForNull : ValorSeNaoForNulll;

static void Main(string[] args) { int x = 10; int y = 20; int maximo; maximo = (x > y) ? x : y; Console.WriteLine(" Mximo = " + maximo); Console.ReadKey(); }

2- O operador ??
Sintaxe: varivel ?? valor padro
O operador ?? retorna o operando esquerda da expresso se o valor no for nulo; se o valor for nulo ele retorna o operando direita da expresso. object a = null; object d = new object(); object a = null; object e; object d = new object(); object e; if (a != null) e = a; object e = c ?? d; else e = d; Abaixo temos um exemplo mais prtico: string mensagem = null; Console.WriteLine(mensagem ?? "Macoratti.net"); Como mensagem possui um valor null ser exibida a mensagem "Macoratti.net" definida aps o operador ??.

Vamos agora combinar a utilizao dos dois operadores: string conceito = null ; int nota = 5; string resultado = ""; resultado = nota >= 5 ? conceito ?? " Aprovado " : " Reprovado "; Console.WriteLine(resultado); O que ser exibido ??? O operador ? ir verificar se a expresso nota >= 5 verdadeira, neste caso, a primeira expresso ser avaliada:

conceito ?? " Reprovado "


Nesta expresso temos o operador ?? e como o valor da varivel conceito null ento ser exibida a string " Aprovado ";

3- Inicializadores de objetos
Depois de criar um novo objeto muitas vezes voc tem que atribuir as suas propriedades. A partir da verso 3.0 da plataforma .NET a linguagem C# torna possvel usar os inicializadores de objeto para melhorar a legibilidade e gerar menos cdigo. Vejamos como utilizar este recurso: Cliente mac = new Cliente(); mac.Nome = "Macoratti"; mac.Endereco = "Rua Projetada 100"; Console.WriteLine(mac.Nome + " - " + mac.Endereco); Cdigo Padro

Cliente mac = new Cliente { Nome="Macoratti", Endereco = "Rua Projetada , 100" }; Console.WriteLine(mac.Nome + " - " + mac.Endereco); Usando inicializadores de objetos

4- A instruo Using
Muitas vezes voc ter de alocar um recurso do sistema, como uma fonte, um identificador de arquivo, um recurso de rede, um banco de dados,etc. Cada vez que voc precisar desse recurso h trs etapas fundamentais para percorrer: 1- Voc adquire o recurso; 2- Voc usa o recurso; 3- Voc libera o recurso; Se voc no liberar o recurso usado de forma correta, voc estar ocupando memria desnecessariamente e dependendo do cenrio poder ter problemas com vazamento de memria.

Um exemplo que mostra bem o uso da instruo Using a utilizao de um banco de dados relacional como o SQL Server. Veja o exemplo a seguir: SqlConnection connection = new SqlConnection(connectionString); SqlCommand command = connection.CreateCommand(); command.CommandText = "mac_GetValue"; command.CommandType = CommandType.StoredProcedure; object ret = null; try { connection.Open(); ret = command.ExecuteScalar(); } finally { //verifica se a conexo esta em uso para liberar if (connection != null) connection.Close(); } Cdigo padro using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = connection.CreateCommand(); command.CommandText = "mysp_GetValue"; command.CommandType = CommandType.StoredProcedure; connection.Open(); object ret = command.ExecuteScalar(); } // libera os recursos

Usando a instruo Using

No trecho de cdigo com a instruo Using a conexo ser fechada quando o objeto sai do escopo. Esse processo feito da maneira orientada a objeto - atravs da implementao de uma interface. A interface IDisposable. Isto implica que apenas os objetos que implementam IDisposable podem ser usado em uma instruo using. Tambm importante notar que chamar Dispose explicitamente (ou implicitamente atravs de uma declarao using) trs benefcios em termos de desempenho.

5- Usando aliases para tipos e namespaces extensos


Os nomes de identificadores C# podem ficar muito extensos, e, isso dificulta a digitao e aumenta a chance de erros.

Ao usar uma diretiva alias voc introduz um identificador que serve como um alias para um Namespace ou tipo dentro da unidade de compilao imediatamente envolvente ou corpo do namespace. Vejamos alguns exemplos:
Se voc estiver fazendo a automao do Microsoft Office voc pode querer fazer algo simples como abrir o MS Word e alterar um documento. Voc pode usar a instruo "using" para criar um alias para uma classe ou um namespace conforme o exemplo abaixo:

using Outlook = Microsoft.Office.Interop.Outlook; using Word = Microsoft.Office.Interop.Word; Word.Application = new Word.Application() { Visible = True; }

A sintaxe da diretiva usando um pseudnimo exige a utilizao da palavra-chave using e o do sinal igual ( = ). No exemplo a seguir vamos mapear o tipo 'Texto' para o tipo System.Text.StringBuilder:
using System; using Texto = System.Text.StringBuilder;

class Program { static void Main() { Texto palavra = new Texto(); palavra.Append("sparky"); palavra.Append(100); Console.WriteLine(palavra); } }

Obs: Este recurso deve ser usado com ateno e cuidado para no tornar o cdigo confuso e difcil de entender.

6- Nullabe Types ou Tipos Anulveis


Existem situaes, especialmente quando se trabalha com bases de dados, onde voc quer indicar que uma varivel no detm atualmente um valor vlido. Para tipos de referncia, voc pode fazer isso com facilidade definindo a varivel para null.
Os nullabe Types ou Tipos Anulveis permitem que voc crie um tipo por valor que pode ser marcado como vlido ou invlido de forma que voc tenha certeza que a varivel seja vlida antes de ser usada.Tipos de valores regulares so chamados de tipos no anulveis. Obs: Tipos anulvel so instncias da struct System.Nullable . Um tipo anulvel sempre baseado em outro tipo, chamado tipo subjacente, que j foi declarado e sobre os quais temos que:

Voc pode criar um tipo anulvel a partir de qualquer tipo de valor, incluindo o pr-definido, tipos simples; Voc no pode criar um tipo anulvel a partir de um tipo de referncia ou de outro tipo anulvel; Voc no declara explicitamente um tipo anulvel em seu cdigo. Em vez disso, voc declara uma varivel de um tipo anulvel. O compilador cria implicitamente o tipo anulvel para voc;

Por exemplo, o cdigo a seguir declara uma varivel do tipo int anulvel. Observe que o sufixo
anexado ao nome do tipo, no ao nome da varivel.

int? meuInteiro = 28;


Com essa instruo de declarao, o compilador cuida de ambas produzindo o tipo anulvel e criando uma varivel desse tipo. Veja a seguir mais exemplos de tipos anulveis:

int? i = 10; double? d1 = 3.14; bool? flag = null; char? letter = 'a'; int?[] arr = new int?[10]; Obs :Os tipos Anulveis tambm podem ser declarados da seguinte forma: System.Nullable<T> varivel Exemplo:System.Nullable<int> x = 9;
Ateno !!! Usar um tipo anulvel como usar uma varivel de qualquer outro tipo.

7- Propriedades Automticas
A partira da verso 3.0 a linguagem C# introduziu as propriedades automticas. Uma propriedade constituda basicamente de varivel privada, que exposta ao mundo exterior atravs de getters e setters. O exemplo a seguir mostra isso: public class Pessoa { private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private string _email; public string Email { get { return _email; } set { _email = value; } } } Usando as propriedades automticas podemos reduzir o cdigo acima para: public class Pessoa { public string Nome { get; set; } public string Email { get; set; } } O compilador C # gera automaticamente uma varivel de apoio e as propriedades corretas get e set. E da ?? E da que definindo a varivel como uma propriedade vai permitir a voc adicionar a lgica de validao para sua classe, numa fase posterior. Como assinatura na memria da classe no vai mudar o que significa que quaisquer bibliotecas externas compiladas com o seu cdigo no tero que ser recompiladas.

8- Inferncia de tipos
Na linguagem C# temos sempre o cuidado de definir nossas definies de variveis. Ex: string

_meuSite = www.macoratti.net;
Analisando a declarao parece bvio que o tipo da varivel s pode ser uma string.

De forma clara e sem rodeios, a inferncia de tipos (local variable type inferencing) significa dizer que o compilador capaz de 'adivinhar' o tipo de dados de uma varivel. o sonho de todo o programador : no precisar se preocupar mais em declarar variveis... mas como que isso funciona ?? Para explicar esse recurso vou usar um trecho de cdigo do LINQ, veja:
var numeros = new int[] { 218, 7, 1, 14, 6, 3, 15, 8, 74, 81, 94 }; var numerosImpares = from p in numeros where (p % 2) != 0 select p; foreach (var valor in numerosImpares) { Console.WriteLine(val + " ");

} Console.ReadKey();

No IDE do Editor do Visual C# 2010 Express Edition podemos identificar as variveis usadas no cdigo acima. Assim temos que: 1- A 2- A tipo 2- A 3- A primeira varivel var do cdigo acima pode ser identifica como sendo do tipo int32[]; segunda varivel var do cdigo acima pode ser identifica como sendo do IEnumerable<out T>; varivel nmeros usada na sintaxe LINQ do tipo int[]; varivel valor usada no lao For/Each do tipo int32;

Agora uma pergunta sutil. Onde declaramos estas variveis ? Em lugar nenhum. Mas ento como que o danado do compilador consegue 'adivinhar' o tipo das variveis ? Nas verses anteriores do Visual Basic poderamos at declarar um valor a uma varivel sem definir o tipo mas a varivel seria considerada do tipo Object. Assim, no cdigo abaixo, as variveis a e b seriam identificadas como do tipo Object: Dim a = 100 Dim b = DateTime.Now()

9. Lambda Expressions
A verso 2.0 da linguagem C# introduziu os mtodos annimos, que so mtodos definidos dentro de um mtodo. Este recurso embora poderoso sendo uma boa maneira de colocar todos os tipos de avaliao lgica dentro do seu cdigo que tinha a desvantagem de no serem muito legveis. Ex: Func filtro = delegate(int a) { return a > 35; }; As expresses lambdas tornam o cdigo mais fcil de ler mantendo a mesma funcionalidade. Para o exemplo acima temos: As expresses lambda foram includas na plataforma .NET para dar suporte a consultas LINQ onde as clusulas Where so assim compiladas como expresses lambdas. Elas podem ser consideradas uma forma de delegate que pode passar ou retornar outra funo. Nota: Delegates permitem que uma classe use mtodos de outra classe. Para saber mais sobre delegates leia o meu artigo: Usando Delegates Assim, as expresses lambdas so funes ou rotinas, sem nome, que calculam e retornam um valor nico; elas podem ser usadas em qualquer lugar que um tipo delegate for vlido. A seguir veremos alguns cenrios, a utilizao das expresses lambdas , a abordagem tradicional e o resultado:
Cenrio Usando Expresses lambdas

Ordenao Ascendente

For Each item In Numeros.OrderByDescending(Function(i) i) Console.WriteLine(item) Next

Numeros.Sort(Func

Verificar um condio (verifica os nmeros da lista so menores que 11)

Dim resultado As Boolean = Numeros.All(Function(i) i < 11)

Dim resultado As B For Each i As Integ If i >= 100 Then resultado = F End If Next

Verificar um condio (verifica um nmero da lista igual a 5 )

Dim resultado As Boolean = Numeros.Any(Function(i) i = 5)

Dim resultado As B For Each i As Integ If i = 5 Then resultado = T End If Next

Dim subconjunto = Numeros.Take(4) Obter os 4 nmeros do topo da Lista For Each item In subconjunto Console.WriteLine(item) Next

Dim subconjunto = For i As Integer = 0 If i < Numeros.C subconjunto.A End If Next

Numeros.Sort(Func Dim resultado = _ Numeros.OrderByDescending(Function(i) i).Where(Function(i) i < 8).Take(5)

Fazer a ordenao ascendente, pegar os nmeros menor que 8 e pegar os 5 nmeros da For Each item In resultado lista Console.WriteLine(item) Next

Dim resultado As N For Each i As Integ If i < 8 Then If resultado.Co resultado.A End If End If Next

Localizando itens

Dim numero As String = Numeros.Find(Function(p) p = 6)

For Each i As Integ If i = 6 Then console.Wri End If Next

10. Usando string.IsNullOrEmpty


Este recurso um biblioteca de funo de grande utilidade. Quantas vezes voc precisa testar se uma string est vazia ? Ou nula ? O mtodo string.IsNullOrEmpty retorna true se este for o caso. O mtodo String.IsNullOrEmpty indica se a String especificada uma referncia nula (Nothing no Visual Basic) ou uma string Empty (vazia).

static void Main(string[] args) { string s1 = "abcd"; string s2 = ""; string s3 = null; Console.WriteLine("S tring s1 {0}.", Teste(s1)); Console.WriteLine("S tring s2 {0}.", Teste(s2)); Console.WriteLine("S tring s3 {0}.", Teste(s3)); Console.ReadKey(); } public static String Teste(string s) { if (String.IsNullOrEmpty(s)) return " null ou empty"; else return String.Format("(\"{0}\") not null ou empty", s); }

Uma ltima dica: Bom senso e boas prticas sempre resultam em um bom trabalho. Romanos 2:12 Porque todos os que sem lei pecaram, sem lei tambm perecero; e todos os que sob a lei pecaram, pela lei sero julgados. Romanos 2:13 Pois no so justos diante de Deus os que s ouvem a lei; mas sero justificados os que praticam a lei

Você também pode gostar