Języki Programowania na Platformie .NET Tomasz Goluchgoluch/wyk/lec3_VB.pdf · VB/VS 7.0 .NET 1.0...
Transcript of Języki Programowania na Platformie .NET Tomasz Goluchgoluch/wyk/lec3_VB.pdf · VB/VS 7.0 .NET 1.0...
Visual Basic .NETJęzyki Programowania na Platformie .NET
Tomasz Goluch
http://kaims.eti.pg.gda.pl/∼goluch/[email protected]
Wersje VB, VS, .NET oraz C#
VB 1.0 (1991)VB 1.0 for DOS (1992)VB 2.0 (1992)VB 3.0 (1993)VB 4.0 (1995) 32-bitVB 5.0/VS 97 (1997)VB/VS 6.0 (1998)VB/VS 7.0 .NET 1.0 (2002) / C#1.0VB/VS 7.1 .NET 1.1 (2003) / C#1.2VB/VS 8.0 .NET 2.0 (2005) / C#2.0VB/VS 9.0 .NET 3.5 (2008) / C#3.0VB/VS 10.0 .NET 4.0 (2010) / C#4.0VB/VS 11.0 .NET 4.5 (2012) / C#5.0VB/VS 14.0 .NET 4.6 (2015) / C#6.0VB/VS 15.0 .NET 4.7 (2017) / C#7.0
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 7.0 .NET 1.0 (2002) / C#1.0
wprowadzenie platformy .NET Framework
wprowadzenie języka C#i J#podobnych w składni do językaJava
wprowadzenie rozszerzenia Managed C++obsługującegoplatformę .NET
VB/VS 7.1 .NET 1.1 (2003) / C#1.2
wsparcie w oprogramowywaniu i użytkowaniu urządzeńmobilnych ASP.NET
VB/VS 8.0 .NET 2.0 (2005) / C#2.0
typy generyczne
wprowadzenie języka C++/CLI w miejsce Managed C++
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 9.0 .NET 3.5 (2008) / C#3.0
rezygnacja z języka J#
LINQ, wyrażenia lambda
VB/VS 10.0 .NET 4.0 (2010) / C#4.0
słowo kluczowe „dynamic”
wprowadzenie języka F#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 9.0 .NET 3.5 (2008) / C#3.0
rezygnacja z języka J#
LINQ, wyrażenia lambda
VB/VS 10.0 .NET 4.0 (2010) / C#4.0
słowo kluczowe „dynamic”
wprowadzenie języka F#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 9.0 .NET 3.5 (2008) / C#3.0
rezygnacja z języka J#
LINQ, wyrażenia lambda
VB/VS 10.0 .NET 4.0 (2010) / C#4.0
słowo kluczowe „dynamic”
wprowadzenie języka F#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 9.0 .NET 3.5 (2008) / C#3.0
rezygnacja z języka J#
LINQ, wyrażenia lambda
VB/VS 10.0 .NET 4.0 (2010) / C#4.0
słowo kluczowe „dynamic”
wprowadzenie języka F#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 11.0 .NET 4.5 (2012) / C#5.0
słowa kluczowe „async” i „await”
VB/VS 14.0 .NET 4.6 (2013) / C#6.0
Auto property initializer
Primary constructors
Static typename
New collection initializers
New numbers syntax
kompilator Roslyn – open source (np. można napisaćrozszerzenia by wyświetlać własne ostrzeżenia i błędy wtrakcie kompilowania kodu)
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 15.0 .NET 4.7 (2015) / C#7.0
ValueTuple
Poprawa czytelności literałów
Typ zwracany przez referencję – tylko wykorzystanie funkcji zC#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 15.0 .NET 4.7 (2015) / C#7.0
ValueTuple
Poprawa czytelności literałów
Typ zwracany przez referencję – tylko wykorzystanie funkcji zC#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 15.0 .NET 4.7 (2015) / C#7.0
ValueTuple
Poprawa czytelności literałów
Typ zwracany przez referencję – tylko wykorzystanie funkcji zC#
Tomasz Goluch Visual Basic .NET
Wersje VB, VS, .NET oraz C#
VB/VS 15.0 .NET 4.7 (2015) / C#7.0
ValueTuple
Poprawa czytelności literałów
Typ zwracany przez referencję – tylko wykorzystanie funkcji zC#
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>
analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatorasłowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeńdzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatora
słowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeńdzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatorasłowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeń
dzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatorasłowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeńdzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)
w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatorasłowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeńdzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczbakombinacji nazw)instrukcja Select Case odpowiednik Switch zC#współpracuje z operatorami porównania: <,<=,>,>=,=,<>analogicznie typ wyliczeniowy Enum współpracuje z w/woperatorami i to nawet przy włączonej opcji Strictkompilatorasłowo kluczowe WithEvents wraz z Handles pozwala nadeklaratywny sposób określania obsługi zdarzeńdzięki RaiseEvent istnieje możliwość wyświetlenia listydostępnych zdarzeń i dodawania obsługi nowego bezopuszczania okna z kodem (doryczy równiez zmiennychzadeklarowanych z WithEvents)w zasiegu składni: With objectExpression ... End With– można wykonać szereg odwołań do określonego obiektu bezpodwania jego nazwy.
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
bardziej intuicyjny, naturalny, np. operatory:VB: and, or, not, &, =C#: &&, ||, !, +, ==lub deklaracja zmiennych:VB: Dim Name As String = "Tomek"C#: string Name = "Tomek"
lepsza współpraca z Intellisens’em (np. automatycznedopisywanie kodu właściwości)funkcje których nie ma w C#: IsNumeric, PMT
Dim s As String = "3"If IsNumeric(s) ThenMessageBox.Show("numeric")
ElseMessageBox.Show("not numeric")
End If
w C#można skorzystać z w/w metod dodając referencję dobiblioteki Microsoft.VisualBasic.dll :)
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
bardziej intuicyjny, naturalny, np. operatory:VB: and, or, not, &, =C#: &&, ||, !, +, ==lub deklaracja zmiennych:VB: Dim Name As String = "Tomek"C#: string Name = "Tomek"lepsza współpraca z Intellisens’em (np. automatycznedopisywanie kodu właściwości)
funkcje których nie ma w C#: IsNumeric, PMT
Dim s As String = "3"If IsNumeric(s) ThenMessageBox.Show("numeric")
ElseMessageBox.Show("not numeric")
End If
w C#można skorzystać z w/w metod dodając referencję dobiblioteki Microsoft.VisualBasic.dll :)
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
bardziej intuicyjny, naturalny, np. operatory:VB: and, or, not, &, =C#: &&, ||, !, +, ==lub deklaracja zmiennych:VB: Dim Name As String = "Tomek"C#: string Name = "Tomek"lepsza współpraca z Intellisens’em (np. automatycznedopisywanie kodu właściwości)funkcje których nie ma w C#: IsNumeric, PMT
Dim s As String = "3"If IsNumeric(s) ThenMessageBox.Show("numeric")
ElseMessageBox.Show("not numeric")
End If
w C#można skorzystać z w/w metod dodając referencję dobiblioteki Microsoft.VisualBasic.dll :)
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
bardziej intuicyjny, naturalny, np. operatory:VB: and, or, not, &, =C#: &&, ||, !, +, ==lub deklaracja zmiennych:VB: Dim Name As String = "Tomek"C#: string Name = "Tomek"lepsza współpraca z Intellisens’em (np. automatycznedopisywanie kodu właściwości)funkcje których nie ma w C#: IsNumeric, PMT
Dim s As String = "3"If IsNumeric(s) ThenMessageBox.Show("numeric")
ElseMessageBox.Show("not numeric")
End If
w C#można skorzystać z w/w metod dodając referencję dobiblioteki Microsoft.VisualBasic.dll :)
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Visual Basic .NET? vs C#
przestrzeń nazw My zapewnia dostęp do informacji orazobiektów powiązanych z aplikacją i środowiskiemwykonawczym.
możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicyprzy pomocy słowa kluczowego ReDim Preserve.
brak wsparcia dla kodu niebezpiecznego – odpowiedniki słówkluczowych: unsafe i fixed
brak odpowiednika ++i, i++, w środowisku wielowątkowymnależy użyć (analogicznie jak w C#) metod: Increment ,Decrement z przestrzeni nazw:System.Threading.Interlocked
obsługa literałów XML (wiązanie jednego języka z innym – cojeśli XML ewoluuje?)
deklaracja daty w linii: Dim data As Date = #12/31/2000#
moduły
Tomasz Goluch Visual Basic .NET
Podstawy
koniec linii = koniec instrukcji
znak oznacza kontynuację linii (musi być poprzedzonyprzynajmniej jednym białym znakiem), np.:
Sub Print( _x As Integer )
Instr1 : Instr2 - kilka instrukcji w jednym wierszu
’, REM - początek komentarza liniowego (brak komentarzablokowego)
Tomasz Goluch Visual Basic .NET
Podstawy
koniec linii = koniec instrukcji
znak oznacza kontynuację linii (musi być poprzedzonyprzynajmniej jednym białym znakiem), np.:
Sub Print( _x As Integer )
Instr1 : Instr2 - kilka instrukcji w jednym wierszu
’, REM - początek komentarza liniowego (brak komentarzablokowego)
Tomasz Goluch Visual Basic .NET
Podstawy
koniec linii = koniec instrukcji
znak oznacza kontynuację linii (musi być poprzedzonyprzynajmniej jednym białym znakiem), np.:
Sub Print( _x As Integer )
Instr1 : Instr2 - kilka instrukcji w jednym wierszu
’, REM - początek komentarza liniowego (brak komentarzablokowego)
Tomasz Goluch Visual Basic .NET
Podstawy
koniec linii = koniec instrukcji
znak oznacza kontynuację linii (musi być poprzedzonyprzynajmniej jednym białym znakiem), np.:
Sub Print( _x As Integer )
Instr1 : Instr2 - kilka instrukcji w jednym wierszu
’, REM - początek komentarza liniowego (brak komentarzablokowego)
Tomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Public – element dostępny w zakresie całego projektu (niemożna deklarować elementów publicznych w procedurach)Protected – element dostępny tylko wewnątrz klasy oraz wklasach potomnych (można używać tylko na poziomie klas)
Friend – element dostępny wewnątrz podzespołu „assembly”(można używać tylko na poziomie modułów1, interfejsów lubprzestrzeni nazw)Protected Friend – suma powyższych dwóchPrivate – element dostępny jedynie wewnątrz tego samegomodułu, klasy lub struktury (można używać tylko na poziomiemodułów)
1modułów, klas, strukturTomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Public – element dostępny w zakresie całego projektu (niemożna deklarować elementów publicznych w procedurach)Protected – element dostępny tylko wewnątrz klasy oraz wklasach potomnych (można używać tylko na poziomie klas)Friend – element dostępny wewnątrz podzespołu „assembly”(można używać tylko na poziomie modułów1, interfejsów lubprzestrzeni nazw)
Protected Friend – suma powyższych dwóchPrivate – element dostępny jedynie wewnątrz tego samegomodułu, klasy lub struktury (można używać tylko na poziomiemodułów)
1modułów, klas, strukturTomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Public – element dostępny w zakresie całego projektu (niemożna deklarować elementów publicznych w procedurach)Protected – element dostępny tylko wewnątrz klasy oraz wklasach potomnych (można używać tylko na poziomie klas)Friend – element dostępny wewnątrz podzespołu „assembly”(można używać tylko na poziomie modułów1, interfejsów lubprzestrzeni nazw)Protected Friend – suma powyższych dwóch
Private – element dostępny jedynie wewnątrz tego samegomodułu, klasy lub struktury (można używać tylko na poziomiemodułów)
1modułów, klas, strukturTomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Public – element dostępny w zakresie całego projektu (niemożna deklarować elementów publicznych w procedurach)Protected – element dostępny tylko wewnątrz klasy oraz wklasach potomnych (można używać tylko na poziomie klas)Friend – element dostępny wewnątrz podzespołu „assembly”(można używać tylko na poziomie modułów1, interfejsów lubprzestrzeni nazw)Protected Friend – suma powyższych dwóchPrivate – element dostępny jedynie wewnątrz tego samegomodułu, klasy lub struktury (można używać tylko na poziomiemodułów)
1modułów, klas, strukturTomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Public – element dostępny w zakresie całego projektu (niemożna deklarować elementów publicznych w procedurach)Protected – element dostępny tylko wewnątrz klasy oraz wklasach potomnych (można używać tylko na poziomie klas)Friend – element dostępny wewnątrz podzespołu „assembly”(można używać tylko na poziomie modułów1, interfejsów lubprzestrzeni nazw)Protected Friend – suma powyższych dwóchPrivate – element dostępny jedynie wewnątrz tego samegomodułu, klasy lub struktury (można używać tylko na poziomiemodułów)
1modułów, klas, strukturTomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Shared: wszystkie instancje struktury lub klasy współdzielątą samą zmienną
Shadows: zmienna „ukrywa” zmienną o tej samej nazwiew klasie bazowej
Static: zmienna istnieje pomiędzy wywołaniami procedury
Dim: słowo kluczowe informujące o deklaracji zmiennej
WithEvents: informuje, że zmienna jest obiektem typu, którymoże generować zdarzenia, które można przechwycić
Tomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Shared: wszystkie instancje struktury lub klasy współdzielątą samą zmienną
Shadows: zmienna „ukrywa” zmienną o tej samej nazwiew klasie bazowej
Static: zmienna istnieje pomiędzy wywołaniami procedury
Dim: słowo kluczowe informujące o deklaracji zmiennej
WithEvents: informuje, że zmienna jest obiektem typu, którymoże generować zdarzenia, które można przechwycić
Tomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Shared: wszystkie instancje struktury lub klasy współdzielątą samą zmienną
Shadows: zmienna „ukrywa” zmienną o tej samej nazwiew klasie bazowej
Static: zmienna istnieje pomiędzy wywołaniami procedury
Dim: słowo kluczowe informujące o deklaracji zmiennej
WithEvents: informuje, że zmienna jest obiektem typu, którymoże generować zdarzenia, które można przechwycić
Tomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Shared: wszystkie instancje struktury lub klasy współdzielątą samą zmienną
Shadows: zmienna „ukrywa” zmienną o tej samej nazwiew klasie bazowej
Static: zmienna istnieje pomiędzy wywołaniami procedury
Dim: słowo kluczowe informujące o deklaracji zmiennej
WithEvents: informuje, że zmienna jest obiektem typu, którymoże generować zdarzenia, które można przechwycić
Tomasz Goluch Visual Basic .NET
Deklaracja zmiennej
[ <atrybuty> ] [ dostęp ][[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]Dim [ WithEvents ] lista_zmiennych
Shared: wszystkie instancje struktury lub klasy współdzielątą samą zmienną
Shadows: zmienna „ukrywa” zmienną o tej samej nazwiew klasie bazowej
Static: zmienna istnieje pomiędzy wywołaniami procedury
Dim: słowo kluczowe informujące o deklaracji zmiennej
WithEvents: informuje, że zmienna jest obiektem typu, którymoże generować zdarzenia, które można przechwycić
Tomasz Goluch Visual Basic .NET
Tablice
Deklaracja tablicy: Dim a(), b(,), c(,,) As Integer
Dim c(15) As StringDim d(20,3) As Integer
Dim d(,) As Integerd = New Integer(20,3) {}
Tablicę c indeksujemy 0, . . . , 15.Pusta tablica (jeden z wymiarów -1): Dim tab(-1,5) As StringZmiana rozmiaru: ReDim c(25)Odwołanie d(5,1) = 3Inicjalizacja: Dim e = New Integer() {1, 2, 3, 4}
Tomasz Goluch Visual Basic .NET
Przykłady deklaracji
Dim napis As String = "Hello world."Dim tablica(), liczba As Integer
Gdy użyjemy Public, Protected, Friend, Protected Friend,Private, Shared, Shadows, Static, ReadOnly, lubWithEvents, to możemy pominąć Dim
Dim a, b, c As Single, d, e, f As Double, g, h As Integer
Tomasz Goluch Visual Basic .NET
Deklaracja stałej
[ <atrybuty> ] [ dostęp ] [ Shadows ]Const lista_stałych
Const napis As String = "Hello world."
Dla każdej stałej wymagany jest inicjator.
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Readonly:
ustalenie wartości na poziomie wykonania (podczas deklaracjialbo poprzez konstruktor), może zostać wyliczona
bardziej elastyczna – dowolny typ
nie gwarantuje niemożności zmiany wartości (reflection, kodunsafe i wskaźniki)
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Readonly:
ustalenie wartości na poziomie wykonania (podczas deklaracjialbo poprzez konstruktor), może zostać wyliczona
bardziej elastyczna – dowolny typ
nie gwarantuje niemożności zmiany wartości (reflection, kodunsafe i wskaźniki)
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Readonly:
ustalenie wartości na poziomie wykonania (podczas deklaracjialbo poprzez konstruktor), może zostać wyliczona
bardziej elastyczna – dowolny typ
nie gwarantuje niemożności zmiany wartości (reflection, kodunsafe i wskaźniki)
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Const:
ustalenie wartości na poziomie kompilacji kodu
można wykorzystać jedynie typy wbudowane
szybsza – jako literał w kodzie (brak odwołań do źródłowychbibliotek)
aktualizacja wartości może wymagać re-kompilacji kodu,inaczej wartości w powiązanych podzespołach mogą byćnieaktualne
można stosować podczas definiowania wartości etykiet sekcjiCase.
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Const:
ustalenie wartości na poziomie kompilacji kodu
można wykorzystać jedynie typy wbudowane
szybsza – jako literał w kodzie (brak odwołań do źródłowychbibliotek)
aktualizacja wartości może wymagać re-kompilacji kodu,inaczej wartości w powiązanych podzespołach mogą byćnieaktualne
można stosować podczas definiowania wartości etykiet sekcjiCase.
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Const:
ustalenie wartości na poziomie kompilacji kodu
można wykorzystać jedynie typy wbudowane
szybsza – jako literał w kodzie (brak odwołań do źródłowychbibliotek)
aktualizacja wartości może wymagać re-kompilacji kodu,inaczej wartości w powiązanych podzespołach mogą byćnieaktualne
można stosować podczas definiowania wartości etykiet sekcjiCase.
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Const:
ustalenie wartości na poziomie kompilacji kodu
można wykorzystać jedynie typy wbudowane
szybsza – jako literał w kodzie (brak odwołań do źródłowychbibliotek)
aktualizacja wartości może wymagać re-kompilacji kodu,inaczej wartości w powiązanych podzespołach mogą byćnieaktualne
można stosować podczas definiowania wartości etykiet sekcjiCase.
Tomasz Goluch Visual Basic .NET
Const czy Readonly?
Const:
ustalenie wartości na poziomie kompilacji kodu
można wykorzystać jedynie typy wbudowane
szybsza – jako literał w kodzie (brak odwołań do źródłowychbibliotek)
aktualizacja wartości może wymagać re-kompilacji kodu,inaczej wartości w powiązanych podzespołach mogą byćnieaktualne
można stosować podczas definiowania wartości etykiet sekcjiCase.
Tomasz Goluch Visual Basic .NET
Deklaracja typu wyliczeniowego
[ <atrybuty> ] [ dostęp ] [ Shadows ]Enum nazwa [ As typ ]składowe
End Enum
dostęp: Public, Protected, ...
przy braku inicjalizacji wartość jest równa 0 dla pierwszejskładowej lub jest o jeden większa od poprzednika na liście
każda składowa ma postać:[ <atrybuty> ] nazwa [ = inicjalizacja ]
Tomasz Goluch Visual Basic .NET
Deklaracja typu wyliczeniowego
[ <atrybuty> ] [ dostęp ] [ Shadows ]Enum nazwa [ As typ ]składowe
End Enum
dostęp: Public, Protected, ...
przy braku inicjalizacji wartość jest równa 0 dla pierwszejskładowej lub jest o jeden większa od poprzednika na liście
każda składowa ma postać:[ <atrybuty> ] nazwa [ = inicjalizacja ]
Tomasz Goluch Visual Basic .NET
Deklaracja typu wyliczeniowego
[ <atrybuty> ] [ dostęp ] [ Shadows ]Enum nazwa [ As typ ]składowe
End Enum
dostęp: Public, Protected, ...
przy braku inicjalizacji wartość jest równa 0 dla pierwszejskładowej lub jest o jeden większa od poprzednika na liście
każda składowa ma postać:[ <atrybuty> ] nazwa [ = inicjalizacja ]
Tomasz Goluch Visual Basic .NET
Wybrane typy danych
Typ Rozm. WartościByte 1 0..255SByte 1 −128..127Short 2 −32768..32767UShort 2 0..65535Integer 1 −2147483648..2147483647
−231..231 − 1UInteger 4 0..4294967295
0..232 − 1Long 8 −9223372036854775808..9223372036854775807
−263..263 − 1ULong 8 18446744073709551615
0..264 − 1BigInteger dyn. −∞..∞ (OutOfMemoryException)Complex dyn. zal. od użytego typu (każdy z pow.)
Tomasz Goluch Visual Basic .NET
Typ BigInteger
Dim b1 As BigInteger = 1, b2 As BigInteger = 1Dim i As Integer = 1While i Mod 1000 <> 0Dim n As BigInteger = b1 + b2b1 = b2b2 = ni += 1
End While
’wynik b2 = 70330367711422815821835254877183549770181269836358732742604905087154537118196933579742249494562611733487750449241765991088186363265450223647106012053374121273867339111198139373125598767690091902245245323403501
Tomasz Goluch Visual Basic .NET
Typ BigInteger
Dim b1 As BigInteger = 1, b2 As BigInteger = 1Dim i As Integer = 1While i Mod 1000 <> 0Dim n As BigInteger = b1 + b2b1 = b2b2 = ni += 1
End While
’wynik b2 = 70330367711422815821835254877183549770181269836358732742604905087154537118196933579742249494562611733487750449241765991088186363265450223647106012053374121273867339111198139373125598767690091902245245323403501
Tomasz Goluch Visual Basic .NET
Wybrane typy danych
Typ Rozmiar WartościSingle 4 ≈ −1.5 · 10−45..3.4 · 1038 (precyzja 7 cyfr)Double 8 ≈ −5.0 · 10−324..1.7 · 10308 (precyzja 15-16 cyfr)Decimal 16 ≈ ±1.0 · 10−28..±7.9 · 1028 (28-29 cyfr znacz.)Char 2 0..65535Boolean 1 True lub FalseObject 4 albo 8 wsk. każdy typ danychDate 8 Jan. 1, 0001 12:00:00 AM
Dec. 31, 9999 11:59:59 PMString 10+2·dł. 0..2147483647 znaków Unicode
Tomasz Goluch Visual Basic .NET
Typ Decimal
Dim f As Single = 0For i As Integer = 0 To 8f += 0.1F ’0.0(0011) - syst. bin.
Next
’wynik f = 0.9000001
Dim f As Decimal = 0For i As Integer = 0 To 8f += 0.1D
Next
’wynik f = 0.9
Tomasz Goluch Visual Basic .NET
Typ Decimal
Dim f As Single = 0For i As Integer = 0 To 8f += 0.1F ’0.0(0011) - syst. bin.
Next
’wynik f = 0.9000001
Dim f As Decimal = 0For i As Integer = 0 To 8f += 0.1D
Next
’wynik f = 0.9
Tomasz Goluch Visual Basic .NET
Typ Decimal
Dim f As Single = 0For i As Integer = 0 To 8f += 0.1F ’0.0(0011) - syst. bin.
Next
’wynik f = 0.9000001
Dim f As Decimal = 0For i As Integer = 0 To 8f += 0.1D
Next
’wynik f = 0.9
Tomasz Goluch Visual Basic .NET
Typ Decimal
Dim f As Single = 0For i As Integer = 0 To 8f += 0.1F ’0.0(0011) - syst. bin.
Next
’wynik f = 0.9000001
Dim f As Decimal = 0For i As Integer = 0 To 8f += 0.1D
Next
’wynik f = 0.9
Tomasz Goluch Visual Basic .NET
Typ Anonimowy
Dim x = New With {.Title = "Lord",.Surname = "Voldemort"
}Console.WriteLine("To przecież " _
+ x.Title + " " _+ x.Surname + "!")
’To przecież Lord Voldemort !
Tomasz Goluch Visual Basic .NET
Typy CLS
Typ .Net Typ VB C# zakresSystem.Byte Byte byte 0..255System.SByte SByte sbyte -128..127System.Int16 Short short -32 768..32 767System.UInt16 UShort ushort 0..65 535System.Int32 Integer int -231..231 − 1System.UInt32 UInteger uint 0..232 − 1System.Int64 Long long -263..263 − 1System.UInt64 ULong ulong 0..264 − 1System.Single Single float 32 bitySystem.Double Double double 64 bitySystem.Decimal Decimal decimal 128 bitówSystem.Char Char char unicodeSystem.String String string 16· dł.System.Boolean Boolean bool True,FalseSystem.Object Object object 32 bity
Tomasz Goluch Visual Basic .NET
Funkcje konwersji typu
Funkcja Konwersja doCBool BooleanCByte ByteCChar CharCDate DateCDbl DoubleCDec DecimalCInt IntegerCLng Long
Funkcja Konwersja doCObj ObjectCSByte SByteCShort ShortCSgn SingleCStr StringCUInt UIntegerCULng ULongCUShort Ushort
Tomasz Goluch Visual Basic .NET
Funkcje konwersji typu
różną się od rzutowania możliwością konwersji literałów
sprawdzają przekroczenie zakresu – odpowiednik słowakluczowego checked z C#.
tak jak niejawna konwersja typów, nie gwarantują brakuutraty informacji:
Dim ui As UInteger = 3000000001Dim s1 As Single = ui ’3.0E+9Dim s2 As Single = CSng(ui) ’3.0E+9
Tomasz Goluch Visual Basic .NET
Funkcje konwersji typu
różną się od rzutowania możliwością konwersji literałów
sprawdzają przekroczenie zakresu – odpowiednik słowakluczowego checked z C#.
tak jak niejawna konwersja typów, nie gwarantują brakuutraty informacji:
Dim ui As UInteger = 3000000001Dim s1 As Single = ui ’3.0E+9Dim s2 As Single = CSng(ui) ’3.0E+9
Tomasz Goluch Visual Basic .NET
Funkcje konwersji typu
różną się od rzutowania możliwością konwersji literałów
sprawdzają przekroczenie zakresu – odpowiednik słowakluczowego checked z C#.
tak jak niejawna konwersja typów, nie gwarantują brakuutraty informacji:
Dim ui As UInteger = 3000000001Dim s1 As Single = ui ’3.0E+9Dim s2 As Single = CSng(ui) ’3.0E+9
Tomasz Goluch Visual Basic .NET
Wybrane instrukcje sterujące
If ... Then...End If
If ... Then...[ ElseIf ... Then... ]Else...End If
While ......End While
For i=0 To 10 Step 1For i As Double=2 To 0 Step -0.25...Next [i]
Select xCase 1...Case 2,3...Case Is < 20...Case Else...
End Select
Tomasz Goluch Visual Basic .NET
Wybrane operatory
If( [arg1,] arg2, arg3 ) – dla trzech argumentówwartość logiczna pierwszego określa, która wartość, jednego zdwóch kolejnych argumentów, zostanie zwrócona– odpowiednik operatora warunkowego: ? w C#.
If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugiargument nie będzie oceniany zatem, nie wywoła wyjątku.
dla dwóch argumentów wartość pierwszego zostanie zwróconajeśli będzie różna od Nothing, w przeciwnym razie zostaniezwrócona wartość drugiego argumentu – odpowiednikoperatora: ?? (null coalescing) w C#
If( out, "" )
Tomasz Goluch Visual Basic .NET
Wybrane operatory
If( [arg1,] arg2, arg3 ) – dla trzech argumentówwartość logiczna pierwszego określa, która wartość, jednego zdwóch kolejnych argumentów, zostanie zwrócona– odpowiednik operatora warunkowego: ? w C#.
If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugiargument nie będzie oceniany zatem, nie wywoła wyjątku.
dla dwóch argumentów wartość pierwszego zostanie zwróconajeśli będzie różna od Nothing, w przeciwnym razie zostaniezwrócona wartość drugiego argumentu – odpowiednikoperatora: ?? (null coalescing) w C#
If( out, "" )
Tomasz Goluch Visual Basic .NET
Wybrane operatory
If( [arg1,] arg2, arg3 ) – dla trzech argumentówwartość logiczna pierwszego określa, która wartość, jednego zdwóch kolejnych argumentów, zostanie zwrócona– odpowiednik operatora warunkowego: ? w C#.
If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugiargument nie będzie oceniany zatem, nie wywoła wyjątku.
dla dwóch argumentów wartość pierwszego zostanie zwróconajeśli będzie różna od Nothing, w przeciwnym razie zostaniezwrócona wartość drugiego argumentu – odpowiednikoperatora: ?? (null coalescing) w C#
If( out, "" )
Tomasz Goluch Visual Basic .NET
Wybrane operatory
If( [arg1,] arg2, arg3 ) – dla trzech argumentówwartość logiczna pierwszego określa, która wartość, jednego zdwóch kolejnych argumentów, zostanie zwrócona– odpowiednik operatora warunkowego: ? w C#.
If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugiargument nie będzie oceniany zatem, nie wywoła wyjątku.
dla dwóch argumentów wartość pierwszego zostanie zwróconajeśli będzie różna od Nothing, w przeciwnym razie zostaniezwrócona wartość drugiego argumentu – odpowiednikoperatora: ?? (null coalescing) w C#
If( out, "" )
Tomasz Goluch Visual Basic .NET
Wybrane operatory
Is – czy dwie referencje wskazują na ten sam obiekt.if a Is b Then ...
IsNot – negacja powyższego.
TypeOf ... Is ... – czy obiekt jest określonego typu.If TypeOf a Is String Then
Tomasz Goluch Visual Basic .NET
Wybrane operatory
Is – czy dwie referencje wskazują na ten sam obiekt.if a Is b Then ...
IsNot – negacja powyższego.
TypeOf ... Is ... – czy obiekt jest określonego typu.If TypeOf a Is String Then
Tomasz Goluch Visual Basic .NET
Wybrane operatory
Is – czy dwie referencje wskazują na ten sam obiekt.if a Is b Then ...
IsNot – negacja powyższego.
TypeOf ... Is ... – czy obiekt jest określonego typu.If TypeOf a Is String Then
Tomasz Goluch Visual Basic .NET
Operator Like
Dim a As String...If a Like "?*@?*.?*" Then...
Znak(i) Znaczenie? pasuje do pojedynczego znaku* zero lub więcej znaków# pojedyncza cyfra[...] pasuje do dowolnego znaku podanego w nawiasach,
np. [a-z] lub [a-dg-p][!...] pasuje do dowolnego znaku nie wyst. na liścieA-Z użyte w nawiasach pasuje do każdego znaku z zakresu A..Z
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Partial – pozwala na deklarację i definicję metody wróżnych plikach. Niezdefiniowane metody częściowe sącałkowicie ignorowane podczas kompilacji (znajdujezastosowanie podczas generowania kodu GUI przez VS)
metoda musi być procedurą (Sub), nie może być funkcją(Function)
ciało metody musi pozostać pustemodyfikator dostępu musi być prywatny (Private)
dostęp: Public, Protected, ...
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Partial – pozwala na deklarację i definicję metody wróżnych plikach. Niezdefiniowane metody częściowe sącałkowicie ignorowane podczas kompilacji (znajdujezastosowanie podczas generowania kodu GUI przez VS)
metoda musi być procedurą (Sub), nie może być funkcją(Function)ciało metody musi pozostać puste
modyfikator dostępu musi być prywatny (Private)dostęp: Public, Protected, ...
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Partial – pozwala na deklarację i definicję metody wróżnych plikach. Niezdefiniowane metody częściowe sącałkowicie ignorowane podczas kompilacji (znajdujezastosowanie podczas generowania kodu GUI przez VS)
metoda musi być procedurą (Sub), nie może być funkcją(Function)ciało metody musi pozostać pustemodyfikator dostępu musi być prywatny (Private)
dostęp: Public, Protected, ...
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Partial – pozwala na deklarację i definicję metody wróżnych plikach. Niezdefiniowane metody częściowe sącałkowicie ignorowane podczas kompilacji (znajdujezastosowanie podczas generowania kodu GUI przez VS)
metoda musi być procedurą (Sub), nie może być funkcją(Function)ciało metody musi pozostać pustemodyfikator dostępu musi być prywatny (Private)
dostęp: Public, Protected, ...Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Partial – pozwala na deklarację i definicję metody wróżnych plikach. Niezdefiniowane metody częściowe sącałkowicie ignorowane podczas kompilacji (znajdujezastosowanie podczas generowania kodu GUI przez VS)
metoda musi być procedurą (Sub), nie może być funkcją(Function)ciało metody musi pozostać pustemodyfikator dostępu musi być prywatny (Private)
dostęp: Public, Protected, ...Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
modyfikatory:Overloads – ponowna deklaracja (domyślne działanie w C#)Overrides – przesłonienie metody bazowej (override w C#)
Overridable – może być przesłonięta w klasie pochodnej(virtual w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
modyfikatory:Overloads – ponowna deklaracja (domyślne działanie w C#)Overrides – przesłonienie metody bazowej (override w C#)Overridable – może być przesłonięta w klasie pochodnej(virtual w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
modyfikatory:Overloads – ponowna deklaracja (domyślne działanie w C#)Overrides – przesłonienie metody bazowej (override w C#)Overridable – może być przesłonięta w klasie pochodnej(virtual w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
modyfikatory:NotOverridable – nie może być przesłonięta w klasiepochodnej (sealed w C#)MustOverride – nie zaimplementowana i przed użyciem musizostać przesłonięta w klasie pochodnej (abstract w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
modyfikatory:NotOverridable – nie może być przesłonięta w klasiepochodnej (sealed w C#)MustOverride – nie zaimplementowana i przed użyciem musizostać przesłonięta w klasie pochodnej (abstract w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Shared – powiązanie metody z klasą albo strukturą zamiast zkonkretną instancją (static w C#)Shadows – ponowna deklaracja i ukrcie metody w klasiebazowej bądź wszystkich przeciążonych metod w hierarchiidziedziczenia (new w C#)
Async – informacja dla kompilatora że w metodzie będąużywane mozliwości asynchroniczne (async w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Shared – powiązanie metody z klasą albo strukturą zamiast zkonkretną instancją (static w C#)Shadows – ponowna deklaracja i ukrcie metody w klasiebazowej bądź wszystkich przeciążonych metod w hierarchiidziedziczenia (new w C#)Async – informacja dla kompilatora że w metodzie będąużywane mozliwości asynchroniczne (async w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
Shared – powiązanie metody z klasą albo strukturą zamiast zkonkretną instancją (static w C#)Shadows – ponowna deklaracja i ukrcie metody w klasiebazowej bądź wszystkich przeciążonych metod w hierarchiidziedziczenia (new w C#)Async – informacja dla kompilatora że w metodzie będąużywane mozliwości asynchroniczne (async w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
lista typów parametrów: dla procedur generycznych (generic)
element listy implementacji ma postać:interfejs.nazwa_procedury,. . . (brak odpowiednika wC#, wymaga przeciążenia osobno każdej metody interfejsu)
element listy zdarzeń ma postać: obiekt.zdarzenie,. . . np.:button.Click (brak odpowiednika w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
lista typów parametrów: dla procedur generycznych (generic)
element listy implementacji ma postać:interfejs.nazwa_procedury,. . . (brak odpowiednika wC#, wymaga przeciążenia osobno każdej metody interfejsu)
element listy zdarzeń ma postać: obiekt.zdarzenie,. . . np.:button.Click (brak odpowiednika w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ Partial ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async ]Sub nazwa [(Of lista_typ._param.)] [(lista param.)]
[ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Sub ]
[ wyrażenia ]End Sub
lista typów parametrów: dla procedur generycznych (generic)
element listy implementacji ma postać:interfejs.nazwa_procedury,. . . (brak odpowiednika wC#, wymaga przeciążenia osobno każdej metody interfejsu)
element listy zdarzeń ma postać: obiekt.zdarzenie,. . . np.:button.Click (brak odpowiednika w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
[ <atrybuty> ] [ dostęp ] [ modyfikatory ][ Shared ] [ Shadows ] [ Async | Iterator ]Function nazwa [(Of lista_typ._param.)] [(lista param.)][ As typ_zwracany ][ Implements lista_implementacji | Handles lista_zdarzeń ][ wyrażenia ] [ Return | Exit Function ]
[ wyrażenia ]End Function
Iterator – Iterator, wykorzystuje instrukcje yield dozwracania elementów kolekcji (brak odpowiednika w C#)
Tomasz Goluch Visual Basic .NET
Deklaracja procedur i funkcji
Function myFunction(ByVal j As Integer) As DoubleReturn 3.87 * j
End Function
Function myFunction(ByVal j As Integer) As DoublemyFunction = 3.87 * jExit Function
End Function
Tomasz Goluch Visual Basic .NET
Metody Rozszerzeń
Imports System.Runtime.CompilerServices
Module StringExtensions
<Extension()>Public Sub Print(ByVal aString As String)Console.WriteLine(aString)
End Sub
End Module
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
Przez wartość – procedura lub funkcjaotrzymuje kopię zmiennej.
Public Sub A(ByVal i As Integer)i += 1 ’ nie zmienia wart.
’ org. zmiennejEnd Sub
Przez referencję – proceduralub funkcja otrzymuje wskaźnikdo zmiennej.
Public Sub A(ByRef i As Integer)i += 1 ’ inkrementacja
’ org. zmiennejEnd Sub
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
[ <atrybuty> ] [ Optional ] [ { ByVal | ByRef } ] [ ParamArray ]nazwa_parametru[ ( ) ] [ As typ_param. ] [ = wartosc_domyślna ]
jeśli parametr jest Optional, to wszystkie pozostałe teżmuszą takie być,
parametr Optional musi mieć podaną wartość domyślną
ParamArray jest używany w połączeniu z ByVal (opcjonalnatablica elementów określonego typu)
nie można używać Optional i ParamArray jednocześnie
ByVal jest domyślnym mechanizmem; jeśli parametr jestreferencją, to procedura może modyfikować wskazywanyobiekt (choć nie może zmienić wartości samej referencji)
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
[ <atrybuty> ] [ Optional ] [ { ByVal | ByRef } ] [ ParamArray ]nazwa_parametru[ ( ) ] [ As typ_param. ] [ = wartosc_domyślna ]
jeśli parametr jest Optional, to wszystkie pozostałe teżmuszą takie być,
parametr Optional musi mieć podaną wartość domyślną
ParamArray jest używany w połączeniu z ByVal (opcjonalnatablica elementów określonego typu)
nie można używać Optional i ParamArray jednocześnie
ByVal jest domyślnym mechanizmem; jeśli parametr jestreferencją, to procedura może modyfikować wskazywanyobiekt (choć nie może zmienić wartości samej referencji)
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
[ <atrybuty> ] [ Optional ] [ { ByVal | ByRef } ] [ ParamArray ]nazwa_parametru[ ( ) ] [ As typ_param. ] [ = wartosc_domyślna ]
jeśli parametr jest Optional, to wszystkie pozostałe teżmuszą takie być,
parametr Optional musi mieć podaną wartość domyślną
ParamArray jest używany w połączeniu z ByVal (opcjonalnatablica elementów określonego typu)
nie można używać Optional i ParamArray jednocześnie
ByVal jest domyślnym mechanizmem; jeśli parametr jestreferencją, to procedura może modyfikować wskazywanyobiekt (choć nie może zmienić wartości samej referencji)
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
[ <atrybuty> ] [ Optional ] [ { ByVal | ByRef } ] [ ParamArray ]nazwa_parametru[ ( ) ] [ As typ_param. ] [ = wartosc_domyślna ]
jeśli parametr jest Optional, to wszystkie pozostałe teżmuszą takie być,
parametr Optional musi mieć podaną wartość domyślną
ParamArray jest używany w połączeniu z ByVal (opcjonalnatablica elementów określonego typu)
nie można używać Optional i ParamArray jednocześnie
ByVal jest domyślnym mechanizmem; jeśli parametr jestreferencją, to procedura może modyfikować wskazywanyobiekt (choć nie może zmienić wartości samej referencji)
Tomasz Goluch Visual Basic .NET
Przekazywanie parametrów
[ <atrybuty> ] [ Optional ] [ { ByVal | ByRef } ] [ ParamArray ]nazwa_parametru[ ( ) ] [ As typ_param. ] [ = wartosc_domyślna ]
jeśli parametr jest Optional, to wszystkie pozostałe teżmuszą takie być,
parametr Optional musi mieć podaną wartość domyślną
ParamArray jest używany w połączeniu z ByVal (opcjonalnatablica elementów określonego typu)
nie można używać Optional i ParamArray jednocześnie
ByVal jest domyślnym mechanizmem; jeśli parametr jestreferencją, to procedura może modyfikować wskazywanyobiekt (choć nie może zmienić wartości samej referencji)
Tomasz Goluch Visual Basic .NET
Definicja klasy
[ <atrybuty> ] [ dostęp ] [ Shadows ] _[ MustInherit | NotInheritable ] [ Partial ] _Class nazwa [ ( Of lista_typów ) ][ Inherits nazwa_klasy ][ Implements nazwa_interfejsów ][ zawartość ]
End Class
po klasach dziedziczymy, interfejsy implementujemy (jawnerozgraniczenie)
można definiować klasy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja klasy
[ <atrybuty> ] [ dostęp ] [ Shadows ] _[ MustInherit | NotInheritable ] [ Partial ] _Class nazwa [ ( Of lista_typów ) ][ Inherits nazwa_klasy ][ Implements nazwa_interfejsów ][ zawartość ]
End Class
po klasach dziedziczymy, interfejsy implementujemy (jawnerozgraniczenie)
można definiować klasy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja klasy
[ <atrybuty> ] [ dostęp ] [ Shadows ] _[ MustInherit | NotInheritable ] [ Partial ] _Class nazwa [ ( Of lista_typów ) ][ Inherits nazwa_klasy ][ Implements nazwa_interfejsów ][ zawartość ]
End Class
po klasach dziedziczymy, interfejsy implementujemy (jawnerozgraniczenie)
można definiować klasy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Słowa kluczowe Async i Await
Async – umieszczane w deklaracjach metod, metodanonimowych oraz wyrażeń lambda. Informuje kompilator, żew metodzie będą wykorzystywane możliwości asynchroniczne(pozwala na użycie słowa kluczowego Await, inaczej będzieono traktowane jako zwykły identyfikator)
Await – powoduje uruchomienie oznaczonej nim metody wtrybie asynchronicznym wraz z obsługą powinowactwa dowątku
Tomasz Goluch Visual Basic .NET
Słowa kluczowe Async i Await
Async – umieszczane w deklaracjach metod, metodanonimowych oraz wyrażeń lambda. Informuje kompilator, żew metodzie będą wykorzystywane możliwości asynchroniczne(pozwala na użycie słowa kluczowego Await, inaczej będzieono traktowane jako zwykły identyfikator)
Await – powoduje uruchomienie oznaczonej nim metody wtrybie asynchronicznym wraz z obsługą powinowactwa dowątku
Tomasz Goluch Visual Basic .NET
Słowa kluczowe Async i Await
Private Async Sub Button1_Click(sender As Object, _e As EventArgs) Handles Button1.Click
Dim result As String = Await WaitAsynchAsynchr()TextBox1.Text &= resultEnd Sub
Public Async Function WaitAsynchAsynchr() _As Task(Of String)Await Task.Delay(10000)Return "Finished"End Function
Public Async Function WaitSynchr() As Task(Of String)Thread.Sleep(10000)Return "Finished"
End Function
Tomasz Goluch Visual Basic .NET
Słowa kluczowe Async i Await
Async Function AccessTheWebAsync() As Task(Of Integer)Dim client As HttpClient = New HttpClient()Dim getStringTask As Task(Of String) = _client.GetStringAsync("http://msdn.microsoft.com")DoIndependentWork()Dim urlContents As String = Await getStringTaskReturn urlContents.Length
End Function
http://msdn.microsoft.com/en-us/library/hh191443.aspx
Tomasz Goluch Visual Basic .NET
Słowo kluczowe Global
Namespace SpecialSpaceNamespace SystemClass abcFunction getValue() As System.Int32Dim n As System.Int32Return n
End FunctionEnd Class
End NamespaceEnd Namespace
http://msdn.microsoft.com/en-us/library/zt9tafza.aspx
Tomasz Goluch Visual Basic .NET
Słowo kluczowe Global
Namespace SpecialSpaceNamespace SystemClass abcFunction getValue() As Global.System.Int32Dim n As Global.System.Int32Return n
End FunctionEnd Class
End NamespaceEnd Namespace
http://msdn.microsoft.com/en-us/library/zt9tafza.aspx
Tomasz Goluch Visual Basic .NET
Słowa kluczowe Iterator i Yield
Sub Main()For Each number As Integer In SomeNumbers()Console.Write(number & " ")
Next’ Output: 3 5 8Console.ReadKey()
End Sub
Private Iterator Function _SomeNumbers() As System.Collections.IEnumerableYield 3Yield 5Yield 8
End Function
Tomasz Goluch Visual Basic .NET
Częściowe klasy i procedury
pozwala umieścićfragmenty kodu klasyw różnych fragmentachpliku lub w różnychmodułach,
co najmniej jeden zfragmentów musi byćpoprzedzony słowemPartial, ale dlaprzejrzystości kodusugeruje się używać przykażdym fragmencie
przydatne, gdy kilka osóbpracuje nad różnymifragmentami jednej klasy.
Partial Public Class APublic x As IntegerEnd Class
... inny kod ...
Partial Public Class APublic y As DoubleEnd Class
Tomasz Goluch Visual Basic .NET
Częściowe klasy i procedury
pozwala umieścićfragmenty kodu klasyw różnych fragmentachpliku lub w różnychmodułach,
co najmniej jeden zfragmentów musi byćpoprzedzony słowemPartial, ale dlaprzejrzystości kodusugeruje się używać przykażdym fragmencie
przydatne, gdy kilka osóbpracuje nad różnymifragmentami jednej klasy.
Partial Public Class APublic x As IntegerEnd Class
... inny kod ...
Partial Public Class APublic y As DoubleEnd Class
Tomasz Goluch Visual Basic .NET
Częściowe klasy i procedury
pozwala umieścićfragmenty kodu klasyw różnych fragmentachpliku lub w różnychmodułach,
co najmniej jeden zfragmentów musi byćpoprzedzony słowemPartial, ale dlaprzejrzystości kodusugeruje się używać przykażdym fragmencie
przydatne, gdy kilka osóbpracuje nad różnymifragmentami jednej klasy.
Partial Public Class APublic x As IntegerEnd Class
... inny kod ...
Partial Public Class APublic y As DoubleEnd Class
Tomasz Goluch Visual Basic .NET
Częściowe klasy i procedury
częściowa procedurapozwala na oddzielenie jejdeklaracji odimplementacji
używamy wrazz częściową klasą:w jednej części klasyumieszczamy deklarację,natomiast w drugiejimplementację
Partial Class APrivate x As Integer’ deklaracja:Partial Private Sub powieksz()End Sub
End Class...Partial Class Product’ implementacja:Private Sub powieksz()x = x+1
End SubEnd Class
Tomasz Goluch Visual Basic .NET
Częściowe klasy i procedury
częściowa procedurapozwala na oddzielenie jejdeklaracji odimplementacji
używamy wrazz częściową klasą:w jednej części klasyumieszczamy deklarację,natomiast w drugiejimplementację
Partial Class APrivate x As Integer’ deklaracja:Partial Private Sub powieksz()End Sub
End Class...Partial Class Product’ implementacja:Private Sub powieksz()x = x+1
End SubEnd Class
Tomasz Goluch Visual Basic .NET
Dostępność
Public – klasa dostępna dla całego kodu, również pozamodułem
Protected – stosowane tylko w odniesieniu do klas; dostęptylko w obrębie klasy i klas pochodnych
Friend (domyślne) – klasa dostępna dla całego koduw module oraz poza modułem wewnątrz tego samegoprojektu. Różnice w stosunku do Public są przy tworzeniubibliotek.
Protected Friend – suma dwóch powyższych.
Private – klasa dostępna tylko wewnątrz modułu.
Tomasz Goluch Visual Basic .NET
Dostępność
Public – klasa dostępna dla całego kodu, również pozamodułem
Protected – stosowane tylko w odniesieniu do klas; dostęptylko w obrębie klasy i klas pochodnych
Friend (domyślne) – klasa dostępna dla całego koduw module oraz poza modułem wewnątrz tego samegoprojektu. Różnice w stosunku do Public są przy tworzeniubibliotek.
Protected Friend – suma dwóch powyższych.
Private – klasa dostępna tylko wewnątrz modułu.
Tomasz Goluch Visual Basic .NET
Dostępność
Public – klasa dostępna dla całego kodu, również pozamodułem
Protected – stosowane tylko w odniesieniu do klas; dostęptylko w obrębie klasy i klas pochodnych
Friend (domyślne) – klasa dostępna dla całego koduw module oraz poza modułem wewnątrz tego samegoprojektu. Różnice w stosunku do Public są przy tworzeniubibliotek.
Protected Friend – suma dwóch powyższych.
Private – klasa dostępna tylko wewnątrz modułu.
Tomasz Goluch Visual Basic .NET
Dostępność
Public – klasa dostępna dla całego kodu, również pozamodułem
Protected – stosowane tylko w odniesieniu do klas; dostęptylko w obrębie klasy i klas pochodnych
Friend (domyślne) – klasa dostępna dla całego koduw module oraz poza modułem wewnątrz tego samegoprojektu. Różnice w stosunku do Public są przy tworzeniubibliotek.
Protected Friend – suma dwóch powyższych.
Private – klasa dostępna tylko wewnątrz modułu.
Tomasz Goluch Visual Basic .NET
Dostępność
Public – klasa dostępna dla całego kodu, również pozamodułem
Protected – stosowane tylko w odniesieniu do klas; dostęptylko w obrębie klasy i klas pochodnych
Friend (domyślne) – klasa dostępna dla całego koduw module oraz poza modułem wewnątrz tego samegoprojektu. Różnice w stosunku do Public są przy tworzeniubibliotek.
Protected Friend – suma dwóch powyższych.
Private – klasa dostępna tylko wewnątrz modułu.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
brak klas statycznych, można symulować ich zachowanie nadwa sposoby:
“zwykłe klasy” ze współdzieloną (Shared) zawartością
moduły – słowo kluczowe: Module
MustInherit – nie można tworzyć instancji takiej klasy(klasa abstrakcyjna).
NotInheritable – nie można dziedziczyć.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
brak klas statycznych, można symulować ich zachowanie nadwa sposoby:
“zwykłe klasy” ze współdzieloną (Shared) zawartościąmoduły – słowo kluczowe: Module
MustInherit – nie można tworzyć instancji takiej klasy(klasa abstrakcyjna).
NotInheritable – nie można dziedziczyć.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
brak klas statycznych, można symulować ich zachowanie nadwa sposoby:
“zwykłe klasy” ze współdzieloną (Shared) zawartościąmoduły – słowo kluczowe: Module
MustInherit – nie można tworzyć instancji takiej klasy(klasa abstrakcyjna).
NotInheritable – nie można dziedziczyć.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
brak klas statycznych, można symulować ich zachowanie nadwa sposoby:
“zwykłe klasy” ze współdzieloną (Shared) zawartościąmoduły – słowo kluczowe: Module
MustInherit – nie można tworzyć instancji takiej klasy(klasa abstrakcyjna).
NotInheritable – nie można dziedziczyć.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
brak klas statycznych, można symulować ich zachowanie nadwa sposoby:
“zwykłe klasy” ze współdzieloną (Shared) zawartościąmoduły – słowo kluczowe: Module
MustInherit – nie można tworzyć instancji takiej klasy(klasa abstrakcyjna).
NotInheritable – nie można dziedziczyć.
Tomasz Goluch Visual Basic .NET
Dziedziczenie
Public MustInherit Class FiguraPublic MustOverride Sub Pole()End Class
Public Class KwadratInherits FiguraPublic Overrides Sub Pole()...End SubEnd Class
Tomasz Goluch Visual Basic .NET
Dziedziczenie – przykład
Private MustInherit Class APublic x As IntegerPublic Sub f(ByVal x As Integer)Me.x = x
End SubEnd Class
Private Class BInherits APublic Overloads Sub f(ByVal x _
As Integer)Me.x = 2 * x
End SubEnd Class
Dim a As Aa = New Ba.f(5) ’ a.x = 5
Dim b As Bb = New Bb.f(5) ’ b.x = 10
Tomasz Goluch Visual Basic .NET
Dziedziczenie – przykład
Private MustInherit Class APublic x As IntegerPublic Overridable Sub f(ByVal x As Integer)Me.x = x
End SubEnd Class
Private Class BInherits APublic Overrides Sub f(ByVal x _
As Integer)Me.x = 2 * x
End SubEnd Class
Dim a As Aa = New Ba.f(5) ’ a.x = 10
Dim b As Bb = New Bb.f(5) ’ b.x = 10
Tomasz Goluch Visual Basic .NET
Dziedziczenie – przykład
Private MustInherit Class APublic x As IntegerPublic Sub New()x = 1
End SubEnd Class
Private Class BInherits APublic Shadows x As IntegerPublic Sub New()x = 2
End SubEnd Class
Dim a As ADim b As Ba = New Bb = New BConsole.WriteLine(a.x) ’1Console.WriteLine(b.x) ’2
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu
deklaracja zmiennej dowolnej klasy to alokacja 4 bajtówpamięci i przypisanie jej domyślnej wartości Nothing
przy braku konstruktorów, przy tworzeniu obiektu używamysłowa New bez parametrów
konstruktor to procedura o nazwie New (zwykle kilkai z parametrami).
pierwsza linia konstruktora powinna być wywołaniemkonstruktora w klasie bazowej, co realizujemy poprzezMyBase.New(parametry)
powyższe można pominąć jeśli klasa bazowa posiadakonstruktor bez parametrów i wówczas zostanie on wywołanydomyślnie
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu
deklaracja zmiennej dowolnej klasy to alokacja 4 bajtówpamięci i przypisanie jej domyślnej wartości Nothing
przy braku konstruktorów, przy tworzeniu obiektu używamysłowa New bez parametrów
konstruktor to procedura o nazwie New (zwykle kilkai z parametrami).
pierwsza linia konstruktora powinna być wywołaniemkonstruktora w klasie bazowej, co realizujemy poprzezMyBase.New(parametry)
powyższe można pominąć jeśli klasa bazowa posiadakonstruktor bez parametrów i wówczas zostanie on wywołanydomyślnie
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu
deklaracja zmiennej dowolnej klasy to alokacja 4 bajtówpamięci i przypisanie jej domyślnej wartości Nothing
przy braku konstruktorów, przy tworzeniu obiektu używamysłowa New bez parametrów
konstruktor to procedura o nazwie New (zwykle kilkai z parametrami).
pierwsza linia konstruktora powinna być wywołaniemkonstruktora w klasie bazowej, co realizujemy poprzezMyBase.New(parametry)
powyższe można pominąć jeśli klasa bazowa posiadakonstruktor bez parametrów i wówczas zostanie on wywołanydomyślnie
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu
deklaracja zmiennej dowolnej klasy to alokacja 4 bajtówpamięci i przypisanie jej domyślnej wartości Nothing
przy braku konstruktorów, przy tworzeniu obiektu używamysłowa New bez parametrów
konstruktor to procedura o nazwie New (zwykle kilkai z parametrami).
pierwsza linia konstruktora powinna być wywołaniemkonstruktora w klasie bazowej, co realizujemy poprzezMyBase.New(parametry)
powyższe można pominąć jeśli klasa bazowa posiadakonstruktor bez parametrów i wówczas zostanie on wywołanydomyślnie
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu
deklaracja zmiennej dowolnej klasy to alokacja 4 bajtówpamięci i przypisanie jej domyślnej wartości Nothing
przy braku konstruktorów, przy tworzeniu obiektu używamysłowa New bez parametrów
konstruktor to procedura o nazwie New (zwykle kilkai z parametrami).
pierwsza linia konstruktora powinna być wywołaniemkonstruktora w klasie bazowej, co realizujemy poprzezMyBase.New(parametry)
powyższe można pominąć jeśli klasa bazowa posiadakonstruktor bez parametrów i wówczas zostanie on wywołanydomyślnie
Tomasz Goluch Visual Basic .NET
Konstruktory – przykład
Public Class OsobaPublic imie As StringPublic nazw As String
Public Sub New(ByVal i As String, ByVal n As String)imie = inazw = nEnd Sub
Public Sub New()Me.New("-", "-")End SubEnd Class
Tomasz Goluch Visual Basic .NET
Tworzenie obiektu – przykład
Public Class OsobaPublic imie As StringPublic nazw As String
Public Sub New(Optional ByVal i As String = "-", _Optional ByVal n As String = "=")
imie = inazw = nEnd SubEnd Class
Dim a As Osoba = New Osoba ’ -,=Dim b As Osoba = New Osoba("Jan") ’ Jan,=Dim b As Osoba = New Osoba("Jan", "K") ’ Jan,K
Tomasz Goluch Visual Basic .NET
Uwaga o składowych Private
Jeśli składowa klasy (np. zmienna) jest zadeklarowana jakoPrivate, to obiekt danej klasy ma również dostęp do tej składowejw innej instancji tej samej klasy.
Public Class PunktPrivate x As Double
Public Function Porownaj(ByVal inny_punkt As Punkt) _As BooleanIf x > inny_punkt.x Thenreturn TrueElsereturn FalseEnd IfEnd FunctionEnd Class
Tomasz Goluch Visual Basic .NET
Metoda Finalize
Garbage collector zwalnia pamięć przydzieloną obiektom, doktórych nie ma referencji w programie. Możemy zlecićwykonanie kodu tuż przed zwolnieniem pamięci przesłaniającmetodę Finalize zdefiniowaną w Object.
metoda Finalize nie musi być wywołana bezpośrednio potym, gdy przestaną istnieć w programie referencje do obiektu
w celu natychmiastowego zwalniania zasobów używamyDispose
Public Class A...Protected Overrides Sub Finalize()...End SubEnd Class
Tomasz Goluch Visual Basic .NET
Metoda Finalize
Garbage collector zwalnia pamięć przydzieloną obiektom, doktórych nie ma referencji w programie. Możemy zlecićwykonanie kodu tuż przed zwolnieniem pamięci przesłaniającmetodę Finalize zdefiniowaną w Object.
metoda Finalize nie musi być wywołana bezpośrednio potym, gdy przestaną istnieć w programie referencje do obiektu
w celu natychmiastowego zwalniania zasobów używamyDispose
Public Class A...Protected Overrides Sub Finalize()...End SubEnd Class
Tomasz Goluch Visual Basic .NET
Metoda Finalize
Garbage collector zwalnia pamięć przydzieloną obiektom, doktórych nie ma referencji w programie. Możemy zlecićwykonanie kodu tuż przed zwolnieniem pamięci przesłaniającmetodę Finalize zdefiniowaną w Object.
metoda Finalize nie musi być wywołana bezpośrednio potym, gdy przestaną istnieć w programie referencje do obiektu
w celu natychmiastowego zwalniania zasobów używamyDispose
Public Class A...Protected Overrides Sub Finalize()...End SubEnd Class
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów
można przeciążać następujące operatory: +,-,*,/,\,^,&,<<,>>,=,<>,<,>,<=,>=,Mod,Not,And,Or,Xor,Like,IsTrue,IsFalse,CType
pewne operatory tworzą pary – trzeba przeciążać równieżdrugi. Pary: =,<>; <,>; <=,>= oraz IsTrue,IsFalse.
nie można przeciążać:AndAlso,OrElse,New,TypeOf ... Is,Is,IsNot,AddressOf,GetType,AsType
definiujemy podobnie jak procedury/funkcje, przy czymSub/Function używamy słowa kluczowego Operator,a nazwą metody jest przeciążany operator
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów
można przeciążać następujące operatory: +,-,*,/,\,^,&,<<,>>,=,<>,<,>,<=,>=,Mod,Not,And,Or,Xor,Like,IsTrue,IsFalse,CType
pewne operatory tworzą pary – trzeba przeciążać równieżdrugi. Pary: =,<>; <,>; <=,>= oraz IsTrue,IsFalse.
nie można przeciążać:AndAlso,OrElse,New,TypeOf ... Is,Is,IsNot,AddressOf,GetType,AsType
definiujemy podobnie jak procedury/funkcje, przy czymSub/Function używamy słowa kluczowego Operator,a nazwą metody jest przeciążany operator
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów
można przeciążać następujące operatory: +,-,*,/,\,^,&,<<,>>,=,<>,<,>,<=,>=,Mod,Not,And,Or,Xor,Like,IsTrue,IsFalse,CType
pewne operatory tworzą pary – trzeba przeciążać równieżdrugi. Pary: =,<>; <,>; <=,>= oraz IsTrue,IsFalse.
nie można przeciążać:AndAlso,OrElse,New,TypeOf ... Is,Is,IsNot,AddressOf,GetType,AsType
definiujemy podobnie jak procedury/funkcje, przy czymSub/Function używamy słowa kluczowego Operator,a nazwą metody jest przeciążany operator
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów
można przeciążać następujące operatory: +,-,*,/,\,^,&,<<,>>,=,<>,<,>,<=,>=,Mod,Not,And,Or,Xor,Like,IsTrue,IsFalse,CType
pewne operatory tworzą pary – trzeba przeciążać równieżdrugi. Pary: =,<>; <,>; <=,>= oraz IsTrue,IsFalse.
nie można przeciążać:AndAlso,OrElse,New,TypeOf ... Is,Is,IsNot,AddressOf,GetType,AsType
definiujemy podobnie jak procedury/funkcje, przy czymSub/Function używamy słowa kluczowego Operator,a nazwą metody jest przeciążany operator
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów
Class PunktPrivate x, y As DoublePublic Sub New(ByVal x As Double, ByVal y As Double)Me.x = xMe.y = y
End Sub
Public Shared Operator +(ByVal a As Punkt,ByVal b As Punkt) As Punkt
Dim r As New Punkt( a.x + b.x, a.y + b.y )Return r
End OperatorEnd Class
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów – przykład
Private Class APublic x As IntegerPublic Sub New()x = 1
End Sub
Public Shared Widening Operator CType(ByVal x As Integer) As ADim r As A = New Ar.x = xReturn r
End OperatorEnd Class...Dim a As A = New Aa = 101
Uwaga: musimy użyć:
Widening – gdy rzutowanie zawsze się powiedzie
Narrowing – gdy możliwy jest błąd rzutowania (zgłosimy wyjątek)
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów – przykład
Private Class APublic x As IntegerPublic Sub New()x = 1
End Sub
Public Shared Widening Operator CType(ByVal x As Integer) As ADim r As A = New Ar.x = xReturn r
End OperatorEnd Class...Dim a As A = New Aa = 101
Uwaga: musimy użyć:
Widening – gdy rzutowanie zawsze się powiedzie
Narrowing – gdy możliwy jest błąd rzutowania (zgłosimy wyjątek)
Tomasz Goluch Visual Basic .NET
Przeciążanie operatorów – przykład
Private Class APublic x As IntegerPublic Sub New()x = 1
End Sub
Public Shared Widening Operator CType(ByVal x As Integer) As ADim r As A = New Ar.x = xReturn r
End OperatorEnd Class...Dim a As A = New Aa = 101
Uwaga: musimy użyć:
Widening – gdy rzutowanie zawsze się powiedzie
Narrowing – gdy możliwy jest błąd rzutowania (zgłosimy wyjątek)
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
typ referencyjny, może być zdefiniowany jedynie wewnątrzpliku lub przestrzeni nazw
czas życia identyczny jak czas życia programu
dostęp jedynie Friend (domyslny) i Public
wewnątrz modułu można definiować: zmienne, właściwości,zdarzenia, procedury oraz typy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
typ referencyjny, może być zdefiniowany jedynie wewnątrzpliku lub przestrzeni nazw
czas życia identyczny jak czas życia programu
dostęp jedynie Friend (domyslny) i Public
wewnątrz modułu można definiować: zmienne, właściwości,zdarzenia, procedury oraz typy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
typ referencyjny, może być zdefiniowany jedynie wewnątrzpliku lub przestrzeni nazw
czas życia identyczny jak czas życia programu
dostęp jedynie Friend (domyslny) i Public
wewnątrz modułu można definiować: zmienne, właściwości,zdarzenia, procedury oraz typy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
typ referencyjny, może być zdefiniowany jedynie wewnątrzpliku lub przestrzeni nazw
czas życia identyczny jak czas życia programu
dostęp jedynie Friend (domyslny) i Public
wewnątrz modułu można definiować: zmienne, właściwości,zdarzenia, procedury oraz typy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
typ referencyjny, może być zdefiniowany jedynie wewnątrzpliku lub przestrzeni nazw
czas życia identyczny jak czas życia programu
dostęp jedynie Friend (domyslny) i Public
wewnątrz modułu można definiować: zmienne, właściwości,zdarzenia, procedury oraz typy zagnieżdżone
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
składowe modułu widoczne są bezpośrednio w przestrzeninazw w którym jest on zdefiniowany (promocja typu)
nie można dziedziczyć, implementować oraz tworzyć obiektówmodułu.
wszystkie składowe modułu są współdzielone – Shared,(static w C#)
odpowiednik klasy statycznej i zamkniętej jednocześnie(static i sealed z C#) ?
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
składowe modułu widoczne są bezpośrednio w przestrzeninazw w którym jest on zdefiniowany (promocja typu)
nie można dziedziczyć, implementować oraz tworzyć obiektówmodułu.
wszystkie składowe modułu są współdzielone – Shared,(static w C#)
odpowiednik klasy statycznej i zamkniętej jednocześnie(static i sealed z C#) ?
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
składowe modułu widoczne są bezpośrednio w przestrzeninazw w którym jest on zdefiniowany (promocja typu)
nie można dziedziczyć, implementować oraz tworzyć obiektówmodułu.
wszystkie składowe modułu są współdzielone – Shared,(static w C#)
odpowiednik klasy statycznej i zamkniętej jednocześnie(static i sealed z C#) ?
Tomasz Goluch Visual Basic .NET
Definicja modułu
[ <atrybuty> ] [ dostęp ] Module nazwa[ zawartość ]
End Module
składowe modułu widoczne są bezpośrednio w przestrzeninazw w którym jest on zdefiniowany (promocja typu)
nie można dziedziczyć, implementować oraz tworzyć obiektówmodułu.
wszystkie składowe modułu są współdzielone – Shared,(static w C#)
odpowiednik klasy statycznej i zamkniętej jednocześnie(static i sealed z C#) ?
Tomasz Goluch Visual Basic .NET
Moduły – przykład
Public Module thisModuleSub Main()Dim userName As String = _InputBox("What is your name?")MsgBox("User name is" & userName)
End Sub’ Insert variable, property, procedure,’ and event declarations.
End Module
Tomasz Goluch Visual Basic .NET
Delegaty
Public Shared Function GetIndexOfFirstNonEmptyBin _(ByVal bins As Integer()) As IntegerDim num As Integer = Array.FindIndex( _bins, AddressOf IsGreaterThanZero)Return num
End Function
Private Shared Function IsGreaterThanZero _(ByVal value As Integer) As BooleanReturn value > 0
End Function
operator AddressOf zwraca adres procedury/funkcji
Tomasz Goluch Visual Basic .NET
Delegaty
Public Delegate Function Predicate _(Of In T)(ByVal obj As T) As Boolean
Public Shared Function FindIndex _(Of T)(ByVal array As T(), _ByVal match As Predicate(Of T)) As Integer
’ ...ElseIf (Not match(array(i))) Then
’ ...
End Function
typ Predicate(Of T) pozwala na przekazanie procedury/funkcji
jest on definiowany przy pomocy słowa kluczowego Delegate
w celu dopasowywania metody do typu delegata możliwa jestniejawna konwersja parametrów metody do parametrów delegata
Tomasz Goluch Visual Basic .NET
Delegaty
Public Delegate Function Predicate _(Of In T)(ByVal obj As T) As Boolean
Public Shared Function FindIndex _(Of T)(ByVal array As T(), _ByVal match As Predicate(Of T)) As Integer
’ ...ElseIf (Not match(array(i))) Then
’ ...
End Function
typ Predicate(Of T) pozwala na przekazanie procedury/funkcji
jest on definiowany przy pomocy słowa kluczowego Delegate
w celu dopasowywania metody do typu delegata możliwa jestniejawna konwersja parametrów metody do parametrów delegata
Tomasz Goluch Visual Basic .NET
Delegaty
Public Delegate Function Predicate _(Of In T)(ByVal obj As T) As Boolean
Public Shared Function FindIndex _(Of T)(ByVal array As T(), _ByVal match As Predicate(Of T)) As Integer
’ ...ElseIf (Not match(array(i))) Then
’ ...
End Function
typ Predicate(Of T) pozwala na przekazanie procedury/funkcji
jest on definiowany przy pomocy słowa kluczowego Delegate
w celu dopasowywania metody do typu delegata możliwa jestniejawna konwersja parametrów metody do parametrów delegata
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Dim p = New Predicate(Of Integer)(AddressOf IsGreaterThanZero)
Dim p As Predicate(Of Integer) = AddressOf IsGreaterThanZero
wyrażenie IsGreaterThanZero nie ma własnego typu i możepasować do różnych typów delegatów zatem musimy podaćjawnie, którego typu delegatów chcemy użyć
wyrażenie IsGreaterThanZero reprezentuje grupę metod(możliwe przeciażenie)
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Dim p = New Predicate(Of Integer)(AddressOf IsGreaterThanZero)
Dim p As Predicate(Of Integer) = AddressOf IsGreaterThanZero
wyrażenie IsGreaterThanZero nie ma własnego typu i możepasować do różnych typów delegatów zatem musimy podaćjawnie, którego typu delegatów chcemy użyć
wyrażenie IsGreaterThanZero reprezentuje grupę metod(możliwe przeciażenie)
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Public Class ThresholdComparer
Public Property Threshold As Integer
Public Function IsGreaterThan(ByVal value As Integer) _As BooleanReturn value > Threshold
End Function
Public Function GetIsGreaterThanPredicate() _As Predicate(Of Integer)Return New Predicate(Of Integer) _
(AddressOf IsGreaterThan)
End FunctionEnd Class
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Dim zeroThreshold As ThresholdComparer = _New ThresholdComparer() With {.Threshold = 0}
Dim tenThreshold As ThresholdComparer = _New ThresholdComparer() With {.Threshold = 10}
Dim hundredThreshold As ThresholdComparer = _New ThresholdComparer() With {.Threshold = 100}
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Jeśli nie wiadomo jaka metoda bądź obiekt zostaną użyte w trakciewykonywania programu możemy – w celu utworzenia delegata –posłużyć się metodą statyczną CreateDelegate klasy Delegate.
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów
Dim greaterThanZero As Predicate(Of Integer) _= [Delegate].CreateDelegate( _GetType(Predicate(Of Integer)), _zeroThreshold, "IsGreaterThan")
Dim greaterThanTen As Predicate(Of Integer) _= [Delegate].CreateDelegate( _GetType(Predicate(Of Integer)), _tenThreshold, "IsGreaterThan")
Dim greaterThanHundred As Predicate(Of Integer) _= [Delegate].CreateDelegate( _GetType(Predicate(Of Integer)), _hundredThreshold, "IsGreaterThan")
nawiasy kwadratowe mówią kompilatorowi, że chodzi o nazwęklasy a nie słowo kluczowe
Tomasz Goluch Visual Basic .NET
Tworzenie delegatów zbiorowych
Dim multicastDelegate = [Delegate].Combine( _greaterThanZero, _greaterThanTen, _New Predicate(Of Integer)( _AddressOf hundredThreshold.IsGreaterThan))
multicastDelegate = [Delegate].Combine( _multicastDelegate, _greaterThanHundred)
w VB nie ma przeciążonych operatorów: +, +=, -, -= dladelegatów
Tomasz Goluch Visual Basic .NET
Wywoływanie delegatów
Dim trueCount As Integer = 0, falseCount As Integer = 0For Each p As Predicate(Of Integer) In _multicastDelegate.GetInvocationList()If (p(42) = True) ThenfalseCount = falseCount + 1
ElsetrueCount = trueCount + 1
End IfNext
zmienne trueCount i falseCount przyjmą wartość 2
metoda na którą wskazuje delegat greaterThanHundredzostanie wywołana dwa razy
Tomasz Goluch Visual Basic .NET
Wywoływanie delegatów
Dim trueCount As Integer = 0, falseCount As Integer = 0For Each p As Predicate(Of Integer) In _multicastDelegate.GetInvocationList()If (p(42) = True) ThenfalseCount = falseCount + 1
ElsetrueCount = trueCount + 1
End IfNext
zmienne trueCount i falseCount przyjmą wartość 2
metoda na którą wskazuje delegat greaterThanHundredzostanie wywołana dwa razy
Tomasz Goluch Visual Basic .NET
Predefiniowane delegaty
.NET definiuje sporą liczbę specjalizowanych delegatów np.Predicate(Of Integer)
Jeśli istnieje niejawna konwersja referencji pomiędzy typami Ai B to istnieje również niejawna konwersja pomiędzy typamiPredicate(Of A) i Predicate(Of B)
Tomasz Goluch Visual Basic .NET
Predefiniowane delegaty
.NET definiuje sporą liczbę specjalizowanych delegatów np.Predicate(Of Integer)
Jeśli istnieje niejawna konwersja referencji pomiędzy typami Ai B to istnieje również niejawna konwersja pomiędzy typamiPredicate(Of A) i Predicate(Of B)
Tomasz Goluch Visual Basic .NET
Delegaty Action<T>i Func<T, TResult>
Public Delegate Sub Action(Of In T)’...Public Delegate Sub Action _(Of In T1, In T2, In T3, In T4,In T5, In T6, In T7, In T8,In T9, In T10, In T11, In T12,In T13, In T14, In T15, In T16) _
(arg1 As T1, arg2 As T2, arg3 As T3, arg4 As T4, _arg5 As T5, arg6 As T6, arg7 As T7, arg8 As T8, _arg9 As T9, arg10 As T10, arg11 As T11, arg12 As T12, _arg13 As T13, arg14 As T14, arg15 As T15, arg16 As T16 )
Tomasz Goluch Visual Basic .NET
Delegaty Action<T>i Func<T, TResult>
Public Delegate Function Func(Of Out TResult) As TResult’...Public Delegate Function _Func(Of In T1, In T2, In T3, In T4,
In T5, In T6, In T7, In T8,In T9, In T10, In T11, In T12,In T13, In T14, In T15, In T16,Out TResult) _
(arg1 As T1, arg2 As T2,arg3 As T3, arg4 As T4,arg5 As T5, arg6 As T6,arg7 As T7, arg8 As T8,arg9 As T9, arg10 As T10,arg11 As T11, arg12 As T12,arg13 As T13, arg14 As T14,arg15 As T15, arg16 As T16) _
As TResult
Tomasz Goluch Visual Basic .NET
Właściwości
Private Class BPrivate x As Integer
Public Property x_pr()GetReturn x
End GetSet(ByVal value)x = value
End SetEnd Property
End Class
Dim b As B = New Bb.x_pr = 100If b.x_pr = 100 Then...
Tomasz Goluch Visual Basic .NET
Obsługa błędów
Try[ kod ][ Exit Try ]
[ Catch [ wyjątek [ As typ ] ] [ When wyrażenie ][ kod ][ Exit Try ] ]
[ Catch ... ][ Finally[ kod ] ]
End Try
Tomasz Goluch Visual Basic .NET
Obsługa błędów
gdy pojawi się błąd podczas wykonywania bloku Try,poszukiwany jest blok Catch, którego typ wyjątku ”pasuje”do błędu
kod w bloku Finally wykonywany jest po tym, gdy kodbloku try wykona się bezbłędnie lub gdy zakończy się obsługabłędu w bloku Catch
wyjątki od powyższego, to napotkanie wyrażenia End lubpojawił się wyjątek StackOverflowException w bloku Trylub Catch
Tomasz Goluch Visual Basic .NET
Obsługa błędów
gdy pojawi się błąd podczas wykonywania bloku Try,poszukiwany jest blok Catch, którego typ wyjątku ”pasuje”do błędu
kod w bloku Finally wykonywany jest po tym, gdy kodbloku try wykona się bezbłędnie lub gdy zakończy się obsługabłędu w bloku Catch
wyjątki od powyższego, to napotkanie wyrażenia End lubpojawił się wyjątek StackOverflowException w bloku Trylub Catch
Tomasz Goluch Visual Basic .NET
Obsługa błędów
gdy pojawi się błąd podczas wykonywania bloku Try,poszukiwany jest blok Catch, którego typ wyjątku ”pasuje”do błędu
kod w bloku Finally wykonywany jest po tym, gdy kodbloku try wykona się bezbłędnie lub gdy zakończy się obsługabłędu w bloku Catch
wyjątki od powyższego, to napotkanie wyrażenia End lubpojawił się wyjątek StackOverflowException w bloku Trylub Catch
Tomasz Goluch Visual Basic .NET
Interfejsy
nie ma możliwości wielokrotnego dziedziczenia w VB,
klasa może implementować wiele interfejsów.
[ <atrybuty> ] [ dostęp ] [ Shadows ] _Interface nazwa [ ( Of lista_typów ) ]...
End Interface
Public Interface IFiguraFunction pole() As DoubleProperty X() As DoubleProperty Y() As DoubleEnd Interface
Tomasz Goluch Visual Basic .NET
Interfejsy
nie ma możliwości wielokrotnego dziedziczenia w VB,
klasa może implementować wiele interfejsów.
[ <atrybuty> ] [ dostęp ] [ Shadows ] _Interface nazwa [ ( Of lista_typów ) ]...
End Interface
Public Interface IFiguraFunction pole() As DoubleProperty X() As DoubleProperty Y() As DoubleEnd Interface
Tomasz Goluch Visual Basic .NET
Interfejsy
Public Class KwadratImplements IFigura
Public Function pole() As Double _Implements IFigura.pole
End Function
Property X() As Double Implements IFigura.XGetEnd GetSet(ByVal a As Double)End SetEnd Property
...End Class
Tomasz Goluch Visual Basic .NET
Struktury
[ <atrybuty> ] [ dostęp ] [ Shadows ] [ Partial ] _Structure nazwa [ ( Of lista_typów ) ][ Implements nazwy_interfejsów ]...
End Structure
Różnice w stosunku do klasy:
struktury nie mogą dziedziczyć,
zmienna będąca strukturą przechowuje całą zawartośćstruktury (value type), natomiast zmienna obiektowa jestreferencją (4 bajty).
przypisanie w przypadku struktury kopiuje całą jej zawartość;w przypadku obiektów - przypisanie powoduje, że obiezmienne wskazują ten sam obiekt.
Tomasz Goluch Visual Basic .NET
Struktury
[ <atrybuty> ] [ dostęp ] [ Shadows ] [ Partial ] _Structure nazwa [ ( Of lista_typów ) ][ Implements nazwy_interfejsów ]...
End Structure
Różnice w stosunku do klasy:
struktury nie mogą dziedziczyć,
zmienna będąca strukturą przechowuje całą zawartośćstruktury (value type), natomiast zmienna obiektowa jestreferencją (4 bajty).
przypisanie w przypadku struktury kopiuje całą jej zawartość;w przypadku obiektów - przypisanie powoduje, że obiezmienne wskazują ten sam obiekt.
Tomasz Goluch Visual Basic .NET
Struktury
[ <atrybuty> ] [ dostęp ] [ Shadows ] [ Partial ] _Structure nazwa [ ( Of lista_typów ) ][ Implements nazwy_interfejsów ]...
End Structure
Różnice w stosunku do klasy:
struktury nie mogą dziedziczyć,
zmienna będąca strukturą przechowuje całą zawartośćstruktury (value type), natomiast zmienna obiektowa jestreferencją (4 bajty).
przypisanie w przypadku struktury kopiuje całą jej zawartość;w przypadku obiektów - przypisanie powoduje, że obiezmienne wskazują ten sam obiekt.
Tomasz Goluch Visual Basic .NET
Generics – deklaracje generyczne
Pubilc Class Lista(Of t [As IComparable])...
End Class...Dim l As Lista(Of String)
kontrola typów na etapie kompilacji
Tomasz Goluch Visual Basic .NET
Przestrzenie nazw (Namespaces)
przestrzenie nazw pozwalają rozwiązywać problemy związanez jednakowymi nazwami, np. klas.
przestrzenie nazw mogą tworzyć hierarchiczną strukturę
nie są typami, służą do organizacji kodu
Dim a As Siec.PolaczenieDim b As Zasoby.Polaczenie
Tomasz Goluch Visual Basic .NET
Przestrzenie nazw (Namespaces)
przestrzenie nazw pozwalają rozwiązywać problemy związanez jednakowymi nazwami, np. klas.
przestrzenie nazw mogą tworzyć hierarchiczną strukturę
nie są typami, służą do organizacji kodu
Dim a As Siec.PolaczenieDim b As Zasoby.Polaczenie
Tomasz Goluch Visual Basic .NET
Przestrzenie nazw (Namespaces)
przestrzenie nazw pozwalają rozwiązywać problemy związanez jednakowymi nazwami, np. klas.
przestrzenie nazw mogą tworzyć hierarchiczną strukturę
nie są typami, służą do organizacji kodu
Dim a As Siec.PolaczenieDim b As Zasoby.Polaczenie
Tomasz Goluch Visual Basic .NET
Namespaces – Imports
wyrażenia typu System.Drawing.Rectangle nie są wygodnei utrudniają czytanie kodu.
umieszczamy na początku pliku Imports System.Drawingi wówczas w kodzie wcześniejsze wyrażenie zastępujemyRectangle
plik może zawierać (zawsze podane na początku) dowolnąliczbę instrukcji Imports
jeśli chcemy importować różne moduły dla różnychfragmentów kodu, to trzeba kod podzielić pomiędzy kilkaplików.
Tomasz Goluch Visual Basic .NET
Namespaces – Imports
wyrażenia typu System.Drawing.Rectangle nie są wygodnei utrudniają czytanie kodu.
umieszczamy na początku pliku Imports System.Drawingi wówczas w kodzie wcześniejsze wyrażenie zastępujemyRectangle
plik może zawierać (zawsze podane na początku) dowolnąliczbę instrukcji Imports
jeśli chcemy importować różne moduły dla różnychfragmentów kodu, to trzeba kod podzielić pomiędzy kilkaplików.
Tomasz Goluch Visual Basic .NET
Namespaces – Imports
wyrażenia typu System.Drawing.Rectangle nie są wygodnei utrudniają czytanie kodu.
umieszczamy na początku pliku Imports System.Drawingi wówczas w kodzie wcześniejsze wyrażenie zastępujemyRectangle
plik może zawierać (zawsze podane na początku) dowolnąliczbę instrukcji Imports
jeśli chcemy importować różne moduły dla różnychfragmentów kodu, to trzeba kod podzielić pomiędzy kilkaplików.
Tomasz Goluch Visual Basic .NET
Namespaces – Imports
wyrażenia typu System.Drawing.Rectangle nie są wygodnei utrudniają czytanie kodu.
umieszczamy na początku pliku Imports System.Drawingi wówczas w kodzie wcześniejsze wyrażenie zastępujemyRectangle
plik może zawierać (zawsze podane na początku) dowolnąliczbę instrukcji Imports
jeśli chcemy importować różne moduły dla różnychfragmentów kodu, to trzeba kod podzielić pomiędzy kilkaplików.
Tomasz Goluch Visual Basic .NET
Namespaces – aliasy
Pełna składnia: Imports [alias =] namespace[.element] Np:
Imports D2 = System.Drawing.Drawing2D...Dim dash_style As D2.DashStyle = D2.DashStyle.DashDotDot
Jeżli zdefiniowaliśmy alias, to trzeba go użyć, aby się odwołaćdo elementu przestrzeni nazw.
aliasy są potrzebne, gdy importujemy dwie przestrzenie nazw,które zawierają definicje jednakowo nazwanych elementów(np. klas)
Tomasz Goluch Visual Basic .NET
Namespaces – aliasy
Pełna składnia: Imports [alias =] namespace[.element] Np:
Imports D2 = System.Drawing.Drawing2D...Dim dash_style As D2.DashStyle = D2.DashStyle.DashDotDot
Jeżli zdefiniowaliśmy alias, to trzeba go użyć, aby się odwołaćdo elementu przestrzeni nazw.
aliasy są potrzebne, gdy importujemy dwie przestrzenie nazw,które zawierają definicje jednakowo nazwanych elementów(np. klas)
Tomasz Goluch Visual Basic .NET
Namespaces – importowanie elementu
Oprócz importowania przestrzeni nazw można importować jejelement.
Imports AliasDoListBox = ListBoxProject.Form1.ListBox...Dim x As AliasDoListBox
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
Każdy projekt posiada swoją przestrzeń nazw – każdy elementw nim zdefiniowany do niej należy (bezpośrednio lubpośrednio).
Można definiować własną przestrzeń nazw (wewnątrzprzestrzeni nazw projektu):
Namespace StrukturyDanychPublic Class Lista...End ClassEnd Namespace
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
Każdy projekt posiada swoją przestrzeń nazw – każdy elementw nim zdefiniowany do niej należy (bezpośrednio lubpośrednio).
Można definiować własną przestrzeń nazw (wewnątrzprzestrzeni nazw projektu):
Namespace StrukturyDanychPublic Class Lista...End ClassEnd Namespace
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
Do powyżej zdefiniowanej klasy Lista kod wewnątrzprzestrzeni StrukturyDanych odwołuje się poprzez samąnazwę Lista
Kod poza tą przestrzenią odwołuje się następująco:
Dim l As New MyApplication.StrukturyDanych.Lista
zakładając, że MyApplication jest przestrzenią nazw projektu.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
Do powyżej zdefiniowanej klasy Lista kod wewnątrzprzestrzeni StrukturyDanych odwołuje się poprzez samąnazwę Lista
Kod poza tą przestrzenią odwołuje się następująco:
Dim l As New MyApplication.StrukturyDanych.Lista
zakładając, że MyApplication jest przestrzenią nazw projektu.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).
można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,różne osoby pracują nad różnymi fragmentami kodu,chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,różne osoby pracują nad różnymi fragmentami kodu,chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,
różne osoby pracują nad różnymi fragmentami kodu,chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,różne osoby pracują nad różnymi fragmentami kodu,
chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,różne osoby pracują nad różnymi fragmentami kodu,chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Namespaces – definiowanie własnych
wewnątrz przestrzeni nazw można definiować inne przestrzenienazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy.
wewnątrz przestrzeni nazw nie można definiować bezpośredniozmiennych, właściwości (properties), procedur, zdarzeń(events).można jedną przestrzeń nazw definiować w kilku fragmentach.Przydatne, gdy:
chcemy definicje klas umieszczać w osobnych plikach,różne osoby pracują nad różnymi fragmentami kodu,chcemy rozszerzyć istniejące przestrzenie nazw.
Tomasz Goluch Visual Basic .NET
Odzwierciedlanie
Reflection wykorzystuje głównie klasy znajdujące się wprzestrzeni nazw System.Reflection
wyjątkiem jest klasa System.Type, która reprezentuje typ wmodule zarządzanego koduMożliwości
analiza zewnętrznego kodu podczas działania programu‘late binding’
Tomasz Goluch Visual Basic .NET
Klasa Assembly
Klasa reprezentuje pojedynczy moduł (.NET assembly). Przykładuzyskania referencji do takiego obiektu:
’pobranie referencji do bieżącego modułuDim a As Assembly = Assembly.GetExecutingAssembly()’pobranie ref. do modułu zawierającego określony typa = Assembly.GetAssembly( GetType( DateTime ) )’pobranie z określonej lokalizacjia = Assembly.LoadFrom( "..." )’pobranie tylko do celów ‘inspekcji‘a = Assembly.ReflectionOnlyLoadFrom( "..." )
Tomasz Goluch Visual Basic .NET
Wykorzystanie obiektu Assembly
uzyskanie kolekcji typów zdefiniowanych w module
For Each t As Type in a.GetTypes()Console.WriteLine( t.FullName() )
Next
pobranie typu na podstawie jego nazwyDim t As Type = a.GetType( "..." )
szczegółowe informacje o module
Dim an As AssemblyName = a.GetName()an.ProcessorArchitecture()an.VersionMajor()an.VersionMinor()
Tomasz Goluch Visual Basic .NET
Klasa Type – tworzenie obiektu
’na podstawie nazwy klasy:Dim t As Type = GetType( String )’na podstawie obiektu:Dim i As Integert = i.GetType() ’System.Int32’na podstawie nazwy klasy (string)t = GetType( "System.DateTime" )
Jeśli funkcja GetType nie może odnaleźć wskazanego typu, touruchamiane jest zdarzenie TypeResolve w klasie AppDomain.Pozwala to m.in. obsłużyć sytuacje wyjątkowe lub zmienićstandardowy sposób nazywania typów.
Tomasz Goluch Visual Basic .NET
Wybrane metody klasy Type
If t.IsClass Then...
ElseIf t.IsInterface Then...
ElseIf t.IsEnum Then...
ElseIf t.IsValueType Then... ’Enum to również ValueType,’więc niezbędna taka kolejność
Else... ’sterowanie nigdy nie dotrze tutaj
EndIf
Tomasz Goluch Visual Basic .NET
Wybrane metody klasy Type
If t.IsPublic ThenElseIf t.IsNotPublic ThenEndIf
If t.IsAbstract ThenEndIf
If t.IsSealed ThenEndIf
t.BaseType.FullName()If t.IsInstanceOfType( obj ) ThenEndIf
If obj.GetType().IsSubclassOf( GetType( MojaKlasa ) ) ThenEndIf
Tomasz Goluch Visual Basic .NET
Przetwarzanie elementów klasy
Następujący kod
Dim info() As MemberInfo = t.GetMembers()For Each i As MemberInfo in info...
Next
przetwarza elementy wchodzące w skład klasy: pole, ’property’,metoda, konstruktor, ’event’, zagnieżdżona klasa. Można teżprzetwarzać składowe wybranego typu (t.GetFields,GetProperties, GetMethods, GetEvents, GetConstuctors,GetInterfaces, GetNestedTypes, GetDefaultMembers)
Tomasz Goluch Visual Basic .NET
Uzyskiwanie referencji do wybranej metody
Dim mi As MethodInfo = t.GetMethod( "NazwaMetody" )
’jeśli metoda jest przeciążona, to trzeba wyspecyfikować’dokładną listę parametrów:Dim args() As Type = { GetType( Integer ),
GetType( Double ) }mi = GetMethod( "InnaNazwa", args )
’gdy parametry, to typy referencyjne lub tablica:GetType( Double ).MakeRefType()GetType( Integer ).MakeArrayType( 4 )
Tomasz Goluch Visual Basic .NET
Dynamiczne tworzenie obiektu
’zwykle referencja jest typu Object (nie znamy typu na’etapie kompilacji)Dim o As Object = Activator.CreateInstance( t )
’konstr. z parametrami: przekazujemy je jako tablicę:Dim args() As Object = { 1, "Hello" }o = Activator.CreateInstance( t, args )
’uzyskanie dostępu do pola:Dim f As FieldInfo = t.GetField( "NazwaPola" )f.GetValue( o ) ’lub f.SetValue( o, wartość )
’wywołanie metody:Dim m As MethodInfo = t.GetMethod( "NazwaMetody" )Dim args() As Object = { 4, "Hello" }m.Invoke( o, args )
Tomasz Goluch Visual Basic .NET
Bezpieczeństwo – ogólne koncepcje
sandboxingzbiór praw jest określany poprzez evidence
prawa (permissions)
egzekwowanie praw (enforcements)
Tomasz Goluch Visual Basic .NET
Bezpieczeństwo w .NET Framework 4.5
Wyróżniamy dwa rodzaje kodu:
critical code – kod, który może wykonywać uprzywilejowaneakcje,
transparent code – nie może powyższych, w szczególnościwykonuje czynności w ramach praw, które posiada i nie możewykonywać, dziedziczyć czy zawierać kodu krytycznego.(Możliwość debugowania z ograniczonymi prawami.)
Tomasz Goluch Visual Basic .NET
Bezpieczeństwo w .NET Framework 4.5
Mechanizm zabezpieczeń stosowany na platformie .NETopiera się na modelu bezpieczeństwa opartym na rolach – RBS(role based security) oraz na uprawnieniach kodu – CAS (codeaccess security)
Mechanizm RBS bazuje na uprawnieniach użytkownikaokreślonych na poziomie systemu operacyjnego, wynikającychz jego uprawnień indywidualnych oraz z przynależności dogrupySprawdzenie tożsamości użytkownika i zweryfikowanie jegouprawnień do korzystania z kodu realizuje się na dwa sposoby:
deklaratywny (declarative security), za pomocą atrybutówzabezpieczeń dodanych do klas i metodprogramowy (imperative security), polegający na dynamicznymtworzeniu zestawu uprawnień, które są następnie sprawdzane wtrakcie wykonywania kodu
Tomasz Goluch Visual Basic .NET
Bezpieczeństwo w .NET Framework 4.5
Brak wystarczających uprawnień do wykonania kodu powodujezgłoszenie wyjątku powoduje zgłoszenie wyjątkuSecurityException
Metoda deklaratywna jest prostą, statyczną metodąumożliwiającą określenie niezbędnych uprawnień dla całejklasy lub metody dla użytkowników/grup użytkowników,których role są powszechnie znane
W celu kontrolowania uprawnień na poziomie konkretnychfragmentów kodu lub wtedy, gdy chcemy uwzględnićdodatkowe warunki, to należy zastąpić podejście deklaratywnepodejściem programowym
Tomasz Goluch Visual Basic .NET
CAS (Code Access Security)
Mechanizm CAS pozwala na kontrolowanie sposobu działaniaaplikacji niezależnie od uprawnień użytkownika (np. pozwalasprawdzić, czy aplikacja ma wystarczające prawa dokorzystania z zasobów albo weryfikować, czy nie posiada onawiększych uprawnień niż są jej konieczne)
definiuje prawa i zbiory praw, które reprezentują możliwościdostępu do zasobów systemowych
umożliwia wykonywanie kodu z wybranym poziomem‘bezpieczeństwa’
sprawdza czy kod nadrzędny (wywołujący) posiada prawapozwalające wykonać zadaną akcję
Tomasz Goluch Visual Basic .NET
CAS (Code Access Security)
CLR pozwala na dostęp do zasobów systemowych (np. plików,rejestru systemowego, dziennika zdarzeń, gniazd sieciowych) iwykonanie na nich żądanych operacji tylko wtedy, gdy maodpowiednie do tego uprawnienia
Przed uzyskaniem przez podzespół dostępu do zasobów CLRw trakcie uruchamiania podzespołu kolekcjonuje i sprawdzadowody (evidence), aby określić, jakie uprawnienia(permission) do wykonania kodu można mu nadać
Tomasz Goluch Visual Basic .NET
CAS (Code Access Security)
Począwszy od wersji .NET Framework 4.0 CAS nie korzystajuż z zasad polityki bezpieczeństwa (security policy), ponieważzapewniały one tylko kontrolę kodu zarządzanego, pomijająccałkowicie aplikacje niezarządzane (natywne)
Prawa dostępu określane są na podstawie uprawnień i takzwanej przejrzystości (transparency), która określa, jakifragment kodu może wykonywać krytyczne ze względówbezpieczeństwa operacje, a jaki nie
Zadaniem modelu przejrzystości jest zapewnienie prostego iefektywnego mechanizmu, który będzie izolować od siebieróżne grupy kodów
Podobnie jak w przypadku RBS dostęp do zasobów możnaweryfikować w sposób deklaratywny lub programowy
Tomasz Goluch Visual Basic .NET
Sanboxing – zastosowania
Uruchamiamy kod z ograniczonymi prawami, gdy:
nie mamy zaufania, np. kod pobierany z sieci
testujemy własny moduł, który bedzie uruchamiany zograniczonymi prawami na maszynie klienta
Tomasz Goluch Visual Basic .NET
Sandboxing w praktyce: domeny aplikacji
zestaw uprawnień w sandbox-ie jest określony przez jestokreślony przez dowody uprawnień (evidence) na etapietworzenia domeny aplikacji
Public Shared Function CreateDomain ( _friendlyName As String, _securityInfo As Evidence, _info As AppDomainSetup, _grantSet As PermissionSet, _ParamArray fullTrustAssemblies As StrongName() _) As AppDomain
Tomasz Goluch Visual Basic .NET
Klasa Evidence
zawiera zwykle podpisy i lokalizację danego kodu
security policy składa się z grup kodu
klasa Evidence służy do określenia do jakiej grupy dany kodnależy
obiekt Evidence jest kolekcją
mamy dwa typy źródeł: host evidence oraz assembly evidence
Tomasz Goluch Visual Basic .NET
Prosty przykład uruchomienia
Imports System.AppDomain...Dim d as AppDomain = AppDomain.CreateDomain("Dowolna nazwa")d.ExecuteAssembly("sciezka\plik.exe")AppDomain.Unload(d)
Tomasz Goluch Visual Basic .NET
XML w Visual Basic .NET
Dim o As XElement =<osoba><name>Kowalski</name><tel type="domowy">581234567</phone><tel type="praca">587654321</phone></osoba>
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Auto property initializer:
public class Person{public int Id { get; } = -1;
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Primary constructors:
public class Ruler(string unitsName,decimal value){public string UnitsName { get; } = unitsName;public decimal Value { get; } = value;
}
Składnia klasyczna:
public class Ruler{public Ruler(string unitName,decimal value){UnitsName = unitName;Value = value;
}public string UnitsName { get; private set; }public decimal Value { get; private set; }
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Wartość domyślna w konstruktorze:
public class Ruler(string unitsName, decimal value){public string UnitsName { get; } = unitsName ?? "cm";public decimal Value { get; } = value;
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Static typename:
using System.Console;
namespace CSharp6Example{class Program{static void Main(string[] args){WriteLine("Hello");
}}
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
New dictionary initializer:
Dictionary<string, Person> _persons =new Dictionary<string, Person>(){["programista"] = new Person(),["grafik"] = new Person()
};
Składnia klasyczna:
Dictionary<string, Person> _persons =new Dictionary<string, Person>(){{ "programista", new Person() },{ "grafik", new Person() }
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Działanie kompilarora C#6.0:
Dictionary<string, Person> _persons =new Dictionary<string, Person>();
_persons["programista"] = new Person());_persons["grafik"] = new Person());
Działanie kompilarora C#3.0:
Dictionary<string, Person> _persons =new Dictionary<string, Person>();
_persons.Add("programista", new Person());_persons.Add("grafik", new Person());
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
New numbers syntax:
public class NumbersSixCSharp{public long MyCash { get; } = 1_500_000_000;public byte SecretCode { get; } = 0b1100;
}
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Operator ?.:
If customer IsNot Nothing AndAlso customer.Age >= 100 ThenConsole.WriteLine("send telegram")
End If
If customer?.Age >= 100 ThenConsole.WriteLine("send telegram")
End If
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
String Interpolation:
Dim url = String.Format( _"http://{0}/{1}?query={2}" site, path, g)
Dim url = $"http://{site}/{path}?query={g}"
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Multiline Strings:
Dim multiline = vbCrLf &"[configuration]" & vbCrLf &"name=freud" & vbCrLf &"age=40"
Dim multiline = "[configuration]name=freudage=40"
Tomasz Goluch Visual Basic .NET
Nowości w VB 14.0 i C#6.0
Komentarze w zapytaniach LINQ:
Dim addr = From i In invitees ’go through the listLet address = Lookup(i) ’look up nameSelect i, address
Wcześniej komentarze wewnątrz zapytań były traktowane jako błąd
Tomasz Goluch Visual Basic .NET
Dziękuje za uwagę
Tomasz Goluch Visual Basic .NET