Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
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
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.
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.
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? 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
Numeros.Sort(Func
Dim resultado As B For Each i As Integ If i >= 100 Then resultado = F 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
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
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