Comparando VB.NET com C#

A seguir um guia de referência rápida comparando a sintaxe e definições do VB.NET com C-Sharp.

VB.NET

C#

Comentários
' linha única
Rem somente uma linha

// somente uma linha
/* Multiplas
    linhas */
/// comentário XML em um linha
/** comentário XML em múltiplas linhas */

Tipos de dados

Tipos por Valor
Boolean
Byte
Char   (exemplo: "A")
Short, Integer, Long
Single, Double
Decimal
Date

Tipos por Referência
Object
String

Dim x As Integer
Console.WriteLine(x.GetType())     ' Imprime System.Int32
Console.WriteLine(TypeName(x))  ' Imprime Integer

' Conversão de Tipos
Dim numDecimal As Single = 3.5
Dim numInt As Integer
numInt = CType(numDecimal, Integer)   ' Define para 4
numInt = CInt(numDecimal)  ' mesmo resultado que com CType
numInt = Int(numDecimal)    ' Define para3 (A função Int trunca o decimal)

Tipos por Valor
bool
byte, sbyte
char   (exemplo: 'A')
short, ushort, int, uint, long, ulong
float, double
decimal
DateTime  

Tipos por Referência
object
string

int x;
Console.WriteLine(x.GetType());    // Imprime System.Int32
Console.WriteLine(typeof(int));      // Imprime System.Int32


// Conversão de Tipos

double numDecimal = 3.5;
int numInt = (int) numDecimal;   // define para 3  (trunca o decimal)

Constantes
 

Const MAX_STUDENTS As Integer = 25

const int MAX_STUDENTS = 25;
Enumerations
Enum Action
  Start 
  [Stop]   ' Stop é uma palavra reservada
  Rewind
  Forward
End Enum

Enum Status
  Flunk = 50
  Pass = 70
  Excel = 90
End Enum

Dim a As Action = Action.Stop
If a <> Action.Start Then Console.WriteLine(a)     ' Imprime 1

Console.WriteLine(Status.Pass)     ' Imprime 70
Console.WriteLine(Status.Pass.ToString())     ' Imprime Pass
enum Action {Start, Stop, Rewind, Forward};
enum Status {Flunk = 50, Pass = 70, Excel = 90};

Action a = Action.Stop;
if (a != Action.Start)
  Console.WriteLine(a + " e " + (int) a);    // Imprime "Stop e 1"

Console.WriteLine(Status.Pass);    // Imprime Pass
Operadores

Comparação

=  <  >  <=  >=  <>

Aritimético
+  -  *  /
Mod
(divisão inteira)
(eleva a potência)

Atribuição
=  +=  -=  *=  /=  \=  ^=  <<=  >>= 
&=

Bitwise
And  AndAlso  Or  OrElse  Not  <<  >>

Logico
And  AndAlso  Or  OrElse  Not

Note: AndAlso and OrElse sao avaliações lógica do tipo curto-circuito

Concatenação de strings
&

Comparação

==  <  >  <=  >=  !=

Aritimético
+  -  *  /
(mod)
(idivisão inteira se ambos os operadores são ints)
Math.Pow(x, y) (eleva a potência)

Atribuição
=  +=  -=  *=  /=   %=  &=  |=  ^=  <<=  >>=  ++  --

Bitwise
&  |  ^   ~  <<  >>

Logico
&&  ||   !

Note: && and ||sao avaliações lógica do tipo curto-circuito

Concatenação de strings
+

If

saudacao= IIf(idade < 20, "Tudo bem ?", "Ola")

' Uma linha não requere "End If", nem "Else"
If language = "VB.NET" Then langType = "texto"

' Usar : para por dois comandos na mesma linha
If x <> 100 And y < 5 Then x *= 5 : y *= 2  

' Preferido
If x <> 100 And y < 5 Then
  x *= 5
  y *= 2
End If

para quebrar linhas longas use  _ (underscore)
If teste1teste2 And teste3 > 100 Then _
  outra linha

'If x > 5 Then
  x *= y
ElseIf x = 5 Then
  x += y
ElseIf x < 10 Then
  x -= y
Else
  x /= y
End If

Select Case color   ' Deve ser um tipo primitivo
  Case "pink", "red"
    r += 1
  Case "blue"
    b += 1
  Case "green"
    g += 1
  Case Else
    other += 1
