Professional Documents
Culture Documents
SUMÁRIO
Este apêndice descreve as regras básicas de sintaxe de C# que cumprem as versões do compilador
7.00.9254, contida em Beta 2, ao 7.00.9466, contida na versão 1.0.3705 do SDK.
A classe é o fundamento da programação orientada a objetos em C#. Uma classe encapsula dados
(representados por variáveis) e comportamentos (representados por métodos). Todo o código definido
na classe (variáveis e métodos) estará contido entre chaves.
mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Uma sentença using permite a uma classe ser referida somente por seu nome de classe.
Tipos valor
Os tipos valor contêm diretamente seus dados. Cada variável de um tipo valor tem sua própria cópia dos dados.
Os tipos valor são atribuídos normalmente na pilha e são destruídos automaticamente quando a variável sai
do escopo.
Os tipos valor são: tipos estrutura e tipos enumeração.
Tipos referência
Os tipos referência não contêm diretamente dados, mas referências a dados. As variáveis de tipos referência
armazenam referências a dados denominados objetos. Duas variáveis diferentes podem referenciar o mesmo
objeto. Os tipos referência são atribuídos no montículo e eventualmente são destruídos por um processo
conhecido como coleta de lixo (garbage collection).
Os tipos referência são: string, object, tipos classe, tipos array, interfaces e delegados.
Tipos ponteiro
Os tipos ponteiro somente são utilizados em códigos pouco seguros (perigosos).
Tipos valor
Os tipos valor podem ser do tipo estrutura ou do tipo enumeração. O tipo estrutura engloba as estruturas
definidas pelo usuário e os tipos simples (Figura G.1).
Tipos valor
sbyte float
byte double
short
ushort
int
uint
long
ulong
char
quadrosXadrez =64;
quadrosXadrez =0x40;
mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Literais decimais
Um literal decimal é especificado com o sufixo M ou m.
Literais caractere
Um literal char representa um caractere único. Pode constar de um caractere entre aspas simples ou um ca-
ractere Unicode em hex (hexadecimal) com prefixos \x ou \u, ou um caractere de escape (para representar
algo semelhante a uma aspa ou barra inclinada), por exemplo:
Literais booleanos
Os valores booleanos são true e false. Em C# as palavras reservadas true e false podem ser utilizadas
como um operador e como um literal.
atributos
mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Um atributo é uma etiqueta que permite associar ao código informação adicional que se incorpora ao sistema
de metadados. Essa informação adicional estabelecida pelo programador pode ser extraída usando os serviços de
reflexão e ser utilizada para modificar a conduta em tempo de execução. Os atributos podem ser predefinidos e
definidos pelo usuário. A declaração de uma estrutura permite especificar mais de um atributo
modificadores
new
public
protected
internal
private
Exemplo
No exemplo, em razão do atributo estabelecido, ao compilar será produzida uma mensagem indicando que se
trata de uma Estrutura antiquada.
using System;
[Obsoleto(“Estrutura antiquada”)] //atributo
public struct Vetor
{
public float endereço;
public int magnitude;
}
class TesteEstrutura
{
public static void main( )
{
Vetor [ ] vetores = new Vetor [200];
for (int i = 0; i < vetores.length; i++)
vetores[i] = new vetor( );
}
}
Um objeto estrutura é criado utilizando o operador new, mesmo que também possa ser criado sem utilizar
o mencionado operador. Quando não utilizamos o operador new, os campos não são inicializados por default
e o objeto não pode ser utilizado até que se inicializem seus campos.
Exemplo
using System;
public struct Endereço
{
public int número;
public string rua;
public void Mostrar ( )
{
Console.WriteLine(“Número: {0}, Rua: {1}”, número, rua);
}
}
Manual de sintaxe da linguagem C#mm
class TesteEstrutura
{
public static void main( )
{
Endereço e1, e2;
e1 = new Endereço( );
e1.número = 10;
e1.Mostrar( );
e2.número = 12;
e2.rua = “ ”;
e2.Mostrar( );
}
}
base
:tipo_integral
corpo_enumeração
{
declarações_de_membros,
}
Exemplo 1
public enum Cor
{
Vermelho,
Verde,
Azul
}
Exemplo 2
//declara um enum de tipo long
public enum Cor : long
{
Vermelho,
Verde,
Azul
}
mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Exemplo 3
public enum EstadoReserva : byte
{
NãoExisteHotel, //0, implicitamente
ApartamentoDisponível, //1, implicitamente
Indicador = 5 //valor explícito
}
Exemplo 4
// Em c:\winnt\microsoft.net\framework\v1.0.3705\mscorlib.d1l
public enum System.IO.FileAccess
{
Read = 0x00000001,
ReadWrite = 0x00000003,
Write = 0x00000002,
}
• Classes;
— Tipos classe.
— object.
— string.
• Array.
• Interface.
• Delegado.
Os tipos referência têm um valor nulo que indica a ausência de uma instância. As palavras reservadas que
permitem definir tipos referência são class, interface, delegate.
G.1.11 Classes
Uma classe é uma estrutura de dados que pode conter membros dados (constantes, campos e eventos), métodos,
construtores, destrutores, propriedades, indexadores, definições de operadores e tipos aninhados. Os tipos classe
suportam herança; mediante a herança, uma classe derivada pode ampliar ou especializar uma classe base.
Ao tratarmos as classes, temos de levar em conta que existem duas classes na biblioteca .NET Framework
que têm palavras reservadas como pseudônimo: object, string.
Definição de classes
Uma definição de uma classe consta de um cabeçalho e um corpo. O cabeçalho consta de palavras reservadas
e identificadores que representam: uma seqüência opcional de modificadores, a palavra reservada class, o
nome da classe, um nome opcional da classe pai, uma seqüência opcional de interfaces e o corpo da classe
com seus membros.
Os modificadores podem ser: new, abstract, sealed, public, protected, interna1 e private.
new somente é permitido em classes aninhadas.
public, protected, interl e private controlam a acessibilidade.
abstract é utilizado para indicar uma classe abstrata.
sealed, para evitar a derivação de uma classe.
lista_base
Lista com uma classe base como máximo (classe pai) e todas as interfaces implementadas separadas
por vírgulas.
Exemplo
public class MinhaClasse
{
protected int var;
void Procedimento1 (string Param)
{
//...
}
}
Modificadores de acesso
C# proporciona modificadores protected e internal, somente um modificador de acesso pode ser aplicado
a um membro ou tipo. A Tabela G.8 proporciona um resumo dos modificadores.
public Declara um tipo ou membro visível a todos os programas. É a acessibilidade por default
para os membros de enumerações e interfaces.
internal Declara um tipo ou membro acessível só dentro da montagem a que pertence. É a
acessibilidade por default para todos os tipos não aninhados e pode ser omitida.
protected Declara o membro de uma determinada classe unicamente acessível dessa classe e suas
classes derivadas.
private Declara a um membro apenas visível em sua unidade de compilação. É a acessibilidade por
default para os membros de classes e estruturas.
Classes abstratas
Uma classe abstrata é diferenciada de uma classe não-abstrata em:
• Uma classe abstrata não pode ser instanciada diretamente e é um erro utilizar o operador new em uma
classe abstrata. Está projetada para ser classe base na herança.
• Uma classe abstrata pode conter membros abstratos.
• Uma classe abstrata não pode ser marcada (sealed).
Exemplo
public abstract class Base
{
public abstract void Abstrato( );
public void NãoAbstrato( )
10mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
{
//Implementação
}
}
public abstract class DerivadaBase: Base
{
public abstract void OutroAbstrato( );
}
public class Derivada: DerivadaBase
{
public override void Abstrato( )
{
//Implementação
}
public override void OutroAbstrato( )
//Implementação
}
}
Classes marcadas
O modificador sealed assegura que uma classe nunca pode ser utilizada como classe base. Portanto,
os membros de uma classe sealed não podem ser declarados protected ou protected interna1.
Um exemplo de classe marcada da biblioteca de classes .NET Framework é a classe Math.
Herança
A herança significa que a classe derivada contém implicitamente todos os membros de sua classe base direta,
exceto construtores e destrutores. A herança facilita a reutilização de código, já que, de forma automática, o
código da classe base se põe à disposição da classe derivada. Todas as classes em C# herdam ou derivam, em
última instância, de uma classe base comum object.
Tipo de herança
C# somente suporta herança simples.
Especificação
[atributos] [modificadores] class IdentificadorClasseDerivada : ClasseBase
[,lista_interfaces]
corpo_da_classe
Exemplo
class BaseDados
{
//...
}
class SQLServer: BaseDados
{
//...
}
class DB2: BaseDados
{
//...
}
Manual de sintaxe da linguagem C#mm11
G.1.12 Métodos
Uma classe encapsula dados e comportamentos em uma única entidade. Um método é um membro que
implementa um cálculo ou ação que pode ser executado por um objeto ou classe.
Declaração de métodos
As declarações de métodos constam de um cabeçalho e um corpo. No cabeçalho devem ser especificados um
tipo de retorno, um identificador e uma lista de argumentos (parâmetros). O tipo de retorno pode ser qualquer
tipo (incluindo uma classe) ou o tipo void se não for devolvido nada por meio do nome do método. A lista
de argumentos pode estar vazia. Os métodos podem também ter uma visibilidade explícita.
new virtual
public sealed
protected override
internal abstract
private extern
static
e o método pode não ter nenhum ou deve ter uma combinação válida deles, o que implica que:
• A declaração não inclui o mesmo modificador várias vezes.
• A declaração inclui como máximo um dos seguintes modificadores: static, virtual e override.
• A declaração inclui como máximo um dos seguintes modificadores: new ou override.
• Se a declaração inclui o modificador abstract, não inclui os modificadores static, virtual nem
extern.
• Se a declaração inclui o modificador private, então não inclui virtual, override nem abstract.
• Se a declaração inclui o modificador sealed, então também inclui o modificador override.
O tipoDeRetorno especifica o tipo de valor calculado e devolvido pelo método e pode ser
tipo
void
Na implementação do método, quando ele não tiver sido declarado void, será utilizada a instrução return
para devolver um valor ao ponto da ativação do método.
A lista_parâmetros_formais especifica os parâmetros do método. O nome do método e o tipo e o
número dos parâmetros formais definem a assinatura do método. Nem o tipo de retorno nem os nomes dos
parâmetros formam parte da assinatura. A assinatura de um método deve ser diferente das assinaturas de outros
métodos declarados na mesma classe. Especificamente, a assinatura de um método consta de nome e número,
modificadores e tipo de seus parâmetros formais.
O corpo_do_método pode ser um bloco_de_sentenças ou um ;. Assim, quando o método for
abstract ou extern, o corpo consta simplesmente de um ponto-e-vírgula, ao passo que os casos restantes
constam de um bloco que especifica as sentenças a serem executadas quando invocamos o método.
Exemplo
abstract class Conta
{
protected abstract void Depositar(double quantidade);
}
12mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Ativação de métodos
Quando ativamos um método, devemos proporcionar os argumentos do tipo adequado. A ativação ou
invocação de um método pode ser realizada de duas maneiras, dependendo de se o método devolve ou
não um valor. Assim, quando o método devolve um valor, a ativação do método é tratada como um valor,
mas se o método devolve void, uma ativação do método deve ser uma sentença.
// interior de um método
{
int Soma = SomaNúmeros(5, 8);
//...
}
Parâmetros valor
O modo por default de passagem de parâmetros em C# é a ativação por valor, na qual os valores dos parâmetros
reais são copiados na área de armazenamento dos parâmetros formais. Devemos levar em conta que as variáveis
que passam como parâmetros podem ser do tipo valor ou do tipo referência. Uma variável de tipo referência
não contém os dados diretamente, mas uma referência ao lugar onde são armazenados; isso implica que, quando
passamos por valor uma variável de tipo referência, é possível devolver mudados os dados apontadores pela
referência, mas não o valor da própria referência.
Manual de sintaxe da linguagem C#mm13
Parâmetros referência
Um parâmetro declarado com um modificador ref é um parâmetro referência e, ao contrário de um parâmetro
valor, não cria uma nova posição de armazenamento.
Exemplo 1
class Teste1
{
static void Intercâmbio(ref int x, ref int y)
{
int aux = x;
x = y;
y = aux
}
Parâmetros de saída
Um parâmetro referência está projetado realmente como um meio de comunicação bidirecional entre o pro-
grama ativador e o programa ativado. Um parâmetro declarado com um modificador out é um parâmetro de
saída. De forma semelhante em um parâmetro referência, um parâmetro de saída não cria uma nova posição
de armazenamento, ao contrário, representa a mesma posição de armazenamento que a variável dada como
argumento, na invocação do método.
Quando um parâmetro formal é um parâmetro de saída, o argumento correspondente em uma invocação
do método deve constar da palavra reservada out seguida por uma variável do mesmo tipo que o parâmetro
formal.
Os parâmetros referência devem ser inicializados antes de seu uso; pelo contrário, não é necessário atribuir
valor a uma variável antes que se possa passar como um parâmetro de saída. No interior de um método, como
uma variável local, um parâmetro de saída é considerado inicialmente não atribuído e devemos atribuí-lo
antes que seu valor seja utilizado. Os parâmetros de saída são utilizados normalmente em métodos que pro-
duzem múltiplos valores de retorno.
14mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
Exemplo
class Teste3
{
static void DividirCaminho(string caminho, out string rota, out string
nome)
{
int i = caminho.Length;
while (i>0)
{
char car = caminho [i-1];
if (( car == ‘\\’) || (car == ‘/’) || (car == ‘:’ ))
break;
i--;
}
rota = caminho.Substring(0,i);
nome = caminho.Substring(i);
}
public static void Main ( )
{
string c, n;
DividirCaminho (“C :\\livro\\Tema01\\Bem-vindo.cs”,
out c, out n);
System.Console.WriteLine(c);
System.Console.WriteLine(n);
}
}
Parâmetros array
Um parâmetro declarado com um modificador params é um parâmetro array. Se uma lista de parâmetros
formais inclui um array parâmetro, deve ser o último parâmetro da lista e deve ser um tipo array de uma só
dimensão. Não podemos combinar o modificador params com os modificadores ref e out.
Exceto por permitir um número variável de argumentos em uma invocação, um parâmetro tipo array é
equivalente a um parâmetro valor.
Exemplo
using System;
class Teste4
{
static void F (params int [ ] args)
{
Console.WriteLine(“O array contém {0} elementos: ”, args.Length);
foreach (int i in args)
Console.Write(“{0} ”, i);
Console.WriteLine( );
}
public static void Main( )
{
int [ ] a ={1,2,3};
F(a);
F(15,25,35,40);
F( );
}
}
Manual de sintaxe da linguagem C#mm15
Exemplo
using System;
class Teste5
{
/*
O método EncontrarMax se sobrecarrega para
parâmetros long ou string
*/
Tipo Operadores
Exemplos
public static Empréstimo operator + (Empréstimo p1, Empréstimo p2)
public static Relógio operator + (Relógio c1, Relógio c2)
public static Relógio operator + (Relógio c1, int h2)
G.1.15 Interfaces
Uma interface define um contrato, e uma classe ou estrutura que implementa uma interface deve cumprir seu
contrato. As interfaces podem conter métodos, propriedades, indexadores e eventos e a classe que implemente
a interface tem de definir todos e cada um dos elementos dessa interface ou o código não será compilado. As
interfaces, como as classes, são tipos referência. A grande diferença é que não existe código de implementação
em uma interface.
[atributos] [modificadores] interface Identificador
[: ListaDeInterfacesBase]
corpo_interface
Herança de interfaces
As interfaces podem herdar de outras interfaces (contrariamente ao que acontece nas classes, em que existem
somente heranças simples) se existem heranças múltiplas de interface.
Exemplo
using System;
interface IConta: IContaCorrente, IContaCrédito
{
}
Manual de sintaxe da linguagem C#mm17
G.1.16 Delegados
Os delegados são tipos referência que podem manter referências a métodos que se correspondam com sua
assinatura e resultam semelhantes aos ponteiros a funções presentes em outras linguagens, tais como Pascal,
C++ etc.
Entretanto, contrariamente aos ponteiros, os delegados são totalmente orientados a objetos e apontam
sempre um método válido. Contrariamente aos ponteiros, as funções membro encapsulam tanto a instância do
objeto como um método.
G.2 SENTENÇAS
Em C# as sentenças podem ser simples ou estruturadas, além do que é possível agrupar várias sentenças em
um bloco.
G.2.1 Bloco
Um bloco consta de uma lista de sentenças opcionais entre chaves. Omitindo a lista de sentenças, dizemos que
o bloco é vazio.
Exemplo
if (x < y)
{
int aux = x;
x = y;
y = aux;
}
if (x >= 0)
goto x;
x=-x;
x: return x;
}
Uma etiqueta só pode ser referenciada de sentenças goto dentro do escopo da etiqueta.
Sentença if
As sentenças if proporcionam controle sobre duas alternativas baseadas no valor lógico de uma expressão.
1) if (expressãoLógica)
sentença1;
else
sentença2;
sentença3;
2) if (expressãoLógica)
sentença1;
sentença2;
Se a expressão for verdadeira, será executada a sentença1 seguida pela sentença2. Se a expressão for
avaliada falsa, será executada a sentença2 diretamente.
Manual de sintaxe da linguagem C#mm19
3) if (expressãoLógica)
bloco
else
bloco
sentença3;
4) if (expressãoLógica)
bloco
sentença2;
switch (expressão)
{
case constante1:
sentenças1;
sentença_salto; // break, continue, goto ou return
case constante2:
sentenças2:
sentença_salto;
...
default
sentençasX;
sentença_salto;
}
Avalia-se a expressão e o resultado é comparado com cada uma das expressões constantes definidas nas
diferentes sentenças case. Uma vez encontrada uma coincidência, o controle é passado à primeira linha de
código nessa sentença case.
Exemplo
using System;
public class DemoSwitch
{
public static void Main (string[ ] args)
{
for (int i=0; i<args.Length; i++)
{
switch (args [i])
{
case “1”;
Console.Write(“Baixo”);
break;
case “2”;
Console.Write(“Médio”);
goto case “1”;
case “3”;
Console.Write(“Médio”);
goto case “4”;
case “4”;
Console.Write(“Alto”);
break;
case “5”;
20mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
case “6”;
Console.Write(“Superior”);
break;
default:
Console.Write(“Caso especial”);
break;
}
Console.WriteLine( );
}
}
}
Execução
C:\livro\Tema07>DemoSwitch 1 2 3 4 5 6 7
Baixo
Médio Baixo
Médio Alto
Alto
Superior
Superior
Caso especial
G.2.7 Laços
Um laço permite executar repetidamente uma série de ações. As sentenças repetitivas ou de iteração são:
while, do, for e foreach.
Sentença while
A sentença while executa condicionalmente zero ou mais vezes as sentenças fechadas no laço.
while (expressãoLógica)
blocoSentenças
sentença;
Sentença do
A sentença do executa condicionalmente uma série de sentenças uma ou mais vezes. O corpo do laço é
executado pelo menos uma vez. O corpo do laço pode constar de somente uma sentença.
do
sentença1; //a sentença é executada pelo menos uma vez
while (expressãoLógica);
Manual de sintaxe da linguagem C#mm21
Se a expressão for verdadeira, o laço será executado uma vez mais e termina a execução quando a expressão
for falsa.
Exemplo
do
{
System.Console.Write(conta);
if (conta < número)
System.Console.Write(“, ”);
conta++;
}
while (conta <= número);
Sentença for
A sentença for avalia uma seqüência de expressões de inicialização e, a seguir, enquanto a condição for
verdadeira, executam as sentenças do interior do laço e termina a execução quando a expressão controle
for falsa:
for (inicialização; condição_de_terminação; iterador)
sentença;
for (inicialização, condição_de_terminação; iterador)
bloco
Essencialmente, o laço for inicializa a(s) variável(is) de controle mediante a(s) sentença(s) de atribuição
especificadas na sessão de inicialização e depois verifica se a condição_de_terminação é verdadeira.
Se a condição é verdadeira, são executadas as sentenças do interior do laço, e se a condição é falsa, saltam-se
todas as sentenças do interior do laço; ou seja, não são executadas. Quando a condição é verdadeira, o laço
executa uma iteração (todas suas sentenças) e a seguir a(s) variável(is) de controle do laço será(ão) incrementada(s)
ou decrementada(s) na forma especificada mediante o iterador. Cada uma das partes (inicialização;
condição_de_terminação; iterador) é opcional.
Exemplos
1) int soma = 0;
for (int i=1; i<=10; i++)
soma += i;
Console.WriteLine (soma);
2) for (int i = 1; i < 16; i=i*2)
Console WriteLine(i);
3) for (int i=1, j=1, j<=5 ; i++)
{
Console.WriteLine(“{0} {1}”,j, i);
if (i==3)
{
i=0;
j++;
}
}
4) for (;;) ; // laço infinito com sentença vazia
22mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
A sentença foreach
A sentença foreach enumera os elementos de uma coleção, executando a(s) sentença(s) embutida(s) para
cada elemento da coleção. A instrução foreach não deve ser usada para mudar o conteúdo de uma coleção.
Exemplo
int [ ] primos = {2, 3, 5, 7, 11, 13};
int soma = 0;
foreach (int primo in primos)
{
Console”Write(“{0} ”, primo);
soma +=primo;
}
Console.WriteLine(“\r\n {0}”, soma);
Sentença break
A sentença break é utilizada para terminar o laço atual ou a sentença switch na qual aparece. O controle é
passado a seguir da linha do código que segue a última sentença interna do laço ou sentença switch.
Sintaxe
break;
Exemplo
for (int i = 1; i <= 100; i++)
{
if (0 == i % 4)
Console.WriteLine(i);
if (i == 66)
break;
}
Uma aplicação interessante de break é sair de laços infinitos. O método é criar um laço infinito no qual
o controle será transferido fora do laço somente quando alcançamos uma sentença break.
Sentença continue
A sentença continue começa uma nova iteração do laço (while, do, for ou foreach) mais perto.
Ao contrário da sentença break, continue não produz uma saída completa do laço, somente termina a
iteração em curso e começa a seguinte iteração.
Sintaxe
continue;
Manual de sintaxe da linguagem C#mm23
Sentença goto
A sentença goto somente deve ser utilizada em circunstâncias muito excepcionais. Seu uso costuma pressupor
uma má prática de programação.
goto transfere o controle a uma sentença marcada por uma etiqueta.
Sintaxe
goto identificador;
goto case expressão_constante;
goto default;
Sentença return
A sentença return devolve o controle e o valor da expressão_retorno ao invocador da função membro
na qual aparece a sentença return. Se um método é do tipo void, a sentença return pode aparecer sem
incluir expressão_retorno ou ser omitida.
Sintaxe
return [expressão_retorno];
Sentenças try
A instrução try-catch consiste em um bloco de teste seguido por uma ou mais cláusulas de captura que
especificam os administradores para as exceções diferentes.
O bloco finally permite limpar qualquer recurso assinado no bloco try. O controle passa sempre à
cláusula finally sem ter em conta como é efetuada a saída do bloco try, ou seja, tanto se produz uma
exceção e se captura, como não se captura, como se não fosse produzida a exceção, como se sai do bloco
try e com return break continue finally poderia aparecer depois de um bloco try sem cláusulas
catch (instrução try-finally) ou ao final das cláusulas catch do bloco try (instrução try-catch-
finally).
Sintaxes
try bloco_try cláusulas_catch
try bloco_try finally bloco_finally
try bloco_try cláusulas_catch finally bloco_finally
As cláusulas_catch serão
cláusulas_catch_específicas [cláusula_catch_geral]
ou
[cláusulas_catch_específicas] cláusula_catch_geral
Sentença throw
Uma sentença throw lança uma exceção:
Sintaxe
throw [expressão];
Uma sentença throw com uma expressão lança a exceção produzida avaliando a expressão. A expressão
deve representar um valor de tipo classe System.Exception ou de um tipo classe derivado de System.
Exception. Uma sentença throw sem expressão pode ser utilizada somente em um bloco catch, lançando
novamente a exceção que está sendo manipulada pelo bloco catch.
unchecked bloco
Símbolo Descrição
Símbolo Descrição
x y x AND y
false false false
false true false
true false false
true true true
26mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
x y x OR y
false false false
false true true
true false true
true true true
x NOT x
false true
true false
x y x XOR y
false false false
false true true
true false true
true true false
A expressão lógica (expressão1) é avaliada em primeiro lugar. Avaliando-se true, a expressão global
recebe o valor expressão2, em caso contrário, o valor expressão3.
• Lógicos bit a bit: AND, OR, XOR (or exclusive) e NOT, às vezes denominados operadores de máscara.
• Operadores de deslocamento: deslocamento para a direita e deslocamento para a esquerda.
Símbolo Descrição
Operadores de deslocamento
a = b << n // desloca n posições para a esquerda
// equivale a multiplicar por 2 n vezes
a = b >> n // desloca n posições para a direita e
// estende o sinal equivalente a dividir
// por 2 n vezes
Símbolo Descrição
= Atribuição simples
+ + Incremento e atribuição
– – Decremento e atribuição
* = Multiplicação e atribuição
/ = Divisão e atribuição
% = Módulo e atribuição
+ = Soma e atribuição
- = Subtração e atribuição
<<= Deslocamento para a esquerda e atribuição
>>= Deslocamento para a direita e atribuição
& = Atribuição AND ou AND sobre bits e atribuição
| = Atribuição OR ou OR sobre bits e atribuição
^ = Atribuição XOR ou XOR sobre bits e atribuição
Exemplo
int x = (y = + + z) + 50;
Atribuição composta
Uma atribuição composta realiza uma operação binária como parte da atribuição.
Descrição Operadores
Aritméticos += -= *= /= %= ++ --
Deslocamento <<= >>=
Bit a bit &= |= ^=
Lógicos &= |= ^=
28mmFundamentos de programação – Algoritmos, estruturas de dados e objetos
G.3.7 Expressões
As expressões são construídas combinando constantes e variáveis. Quando as expressões são avaliadas, o
compilador de C# segue regras de precedência ou prioridade para determinar a ordem das operações a serem
realizadas. Quando um operando está entre dois operadores com o mesmo nível de precedência ou prioridade,
a associatividade do operador controla a ordem de avaliação. A maioria dos operadores se associa da esquerda
para a direita.
Tabela G.20 Prioridade dos operadores em C#
Primários (x) x.y -> f(x) a[x] x++ x-- new stackallock typeof sizeof
checked unchecked
Unários + - ~ ! ++x --x (tipo)x * & true false
Multiplicativos * / %
Aditivos + -
Deslocamento >> <<
Relacionais > >= < <= is as
Igualdade == !=
AND bit a bit &
XOR bit a bit ^
OR bit a bit |
AND em
curto circuito &&
OR em
curto circuito ||
Condicional ? :
Atribuição = *= /= %= += -= >>= <<= &= ^= |=
G.4 EXCEÇÕES
As exceções são objetos que descrevem e permitem controlar erros e problemas inesperados no funcionamento
de um programa. As exceções em C# proporcionam um meio estruturado uniforme e seguro de tipos para
manusear condições de erro na aplicação e no sistema.
Exemplo
using System;
class LançaExceção
{
public static void Main( )
{
try
{
//aconteceu algum erro
throw new AplicationException( );
}
catch (System.Exception e)
{
System.Console.WriteLine(e.Message);
}
}
}
As cláusulas_catch serão:
cláusulas_catch_específicas [cláusula_catch_geral]
ou
[cláusulas_catch_específicas] cláusula_catch_geral
//catch específica
catch(TipoExceção parâmetro)
{
//ações
}
//catch específica
catch(TipoExceção)
{
//ações
}
//catch geral
catch
{
//ações
}
30mmFundamentos de programação – Algoritmos, estruturas de dados e objetos