Framework.NET (2/2) Introdução ao Visual Studio.NET Criação de Aplicações Móveis em C# Aula 1 ASP.NET Construído sobre as bibliotecas de classes da framework.net; Fornece um modelo de aplicações web através de um conjunto de controlos e de uma infra-estrutura que permite a criação fácil de aplicações web; Inclui controlos que encapsulam elementos HTML comuns (caixas de texto, caixas de selecção, etc); Permite definir serviços web apoiados na mesma infraestrutura (web services); Computação Móvel Pedro Sousa Pedro Sousa - INESC-ID / IST 5 Sumário Visual Studio.NET Plataforma.NET Características Gerais Framework.NET Introdução à linguagem C# C# vs. C++, C# vs. Java Compact Framework.NET A Linguagem C# Introdução Linguagem de eleição em.net Linguagem orientada a objectos: Muito semelhante a Java/C++; É fácil começar a programar em C#. Sistema unificado de tipos Tudo pode ser visto como um objecto Suporte directo à Programação Baseada em Componentes Propriedades, Eventos e Atributos Assemblies Pedro Sousa - INESC-ID / IST 2 Pedro Sousa - INESC-ID / IST 6 Plataforma.NET Características Gerais A Linguagem C# Exemplos (1/2) Desenvolvimento de aplicações web ASP.NET, web services, aplicações desktop e aplicações móveis. Permite programar em várias linguagens sobre mesma framework, utilizando o mesmo IDE. (Full) Framework.NET Aplicações WinForms / Web Forms / Web Services Compact Framework.NET Desenvolvimento de aplicações para PDAs, Smartphones, outros dispositivos baseados em Windows CE.NET using System; public class HelloWorld public static void Main(string[] args) Console.WriteLine("Hello World!"); Linguagem case-sensitive Instrução termina com ; Métodos estão dentro de classes Importação de outros namespaces com using Pedro Sousa - INESC-ID / IST 3 Pedro Sousa - INESC-ID / IST 7 Framework.NET (1/2) A Linguagem C# Exemplos (2/2) CLR Common Language Runtime Gestão da alocação de memória e garbage collection; Iniciar e terminar threads e processos; Gestão de políticas de segurança; Gestão de dependências de outros componentes Especificação aberta (portável para outros SOs). Bibliotecas de classes unificadas Fornece ao programador bibliotecas de classes orientadas a objectos, hierárquicas e extensíveis, utilizáveis em qualquer linguagem suportada pela framework; Permite ter herança, tratamento de erros e depuração entre linguagens diferentes. public class Pessoa private string Nome; private int Idade; public Pessoa(string nome, int idade) this.nome = nome; this.idade = idade; public void MostraInfo() Console.WriteLine("0, tem 1 anos", Nome, Idade); Pessoa Cliente = new Pessoa("Carlos", 25); Cliente.MostraInfo(); Pedro Sousa - INESC-ID / IST 4 Pedro Sousa - INESC-ID / IST 8
C# Tudo é um objecto (1/3) Boxing e unboxing: int val = ; object obj = val; int k = (int) obj; // k fica c/ valor C# Controlo de Execução (2/2) foreach Iterar sobre valores contidos em objectos que implementem a interface IEnumerable Enquanto decorre a iteração a lista e o elemento actual são apenas de leitura. val obj System.Int32 Boxing int[] tabela = 1, 2, 3; foreach (int i in tabela) Console.WriteLine("0", i); k Unboxing Pedro Sousa - INESC-ID / IST 9 Pedro Sousa - INESC-ID / IST 13 C# Tudo é um objecto (2/3) C# Sistema de Tipos Fim das classes de wrapping: String string Nome; C# Hashtable ht = new Hashtable(); ht.add(1, "Xpto"); ht.add(2, "Xpti"); Object Array Class Enum int[] tabela; class Pessoa... enum Estado Ligado, Desligado Java Hashtable ht = new Hashtable(); ht.put(new Integer(1), "Xpto"); ht.put(new Integer(2), "Xpti"); ValueType Struct bool byte char short sbyte ushort struct Ponto int x; int y; decimal float int uint decimal conta; double long ulong Pedro Sousa - INESC-ID / IST Pedro Sousa - INESC-ID / IST 14 C# Tudo é um objecto (3/3) Tudo deriva de System.Object Métodos: Equals GetType ToString Finalize MemberwiseClone GetHashCode C# Passagem de Parâmetros (1/2) ref passagem de value types por referência:... char c = 'c'; g(ref c); out passagem de value types não inicializados por referência:... int x; f(out x); Pedro Sousa - INESC-ID / IST 11 Pedro Sousa - INESC-ID / IST 15 C# Controlo de Execução (1/2) if, for, do, while, switch, foreach... switch sem fall-through (excepto se for explícito): switch(value) case 0: i += 3; goto case 1; case 1: i -= 27; goto case 2; case 2: i = j; break; Mas switch(value) case 0: case 1: case 2: i += j; break; está correcto. C# Passagem de Parâmetros (2/2) params passagem de n.º variável de parâmetros public static void Main() UseParams(1, 'a', "test"); int[] myarray = new int[3], 11, 12; UseParams(myarray); public static void UseParams(params object[] list) for (int i=0; i < list.length; i++) Console.WriteLine(list[i]); Console.WriteLine(); Pedro Sousa - INESC-ID / IST 12 Pedro Sousa - INESC-ID / IST 16
C# Herança (1/3) Os métodos não são virtuais por omissão public class Pessoa private string Nome; private int Idade; public Pessoa(string nome, int idade) this.nome = nome; this.idade = idade; public virtual void MostraInfo() Console.WriteLine("0, tem 1 anos", Nome, Idade); C# Redefinição de Operadores (1/2) Em C# é possível redefinir os operadores existentes Lista A = new Lista(); Lista B = new Lista(); A.Add(1); A.Add(2); B.Add(3); B.Add(4); Lista C = A + B; // Junta ambas as listas Pedro Sousa - INESC-ID / IST 17 Pedro Sousa - INESC-ID / IST 21 C# Herança (2/3) C# Redefinição de Operadores (2/2) public class Empregado : Pessoa private string Empresa; public Empregado(string nome, int idade, int empresa) : base(nome, idade) this.empresa = empresa; public override void MostraInfo() base.mostrainfo(); Console.WriteLine("Empresa: 0", Empresa); public class Lista private object[] Elementos; public static Lista operator+(lista a, Lista b) Lista resultado = new Lista(); // Copia os elementos de <a> e <b> para // a lista <resultado> return resultado; Pedro Sousa - INESC-ID / IST 18 Pedro Sousa - INESC-ID / IST 22 C# Herança (3/3) C# Unsafe Code public class Base void Xpto() Console.WriteLine("Base.Xpto()"); virtual void Xpti() Console.WriteLine("Base.Xpti()"); public class Derivada : Base new void Xpto() Console.WriteLine("Deriv.Xpto()"); override void Xpti() Console.WriteLine("Deriv.Xpti()"); O C# suporta elementos avançados, como a utilização de ponteiros Sempre que são utilizados estes elementos, o código tem de ser colocado dentro de um contexto unsafe int total = 0; unsafe int* ptr = &total; *ptr = ; Derivada d = new Derivada(); d.xpto(); // Resulta em "Deriv.Xpto()" d.xpti(); // Resulta em "Deriv.Xpti()" Base dref = d; dref.xpto(); // Resulta em "Base.Xpto()" dref.xpti(); // resulta em "Deriv.Xpti()" public unsafe void FastCopy(byte* dst, byte* src, int count) for (int i=0; i<count; i++) *dst++ = *src++; Pedro Sousa - INESC-ID / IST 19 Pedro Sousa - INESC-ID / IST 23 C# Interfaces C# vs. Java interface ILeitorCD void TocaCD(CD cd); public class Aparelhagem : ILeitorCD void TocaCD(CD cd) public class Computador : ILeitorCD void TocaCD(CD cd) CD GreatestHits = new CD(); Aparelhagem sony = new Aparelhagem(); Computador pc = new Computador(); ILeitorCD leitor; leitor = sony; leitor.tocacd(greatesthits); leitor = pc; leitor.tocacd(greatesthits); Só há um Main Várias classes num ficheiro namespaces em vez de packages goto Redefinição de operadores Enumerações Value types e Boxing Código inseguro (unsafe) ref serve para passar por referência Pedro Sousa - INESC-ID / IST 20 Pedro Sousa - INESC-ID / IST 24
Documentação em XML (1/2) Compact Framework.NET (2/2) /// <summary> /// Este método calcula o ordenado de uma pessoa, /// baseado nos seus dias de trabalho. /// </summary> /// /// <param name="diastrabalho"> /// O número de dias que trabalhou. /// </param> /// /// <returns>o salário da pessoa.</returns> public int CalculaOrdenado(int diastrabalho) Ligação com o SQL Server CE 2.0 através de ADO.NET Não disponível para smartphones Desenvolvimento suportado pelo mesmo IDE, com possibilidade de depuração e de execução de código no dispositivo real ou num simulador. A maior parte do desenvolvimento para dispositivos móveis é feito utilizando o simulador. O restante desenvolvimento, feito no dispositivo, é usado para verificar/confirmar o comportamento no dispositivo real ou para poder utilizar acessórios não disponíveis no simulador (e.g. câmaras fotográficas incorporadas). Pedro Sousa - INESC-ID / IST 25 Pedro Sousa - INESC-ID / IST 29 Documentação em XML (2/2) OpenNETCF.org SDF Smart Device Framework Conjunto de bibliotecas que complementam as existentes na.net Compact Framework Inclui APIs próprias de dispositivos móveis e alguns controlos extra que não estão incluídos na.net CF Estado da bateria, envio SMS, API de notificações, API para Bluetooth, API para receptores GPS, etc. Gerador do.net Ferramenta NDoc (open source) Pedro Sousa - INESC-ID / IST 26 Pedro Sousa - INESC-ID / IST 30 C# Acesso a APIs Nativas Na arquitectura.net podem invocar-se métodos em código nativo, através da declaração da assinatura dos métodos unmanaged. Exemplo: [DllImport("coredll.dll")] public static extern unsigned int GetTickCount(); Especialmente útil na Compact Framework, onde grande parte das APIs dos dispositivos não existem em código managed Procurar a funcionalidade pretendida noutras bibliotecas (e.g. SDF) antes de desenvolver! Outros Recursos (1/2) Newsgroups da Microsoft, acessíveis através do Google Groups ou do site da Microsoft: dotnet.framework.compactframework microsoft.public.dotnet.framework Sites: http://www.codeproject.com/netcf/ Artigos e projectos de exemplo http://www.opennetcf.org Fóruns de discussão e bibliotecas de classes open-source Pedro Sousa - INESC-ID / IST 27 Pedro Sousa - INESC-ID / IST 31 Compact Framework.NET (1/2) Permite desenvolver aplicações para dispositivos móveis PDAs (plataforma PocketPC), smartphones, dispositivos baseados em Windows CE.NET Versão reduzida da framework para desktop Apenas cerca de 25% das classes está disponível Não existe acesso através de código managed ao Pocket Outlook (contactos, agenda) nem às APIs específicas do dispositivo Sistema de notificações, estado da bateria, SMS Outros Recursos (2/2) Livro de introdução à linguagem C#: Microsoft Visual C#.NET Step by Step Version 2003 John Sharp Microsoft Press, 2003. ISBN 0735619093. Livros sobre a Compact Framework.NET:.NET Compact Framework Programming with C# Paul Yao Addison-Wesley, 2004. ISBN 0-3211-7403-8. The Definitive Guide to the.net Compact Framework Dan Fergus APress, 2003. ISBN 1-5905-9095-3. Microsoft.NET Compact Framework Core Reference Andy Wigley Microsoft Press, 2003. ISBN 0-7356-1725-2. Pedro Sousa - INESC-ID / IST 28 Pedro Sousa - INESC-ID / IST 32
Visual Studio IDE Elementos Gerais Ambiente de desenvolvimento com as ferramentas habituais de desenvolvimento (depuração, gestão de ficheiros de projecto, etc.). Soluções Elementos agregadores que contêm um ou mais projectos relacionados / dependentes entre si. Projectos Contêm os vários itens (referências, ligações de dados, pastas e ficheiros) relacionados com a aplicação ou biblioteca que está a ser desenvolvida. Pedro Sousa - INESC-ID / IST 33 Exercício 1 Abra o Visual Studio.NET Crie um novo projecto em C# do tipo Smart Device Application chamado Exercicio1 No ecrã seguinte escolha a plataforma Windows CE.NET, e o tipo de aplicação Windows Application Crie uma aplicação Hello World Use o método Show da classe MessageBox, para mostrar uma caixa de diálogo no evento OnLoad do form principal Pedro Sousa - INESC-ID / IST 34 Exercício 2 (1/2) Crie um novo projecto C# (SDA, WinCE.NET) do tipo Windows Application Adicione um novo ficheiro de classes (.cs) Defina a interface IListaNomes, que deverá incluir interfaces para: Adicionar um novo nome à lista de nomes Retornar a listagem de todos os nomes presentes na lista de nomes, sob a forma de uma cadeia de caracteres Limpar o conteúdo da lista de nomes (continua ) Pedro Sousa - INESC-ID / IST 35 Exercício 2 (2/2) Crie uma classe que implemente IListaNomes e crie uma instância dessa classe no seu Windows Form; Utilize a classe ArrayList para guardar os nomes Construa o Windows Form de forma a utilizar todas as funcionalidades fornecidas pela interface IListaNomes; Coloque breakpoints em cada método da classe e verifique que cada método da mesma é chamado e executado correctamente. NOTA Se o projecto for criado na mesma solução do exercício anterior, deve-se seleccionar o novo projecto com o botão direito do rato e seleccionar Set as Startup Project, para que o projecto a ser executado aquando do comando Start (F5) seja o novo projecto e não o do Exercício 1. Pedro Sousa - INESC-ID / IST 36