End Select

saudacao= idade < 20 ? "Tudo bem ?" : "Ola";





if (x != 100 && y < 5) {    // múltiplos comandos precisam estar entre {}
  x *= 5;
  y *= 2;
}

Não precisa de  _ ou : desde que ; é usado para terminar cada comando







if
(x > 5)
  x *= y;
else if (x == 5)
  x += y;
else if (x < 10)
  x -= y;
else
  x /= y;



switch (color) {                          // precisa ser um inteiro ou string
  case "pink":
  case "red":    r++;    break;        // break é obrigatorio
  case "blue":   b++;   break;
  case "green": g++;   break;
  default:    other++;   break;      
}

Loops
Loops com Pré teste
While c < 10
  c += 1
End While

Do Until c = 10 
  c += 1
Loop

Do While c < 10
  c += 1
Loop

For c = 2 To 10 Step 2
  Console.WriteLine(c)
Next


loop com teste posterior
Do 
  c += 1
Loop While c < 10
Do 
  c += 1
Loop Until c = 10

loopin em Array ou collection
Dim nomes As String() = {"Janice", "Miriam", "Macoratti"}

For Each s As String In nomes
     Console.WriteLine(s)
Next

Loops com pré teste  

// não tem a palavra chave until
while (i < 10)
  i++;

for (i = 2; i < = 10; i += 2)
  Console.WriteLine(i);



loop com teste posterior

do
  i++;
while (i < 10);


loopin em Array ou collection
string[] nomes = {"Janice", "Miriam", "Macoratti"};

foreach (string s in nomes)
      Console.WriteLine(s);

Arrays

Dim nums() As Integer = {1, 2, 3} 
For i As Integer = 0 To nums.Length - 1
  Console.WriteLine(nums(i))
Next

' 4 é o indice do último elemento, então ele trata 5 elementos
Dim names(4) As String
names(0) = "Macoratti"
names(5) = "Miriam' Throws System.IndexOutOfRangeException

' Redimensiona um array mantendo os valores existentes
ReDim Preserve nomes(6)



Dim DuasD(rows-1, cols-1) As Single
DuasD(2, 0) = 4.5

Dim jagged()() As Integer = { _
  New Integer(4) {}, New Integer(1) {}, New Integer(2) {} }
jagged(0)(4) = 5

int[] nums = {1, 2, 3};
for (int i = 0; i < nums.Length; i++)
  Console.WriteLine(nums[i]);


// 5  é o tamanho do array
string[] names = new string[5];
names[0] = "Macoratti";
names[5] = "Miriam";   // Throws System.IndexOutOfRangeException

// C# não pode redimensionar um array dinamicamente. Copie em um novo array
string[] nomes2 = new string[7];
Array.Copy(nomes, nomes2, nomes.Length);  // ou nomes.CopyTo(nomes2, 0); 

float[,] DuasD = new float[rows, cols];
DuasD[2,0] = 4.5f; 

int[][] jagged = new int[3][] {
  new int[5], new int[2], new int[3] };
jagged[0][4] = 5;

Funções

' Passa por valor (é o padrão)
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1
  z = 5
End Sub

Dim a = 1, b = 1, c As Integer   '
TestaFunc(a, b, c)
Console.WriteLine("{0} {1} {2}", a, b, c)   ' 1 2 5

' Aceita número de argumentos variáveis
Function Sum(ByVal ParamArray nums As Integer()) As Integer
  Sum = 0 
  For Each i As Integer In nums
    Sum += i
  Next
End Function  

Dim total As Integer = Sum(4, 3, 2, 1)   ' retorna 10


Sub DizOla(ByVal nome As String, Optional ByVal prefix As String = "")
  Console.WriteLine(Saudacoes, " & prefix & " " & nome)
End Sub

DizOla("Strangelove", "Dr.")
DizOla("Macoratti")

// ' Passa por valor (é o padrão)
void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

int a = 1, b = 1, c;  // c não precisa inicialização
TesatFunc(a, ref b, out c);
Console.WriteLine("{0} {1} {2}", a, b, c);  // 1 2 5

' Aceita número de argumentos variáveis
int Sum(params int[] nums) {
  int sum = 0;
  foreach (int i in nums)
    sum += i;
  return sum;
}

int total = Sum(4, 3, 2, 1);   // retorna 10


void DizOla(string nome, string prefix) {
  Console.WriteLine("Saudacoes, " + prefix + " " + nome);


void DizOla(string nome) {
 DizOla(nome, "");
}

Tratamento de exceção

' Tratamento de erro desatualizado
On Error GoTo MyErrorHandler
...
MyErrorHandler: Console.WriteLine(Err.Description)

Dim ex As New Exception("Alguma coisa esta errada")
Throw  ex 

Try 
  y = 0
  x = 10 / y
Catch ex As Exception When y = 0 ' Argumento e When é opcional          Console.WriteLine(ex.Message)
Finally
  Beep()
End Try





Exception up = new Exception("Alguma coisa esta errada.");
throw up; 

try
  y = 0;
  x = 10 / y;
}
catch (Exception ex) {   // Argumento é opcional   Console.WriteLine(ex.Message);
}
finally {
}

Namespaces

Namespace Harding.Compsci.Graphics 
  ...
End Namespace

' or

Namespace Harding
  Namespace Compsci
    Namespace Graphics 
      ...
    End Namespace
  End Namespace
End Namespace

Imports Harding.Compsci.Graphics

namespace Harding.Compsci.Graphics {
  ...
}

// or

namespace Harding {
  namespace Compsci {
    namespace Graphics {
      ...
    }
  }
}

using Harding.Compsci.Graphics;

Classes / Interfaces

'Modificadores de acesso
Public
Private
Friend                   
Protected
Protected Friend
Shared

' herança
Class FootballGame
  Inherits Competition
  ...
End Class 

' Definição de interface
Interface IAlarmClock 
  ...
End Interface

// Extendendo uma interface 
Interface IAlarmClock
  Inherits IClock
  ...
End Interface

// Implementando uma interface
Class WristWatch 
  Implements IAlarmClock, ITimer 
   ...
End Class 

'Modificadores de acesso
public
private
internal
protected
protected internal
static

' herança
class FootballGame : Competition {
  ...
}


//' Definição de interface
interface IAlarmClock {
  ...
}

// Extendendo uma interface
interface IAlarmClock : IClock {
  ...
}


//Implementando uma interface

class WristWatch : IAlarmClock, ITimer {
   ...
}

Construtores
Class SuperHeroii
  Private _nivelPoder As Integer

  Public Sub New ()
    _nivelPoder = 0
  End Sub

  Public Sub New (ByVal nivelPoder As Integer)
    Me._nivelPoder = nivelPoder
  End Sub

  Protected Overrides Sub Finalize () 
       MyBase.Finalize()
  End Sub
End Class

class SuperHeroi {
  private int _nivelPoder;

  public SuperHeroi() {
     _nivelPoder = 0;
  }

  public SuperHero8(int nivelPoder) {
    this._nivelPoder= nivelPoder; 
  }

  ~SuperHeroi() {
   }
}

Objetos

Dimheroii As SuperHeroi = New SuperHeroi
Withheroi
  .Nome = "HomedeFerro"
  .nivelPoder = 3
End With

heroi.Defend("Miriam")
heroi.Rest()     ' Chamando um método Shared
' ou
SuperHeroi.Rest()

Dim heroi2 As SuperHeroi =heroi  ' ambos se referem ao mesmo objeto
hero2.Nome = "MulherGato"
Console.WriteLine(heroi.Nome)   ' Imprime MulherGato

hero = Nothing    ' Libera o objeto

If heroi Is Nothing Then _
 heroi = New SuperHeroi

Dim obj As Object = New SuperHeroi
If TypeOf obj Is SuperHeroi Then _
  Console.WriteLine("è um objeto SuperHeroi .")

SuperHeroi heroi = new SuperHeroi();

hero.Nome = "HomedeFerro";
hero.nivelPoder = 3;

hero.Defend("Miriam");
SuperHeroi.Rest();   // Chamando um método estático


SuperHeroiheroi2 =heroi;   // ambos se referem ao mesmo objeto
hero2.Name = "MulherGato";
Console.WriteLine(heroi.Nome);   // Imprime MulherGato

 

hero = null ;   // libera o objeto

if (heroi == null)
 heroi = new SuperHeroi();


Object obj = new SuperHeroi(); 
if (obj is SuperHeroi)
  Console.WriteLine("è um objeto SuperHeroi");

Structs

Structure Aluno
  Public nome As String
  Public gpa As Single

  Public Sub New(ByVal nome As String, ByVal gpa As Single)
    Me.nome = nome
    Me.gpa = gpa
  End Sub
End Structure

Dim stu As Aluno = New Aluno("Jefferson", 3.5)
Dim stu2 As Aluno = stu  

stu2.nome = "Jessica"
Console.WriteLine(stu.nome)    ' Imprime Jefferson
Console.WriteLine(stu2.nome)  ' Imprime Jessica

struct Aluno {
  public string nome;
  public float gpa;

  public Aluno(string nome, float gpa) {
    this.nome = nome;
    this.gpa = gpa;
  }
}

Aluno stu = new Aluno("Jefferson", 3.5f);
Aluno stu2 = stu;  

stu2.nome = "Jessica";
Console.WriteLine(stu.nome);    // Imprime Jefferson
Console.WriteLine(stu2.nome);   // Imprime Jessica

Propriedades

Private _size As Integer

Public Property Size() As Integer
  Get
    Return _size
  End Get
  Set (ByVal Value As Integer)
    If Value < 0 Then
      _size = 0
    Else
      _size = Value
    End If
  End Set
End Property

foo.Size += 1

private int _size;

public int Size {
  get {
    return _size;
  }
  set {
    if (value < 0)
      _size = 0;
    else
      _size = value;
  }
}


foo.Size++;

Console I/O

Caracteres especiais
vbCrLf, vbCr, vbLf, vbNewLine
vbNullString
vbTab
vbBack
vbFormFeed
vbVerticalTab
""
Chr(65)  ' Retorna 'A'

Console.Write("Qual o seu nome ")
Dim name As String = Console.ReadLine()
Console.Write("Quantos anos voce tem? ")
Dim idade As Integer = Val(Console.ReadLine())
Console.WriteLine("{0} tem {1} anos.", name, idade
' ou
Console.WriteLine(nome & " tem " & idade & " anos")

Dim c As Integer
c = Console.Read()    'Le um único caractere
Console.WriteLine(c)   ' Imprime 65  se usuario entrar "A"

Sequencia de escape
\n, \r
\t
\\
\"

Convert.ToChar(65)  // Retorna 'A' -
// ou

(char) 65

Console.Write("Qual o seu nome ");
string name = Console.ReadLine();
Console.Write("Quantos anos voce tem? ");
int idade = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("{0} tem {1} anos.", name, idade);
// ou
Console.WriteLine(nome + " tem " + idade + " anos.");


int c = Console.Read();  // 'Le um único caractere
Console.WriteLine(c);    // Imprime 65 se usuario entrar "A"

File I/O

Imports System.IO

Dim writer As StreamWriter = File.CreateText("c:\arquivo.txt")
writer.WriteLine("Teste.")
writer.Close()

Dim reader As StreamReader = File.OpenText("c:\arquivo.txt")
Dim line As String = reader.ReadLine()
While Not line Is Nothing
  Console.WriteLine(line)
  line = reader.ReadLine()
End While
reader.Close()

Dim str As String = "Texto data"
Dim num As Integer = 123
Dim binWriter As New BinaryWriter (File.OpenWrite("c:\arquivo.dat")) 
binWriter.Write(str) 
binWriter.Write(num) 
binWriter.Close()

Dim binReader As New BinaryReader (File.OpenRead("c:\arquivo.dat"))
str = binReader.ReadString()
num = binReader.ReadInt32()
binReader.Close()

using System.IO;

StreamWriter writer = File.CreateText("c:\\arquivo.txt");
writer.WriteLine("Teste.");
writer.Close();

StreamReader reader = File.OpenText("c:\\arquivo.txt");
string line = reader.ReadLine();
while (line != null) {
  Console.WriteLine(line);
  line = reader.ReadLine();
}
reader.Close();

string str = "Texto data";
int num = 123;
BinaryWriter binWriter = new BinaryWriter(File.OpenWrite("c:\\arquivo.dat"));
binWriter.Write(str);
binWriter.Write(num);
binWriter.Close();

BinaryReader binReader = new BinaryReader(File.OpenRead("c:\\arquivo.dat"));
str = binReader.ReadString();
num = binReader.ReadInt32();
binReader.Close();

Até o próximo artigo ...

Referências:


José Carlos Macoratti