Zdrojový kód z C# do VB.NET snadno a rychle

Ondřej Linhart       21.01.2008       C#, VB.NET, .NET       15943 zobrazení

Cílem tohoto článku by mělo být usnadnit vám práci při luštění zdrojového kódu v jazyku C# a následného přepsání do Visual Basic .NET.

Úvod

Cílem tohoto článku by mělo být usnadnit vám práci při luštění zdrojového kódu v jazyku C# a následného přepsání do Visual Basic .NET (dále jen VB.NET), například když jste narazili na nějaký zajímavý program nebo ukázku kódu.

Trocha historie

Jazyk C# se objevil v roce 2001 s první verzí vývojového prostředí Visual Studio .NET a je tedy o mnoho mladší než Visual Basic. C# se v poslední době stává populárním programovacím jazykem, důkazem budiž XNA Game Studio Express (Visual C# Express Edition s integrovanou podporou XNA Frameworku) nebo ukázkové zdrojové kódy v DirectX SDK.

Hlavní rysy VB.NET

VB byl od začátku považován jako nástroj pro rychlý vývoj aplikací (RAD) i pro méně zkušené programátory nebo pokročilé uživatele.

Následující vlastnosti jsou specifické pro jazyk VB.NET:

  • Nerozlišuje se velikost písmen v názvech a klíčových slovech
  • Volitelné parametry metod
  • Možnost Late Binding
  • Automatická změna velikosti písma v klíčových slovech a názvech podle deklarace
  • Výchozí jmenný prostor se nezobrazuje
  • Klíčové slovo With
  • Vlastnosti mohou mít parametry
  • Deklarativní provázání událostí a metod pomocí klíčového slova Handles
  • Přepínač (Select Case) umožňuje zadávat rozsahy hodnot
  • Možnost volitelně vynechat závorky při vytváření instance třídy s implicitním (bez parametrů) konstruktorem
  • Lze dynamicky změnit velikost pole bez ztráty dat

Hlavní rysy C#

C# je vhodný pro ty, kteří již znají jazyky C/C++ nebo Java a mají zájem psát aplikace na platformě .NET. Inspirace k vytvoření tohoto jazyka byla nalezena v jazycích Delphi, C++, Java a Eiffel.

