Ú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 |