csharp fundamentals

32
Documentos diversos Takenet C# Fundamentals Data: 12/07/2013

Upload: breno-queiroz

Post on 08-Jul-2015

395 views

Category:

Technology


0 download

DESCRIPTION

Treinamento na Take.Net

TRANSCRIPT

Page 1: Csharp fundamentals

Documentos diversos

Takenet

C# Fundamentals

Data: 12/07/2013

Page 2: Csharp fundamentals

Sumário

2

• Value Type, Reference Type

• Stack, Heap

• Box, unboxing

• Collections

• IDisposable (Using)

• Exceptions - throw ex vs throw

Page 3: Csharp fundamentals

O que é?Value Type e Reference Type

3

Page 4: Csharp fundamentals

Value Type

• Quando uma instância value type é criada, um único espaço na memória é alocado para armazenar o valor.

Tipos primitivos como int, float, bool, char e structs são value type. Em tempo de execução quando trabalhamos com value type, estamos lidando diretamente com os dados e isso pode ser muito eficiente.

4

Page 5: Csharp fundamentals

Reference Type

• Quando uma instância reference type é criada, um espaço na memória é alocada com o endereço da memoria(ponteiro) onde os dados estão.

Classes, qualquer Array mesmo que seus membros sejam value type, string e delegates são reference type.

5

Page 7: Csharp fundamentals

Stack e HeapParte 2

7

Page 8: Csharp fundamentals

Stack e Heap

• A memória da aplicação é a porção da memória do computador alocado pelo sistema operacional para rodar a aplicação. Esta memória pode ser alocada em duas partes stack e heap.

• A categoria do tipo de dados determina como ele será alocado na memória.

8

Page 9: Csharp fundamentals

Stack e Heap

• O que vai para a Stack e Heap?

9

Type Onde

Value Type Sempre vão para onde eles foram declarados.

Reference Type Sempre vai para a Heap

Page 10: Csharp fundamentals

Stack

• A CPU organiza a memória da Stack de forma muito eficiente, leitura e escrita para empilhar/desempilhar variáveis são extremamente rápidas.

• Variaveis são alocadas e liberadas automaticamente.

• Stack é uma estrutura de dados “FILO” (First in, last out).

• Cada vez que uma função declara uma nova variável, ela é empilhada na Stack. Cada vez que uma função termina, todas as variáveis empilhadas na Stack por esta função, são liberadas.

10

Memória da aplicação

Stack Heap

Idade: 0

Page 11: Csharp fundamentals

Heap

• A Heap é uma região de memória do seu computador que não é gerenciado “automaticamente” para você, a heap tem que se preocupar com coleta de lixo ae que entra o famoso GC - Garbage collector que é responsável por manter a Heap limpa.

11

Memória da aplicação

Stack Heap

person: null

Page 12: Csharp fundamentals

Heap

• Se tentarmos acessar person.Idade vai ocorrer a Exception System.NullReferenceException: Object reference not set to an instance of an object.

12

Memória da aplicação

Stack Heap

person: null

Page 13: Csharp fundamentals

Heap

• Após criamos uma instância do objeto a nossa memória ficara assim:

13

Memória da aplicação

Stack Heap

person: 123 123: Idade | 25

Page 14: Csharp fundamentals

Box/unboxingParte 3

14

Page 15: Csharp fundamentals

Box/Unboxing

• Boxing é o processo de conversão de um value type para o tipo object.

• No exemplo a seguir, a variável de inteiro i é boxed e atribuído ao objeto o.

• O objeto o pode então ser unboxed e atribuída a variável inteiro i:

15

Page 16: Csharp fundamentals

Box/Unboxing

• É melhor evitar o seu uso em situações com um alto número de box/unboxing, por exemplo, em classes de coleções não genéricas.

• Você pode evitar boxing usando coleções genéricas, como System.Collections.Generic.List<T>.

• O processo de Boxing pode levar até 20 vezes mais do que uma atribuição de referência simples.

16

Page 17: Csharp fundamentals

CollectionsParte 4

17

Page 18: Csharp fundamentals

Collections

• O namespace System.Collections.Generic deve atender a 99% das suas necessidades.

• Coleções Associativas

Coleções associativas armazenam um valor na coleção, fornecendo uma chave que é usado para adicionar / remover / procurar o item. Assim, a coleção associa o valor com a chave. Essas coleções são mais úteis quando você precisa pesquisar / manipular uma coleção usando um valor de chave. Por exemplo, se você quiser procurar um pedido em uma coleção de pedidos por um ID de pedido, você pode ter uma coleção associativo onde a chave é o id do pedido e o valor é o pedido.

18

Page 19: Csharp fundamentals

Collections

• O Dictionary<TKey,TValue> é provavelmente a classe de coleções associativas mais utilizada. O Dictionary<TKey,TValue> é a classe mais rápida para pesquisas / inserções / exclusões, porque ele usa uma tabela hash debaixo das cobertas. Como as chaves são hash, o tipo da chave deve implementar corretamente GetHashCode () e Equals () ou você deve fornecer um IEqualityComparer externo na construção do dicionário.

• Complexidade constante O(1) , o que significa que não importa quão grande o dicionário fica, o tempo que leva para encontrar algo permanece relativamente constante. Isto é altamente desejável para pesquisas de alta velocidade.

19

Page 20: Csharp fundamentals

Collections

