Články

Tisk článku Tisk článku

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

[Zpět na kategorii]

Datum: 21. 1. 2008 23:49       Autor: Ondřej Linhart       Zobrazeno: 10032x

Kategorie: Začínáme

Témata: VB.NET, C#

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

 


> Na začátek

 

Hodnocení:

Hlasů: 18
Zvolte své hodnocení

Ondřej Linhart

Vývojář desktopových a mobilních aplikací.

Související články

Žádné související články nebyly nalezeny.

RSS Feed RSS Feed

Diskuse

C# vs. VB

Datum: 22.1.2008 1:26
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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?
 
           [Odpovědět]
 
Hodnocení: 3 Čekejte, prosím...

Re: C# vs. VB

Datum: 22.1.2008 9:07
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: C# vs. VB

Datum: 22.1.2008 9:15
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
Díky ještě jednou za odpověď i za ujištění, že jsem "nevsadil na špatného koně".
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Vlastnosti c#, jak na to v VB.NET

Datum: 24.1.2008 14:24
Autor: neregistrovaný (213.220.239.146)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Vlastnosti c#, jak na to v VB.NET

Datum: 24.1.2008 15:49
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395

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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

VB.NET a víceřádkové komentáře

Datum: 19.4.2008 14:24
Autor: Petr Vavřinec
Hodnocení autora: 0
Příspěvků: 43
Ty tedy není možné vkládat???
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: VB.NET a víceřádkové komentáře

Datum: 19.4.2008 15:11
Autor: Ondřej Linhart
Hodnocení autora: 1132
Příspěvků: 2395
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

potrebuju prepsat zdrokovy kod podle sveho gusta

Datum: 16.2.2010 10:07
Autor: neregistrovaný (78.136.140.101)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: -3 Čekejte, prosím...

Re: potrebuju prepsat zdrokovy kod podle sveho gusta

Datum: 21.2.2010 17:21
Autor: neregistrovaný (78.98.146.225)
Hodnocení autora: není
Příspěvků: 0
za prve asi to neni normalne :) a za druhe by ti mohlo dojt ze to asi nepojde prepisat nie ?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: potrebuju prepsat zdrokovy kod podle sveho gusta

Datum: 29.10.2010 11:53
Autor: neregistrovaný (213.29.146.239)
Hodnocení autora: není
Příspěvků: 0
Jde vidět, že ti je fakt 14 ;)
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: potrebuju prepsat zdrokovy kod podle sveho gusta

Datum: 2.6.2011 1:29
Autor: neregistrovaný (89.203.192.130)
Hodnocení autora: není
Příspěvků: 0
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...
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Perfektné

Datum: 18.6.2010 17:46
Autor: Šprici
Hodnocení autora: 11
Příspěvků: 83
Váš článok mi velmi pomohol a oboznámil som sa so základnými rozdielmi medzi C# a VB.NET ,dakujem :)
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.