Následující vlastnosti jsou specifické pro jazyk C#:

  • Rozlišuje se velikost písmen v názvech a klíčových slovech
  • Možnost psát bloky kódu které mohou zvýšit výkon za cenu toho, že nejsou bezpečné (jedná se především o operace s ukazateli - Pointers)
  • Anonymní metody (tato vlastnost mi velmi chybí ve VB.NET)
  • Statické třídy (moduly ve VB.NET jsou v podstatě statické třídy)
  • Víceřádkové komentáře (bez nutnosti použití ' nebo REM na každém řádku)
  • Klíčová slova checked a unchecked pro řízení kontroly přetečení/podtečení
  • Možnost používat Escape sekvence v proměnných typu String
  • Každý řádek kódu musí být ukončen středníkem

Základní operace

Deklarace proměnných

Deklarace proměnných v C# je stejná jako u všech jazyků založených na C. Nejdříve se uvádí typ, potom název proměnné a případně inicializační hodnota stejně jako ve VB.NET.

int i; 

string s = "Hello World!";

DirectoryInfo di = new DirectoryInfo(@"C:\WINDOWS");

object obj = null;
Dim i As Integer

Dim s As String = "Hello World"

Dim di As New DirectoryInfo("C:\WINDOWS")

Dim obj As Object = Nothing

Pole

Velikost pole v C# určuje kapacita, velikost pole ve VB.NET určuje horní hranice. Velikost pole v C# nelze dynamicky měnit.

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

string[] names = new string[2];

names[0] =
"Jan";

names[1] =
"Jana";
Dim numbers() As Integer = {1, 2, 3, 4, 5}

Dim names(1) As String

names(0) = "Jan"

names(1) = "Jana"

Dynamická změna velikosti pole:

        ReDim Preserve names(2)
names(2) =
"Ondřej" 'Na pozici 0 je Jan, na pozici 1 Jana, na pozici 2 Ondřej

Konverze proměnných

byte b = 255;

int i = (int)b;

FileSystemInfo fsi =
new DirectoryInfo(@"C:\WINDOWS");

DirectoryInfo di = (DirectoryInfo)fsi;
Dim b As Byte

Dim
i As Integer = CInt(b)

Dim fsi As FileSystemInfo = New DirectoryInfo("C:\WINDOWS")

Dim DirectoryInfo di = DirectCast(fsi, DirectoryInfo)

Komentáře

//Komentář na jeden řádek

/* Komentář
na více řádků */

///XML komentář
'Komentář na jeden řádek




'''XML komentář

Podmínky

if (podmínka) 
{

}


if (podmínka)
{

}
else
{

}


if (podmínka)
{

}
else if (podmínka2)
{

}


string str = a > b ? "a je větší než b" : "a je menší než b"
If podmínka Then 

End
If



If
podmínka Then


Else

End If





If
podmínka Then

ElseIf podmínka2 Then

End If





Dim
str As String = IIf(a > b, "a je větší než b", "a je menší než b")

Přepínače

int n = 100;
switch (n)
{
case 1:
{

break;
}
case 10:
{

break;
}
case 100:
{

break;
}
default:
{

break;
}
}
Dim n As Integer = 100
Select Case n
Case 1


Case 10


Case 100


Case Else


End Select

Toto v C# nelze napsat:

Select Case n 
Case Is < 3


Case 3, 5, 7


Case 8 To 10


Case 11 To 99, Is < 101


End Select

Cykly

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

}


for (int i = 10; i >= 0; i--)
{

}


foreach (FileInfo file in new DirectoryInfo(@"C:\").GetFiles())
{

}


while (n < 10)
{
n++;
}


do
{
n++;
}
while (n < 10);
For i As Integer = 0 To 9

Next



For
i As Integer = 10 To 0 Step -1

Next



For
Each file As FileInfo In New DirectoryInfo("C:\").GetFiles()

Next



While
n < 10
n += 1
End While



Do
n += 1
Loop While n < 10

Porovnávání

if (a == b)
{

}

if (a != b)
{

}

if ((a == b) & (c == d) | (e == f))
{

}

if ((a == b) && (c == d) || (e == f))
{

}
If a = b Then 

End If


If
a <> b Then

End If


If
a = b And c = d Or e = f Then

End If


If
a = b AndAlso c = d OrElse e = f Then

End If

Metody

Metodami jsou souhrnně nazývány procedury a funkce. C# nerozlišuje mezi procedurou a funkcí, VB.NET ano. V C# nelze napsat metodu s volitelnými parametry, ve VB.NET ano.

void Main() 
{

}

int Sum(int a, int b)
{

}
Sub Main()

End Sub


Function
Sum(ByVal a As Integer, ByVal b As Integer) As Integer

End
Function

Příklad metody s volitelnými parametry:

Public Sub AddCustomer(ByVal customerId As Guid, Optional ByVal customerName As String = "Zákazník")

End Sub


AddCustomer(Guid.NewGuid()) 'Parametr customerName bude Zákazník

AddCustomer(Guid.NewGuid(), "Jan Novák") 'Parametr customerName bude Jan Novák

Třídy, rozhraní, dědičnost

interface ICustomer
{
string Name
{
get;
set;
}

int ID
{
get;
}
}
Interface ICustomer

Property Name() As String

ReadOnly Property ID() As Integer

End
Interface
class Customer : ICustomer
{

private string name = string.Empty;

private int id;

public string Name
{
get
{
return name;
}
set
{
name =
value;
}
}

public int ID
{
get
{
return id;
}
}

//Konstruktor
public Customer(int id)
{
this.id = id;
}

}
Class Customer
Implements ICustomer

Private _name As String = String.Empty

Private _id As Integer

Public Property Name() As String Implements ICustomer.Name

Get

Return _name
End Get

Set(ByVal value As String)
_name = value

End Set
End Property

Public ReadOnly Property ID() As Integer Implements ICustomer.ID

Get
Return _id

End Get
End Property

'Konstruktor
Public Sub New(ByVal id As Integer)

Me._id = id
End Sub

End
Class
class VIPCustomer : Customer
{

private float discount;

public float Discount
{
get
{
return discount;
}
set
{
discount =
value;
}
}

//Konstruktor odvozené třídy volá konstruktor základní třídy
public VIPCustomer(int id) : base(id)
{

}

//Destruktor
~VIPCustomer()
{

}
}
Class VIPCustomer
Inherits Customer

Private _discount As Single

Public Property Discount() As Single
Get
Return _discount
End Get
Set(ByVal value As Single)
_discount = value
End Set
End Property

Public Sub New(ByVal id As Integer)
'Konstruktor odvozené třídy volá konstruktor základní třídy
MyBase.New(id)
End Sub

'Destruktor
Protected Overrides Sub Finalize()

End Sub

End
Class

Události

V jazyku C# je nutné pro každou vlastní událost pro kterou nelze použít System.EventHandler nebo System.EventHandler(Of TEventArgs) napsat také odpovídající delegát. VB.NET umožňuje tento delegát vytvořit automaticky pomocí klíčového slova AddHandler (mimochodem vynikající vlastnost), jde to však udělat i ručně - stejně jako v C#.

V C# je navíc potřeba dávat obrovský pozor na to, zda-li v momentě vyvolání události je k události připojena nějaká metoda (v opačném případě nastane vyjímka, která se může projevit nečekaně za běhu aplikace) což ve VB.NET není třeba pokud nepracujete s uživatelsky definovanou událostí.

public delegate void ComputedEventHandler(int n);

class EventExample
{
public event ComputedEventHandler Computed;

public void Compute()
{
int n = 1 + 1;
if (Computed != null) Computed(n);
}
}



void ee_Computed(int n)
{
//Ošetřit událost

}

EventExample ee =
new EventExample();

ee.Computed +=
new ComputedEventHandler(ee_Computed);

S použitím delegáta:

Public Delegate Sub ComputedEventHandler(ByVal n As Integer)

Class EventExample

Public Event Computed As ComputedEventHandler

Public Sub Compute()
Dim n As Integer = 1 + 1
RaiseEvent Computed(n)
End Sub

End
Class


Sub
ee_Computed()

'Ošetřit událost

End Sub


Dim
ee As New EventExample

AddHandler ee.Computed, New ComputedEventHandler(AddressOf ee_Computed)

Bez použití delegáta:

Class EventExample

Public Event Computed(ByVal n As Integer)

Public Sub Compute()
Dim n As Integer = 1 + 1
RaiseEvent Computed(n)
End Sub

End
Class


Dim
ee As New EventExample

AddHandler ee.Computed, AddressOf ee_Computed


Sub ee_Computed()
'Ošetřit událost

End Sub

Deklarativní způsob připojení metody k události:

Class EventExample

Public Event Computed(ByVal n As Integer)

Public Sub Compute()

Dim n As Integer = 1 + 1

RaiseEvent Computed(n)

End Sub

End
Class


Private
WithEvents ee As New EventExample

Sub ee_Computed(ByVal n As Integer) Handles ee.Computed

'Ošetřit událost

End Sub

Seznam klíčových slov C# a jejich ekvivalenty ve VB.NET

abstract MustInherit
as  
base MyBase
bool Boolean
break Exit
byte Byte
case Case
catch Catch
char Char
checked  
class Class
const Const
continue Continue
decimal Decimal
default Default
delegate Delegate
do Do
double Double
else Else
enum Enum
event Event
explicit  
extern  
False False
finally Finally
fixed  
float Single
for For
foreach For Each
goto GoTo
if If
implicit  
in In
int Integer
interface Interface
internal Friend
is Is
lock SyncLock
long Long
namespace Namespace
new New
null Nothing
object Object
operator Operator
out ByRef
override Overrides
params ParamArray
private Private
protected Protected
public Public
readonly Readonly
ref  
return Return
sbyte SByte
sealed NotInheritable
short Short
sizeof  
stackalloc  
static Shared
string String
struct Structure
switch Select
this Me
throw Throw
true True
try Try
typeof TypeOf
uint UInteger
ulong ULong
unchecked  
unsafe  
ushort UShort
using Imports
virtual Overridable
volatile  
void  
while While

 

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

 

 

Nový příspěvek

 

Diskuse: Zdrojový kód z C# do VB.NET snadno a rychle

zdravim je mi 14 takze nemam s tim moc zkusenosti a ja hraji jednu hru (onlinovku) a chci tam prepsat par informaci jako je HP EXP atd a kdyz tam upravit zdrojovy kod tak mi tam nabehne ta tabulkka zatim je vse v poradku ale nejde mi to prepsat prosim o pomoc

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

za prve asi to neni normalne :) a za druhe by ti mohlo dojt ze to asi nepojde prepisat nie ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jde vidět, že ti je fakt 14 ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Měl by ses nejdřív zeptat strýčka googla... pokud chces měnit hodnoty v online hře, mohl by ti pomoct cheat engine... ale ve většině případů se ti sice zobrazí, že máš něco vylepšeného, ale nebude to mít žádnou funkci...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Zdrojový kód z C# do VB.NET snadno a rychle

Váš článok mi velmi pomohol a oboznámil som sa so základnými rozdielmi medzi C# a VB.NET ,dakujem :)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Zdrojový kód z C# do VB.NET snadno a rychle

Ty tedy není možné vkládat???

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne, ve VB.NET víceřádkové komentáře zapisovat nelze. Nepleťte si komentář na více řádků, kde každý řádek začíná ' nebo REM a víceřádkový komentář, kde se označí pouze začátek komentáře a konec komentáře.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Zdrojový kód z C# do VB.NET snadno a rychle

Mám v C# v rámci jedné třídy takto definovanou vlastnost jako pole.

 public int[] Presets
        {
            get
            {
                int[] A = new int[10];
                A[0] = 14;
                A[1] = 16;
                A[2] = 18;
                A[3] = 20;
                A[4] = 22;
                A[5] = 24;
                A[6] = 26;
                A[7] = 28;
                A[8] = 30;
                A[9] = 32;
                return A;
            }

Jak mám tuto vlastnost převést do VB.NET, nejde mi vytvořit vlastnost jakožto pole. Děkuji za pomoc

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public ReadOnly Property Presets() As Integer()
  Get
    Dim A(9) As Integer
    A(0) = 14
    A(1) = 16
    A(2) = 18
    A(3) = 20
    A(4) = 22
    A(5) = 24
    A(6) = 26
    A(7) = 28
    A(8) = 30
    A(9) = 32
    Return A
  End Get
End Property

Jestliže vracíte pole hodnot, doporučuje se použít metodu místo vlastnosti.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Zdrojový kód z C# do VB.NET snadno a rychle

Vážený pane Linharte,

chtěl jsem Vám poděkovat za velice, alespoň pro mne, přínosný článek, protože máte plnou pravdu ve svém konstatování, že existuje mnoho zajímavých příkladů a vzorů programových vychytávek právě v jazyce C#, a přestože i bez hlubší znalosti člověk je schopen alespoň základní postup pochopit, je velice příjemné mít po ruce takto v kostce sepsány alespoň ty hlavní atributy obou platforem.

Při té příležitosti bych se Vás také, co by odborníka majícího bohaté a hlavně praktické zkušenosti s oběma uvedenými jazyky, zeptal, kde Vy vidíte příčinu tohoto stavu. Je to tím, že ty skutečně zajímavé programové fragmenty zcela logicky píší ti zkušenější programátoři - a tito jsou hlavně na C# zaměřeni z důvodu nějaké profesní hrdosti (že je pod jejich úroveň zabývat se "dětskou hračkou", za kterou je někdy VB označován - bez ohledu na to, co skutečně tato "hračka" umí či neumí), nebo jsou skutečně omezení schopností VB oproti C# natolik zásadní, že pro profesionála nemá takový systém smysl?

(Vím, že jste psal např. o těch "nebezpečných" fragmentech,...)

Konkrétně, co mne vede k takovému dotazu, je realita i Vámi zmiňovaného DirectX SDK, kde (i v té části věnující se managed kódu) je skutečně příkladů využívajících VB velice poskrovnu.

Je to proto, že autoři předpokládali, že takto náročnou knihovnu budou využívat takřka výhradně "profesionálové", kteří opět takřka výhradně budou využívat C# (nepojedou-li dokonce v C++) a že se do ní tedy nebudou tlačit nějaké LAMy (jak jsme mnohdy nazýváni my - nezkušení a potřebnými vědomostmi nezasažení) s nějakým "Basicem", anebo je skutečně většina funkcionality DirectX a to i v té managed oblasti nad síly a schopnosti "našeho" jazyka?

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Děkuji, jsem rád že mohu pomoct.

Podle mého osobního názoru je příčinou toho stavu buď snaha Microsoftu poměrně agresivním způsobem masově rozšířit C#, nebo je toto konání založeno na nějakém podrobném marketingovém průzkumu ze kterého vzešlo že lepší strategie bude soustředit se na C#. Například kdesi na fórech MSDN jsem četl, že rozhodnutí udělat XNA Game Studio Express zatím pouze pro C# bylo stanoveno na základě průzkumu v univerzitách zabývajících se informačními technologiemi.

Jak již na tomto webu bylo několikrát zmiňováno, Visual Basic .NET rozhodně není to co býval ve verzích 6.0 a nižších, je to plnohodnotný objektově orientovaný programovací jazyk. Rozdíly mezi C# a VB.NET jsou skutečně jen v syntaxi a možností C# pracovat s "nebezpečným" kódem, tuto vlastnost jsem však za celou dobu svého působení jako programátor nevyužil. Podle několika testů které jsem kdysi prováděl a které využívaly ukazatele při práci s polem jsem dokonce zjistil, že to může být až 2x pomalejší než při použití klasického bezpečného kódu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky ještě jednou za odpověď i za ujištění, že jsem "nevsadil na špatného koně".

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback