Fernando Amaral
Visual Studio 2005: O ambiente e as linguagens (VB.NET E C#)

 

Visual Studio 2005: O ambiente e as linguagens (VB.NET E C#)

Nesta seção vamos ver os principais compontentes da IDE do VS 2005.

A esquerda, por padrão oculta, existe a Barra de Ferramentas, onde ficam agrupados por categoria os compontes padrão do VS ou de terceiros instalados no ambiente. Para instalar um novo componente, basta clicar com o botão direito sobre a barra e selecionar Choose Itens. Você pode também personalizar a sua barra de ferramentas da maneira que achar melhor.

A direita temos o Solution Explorer, que permite uma navegação rápida entre os arquivos de um projeto ou solução.

Abaixo, a janela de propriedades, permite configurar as propriedades de um controle ou de um formulário, bem como acessar eventos.

Entre as principais novidades do ambiente temos as notificações de status da linha através de cores: Uma nova linha de código ou código alterado é marcado como amarelo. Se a linha já foi salva sua cor muda para verde.

Outra novidade são os Snippets: pedaços de código pré fabricados para executar uma tarefa especifica. Tudo bem que isso não é uma grande novidade e já foi utilizada em outras IDEs por aí a fora, mas com certeza o recurso esta melhor do que nunca e poderá lhe ajudar a poupar bastante trabalho. Para inserir um Snippet basta chama-lo no menu rápido sobre a área de código. Obviamente que você também poderá criar seus proprios snippets.

SINTAXE: VISUAL BASIC .NET e C#

Vamos introduzir os principais aspectos d a sintaxe de programação do VB.NET e do C#. Este não será um estudo completo ou abrangente, para tal procure bibliografia específica.

Lembre-se sempre que o C# diferencia entre caracteres maisculos e minusculos, o VB.NET não.

Você já deve ter encontrado discussões ardentes na internet sobre C# ser melhor que VB.NET e vice-versa. A verdade que conhecendo os fundamentos da plataforma sabemos que o resultado é exatamente igual.

Comentários

No C# comentário de linha são feitos com duas barras. Comentários em bloco são aberto com \* e fechados com *\.

No VB.NET Comentários são inseridos com aspas simples no inicio da linha. O VB.NET não permite o comentário de blocos de código, a solução é comentar linha a linha. Porém o Visual Studio possui em sua barra de ferramentas padrão o

comando Comment out the selected lines que comenta um bloco de código

selecionado e Uncomment the selected lines que remove os comentários, a utilização é simples e intuitiva, e funcina em ambas as linguagens

‘este é um comentário válido

Dim i as Integer ‘esta também é um comentário válido

//este é um comentário válido

int x = 3;

/* este também é

um comentário válido */

Você ainda pode criar comentários no VB.NET utilizando Rem.

No Visual Studio 2005 também é possível documentas seu código sem a necessidade de instalar qualquer plug-in9, basta adcionar três aspas (vb.net) ou tres barras (C#) antes do procedimento. O VS automaticamente preenche o esqueleto do documento. Observe o exemplo abaixo:

''' <summary>

''' Função para somar dois números

''' </summary>

''' <param name="x">Primeiro número a somar</param>

''' <param name="y">Segundo número a somar</param>

''' <returns>Resultado da soma</returns>

''' <remarks>By Fulano</remarks>

Public Function Somar(ByVal x As Integer, ByVal y As Integer) _

As Integer

Dim z As Integer

z = x + y

Return z End Function

/// <summary>

/// Função para somar dois números

/// </summary>

/// <param name="x">Primeiro número a somar</param>

/// <param name="y">Segundo número a somar</param>

/// <returns>Resultado da soma</returns>

int Somar(int x, int y)

{

int z;

z = x + y;

return z; }

O VS ainda pode gerar um diagrama de sua classe, basta clicar com o botão direito sobre o arquivo, e selecionar View Class Diagram

Tipos de Dados

Sendo o .NET um framework, não existem tipos de dados desta ou daquela linguagem. Os tipos são todos do .NET. Obviamente que existem diferenças de sintaxe na declaração e manipulação destas variaveis. Abaixo segue uma relação dos principais tipos de dados, para uma relação completa consulte a documentação do VS 2005:

Boolean - Verdadeiro ou falso

Char - caractere unicode de 16 bit

String - String

Byte - inteiro de 8 bit, sem sinal

UInt16 - inteiro de 16 bit, sem sinal

UInt32 - inteiro de 32 bit, sem sinal

UInt64 - inteiro de 64 bit, sem sinal

Int16 - inteiro de 16 bit, com sinal

Int32 - inteiro de 32 bit, com sinal

Int64 - inteiro de 64 bit, com sinal

SByte - - inteiro de 8 bit, com sinal

DateTime - data e hora

Decimal - número decimal

Double - número de ponto flutuante com 64 bit

Single - número de ponto flutuante com 32 bit

Um valor nulo em VB.NET é representado por NOTHING, em C# por null.

O tipo Int32 pode ser representado no VB.NET por Integer e int no C#.

Operadores

VB.NET

C#

And

&

Or

|

XOr

^

Not

!

Is Nothing

== null

<>

!=

&

+

\

/

\=

/=

Mod

%

=

==

Variaveis e Constantes

No VB.NET para declarar uma variável usamos a palavra DIM, seguido pelo nome da variável e tipo:

Dim i as Integer

 

A sintaxe do C# é semelhante ao do C++:

int z;

Podemos ainda declara diversas variaveis de um mesmo tipo numa unica declaração:

Dim i,j,k as Integer

int x, y, z;

Ou ainda variaveis de diferentes tipos:

Dim i,m as Integer, j,k as Single

int i, m; Double j,k;

Obviamente i e m serão do tipo inteiro, e j e K do tipo single.

É possível ainda incializar a variável na sua declaração:

Dim i as Integer = 1

int z = 1;

Para declarar uma constante utilizamos a declaração Const:

Const x as integer = 1

const int x = 1;

Enumeradores

Para declarar um enumerador usamos a declaração Enum

Public Enum Semana

Domingo

Segunda

Terça

Quarta

Quinta

Sexta

Sabado End Enum

enum Semana { Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sabado };

Você opcionalmente pode inicializar cada menbro, se você não o fizer, o primeiro menbro será inicializado com zero e assim sucessimvamente.

Enum Semana

Domingo = 1

Segunda = 2

Terça = 3

Quarta = 4

Quinta = 5

Sexta = 6

Sabado = 7 End Enum

enum Semana { Domingo = 1, Segunda =2, Terça =3, Quarta =4, Quinta =5, Sexta =6, Sabado =7 };

Coleções

Poderíamos dedicar um longo capítulo ao estudo de coleção, sendo nosso objetivo fazer uma introdução a parte de sintaxe, veremos apenas arrays:

Dim MeuArray(1) As String MeuArray(0) = "Um" MeuArray(1) = "Dois"

string[] MeuArray = new string[1]; arr[0] = "Um"; arr[1] = "Dois";

Ao contrário do legado VB, um array possui sempre índice iniciado em zero, portanto um array declarado com (1), terá duas posições.

Estruturas de decisão

O classico if não poderia faltar. A sintaxe é semelhante as suas linguagens legadas:

Dim Nome As String = "ASP.NET" If Nome = "VB.NET" Then

MessageBox.Show("Certo!") Else

MessageBox.Show("Errado!") End If

string Nome = "ASP.NET";

if (Nome == "C#")

{

MessageBox.Show("Certo!"); }

else {

MessageBox.Show("Errado!"); }

Obviamente que a intrução else é opcional.

Outra forma de controle de fluxo conhecido é o Select (VB.NET) ou Switch (C#):

Dim Nome As String = "VB.NET" Select Case Nome Case "VB.NET"

MessageBox.Show("Certo!") Case "C#"

MessageBox.Show("Errado!") Case Else

MessageBox.Show("?") End Select

string Nome = "C#";

switch (Nome){

case "VB.NET":

MessageBox.Show("Certo!");

break;

case "C#":

MessageBox.Show("Errado!");

break;

default:

MessageBox.Show("?");

break; }

Note que no C# devemos usar a palavra break para quebrar o fluxo

Laços

Vamos estudar três estruturas de laços: For, while e laços em coleções. O laço for tem a sintaxe semelhante em qualquer linguagem:

Dim i As Integer For i = 1 To 10

MessageBox.Show(CStr(i)) Next i

for (int i = 0; i < 10; i++)

MessageBox.Show(Convert.ToString(i));

A sintaxe do C# nos permite facilmente fazer um loop regressivo, basta alterarmos o último argumento de i++ para i--, e obviamente mudarmos a condição:

for (int i = 0; i < 10; i++)

MessageBox.Show(Convert.ToString(i));

No VB.NET podemos conseguir o mesmo efeito utilizando a palavra chave Step:

Dim i As Integer = 0 For i = 10 To 1 Step -1

MessageBox.Show(CStr(i)) Next i

Existem laços While com teste de condição no inicio da sentença ou no final, neste último o laço executa sempre uma primeira vez, independente do resultado da avaliação. Vamos ver exemplos do primeiro caso:

Dim i As Integer = 0 Do While i < 5

MessageBox.Show(CStr(i))

i += 1 Loop

int i = 0; while (i<5) {

MessageBox.Show(Convert.ToString(i));

i += 1; }

Finalmente, o que pode ser novidade para quem ainda não conhece a plataforma .NET são os laços em coleções, que permitem percorrer um a um os membros de uma coleção qualquer.

Dim numbers() = {4, 5, 6, 1, 2, 3, -2, -1, 0} Dim i As Integer For Each i In numbers

MessageBox.Show(Convert.ToString(i)) Next

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };

foreach (int i in numbers)

{

MessageBox.Show(Convert.ToString(i)); }

Neste exemplo a titulo de simplicidade nossa coleção é um array, porém a estrutura funciona da mesma forma para qualquer tipo de coleção.

Convertendo valores

Para a conversão entre tipos de dados utilize a classe convert, seguida do método apropriado ao tipo que ser converter:

Dim i As Integer, s As String s = Convert.ToString(i)

int i;

string s;

s = Convert.ToString(i);

Procedimentos e funções

Em VB.NET uma função começa com a palavra reservada function e termina com o tipo do dado de retorno. Já no C# inicia com o tipo do dado de retorno:

Function Somar( x As Integer, y As Integer) _
As Integer

Dim z As Integer
z = x + y

Return z

End Function

int Somar(int x, int y) {

int z;

z = x + y;

return z; }


O retorno é inidicado pela palavra-chave return ou pelo próprio nome da função.

Um procedimento que não retorna valor em VB.NET inicia com a palavra chave Sub, e em C# com void:

Sub Somar( x As Integer,y As Integer) _
As Integer

Dim z As Integer
z = x + y

End Function

void Somar(int x, int y) {

int z;

z = x + y; }

 

A passagem de parametros por padrão ocorre por valor. Para indicar um parametro a ser passado por referencia, utilize ByRef no VB.BET e ref no C#.

Visibilidade ou Scopo

A visibilidade de um procedimento, classe, inferface etc. é definada através das palavras reservadas a seguir:

•     Public / public: acessível de qualquer lugar do projeto ou de instancias da classe

•     Private / private: Acessível apenas dentro do mesmo contexto;

•     Friend / internal: Acessivel apenas dentro do projeto;

•     Protected / protected: Acessivel apenas dentro da classe ou de uma classe derivada;

•     Protected Friend / Protected Internal: Acessivel apenas dentro da classe derivada ou do mesmo projeto;

Ao declarar algo sem a visibilidade, por padrão será private.

Tratamento de exceções

O tratamento de exceções será surpresa apenas para quem esta começando agora a conhecer o VB.NET, que com o lançamento do linguagem ganhou uma forma estruturada de tratamento de erro semelhante as demais linguagens OO. È o adeus ao On error go to 10.

O tratamento de erro é formando por uma estrutura Try...Catch..Finally. Entre o Try e o Catch deve ser colocado o código que você quer proteger de uma exceção. Entre Catch e Finnally o código a ser executado no caso de ocorrer uma exceção, e finalmente após Finnally algum código que você queira que obrigatóriamente seja executado, ocorrendo ou não uma exceção, geralmente usado para liberar algum recurso alocado. Vale lembrar que você pode usar apenas parte da funcionalidade do bloco, por exemplo, se você que apenas tratar uma exceção, pode contruir um bloco contendo apenas os comando try...catch. Por outro lado se você quer apenas garantir que um recurso seja liberado, como uma conexão com o banco de dados pro exemplo, você pode fazer uso apenas do bloco try...finally.

Outra caracteristica importante é que as classes de exceção são executadas da mais especifica para a menos especifica, isto permite um tratamento de erros mais robusto e eficaz. Normalmente você deve terminar seu tratamento com a classe Exception, que é menos específica e que da origem a todas as demais.

Try

My.Computer.FileSystem.CopyFile("Aspnet.pdf", "Aspnet.bkp") Catch ex As System.IO.IOException

MessageBox.Show("Ocorreu um erro na cópia do arquivo") Catch ex2 As Exception

MessageBox.Show("Ocorreu um Erro desconhecido") End Try

string s = null; (ArgumentNullException s)

MessageBox.Show("Ocorreu um erro na string"); (Exception r)

MessageBox.Show("Ocorreu um Erro desconhecido");

 

With

O with, que não tem equivalente no C#, permite omitir o nome de um objeto quando o mesmo é utilizado em diversas linhas.

With GridView1

.Caption = "GridView"

.EditIndex = 0

.Enabled = False End With

 

 

try {

}

catch

{

}

catch

{

}

 

Orientação a Objetos

Vamos também apresentar alguns aspectos da sintaxe da criação de classes no VB.NET e no C#. Porém antes é preciso conhecer o conceito de NameSpaces.

NameSpaces é uma estrutura simples, porém muito eficiente de organizar seu código. Por exemplo, uma suposta empresa GoodSoftware pode definir que todas suas classes terão como NameSpace raiz GoodSoftware. Abaixo deste existirão os NameSpaces ERP, CRM e Global. O NameSpace ERP abrigaria as classes de seus novo sistema ERP, o CRM idem, e o Global classes que para serem utilizadas em ambos os projetos. Dentro de cada um destes NameSpaces é possível criar n outros. Outra importante vantagem do seu uso é redução de problemas com conflitos com nomes repetidos de classes ou métodos.

Abaixo vemos a declaração básica de uma classe de Nome Class1, dentro de um NameSpace

 

Namespace GoodSoftware Public Class ERP

End Class End Namespace

 

namespace GoodSoftware {

public class ERP

{

}

 

Você não é obrigado a criar uma classe dentro de um NameSpace.

Não é preciso existir relação entre nomes de classes e namespaces com o nome fisico do arquivo. Você pode inclusive colocar diversas classes ou

namespaces dentro de um mesmo arquivo.

Um construtor de uma classe em VB.NET se define com a palavra chave New, já em C# deve ter no mome da classe

Public Sub New()

End Sub

 

public Class1 () {

// }

 

Obviamente que você pode criar um construtor com passagem de parametros.

Já as propriedades são bastante singular em cada linguagem:

Public Property Nome() As String Get

Return Pnome End Get Set(ByVal value As String)

Pnome = value End Set End Property

 

public String Nome {

get { return Pnome; }

set { Pnome = value; } }

 

Uma propridade pode ser apenas leitura ou apenas escrita. Além de inicar estas caracteristica na declaração da propriedade, você deverá omitir as sentenças get e set, respectivamente.

Caso você deseje criar um método que por algum motivo não precise ou não deva ter sua classe instanciada, basta você acrescentar a palavra chave shared no VB.NET ou static no C#, sempre após a declaração de visibilidade do método:

Public Shared Function Somar(ByVal x As Integer, ByVal y As Integer) _ As Integer

Dim z As Integer

z = x + y

Return z End Function

 

public static int Somar(int x, int y) {

int z;

z = x + y;

return z; }

 

Lembre-se que um método definido com shared / static, não pode usar qualquer recurso da classe, como por exemplo uma variavel privada ou mesmo, uma propriedade ou um outro método.

A herança de uma classe é definida pela palavra chave inherits em VB.NET e em C# através da notação “: classe pai”

Public Class Class2

Inherits Class1 End Class

 

class Class2: Class1

{

}

 

Para se referir a classe base, utilize MyBase no VB.NET ou base no C#, seguido do nome do método ou propriedade.

Abaixo alguns outros recursos de OO do .NET, não vou demonstrar exemplos porque extrapolam o objetivo básico desta sessão. A primeira palavra é a notação em VB.NET e a segunda em C#:

•     NotInheritable / sealed: Também conhecido com “Classe Fechada”, indica que uma classe não pode ser usada como base, ou seja, nenhuma outra classe poderá herdá-la

•     MustInherit / abstract: Define uma classe abstrato, onde apenas uma classe filho poderá ser instanciada.

•     Overloads: permite que um método seja sobrecarregado, ou seja, que possa haver métodos com a mesma função, porém com assinaturas diferentes. O uso do termo é desnecessário tanto em VB.NET quanto em C#, pois o ambiente entende que métodos com o mesmo nome porem com assinaturas diferentes estão sobrecarregados.

•     Overridable / virtual: Indica que uma classe filho deve programar uma nova versão do método.

•     Overrides / override: Utilizado para sobrescrever uma implementação na classe pai.

•     MustOverride: Em uma classe marcada como MustInherit. Indica que o método ou propriedade deve não foi implementado na classe pai e deve ser implementado na classe derivada.

Interfaces

Interfaces é um recurso que permite criar uma padronização maior entre classe. Uma interface é uma “assinatura”, que compreende nada mais que métodos e propriedades “ocas”. Uma classe que programe determinada interface deve obrigatoriamente seguir essa assinatura. Você pode definir que determinada classe implemente determinada interface para ter uma certa funcionalidade.

Confuso? Vou citar um exemplo: você pode conectar tanto um array quanto um SqlDataSource a um GridView, pois ambos implementam a interface System.Collections.IEnumerable.

Interface Interface1

Sub Metodo1()

Function Metodo2() As Integer End Interface Public Class UsaInterface

Implements Interface1

Public Sub Metodo1() Implements Interface1.Metodo1 '

End Sub

Public Function Metodo2() As Integer Implements Interface1.Metodo2 '

End Function End Class

 

public interface Interface1 {

void Metodo1();

int Metodo2(); }

public class UsaInterface : Interface1 {

public void Metodo1()

{

// }

public int Metodo2() {

// } }

 

Como um ambiente de alta produtividade, O VS vai criar automaticamente pra você todas as estruturas que precisam ser implementadas na classe, no momento que você informar que deseja utilzar determinada interface.

O .NET não suporta herança multipla, porém uma classe pode implementar diversas interfaces.

Praticando

Os aplicações a seguir são para reforçar o que foi aprendindo com relação a sintaxe do VB.NET ou do C#. Para sermos mais objetivos, os exercicios a seguir devem ser implementados com aplicações Console11.

1. Em uma cidade de janeiro durante 20 dias não ocorreu temperatura inferior a 9º C nem superior a 30º C. Deve-se dar entrada no sistema da temperatura de cada dia. Fazer um programa que calcule:

a.   A maior temperatura ocorrida, junto com o(s) dia(s) que ocorreu.

b.   A menor temperatura ocorrida, junto com o(s) dia(s) que ocorreu.

c.   A temperatura média dos 20 dias;

d.   Os dias em que a temperatura foi acima da média

e.   Os dias em que a temperatura foi abaixo da média

f.    Os dias em que a temperatura foi igual a média

2.   Fazer um programa que:

a.   Leia uma frase;

b.   Leia um caractere;

c.   Conte quantas vezes o caractere foi encontrado na frase;

d.   Indica as posições em que o caractere foi encontrado na frase;

e.   Exiba a frase de forma invertida.

3.   Fazer um programa que:

a.   Leia 10 número inteiros;

b.   O programa deve recusar numero repetidos

c.   Ordene os número de forma crescente;

d.   Ordene os números de forma decrescente;

Utilizando o IIS

Certifique-se que o IIS esta devidamente instaldo e rodando.

Ao contrario do seu entecessor, o VS 2005 vem com um pequeno servidor Web embutido. Porém devido as limitações deste, vamos trabalhar com IIS. Para criar uma nova aplicação usando o IIS siga os seguintes passoas.

1.   Na IDE do VS selecione File / New Web Site

2.   Na caixa de dialogo New Web Site selecione ASP.NET Web Site

3.   Clique em Browse

4.   Na caixa de dialogo Chose Location, selecione Local IIS

5.   Selecione Site da Web Padrão

6.   Clique em Create New Web Aplication

7. Digite um nome para sua aplicação, no exemplo Teste

8.   Clique em Open

9.   De volta a new Web Site, clique em Ok.

Se surgir a mensagem “Configuring web site 'http://localhost/Teste' to ASP.NET 2.0 failed. You may need to manually configure this site for ASP.NET 2.0 in order for your site to run correctly.” Você deve configurar manualmente sua aplicação para utilizar o ASP.NET 2.0. Isto pode ser feito facilmente através do console de gerenciamento do IIS.

3. Web Forms

Um Web Form é uma pagina de sua aplicação. Na IDE do VS ele se comporta de forma semelhante a um Windows Form: Uma área onde você pode arrastar e soltar controles visuais, codificar eventos e configurar propriedades que vão regrar seu comportamento. Fisicamente, um Web Form é composto por um arquivo com extensão aspx e, dependendo do modelo adotado, poderá ou não estar vinculado a ele um arquivo vb ou cs, com a codificação para execução no servidor.

Abaixo você vê o código gerado pelo próprio VS na criação da um Web Form:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">

<title>Untitled Page</title> </head> <body>

<form id="form1" runat="server">

<div>

</div>

</form> </body> </html>

 

Nesta página você alguns dos principais elementos que formam uma pagina HTML padrão, como as tags Html, Head, Body, Form e Title.

Todos controles e todo conteúdo de apresentação de seu formulário, vai estar entre as Tags Body.

Diretivas

Na primeira linha da página temos uma diretiva de página. Uma diretiva é representada pelo símbolo <%@. O que nos diz que se trata de uma diretiva de página é palavra page, logo após a abertura da tag. Uma diretiva de página possuiu algumas informações que serão úteis ao compilador no momento da geração da pagina. No código acima, vemos que na diretiva criada por padrão pelo VS, temos já diversos atributos, você pode alterá-las ou mesmo inserir diretivas especificas, desde obviamente que você saiba o que esta fazendo.

Abaixo veremos as principais diretivas existentes no ASP.NET 2.0:

@Control: Diretiva de um User Control (arquivo ascx) @Master: Diretiva de uma Máster Page @OutPutCache: Diretiva de controle de cachê @Assembly: Vincula um assembly a página @Import: Importa um namespace especificado @Page: Diretiva de um Web Form (arquivo aspx

Cada diretiva pode conter n atributos. Os atributos são configurações que na

verdade ditam as funcionalidades da diretiva. Veremos a seguir os principais

atributos da diretiva @page:

AutoEventWireUp: Determina que os eventos de uma página sejam disparados

automaticamente

ClassName: Especifica o nome da classe relacionada a página

CodeFile: Especifica o arquivo code-behind da página

Culture: Especifica as configurações de cultura da página12

Debug: Compila a página com os símbolos de depuração

EnableSessionState: Indica se é permitido armazenamento de sessão na página

EnableTheming: indica se é permitido o uso de temas na página

EnableViewState:Indica se o viewstate será mantido na página

Language: Defina a linguagem em que a página é codificada

SmartNavigation: Habilita os recursos do SmartNavigation na página

Theme: Defini um tema especifico para a pagina

ValidateRequest: Indica se a requisição será validada. Quando este atributo esta

com verdadeiro, se existir algum conteúdo potencialmente perigoso postado na

página, será gerada uma exceção.

No arquivo web.config ou mesmo até no machine.config, podemos configurar muitos dos atributos que também são configuráveis a nível de pagina. Normalmente a configuração através de diretiva de página sobrescreve a definida em um arquivo de configuração.

9 No VS 2002 / 2003, este recurso só estava disponível para o C#. Usuários do VB.NET tinham que instalar um plug-in

10 Embora por alguma razão desconhecida você ainda poderá utliza-lo no VS.

11 Uma aplicação console é aquela sem interface gráfica, no estilo MS-DOS

12 Culture diz respeito a todos os aspectos culturais do usuário da página, como formatação da data, caractere de moeda, orientação da escrita etc. O .NET possui recursos fantásticos que facilitam a implantação de aplicações multi-culturais, porém não será tópico deste curso.

Últimos artigos relacionados:
Refatoração (Refactoring) em Visual Studio 2008
Medindo a Performance de seu Código com Visual Studio Team System 2008
Code Snippets no Visual Studio 2008
Análise de Código com Visual Studio Team System 2008
.NET independente de plataforma? Uma introdução ao Mono