.NET
Ótimo material de apoio: https://www.caelum.com.br/apostila-csharp-orientacao-objetos/
C# (Linguagem)
Tipos primitivos
Declaração: tipo nomeDaVariavel = valor;
Exemplo: int numero = 1;
Tipos primitivos de variáveis:
- bool: true ou false
- byte: 0 a 255
- sbyte: -128 a 127
- short: -32768 a 32767
- ushort: 0 a 65535
- int: -2147483648 a 2147483647
- uint: 0 a 4294967295
- long: -9223372036854775808 a 9223372036854775807
- ulong: 0 a 18446744073709551615
- float: -3.40282347E+38 a 3.40282347E+38
- double: -1.7976931348623157E+308 a 1.7976931348623157E+308
- decimal: -79228162514264337593543950335M a 79228162514264337593543950335M
- char: caracteres delimitados por aspas simples. Exemplo: 'a', 'b', etc.
Para que aceitem null, existe o tipo Nullable, que pode ser escrito de duas formas:
int? meuNumero = null
ou Nullable<int> meuNumero = null
Constantes
São "variávels" que não mudam. Deve ter o nome da variável tudo em MAIÚSCULO.
const string URL = "http://asdasdasd.com";
Usando var
Podemos omitir a declaração do tipo da variável utilizando var
:
var meuNumero = 1;
var pessoa = new Pessoa();
Lembrando que uma vez que a variável recebe seu valor ao ser declarada com var
, o tipo não pode mudar.
var meuNumero = 3;
meuNumero = "2"; // ERRO
Coleções
Arrays
int[] numeros = new int[3];
// cria um array de 4 posições com os valores 1, 2, 3 e 14.
int[] numeros = { 1, 2, 3, 14 };
Listas
List<TipoDeDados>
: uma lista dinâmica de objetos.
List<int> listaDeNumeros = new List<int>();
listaDeNumeros.Add(1);
Dicionários
Dictionary<TipoDaChave,TipoDoValor>
: uma coleção, identificada por uma chave (semelhante ao HashMap).
Dictionary<int, string> listaDeChamada = new Dictionary<int, string>();
listaDeChamada.Add(1, "Megaman");
Estruturas de decisão e repetição
if
if(/* ... */)
{
//...
}
else if(/* ... */)
{
//...
}
else
{
//...
}
for
for(int i = 0; i < 10; i++)
{
//...
}
foreach
var listaDeNumeros = new List<int>();
foreach(int numero in listaDeNumeros)
{
//...
}
while
while(true)
{
//...
}
do while
do
{
// faz uma vez, segue fazendo enquando a condição for *true*
} while(true);
switch
int numero = 1;
switch(numero)
{
case 1:
//...
break;
case 2:
//...
break;
default:
break;
}
Operador ternário
bool ok = 1 == 1;
string texto = ok ? "Deu Ok" : "Deu !Ok";
Enum
public enum Tamanho
{
Pequeno,
Medio,
Grande,
Titanic
}
//...
Tamanho t = Tamanho.Medio;
Classes
Definição básica:
{visibilidade} class {nome-da-classe}
Exemplo:
public class NomeDaClasse
{
}
Onde {visibilidade}
pode ser:
public
: todos podem ver a classe.internal
: pode ser visto somente dentro da biblioteca.- omitido: vira internal.
Onde {nome-da-classe}
é o nome em PascalCase.
Métodos
Declaração básica: {visibilidade} {tipo-retorno} {nome} ({parametros})
Onde:
{visibilidade}
public
: todos podem chamar.private
: pode chamar somente dentro da classe.protected
: pode chamar somente dentro da hierarquia.internal
: pode chamar dentro da biblioteca.- sem modificador: por default, private.
{tipo-retorno}
: o tipo de retorno do método.{nome}
: nome do método em PascalCase{parametros}
: a lista de parâmetros, separados por virgula- Segue o padrão
{tipo} {nome}
, onde:{tipo}
: é o tipo do parâmetro.{nome}
: é o nome do parâmetro em camelCase
- Segue o padrão
Exemplos de Método:
public void Iniciar()
{
}
public int Somar(int numero1, int numero2)
{
return numero1 + numero2;
}
Propriedades
Em java provavelmente você faria assim:
public class Mago {
private String nome;
public String getNome() {
return this.nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
Em CSharp, as propriedades são: {visibilidade} {tipo} {nome} {acesso}
.
Onde:
{visibilidade}
public
: todos podem chamar.private
: pode chamar somente dentro da classe.protected
: pode chamar somente dentro da hierarquia.internal
: pode chamar dentro da biblioteca.
{tipo}
: é o tipo de valor da propriedade.{nome}
: é o nome da propriedade, em PascalCase{acesso}
: modificadores de acesso get e set.
Exemplos de Propriedade:
public class Arqueiro
{
// esta é uma propriedade com public get e public set.
public int Flechas { get; set; }
// esta é uma propriedade com public get e private set.
public int Flechas { get; private set; }
// esta é uma propriedade com somente get, retornando uma valor fixo.
public int Flechas
{
get
{
return 1;
}
}
}
DE-PARA Java -> CSharp
Propriedade com public get e public set:
// em java
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
// em C#
public string Nome { get; set; }
Propriedade com public get e private set:
// em java
private String nome;
public String getNome() {
return nome;
}
// em C#
public string Nome { get; private set; }
Propriedade que muda o valor no get, mas o set é normal
// em java
private String nome;
public void setNome(nome) {
this.nome = nome;
}
public String getNome() {
String novoNome = "...";
// faz alguma alteracão com a variável nome
return novoNome;
}
// em c#
private string nome;
public string Nome
{
get
{
string novoNome = "...";
// faz alguma alteracão com a variável nome
return novoNome;
}
set
{
this.nome = value;
}
}
Namespaces:
Semelhante ao package
do JAVA, indica o "endereço" de um conjunto de classes.
Uma classe deve pertencer à um endereço.
namespace Pacote.Utilitarios
{
public class GeradorDeLeroLero
{
public void FazNada()
{
}
}
}
As classes que estiverem no mesmo namespace podem usar as outras sem alteração.
Caso queira utilizar uma classe de outro pacote, precisamos utilizar um using
.
using Pacote.Utilitarios;
namespace OutroPacote
{
public class OutraClasse
{
public void FazAlgo()
{
// sem usar o using, podemos usar assim:
// var gerador = new Pacote.Utilitarios.GeradorDeLeroLero();
// com o using, podemos usar assim:
var gerador = new GeradorDeLeroLero();
gerador.FazNada();
}
}
}
Instâncias de objetos
public class Pessoa
{
public string Nome { get; set; }
}
...
Pessoa p1 = new Pessoa();
p1.Nome = "João";
...
var p2 = new Pessoa();
...
Pessoa p3;
p3 = new Pessoa();
Poliformismo
Classe abstrata
public abstract class Personagem
{
}
Contrutor
public class Guerreiro
{
public Guerreiro(int vida)
{
this.Vida = vida;
}
}
Herança de Classes
Para extender uma classe, usamos :
public class Guerreiro : Personagem
{
}
Interface
Para implementar uma interface, também usamos :
.
public interface IAeronave
{
// pode ter propriedades
int Altura { get; }
// pode ter metodos
void Voar();
}
// Implementando uma interface
public class CarroVoador : IAeronave
{
...
}
// Extendendo uma classe e implementando uma interface
// Primeiro vem a classe, depois as interfaces
public class CarroVoador : Carro, IAeronave
{
...
}
Sobrescrita de Métodos
Métodos virtual
permitem a sobrescrita, sem ele não é possível.
Métodos abstract
obrigam o filho a implementar.
public abstract class Carro
{
// um método que não seja virtual não pode ser sobrescrito no filho.
public virtual void Andar()
{
// tem comportamento padrão...
}
// obriga o filho a implementar.
public abstract void Andar();
}
// Sobrescrevendo
public class Fusca : Carro
{
public override void Andar()
{
...
}
}
Sobrescrita de propriedades
Os mesmos modificadores (virtual
e abstract
) são aplicados às propriedades.
public abstract class Personagem
{
// obriga o filho a implementar
public abstract int Ataque { get; }
}
Linq/Lambda
ASP.NET MVC
É a implementação feita pela Microsoft do padrão MVC (Model-View-Controller). O Pattern MVC já existia há bastante tempo, ficou muito famoso através da linguagem Ruby, com o framework Ruby on rails. Ruby on rails é o MVC do Ruby. ASP.NET MVC é o MVC do .NET. Mas o conceito MVC já existia muito antes da Web.
O principal objetivo do MVC é separar a apresentação da regra de negócio. Muito diferente de como era no Web Forms.
No entanto o MVC ainda é apenas um pattern de apresentação! Normalmente há muitos outros patterns envolvidos em um projeto de um software.
Um servidor HTTP
Antes de entrar no workflow do MVC é importante entender como funciona um servidor Web e para isso é fundamental entender o funcionamento do HTTP.
HTTP
Hypertext Transfer Protocol, como o nome já diz, é um protocolo, o protocolo de comunicação pilar da Web. Dentro dele existem dois conceitos super importantes chamados de request e response, nos quais todos desenvolvedores Web deveriam entender. Para isso, dificilmente exista algum artigo mais explicativo do que esse.
Agora sim, M-V-C:
Vamos criar nosso primeiro projeto e mergulhar um pouco mais a fundo em cada um desses conceitos.
Convention over Configuration
Busca por views
Quando a Controller retornar uma View sem especificar seu nome, a engine do MVC tentará procurar uma View com o mesmo nome da Action. Ou seja:
public class ExemploController : Controller
{
public ActionResult Teste()
{
return View();
}
}
O primeiro lugar que a engine irá procurar será:
~/Views/Exemplo/Teste.cshtml
Também irá procurar na pasta compartilhada (Shared):
~/Views/Shared/Teste.cshtml
Caso queira retornar uma view que fuja dessas convenções basta referenciar o caminho completo até ela:
return View("~/Views/Produto/Cadastro.cshtml");