• O SortedDictionary<TKey,TValue> é semelhante ao Dictionary mas muito diferente na execução. Usa uma árvore binária debaixo das cobertas para manter os itens em ordem pela chave, o tipo da chave deve implementar corretamente IComparable para que as chaves possam ser classificadas.

• Usar quando precisar ter pesquisa rápidas e manter o Dictionary em ordem pela chave.

• Complexidade O (log n) para inserção/remoção/pesquisa, com o tempo logarítmica, você pode dobrar o tamanho da coleção e só tera de realizar uma comparação extra para encontrar o item.

20

Page 21: Csharp fundamentals

Collections

• O SortedList<TKey,TValue> como o SortedDictionary usa a chave para ordena seus itens. No entanto, os itens em um SortedList são armazenados como um array.

• Usa menos memoria que o SortedDictionary

• Inserções e deleções são lineares O (n), porque apagar ou adicionar um item pode implicar a transferência de todos os itens para cima ou para baixo na lista. Pesquisas são O(log n).

• Usar quando quiser manter os itens em ordem e tiver poucas inserções/remoção.

• Indexação de matriz é mais rápido do que seguir os links dos objetos, ou seja, as pesquisas são mais rápidas que um SortedDictionary.

21

Page 22: Csharp fundamentals

Collections

• Coleções não associativas

Não usam uma chave para manipular a coleção, usam outros meios para manipular a coleção, como o indice.

• List<T> é uma série de itens que crescem uma vez que sua capacidade é ultrapassada. Porque os itens são armazenados de forma continua ,como uma matriz, você pode acessar os itens na lista por índice muito rapidamente. No entanto inserção e remoção no início ou no meio da lista são muito caros porque você deve mudar todos os itens para cima ou para baixo.

• Adição e remoção no fim de uma lista é uma operação constante O(1) e para os outros casos O(n).

22

Page 23: Csharp fundamentals

Collections

• LinkedList<T> é uma implementação básica de uma lista duplamente ligada. Isso significa que você pode adicionar ou remover itens no meio de uma lista ligada muito rapidamente (porque não há itens para mover para cima ou para baixo na memória), mas você também perde a capacidade de buscar os itens pelo índice de posição rapidamente. Na maioria das vezes, tendemos a favorecer List <T> sobre LinkedList <T> a menos que você esteja fazendo um monte de adição e remoção na coleção, caso em que a LinkedList <T> pode fazer mais sentido.

23

Page 24: Csharp fundamentals

Collections

• HashSet<T> fornece operações de conjunto de alto desempenho. Um conjunto é uma coleção que não contém elementos duplicados, e cujos elementos estão em nenhuma ordem particular.

• Parece com o Dictionary<TKey,TValue>.

• HashSet <T> é útil para pesquisas super rápidas onde a ordem não é importante. Mais uma vez, como no dicionário, o tipo deve ter uma implementação válida de GetHashCode () e Equals (), ou você deve fornecer um IEqualityComparer adequada ao HashSet <T> em construção.

24

Page 25: Csharp fundamentals

Collections

• Stack<T> e Queue<T>, o Stack<T> é um LIFO(last-in-first-out) onde os itens são adicionados e removidos do topo da pilha. O Queue<T> é um FIFO(first-in-first-out) onde os itens são adicionados no final da fila e remove os itens do começo.

• Exemplo do uso da Stack seria empilhar as ações e, em seguida, ser capaz de desfazer as ações em ordem inversa, conforme necessário.

• Exemplo do uso da Queue: Você precisa processar os itens na ordem em que eles vieram, como um gerenciador de impressão ou filas de espera. onde você precisa para processar os itens na ordem em que eles vieram, como o gerenciador de impressão ou filas de espera

25

Page 26: Csharp fundamentals

Collections

• Essas coleções são otimizados para uso em situações em que multi-threaded é desejado:

• ConcurrentQueue

• ConcurrentStack

• ConcurrentDictionary

• ConcurrentBag (Suporta dados duplicados)

26

Page 27: Csharp fundamentals

IDisposableParte 5

27

Page 28: Csharp fundamentals

IDisposable

• O Garbage Collector (Coletor de Lixo) automaticamente libera a memória alocada para um objeto gerenciado quando este objeto não está mais em uso. No entanto, não há como prever quando o Garbage Collector irá realizar a coleta do lixo. Além disso, o garbage collector não tem conhecimento dos recursos não gerenciados.

• Usamos o método Dispose desta interface para liberar explicitamente recursos não gerenciados.

28

Page 29: Csharp fundamentals

IDisposable

• Ao chamar uma classe que implementa a interface IDisposable, podemos usar o try/finally para certificar-se que os recursos são descartados mesmo se uma exceção interromper sua aplicação.

• Observe que você pode usar a instrução using em vez do try/finally.

• Ambas as abordagens são essencialmente a mesma coisa, a única diferença é que, na primeira abordagem, temos de liberar o recurso explicitamente, e na segunda abordagem a liberação de recursos é feita automaticamente. using é a maneira recomendada porque evita que os programadores esqueçam de fazer.

29

Page 30: Csharp fundamentals

throw vs throw exParte 6

30

Page 32: Csharp fundamentals

throw vs throw ex

32

• throw só pode ser usado dentro do escopo de um bloco catch, porque precisa garantir que existe uma exceção.

• throw {Exception} permite que você forneça uma nova exceção e pode ser usada em qualquer lugar.

• Somente throw pode ser usado para relançar a exceção atual dentro de um catch vazio.

• Ambos relançam o objeto de exceção atual, mas “throw e” redefine alguns parâmetros como o StackTrace.