Академический Документы
Профессиональный Документы
Культура Документы
C#.NET
ESTCB - IPCB
Departamento de Engenharia Informática
Sumário – C#.NET
Variáveis
Documentação XML
C# Preprocessor Directives
Operadores
Estruturas de Decisão
Estruturas de Ciclo
Erros e Excepções
Classes e Objectos
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 2
C# - Orientada a Objectos
Componentes auto-descritivos:
Programação simples:
Pode ser integrada em páginas ASP
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 3
C# - Orientada a Objectos
Tudo é um objecto
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 4
C# - Robustez
Excepções
Melhor tratamento de erros
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 5
C# - Preservar Investimentos
Espaços de nomes;
Interoperabilidade
Melhor produtividade
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 6
C# - Tipos de Dados
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 7
C# - Tipos de Dados
Tipos Valor
Tipos Referência
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 8
C# - Tipos de Dados
Tipos Valor
Primitivos int i;
Tipos Referência
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 9
C# - Tipos de Dados
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 10
Stack e Heap
Uma Stack consiste numa estrutura para armazenar dados utilizando o conceito
LIFO (last-in-First-out). A Stack refere-se a uma área de memória suportada
pelo processador, na qual as variáveis locais são armazenadas.
Na linguagem C#, os Tipo Valor (por exemplo inteiros) são alocados na Stack.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 11
C# - Variáveis & Constantes
Variáveis
Uma variável é criada através da atribuição de um nome e da declaração do tipo.
O C# requere atribuição de valores, isto é, uma variável não pode ser usada sem
antes possuir um valor.
Constantes
Uma constante consiste numa variável cujo valor não pode ser modificado.
X = 32; Literal
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 12
C# - Enumerações
Enumerations
As enumerações constituem uma poderosa alternativa às constantes. Uma
enumeração consiste num conjunto de constantes, denominada enumeration
list.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 13
C# - Enumerações
class Values
{
enum Temperatures: int
{
WickedCold =0,
FreezingPoint = 32,
LightJacketWeather = 60,
SwimmingWeather = 72,
BoilingPoint = 212,
}
static void Main(string[] args)
{
System.Console.WriteLine("Freezing point of water: {0}", (int) Temperatures.FreezingPoint);
System.Console.WriteLine("Boiling point of water: {0}", (int) Temperatures.BoilingPoint);
System.Console.Read();
}
}
É necessário especificar o tipo de dados que se pretende imprimir, caso seja omisso, o valor
imprimido consiste no nome da constante.
Todas as enumerations list possuem scope, isto permite possuir constantes com o mesmo
nome em enumerations list diferentes.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 14
C# - Preprocessor Directives
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 15
C# - Documentação XML
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 16
C# - Documentação XML
TAG Descrição
<c> Especifica uma linha como sendo uma linha de código
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 17
C# - Documentação XML
using System;
namespace Math.Exemplo
{
/// <summary>
/// Classe de Matemática --> Exemplo para PSI
/// Fornece um método para adicionar dois inteiros
/// </summary>
public class Math
{
///<sumary>
/// O método Add permite adicionar dois inteiros
///</sumary>
///<returns> O resultado da adicção é (int) </returns>
///<paran name="x"> Primeiro inteiro a adicionar </param>
///<paran name="y"> Segundo inteiro a adicionar </param>
public int Add(int x, int y)
{
return x+y;
}
}
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 18
C# - Operadores
Operador Descrição
+ Adição
- Subtracção
* Multiplicação
/ Divisão
% Resto da divisão
Incrementos e Decrementos,
Relacionais,
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 19
C# - Operadores
Uma operação comum em programação é a necessidade de somar ou subtrair a
uma variável, ou ainda, modificar o valor de uma variável, e atribui-lo novamente
à mesma variável.
Operador Descrição
++ Incrementa um valor
-- Decrementa um valor
+= Soma o valor à variável em questão
-= Subtrai o valor à variável em questão
*= Multiplica o valor à variável em questão
/= Divide o valor à variável em questão
myExample = 10;
myExample += 9 // myExample = 20
myExample /= 5 // myExample = 4
myExample *= 10 // myExample = 40
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 20
C# - Operadores
Para complicar ainda mais as coisas, é possível incrementar uma variável e
atribuir esse valor a outra variável.
Sufixo
secondvalue = 10;
Prefixo
secondvalue = 10;
firstvalue = ++secondvalue; // firstvalue = 11 // secondvalue = 11
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 21
C# - Operadores
Operadores relacionais são utilizados para comparar dois valores, retorna como
resultado um valor booleano.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 22
C# - Operadores
Lógicos
x=5ey=7
typeof
Isto torna-se útil quando se pretende usar reflexão de forma a obter informção
sobre objecto criados dinamicamente.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 23
C# - Operadores
IS
int i = 10;
if (i is object)
{
Console.WriteLine(“i é um objecto”);
}
AS
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 24
C# - Operadores
Precedência
Descrição Operadores
Primário () . x++ x– new typeof sizeof checked unchecked
Unários + - ! ~ ++x –-x
Multiplicação/Divisão * / %
Adição/subtracção + -
Deslocamento de bits << >>
Relacionais < > <= >= is as
Comparação == !=
AND &
XOR ^
OR |
Boolean AND &&
Boolean OR ||
Ternário ?:
Atribuição = += -= *= /= %= &= |= ^= <<= >>=
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 25
C# - Estruturas de Decisão
int i = 4;
if (i == 0)
{
Console.WriteLine(“i é zero”);
}
else if (i==1)
{
Console.WriteLine(“i é um”);
}
else
{
Console.WriteLine(“i é maior que um”);
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 26
C# - Estruturas de Decisão
Switch (country)
{
case “America”:
Console.WriteLine(“O país em questão é a América”);
break;
case “Inglaterra”:
Console.WriteLine(“O país em questão é a Inglaterra”);
break;
case “Portugal”:
Console.WriteLine(“O país em questão é Portugal”);
break;
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 27
C# - Estruturas de Decisão
Switch (country)
{
case “US”:
case “UK”:
case “AU”:
language = “English”;
break;
case “at”:
case “de”:
language = “German”;
break;
}
Switch (country)
{
case “America”:
Console.WriteLine(“O país em questão é a América”);
goto case “Inglaterra”;
case “Inglaterra”:
language = “English”;
break;
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 28
C# - Estruturas de Ciclo
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 29
C# - Estruturas de Ciclo
bool condition;
{
// executa pelo menos uma vez
DoSomeWork();
condition = checkCondition(); // assume checkCondition() retorna um bool
} while (condition)
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 30
C# - Estruturas de Ciclo
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 31
C# - Excepções
Uma excepção consiste num objecto que encapsula informação acerca de uma
ocorrência fora do comum.
Quando uma excepção é lançada, a função actual pára, isto é, a função termina
naquele momento, tendo no entanto a oportunidade de tratar a excepção. Se
nenhuma das funções activas tratar a excepção, esta será tratada em última
instância pelo CLR, o qual terminará o programa.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 32
C# - Throw e Catch
throw
Caso não encontre um handler, vai retornando nas funções até encontra algum
que satisfaça a excepção. Caso retorne até ao método main e não encontre um
handler, termina o programa.
catch
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 33
C# - Excepções - throw
namespace MyThrow
{
using System;
public class Test
{
OUTPUT:
public static void Main()
{
Enter Main…
Console.WriteLine("Enter Main...");
Enter Func1…
Test t = new Test();
Enter Func2…
t.Func1();
Console.WriteLine("Exit Main...");
Exception ocurred: System.Execption: Na
} exception of type System.Exception was
public void Func1() throw.
{
Console.WriteLine("Enter Func1..."); at MyThrow.Test.Func2();
Func2(); in …exception01.css:line 23
Console.WriteLine("Exit Func1...");
} at MyThrow.Test.Func1();
public void Func2() in …exception01.css:line 17
{
Console.WriteLine("Enter Func2..."); at MyThrow.Test.Main();
throw new System.Exception(); in …exception01.css:line 11
Console.WriteLine("Exit Func2...");
}
}
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 34
C# - Excepções - catch
namespace MyThrow {
using System;
public class Test {
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 35
C# - Excepções – catch – exemplo 2
namespace MyThrow {
using System;
public class Test {
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 36
C# - Excepções – catch dedicados
namespace MyDedicatedCatch
{
using System;
public class DedicatedCatch
{
public static void Main()
{
DedicatedCatch t = new DedicatedCatch();
t.TestFunc();
Console.ReadLine();
}
return num1/num2;
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 37
C# - Excepções – catch dedicados 2
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 38
C# - Finally
finally
Nalgumas situações lançar uma excepção pode criar problemas graves. Por
exemplo se existe um ficheiro aberto, ou se existe a pertença de um recurso, é
importante ter oportunidade de fechar o ficheiro, ou limpar o buffer.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 39
C# - Excepções – finally
namespace MyDedicatedCatch
{
using System;
public class DedicatedCatch
{
public static void Main()
{
DedicatedCatch t = new DedicatedCatch();
t.TestFunc();
Console.ReadLine();
}
return num1/num2;
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 40
C# - Excepções – finally 2
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 41
C# - Objecto Excepção
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 42
C# - Objecto Excepção
namespace MyDedicatedCatch
{
using System;
public class DedicatedCatch
{
public static void Main()
{
DedicatedCatch t = new DedicatedCatch();
t.TestFunc();
Console.ReadLine();
}
//do the division if legal
public double DoDivide(double num1, double num2)
{
if (num2==0){
DivideByZeroException e = new DivideByZeroException();
e.HelpLink = "http://www.libertyassociates.com";
throw e;
}
if (num1==0)
throw new System.ArithmeticException();
return num1/num2;
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 43
C# - Objecto Excepção 2
// Try to divide 2 numbers handle possible excaptions
public void TestFunc()
{
try {
Console.WriteLine("Open the file here.");
double a = 5;
double b = 0;
Console.WriteLine("{0}/{1} = {2}", a,b,DoDivide(a,b));
}
//most derived exception type first
catch (System.DivideByZeroException e) {
Console.WriteLine("\n DivideByZeroException! Msg: {0}", e.Message);
Console.WriteLine("\n HelpLink! Msg: {0}", e.HelpLink);
Console.WriteLine("\n Here's a stack Trace: {0}", e.StackTrace);
}
//generic exception type last
catch {
Console.WriteLine("Unknow exception caucht!");
}
finally
{
Console.WriteLine("Close the file here.");
}
}
}
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 44
C# - Objecto Excepção 3
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 45
C# - Classes e Objectos
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 46
C# - Classes e Objectos
//……
}
}
Ao declarar uma nova classe, definem-se as propriedades dos objectos das classes
assim como o seu comportamento.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 47
C# - Classes e Objectos
Access-modifiers Restrições
É preferível definir as variáveis membro da classe como private. Isto implica que
o acesso aos valores das variáveis seja efectuado somente com recurso a
métodos da classe.
Por defeito a linguagem C# especifica tudo como private, pelo que não é
necessário indicar explicitamente, no entanto é recomendável.
// private variables
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 49
C# - Classes - Construtor
bool False
enum 0
reference null
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 50
C# - Classes – Construtor
public class Time
{
//private member variables
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
//constructor
public Time(System.DateTime dt)
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 51
C# - Classes – Construtor 2
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 52
C# - Classes - this
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 53
C# - Classes – Copy
C# não fornece nenhum construtor copy, pelo que caso seja necessário, é preciso
implementá-lo.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 54
C# - Membros Estáticos
Suponhamos que existe uma classe denominada Button que possui objectos
instanciados (btnUpdate e btnDelete). Suponhamos ainda que a classe possui um
método static denominado SomeMethod(). Acede-se ao método da seguinte
forma:
Button.SomeMethod();
E não:
btnUpdate.SomeMethod();
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 55
C# - Membros Estáticos
Não é possível saber com exactidão o construtor static será executado, sabe-se
somente que ele será executado após o inicio do programa e antes de ser criada a
primeira instância.
existem.
Os membros static são considerados parte da classe pelo que não podem ser
sua declaração.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 56
C# - Membros Estáticos
namespace MyStatic
{
using System;
public Cat()
{
instances++;
}
public static void HowManyCats()
{
Console.WriteLine("{0} cats adopted", instances);
}
}
public class Tester
{
static void Main()
{
Cat.HowManyCats();
Cat Frisky = new Cat();
Cat.HowManyCats();
Cat Whiskers = new Cat();
Cat.HowManyCats();
Console.ReadLine();
}
}
}
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 57
C# - Passagem de Parâmetros
uma cópia temporária desse objecto dentro do método. Uma vez executado o
valores).
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 58
C# - Passagem de Parâmetros
namespace MyConstrutor
{
public class Time
{
//private member variables
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 59
C# - Passagem de Parâmetros 2
//constructor
public Time(System.DateTime dt)
{
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
}
public class Tester
{
static void Main()
{
System.DateTime currentTime = System.DateTime.Now;
Time t = new Time(currentTime);
t.DisplayCurrentTime();
int theHour = 0;
int theMinute = 0;
int theSecond = 0;
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 60
C# - Passagem de Parâmetros
Como os inteiros são tipos valor, são passados como valor, é efectuada uma copia
no método GetTime().
// chamada à função.
t.GetTime(ref theHour,ref theMinute,ref theSecond);
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 61
C# - Passagem de Parâmetros
C# impõe que todas as variáveis seja inicializadas entes de ser utilizadas. É essa a
razão da inicialização das variáveis theHour, theMinute e the Second a zero, antes
de serem utilizadas.
Caso não fossem inicializadas o compilador indicaria o seguinte erro:
Use of unassignedlocal variable 'theHour'
Use of unassignedlocal variable 'theMinute'
Use of unassignedlocal variable 'theSecond'
De forma a evitar este tipo de situações, a linguagem C# fornece uma modificador
denominado out, que permite passar uma variável a um método sem necessidade
de inicialização.
// chamada à função.
t.GetTime(out theHour, out theMinute, out theSecond);
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 62
C# - Sobrecarga - Overloading
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 63
C# - Encapsulamento de dados
Fornecem um interface simples para com o cliente, simulando uma variável membro.
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 64
C# - Encapsulamento de dados
GET
Sempre que existir uma referência à propriedade (desde que não seja uma
atribuição), o método GET é invocado para ler o valor da propriedade.
Time t = new Time(currentTime);
int theHour = t.Hour;
SET
ESTCB - IPCB
Departamento de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07 65
Projecto de Sistemas Industriais
C#.NET
Parte II
ESTCB - IPCB
Departamento de Engenharia Informática
Sumário – C#.NET
Estruturas
Operador Overloading
Interfaces
Diferem das classes na medida em que não possuem destrutores nem permitem
herança.
{struct members};
using System;
namespace MyStruct
{
public struct Location
{
private int xVal;
private int yVal;
public int x
{
get
{
return xVal;
}
set
{
xVal = value;
}
}
public int y
{
get
{
return yVal;
}
set
{
yVal = value;
}
}
/// <summary>
/// Summary description for Class1.
/// </summary>
public class Tester
{
public void myFunc (Location loc)
{
loc.x = 50;
loc.y = 100;
Console.WriteLine("In MyFunc loc: {0}", loc);
}
static void Main()
{
Location loc1 = new Location(200,300);
Console.WriteLine("Loc1 location: {0}", loc1);
Tester t = new Tester();
t.myFunc(loc1);
Console.WriteLine("Loc1 location: {0}", loc1);
}
}
}
Se não for fornecido construtor, será fornecido um por defeito que colocará
todos os membros a zero. Se existir um construtor, é obrigatório inicializar os
membros.
Sem inicialização:
Como exemplo suponha que possui uma classe para representar fracções,
Garantir que esta classe possui todas as funcionalidades que tipos de dados pré-
definidos, significa que a classe definida por si tem capacidade de executar as
mesmas operações que as classes de dados pré-definidos. (Exemplo: adicionar
duas fracções, multiplicar duas fracções, e converter fracções em dados do tipo
int).
Operador Comparação ==
Operador Comparação ==
Ao efectuar o override do método, garante-se que a classe
Fraction actue de forma polimórfica com outros objectos.
Dentro do método é necessário garantir que o objecto a
comparar é um objecto do tipo Fraction.
Operadores de Conversão
Por exemplo converter um int num long consiste numa conversão implítica, pois o
tamanho de um int cabe num long.
int myInt = 5;
long myLong;
myLong = myInt // implicita
myInt = (int) myLong // explícita
namespace MyOverloading
{
using System;
Fraction f3 = f1+f2;
Console.WriteLine("f1 + f2 = f3: {0}", f3.ToString());
Fraction f4 = f3+5;
Console.WriteLine("f3 + 5 = f4: {0}", f4.ToString());
namespace MyInterface
{
using System;
// declare the interface
interface IStorable
{
// no access modifiers, methods are public
// no implementation
void Read( );
void Write(object obj);
int Status { get; set; }
}
// Take our interface out for a spin
public class Tester
{
É permitido que uma classe implemente mais do que uma interface, bastando
para isso indicar o nome das interfaces, separadas por uma vígula.
Extensão de interfaces
Junção de Interfaces.
É possível desenvolver novas interfaces a partir da junção de
interfaces já existentes e opcionalmente adicionar novos
métodos ou propriedades.
interface IStorableCompressible : IStorable, ILoggedCompressible
void LogOriginalSize();
namespace MyInterfaceCombining
{
using System;
interface IStorable {
void Read();
void Write(object obj);
int Status { get; set; }
}
// here's the new interface
interface ICompressible {
void Compress();
void Decompress();
}
// Extend the interface
interface ILoggedCompressible : ICompressible {
void LogSavedBytes();
}
// Combine Interfaces
interface IStorableCompressible : IStorable, ILoggedCompressible {
void LogOriginalSize();
}
// yet another interface
interface IEncryptable {
void Encrypt();
void Decrypt();
}
}
// implement IStorable
public void Read()
{
Console.WriteLine("Implementing the Read Method for IStorable");
}
public void Write(object o)
{
Console.WriteLine("Implementing the Write Method for IStorable");
}
public int Status
{
get{
return status;
}
set{
status = value;
}
}
// implement ICompressible
public void Compress() {
Console.WriteLine("Implementing Compress");
}
public void Decompress() {
Console.WriteLine("Implementing Decompress");
}
// implement ILoggedCompressible
public void LogSavedBytes() {
Console.WriteLine("Implementing LogSavedBytes");
}
// implement IStorableCompressible
public void LogOriginalSize() {
Console.WriteLine("Implementing LogOriginalSize");
}
// implement IEncryptable
public void Encrypt() {
Console.WriteLine("Implementing Encrypt");
}
public void Decrypt() {
Console.WriteLine("Implementing Decrypt");
}
// hold the data for IStorable's Status property
private int status = 0;
}
}
else
{
Console.WriteLine("StorableCompressible not supported");
}
void Write();
void Read()
interface ITalk{
void Talk();
void Read()
v
}oid ITalk.Read()
{
Console.WriteLine(″Implementig ITalk.Read″);
}
ESTCB - IPCB Projecto de Sistemas Industriais, Carlos Alves – 2006/07 26
Departamento de Engenharia Informática
C# - Vectores
O seguinte exemplo:
Não cria um array com três objectos Button, mas sim um vector de 3 elementos
do tipo Button. Para conter objectos deste género, será necessário primeiro
inicializar cada elemento com um objecto deste tipo.
namespace MyArrayFor
{
using System;
Parâmetros - params
Regulares
Um vector multidimensional regular é um vector que possui o mesmo
número de colunas para todas as linhas.
Jagged
Um vector vector jagged consiste num vector de vectores, onde cada linha não
tem obrigatoriamente de ter o mesmo número de colunas das anteriores.
namespace MyJaggedArray
{
using System;
O problema com o tipo vector é o seu tamanho fixo. Se não for possível ter um
conhecimento antecipado de quantos objectos será necessário armazenar, corre-
se o risco de declarar ou um vector muito grande, ou um vector que não
preenche as necessidades.
Hashtables
Numa hash table cada valor é armazenado num bucket, o qual é numerado de
forma semelhante ao offset de um vector.
namespace MyHash
{
using System;
using System.Collections;
C#.NET
Parte III
ESTCB - IPCB
Departamento de Engenharia Informática
Sumário – C#.NET
ADO.NET
DataSet
DataTable
DataColumn
DataRow
DataGrid
Principais características:
Um sucessor do ADO mais flexível
ESTCB
- IPCB
Um conjunto de classes, interfaces, estruturas e enumerações que gerem o acesso a dados dentro do framework
Não estruturados;
Estruturados, não-hierárquicos
Ficheiros CSV (Com ma Separated Value), Folhas Microsoft Excel, Ficheiros, o Microsoft
Exchange, o..
Hierárquicos
Cenários Conectados
Um cenário conectado é aquele no qual os utilizadores estão permanentemente
ligados à bases de dados
Vantagens:
É mais fácil exercer segurança ao nível do ambiente;
A concorrência é mais fácil de controlar;
Os dados estão mais actualizados que nos outros cenários;
Desvantagens
É necessário haver uma ligação constante ao servidor;
Escalabilidade;
1. Abrir ligação
2. Executar comando
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT cod, descricao FROM detalhes WHERE zona=42 “;
SqlDataReader reader = cmd.ExecuteReader();
4. Fechar reader
if(!reader.IsClosed)
reader.Close();
ESTCB - IPCB 7
5.Departamento
Fechar ligação
de Engenharia Informática Projecto de Sistemas Industriais, Carlos Alves - 2006/07
C# - ADO.NET
Cenários Desconectados
Num ambiente desconectado, um sub-conjunto de dados pode ser copiado e
modificado independentemente e mais tarde as alterações podem ser
introduzidas de novo na base de dados
Vantagens
Pode-se trabalhar a qualquer altura e pode-se efectuar uma ligação à base de dados
apenas quando necessário;
Outros utilizadores podem usar os recursos;
Este tipo de ambientes aumenta a escalabilidade e desempenho das aplicações;
Desvantagens
Os dados nem sempre estão actualizados;
Podem ocorrer conflitos de dados que têm que ser resolvidos;
1. Abrir a ligação
SqlConnection conn = new SqlConnection("SERVER=SQLSERVER; INTEGRATED SECURITY = TRUE; INITIAL
CATALOG=ISEP");
conn.open();
2. Preencher o DataSet
System.Data.DataSet ds = new System.Data.DataSet(); System.Data.Sql.sqlDataAdapter da =
new System.Data.Sql.SqlDataAdapter();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM [DETALHES]";
cmd.Connection = conn;
da.SelectCommand = cmd;
da.Fill(ds);
3. Fechar a ligação
conn.Close() ;
4. Processar o DataSet
foreach(DataRow r in ds.Tables[O] .Rows)
r ["preco"] = r[preco] * 1.05;
5. Abrir a ligação
conn.Open() ;
6. Actualizar a fonte de dados
System.Data.Sql.SqlDataAdapter da = new System.Data.Sql.SqlDataAdapter(
"SELECT * FROM [DETALHES]", conn); System.Data.Sql.SqlCommandBuilder cb =
new System.Data.Sql.SqlCommandBuilder(da);
da.Update(ds) ;
7. Fechar a ligação
conn.Close() ;
Namespaces necessários
// Definir uma ligação a um fornecedor do tipo OLEDB para Access OleDbConnection conn = new
OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0iData Source= C:\DSN\Teste.mdbiPersist Security
Info=False");
//Abrir a ligação
conn.Open();
//Definir um novo comando do tipo OLEDB
OleDbCommand cmd = new OleDbCommand();
//Colocar o texto do comando
cmd.CommandText = "SELECT NOME FROM PESSOA WHERE NUMERO = ?“;
//Indicar ao comando qual é a ligação que vai usar
cmd.Connection = conn;
//Definir um parametro do tipo inteiro para conter o "Número" OleDbParameter parm =
cmd.Parameters.Add(new OleDbParameter("@Numero", OleDbType.Integer));
//Colocar o valor do parametro "Número". Quero saber o nome do cliente cujo código é 1...
cmd.Parameters["@Numero"] .Value=l;
//Executar o comando que só irá retornar um valor
//Converter o resultado numa string
//Colocar o valor de retorno na respectiva caixa de texto
txtNome.Text = cmd.ExecuteScalar() .ToString();
//Fechar a ligação
conn.Close();
//Definir uma ligação a um fornecedor do tipo OLEDB para Access OleDbConnection conn = new
OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\DSN\Teste.mdb;Persist Security
Info=False");
//Abrir a ligação
conn.Open() ;
//Definir um novo comando do tipo OLEDB
OleDbCommand cmd = new OleDbCommand();
//Colocar o texto do comando
cmd.CommandText = "SELECT NOME FROM PESSOA";
//Indicar ao comando qual é a ligação que vai usar
cmd.Connection = conn;
//Definir um DataReader para ler os dados
//DataReader = forward only, read only. Muito rápido.
//Executar o comando e associá-lo ao reader
OleDbDataReader reader = cmd.ExecuteReader();
//Percorrer o reader e colocar os valores
while(reader.Read())
cmbNomes.Items.Add(reader[O] .ToString());
//Se o reader não estiver fechado, fechar...
if( !reader.IsClosed )
reader.Close();
//Fechar a ligação
conn.Close() ;
Eventos
ESTCB - IPCB Projecto de Sistemas Industriais, Carlos Alves - 2006/07 14
Departamento de Engenharia Informática
C# - DataSet
Propriedades
CaseSensitive Controla se as comparações de strings são ou não sensíveis a Maiúsculas / Minusculas
Namespace Nome do namespace usado quando o Dataset grava ou carrega os dados para o XML
Prefix Prefixo do namespace usado quando o Dataset grava ou carrega os dados para o XML
Clone Cria um novo Dataset com o mesmo schema, mas sem dados
GetChanges Cria um novo Dataset com o mesmo schema, mas apenas com as linhas que foram modificadas
do Dataset original
Merge Carrega e sincroniza dados de outro Dataset, DataTable ou Array de DataRows para o Dataset
que chama o método.
Reset Faz um reset ao Dataset, de forma a que fique com estado original do Dataset
WriteXml Escreve o conteúdo do DataSet em XML, para um ficheiro, stream, TextReader ou XMLReader.
WriteXmlSchema Escreve o conteúdo do esquema do DataSet em XML Schema, para um ficheiro, stream,
TextReader ou XMLReader.
Os objectos Constraint são utilizados para manter a integridade dos dados. Uma
restrição de chave primária assegura que os valores numa coluna, tal como a
coluna de chave primária, são únicos. Uma restrição de chave forasteira
determina como os registos de uma tabela são afectados quando os registos
correspondentes duma tabela relacionada são alterados ou eliminados.
ESTCB - IPCB Projecto de Sistemas Industriais, Carlos Alves - 2006/07 20
Departamento de Engenharia Informática
C# - DataTable
Construtores
DataTable() Cria um novo DataTable
Eventos
ColumnChanged – Depois do conteúdo de uma coluna ser alterado
DataSet Dataset onde o DataTable está (null se não estiver associado a nenhums dataset)
DefaultView DataView por defeito
DesignMode Indica se o DataTable está em modo design
ExtendedProperties Colecção de propriedades dinâmicas
HasErrors Indica se há algum erro na tabela
Namespace Nome do namespace usado quando grava ou carrega os dados para o XML
Propriedades
Item Propriedade indexada que permite o acesso (ler e alterar) os valores da linha. Indice- nº
ordem da coluna; nome; referência ao DataColumn correspondente.
RowState Estado da linha. Valores possíveis: Added; Deleted; Detached (linha não pretence ainda
a um DataTable); Modified; Unchanged
BeginEdit – CancelEdit Inicia, Cancela ou Guarda (localmente) o processo de alteração dos dados da linha
– EndEdit
Delete Apaga a linha. Na realidade, a linha fica apenas marcada para apagar (RowState = Deleted)
GetChildRows Devolve um array de DataRows, para linhas dependentes da actual, com base numa
DataRelation
GetColumnsInError Array de DataColumns, com todas as colunas que têm erros nesta linha
GetParentRow Devolve um DataRow, para a linha “pai” da actual, com base numa DataRelation
GetParentRows Devolve um array de DataRows, para as linhas “pai” da actual, com base numa DataRelation
HasVersion Indica se a linha tem não uma determinada versão dos dados
SetParentRow Alterar a informação de erro da linha “pai”, com base numa DataRelatio
Find- Método da DataRowColection, que procura uma linha com base na sua chave
primária
Exemplos:
...
...
DataViewRowState Estado;
Estado = DataViewRowState.ModifiedOriginal | DataViewRowState.Deleted
DataRow[] Linhas = Tabela.Select(“”, “”, Estado);
//Devolve as linhas que foram modificadas ou apagadas.
/*
Adicionar GridColumnStyle e associar um nome
ao DataColumn na DataTable
Especificar o título da Coluna e o tamanho
*/
DataGridColumnStyle boolCol = new DataGridTextBoxColumn();
boolCol.MappingName = “Current”;
boolCol.HeaderText = “IsCurrent Customer”;
boolCol.Width = 150;
ts1.GridColumnStyles.Add(boolCol);