Visual Basic .NET - Jezyki Programowania na Platformie .NET
Transkrypt
Visual Basic .NET - Jezyki Programowania na Platformie .NET
Visual Basic .NET Języki Programowania na Platformie .NET (część 2) Tomasz Goluch http://www.kaims.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-bit VB 5.0/VS 97 (1997) VB/VS 6.0 (1998) VB/VS 7.0 .NET 1.0 (2002) / C#1.0 VB/VS 7.1 .NET 1.1 (2003) / C#1.2 VB/VS 8.0 .NET 2.0 (2005) / C#2.0 VB/VS 9.0 .NET 3.5 (2008) / C#3.0 VB/VS 10.0 .NET 4.0 (2010) / C#4.0 VB/VS 11.0 .NET 4.5 (2012) / C#5.0 VB/VS 14.0 .NET 4.6 (2015) / C#6.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ęzyka Java VB/VS 7.1 .NET 1.1 (2003) / C#1.2 VB/VS 8.0 .NET 2.0 (2005) / C#2.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ęzyka Java wprowadzenie rozszerzenia Managed C++obsługującego platformę .NET VB/VS 7.1 .NET 1.1 (2003) / C#1.2 VB/VS 8.0 .NET 2.0 (2005) / C#2.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ęzyka Java wprowadzenie rozszerzenia Managed C++obsługującego platformę .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 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ęzyka Java wprowadzenie rozszerzenia Managed C++obsługującego platformę .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 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ęzyka Java wprowadzenie rozszerzenia Managed C++obsługującego platformę .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ęzyka Java wprowadzenie rozszerzenia Managed C++obsługującego platformę .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 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” 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 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 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 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 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 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 Rosyl – open source (np. można napisać rozszerzenia by wyświetlać własne ostrzeżenia i błędy w trakcie 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 Rosyl – open source (np. można napisać rozszerzenia by wyświetlać własne ostrzeżenia i błędy w trakcie kompilowania kodu) Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> analogicznie typ wyliczeniowy Enum współpracuje z w/w operatorami i to nawet przy włączonej opcji Strict kompilatora Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> analogicznie typ wyliczeniowy Enum współpracuje z w/w operatorami i to nawet przy włączonej opcji Strict kompilatora słowo kluczowe WithEvents wraz z Handles pozwala na deklaratywny sposób określania obsługi zdarzeń Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> analogicznie typ wyliczeniowy Enum współpracuje z w/w operatorami i to nawet przy włączonej opcji Strict kompilatora słowo kluczowe WithEvents wraz z Handles pozwala na deklaratywny sposób określania obsługi zdarzeń dzięki RaiseEvent istnieje możliwość wyświetlenia listy dostępnych zdarzeń i dodawania obsługi nowego bez opuszczania okna z kodem (doryczy równiez zmiennych zadeklarowanych z WithEvents) Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> analogicznie typ wyliczeniowy Enum współpracuje z w/w operatorami i to nawet przy włączonej opcji Strict kompilatora słowo kluczowe WithEvents wraz z Handles pozwala na deklaratywny sposób określania obsługi zdarzeń dzięki RaiseEvent istnieje możliwość wyświetlenia listy dostępnych zdarzeń i dodawania obsługi nowego bez opuszczania okna z kodem (doryczy równiez zmiennych zadeklarowanych z WithEvents) w zasiegu składni: With objectExpression ... End With – można wykonać szereg odwołań do określonego obiektu bez podwania jego nazwy. Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# VB nie jest case-sensitive (trudniej o błąd, ale mniejsza liczba kombinacji nazw) instrukcja Select Case odpowiednik Switch z C#współpracuje z operatorami porównania: <,<=,>,>=,=,<> analogicznie typ wyliczeniowy Enum współpracuje z w/w operatorami i to nawet przy włączonej opcji Strict kompilatora słowo kluczowe WithEvents wraz z Handles pozwala na deklaratywny sposób określania obsługi zdarzeń dzięki RaiseEvent istnieje możliwość wyświetlenia listy dostępnych zdarzeń i dodawania obsługi nowego bez opuszczania okna z kodem (doryczy równiez zmiennych zadeklarowanych z WithEvents) w zasiegu składni: With objectExpression ... End With – można wykonać szereg odwołań do określonego obiektu bez podwania 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" 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. automatyczne dopisywanie kodu właściwości) 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. automatyczne dopisywanie kodu właściwości) funkcje których nie ma w C#: IsNumeric, PMT Dim s As String = "3" If IsNumeric(s) Then MessageBox.Show("numeric") Else MessageBox.Show("not numeric") End If Tomasz Goluch Basicdodając .NET w C#można skorzystać z w/w Visual metod referencję do 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. automatyczne dopisywanie kodu właściwości) funkcje których nie ma w C#: IsNumeric, PMT Dim s As String = "3" If IsNumeric(s) Then MessageBox.Show("numeric") Else MessageBox.Show("not numeric") End If Tomasz Goluch Basicdodając .NET w C#można skorzystać z w/w Visual metod referencję do Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed brak odpowiednika ++i, i++, w środowisku wielowątkowym należy użyć (analogicznie jak w C#) metod: Increment , Decrement z przestrzeni nazw: System.Threading.Interlocked Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed brak odpowiednika ++i, i++, w środowisku wielowątkowym należ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 – co jeśli XML ewoluuje?) Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed brak odpowiednika ++i, i++, w środowisku wielowątkowym należ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 – co jeśli XML ewoluuje?) deklaracja daty w linii: Dim data As Date = #12/31/2000# Tomasz Goluch Visual Basic .NET Visual Basic .NET? vs C# przestrzeń nazw My zapewnia dostęp do informacji oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed brak odpowiednika ++i, i++, w środowisku wielowątkowym należ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 – co jeś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 oraz obiektów powiązanych z aplikacją i środowiskiem wykonawczym. możliwość dynamicznej zmiany ”ostatniego” rozmiaru tablicy przy pomocy słowa kluczowego ReDim Preserve. brak wsparcia dla kodu niebezpiecznego – odpowiedniki słów kluczowych: unsafe i fixed brak odpowiednika ++i, i++, w środowisku wielowątkowym należ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 – co jeś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ć poprzedzony przynajmniej jednym białym znakiem), np.: Sub Print( _ x As Integer ) Tomasz Goluch Visual Basic .NET Podstawy koniec linii = koniec instrukcji znak oznacza kontynuację linii (musi być poprzedzony przynajmniej jednym białym znakiem), np.: Sub Print( _ x As Integer ) Instr1 : Instr2 - kilka instrukcji w jednym wierszu Tomasz Goluch Visual Basic .NET Podstawy koniec linii = koniec instrukcji znak oznacza kontynuację linii (musi być poprzedzony przynajmniej jednym białym znakiem), np.: Sub Print( _ x As Integer ) Instr1 : Instr2 - kilka instrukcji w jednym wierszu ’, REM - początek komentarza liniowego (brak komentarza blokowego) Tomasz Goluch Visual Basic .NET Podstawy koniec linii = koniec instrukcji znak oznacza kontynuację linii (musi być poprzedzony przynajmniej jednym białym znakiem), np.: Sub Print( _ x As Integer ) Instr1 : Instr2 - kilka instrukcji w jednym wierszu ’, REM - początek komentarza liniowego (brak komentarza blokowego) 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 (nie można deklarować elementów publicznych w procedurach) Protected – element dostępny tylko wewnątrz klasy oraz w klasach potomnych (można używać tylko na poziomie klas) 1 modułów, klas, struktur 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 (nie można deklarować elementów publicznych w procedurach) Protected – element dostępny tylko wewnątrz klasy oraz w klasach 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 lub przestrzeni nazw) 1 modułów, klas, struktur 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 (nie można deklarować elementów publicznych w procedurach) Protected – element dostępny tylko wewnątrz klasy oraz w klasach 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 lub przestrzeni nazw) Protected Friend – suma powyższych dwóch 1 modułów, klas, struktur 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 (nie można deklarować elementów publicznych w procedurach) Protected – element dostępny tylko wewnątrz klasy oraz w klasach 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 lub przestrzeni nazw) Protected Friend – suma powyższych dwóch Private – element dostępny jedynie wewnątrz tego samego modułu, klasy lub struktury (można używać tylko na poziomie modułów) 1 modułów, klas, struktur 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 (nie można deklarować elementów publicznych w procedurach) Protected – element dostępny tylko wewnątrz klasy oraz w klasach 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 lub przestrzeni nazw) Protected Friend – suma powyższych dwóch Private – element dostępny jedynie wewnątrz tego samego modułu, klasy lub struktury (można używać tylko na poziomie modułów) 1 modułów, klas, struktur 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 nazwie w klasie bazowej 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 nazwie w klasie bazowej Static: zmienna istnieje pomiędzy wywołaniami procedury 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 nazwie w klasie bazowej Static: zmienna istnieje pomiędzy wywołaniami procedury Dim: słowo kluczowe informujące o deklaracji zmiennej 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 nazwie w 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óry moż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 nazwie w 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óry moż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 String Dim d(20,3) As Integer Dim d(,) As Integer d = New Integer(20,3) {} Tablicę c indeksujemy 0, . . . , 15. Pusta tablica (jeden z wymiarów -1): Dim tab(-1,5) As String Zmiana rozmiaru: ReDim c(25) Odwołanie d(5,1) = 3 Inicjalizacja: 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, lub WithEvents, 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 deklaracji albo poprzez konstruktor), może zostać wyliczona bardziej elastyczna – dowolny typ Tomasz Goluch Visual Basic .NET Const czy Readonly? Readonly: ustalenie wartości na poziomie wykonania (podczas deklaracji albo poprzez konstruktor), może zostać wyliczona bardziej elastyczna – dowolny typ nie gwarantuje niemożności zmiany wartości (reflection, kod unsafe i wskaźniki) Tomasz Goluch Visual Basic .NET Const czy Readonly? Readonly: ustalenie wartości na poziomie wykonania (podczas deklaracji albo poprzez konstruktor), może zostać wyliczona bardziej elastyczna – dowolny typ nie gwarantuje niemożności zmiany wartości (reflection, kod unsafe 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 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łowych bibliotek) 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łowych bibliotek) aktualizacja wartości może wymagać re-kompilacji kodu, inaczej wartości w powiązanych podzespołach mogą być nieaktualne 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łowych bibliotek) 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 sekcji Case. 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łowych bibliotek) 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 sekcji Case. Tomasz Goluch Visual Basic .NET Deklaracja typu wyliczeniowego [ <atrybuty> ] [ dostęp ] Enum nazwa [ As typ ] składowe End Enum [ Shadows ] dostęp: Public, Protected, ... przy braku inicjalizacji wartość jest równa 0 dla pierwszej składowej lub jest o jeden większa od poprzednika na liście Tomasz Goluch Visual Basic .NET Deklaracja typu wyliczeniowego [ <atrybuty> ] [ dostęp ] Enum nazwa [ As typ ] składowe End Enum [ Shadows ] dostęp: Public, Protected, ... przy braku inicjalizacji wartość jest równa 0 dla pierwszej skł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 ] Enum nazwa [ As typ ] składowe End Enum [ Shadows ] dostęp: Public, Protected, ... przy braku inicjalizacji wartość jest równa 0 dla pierwszej skł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 Byte SByte Short UShort Integer Rozm. 1 1 2 2 1 UInteger 4 Long 8 ULong 8 BigInteger Complex dyn. dyn. Wartości 0..255 −128..127 −32768..32767 0..65535 −2147483648..2147483647 −231 ..231 − 1 0..4294967295 0..232 − 1 −9223372036854775808..9223372036854775807 −263 ..263 − 1 18446744073709551615 0..264 − 1 −∞..∞ (OutOfMemoryException) zal. od użytego typu (każdy z pow.) Tomasz Goluch Visual Basic .NET Typ BigInteger Dim b1 As BigInteger = 1, b2 As BigInteger = 1 Dim i As Integer = 1 While i Mod 1000 <> 0 Dim n As BigInteger = b1 + b2 b1 = b2 b2 = n i += 1 End While ’wynik b2 = 7033036771142281582183525487718354977018 1269836358732742604905087154537118196933579742249494 5626117334877504492417659910881863632654502236471060 1205337412127386733911119813937312559876769009190224 5245323403501 Tomasz Goluch Visual Basic .NET Typ BigInteger Dim b1 As BigInteger = 1, b2 As BigInteger = 1 Dim i As Integer = 1 While i Mod 1000 <> 0 Dim n As BigInteger = b1 + b2 b1 = b2 b2 = n i += 1 End While ’wynik b2 = 7033036771142281582183525487718354977018 1269836358732742604905087154537118196933579742249494 5626117334877504492417659910881863632654502236471060 1205337412127386733911119813937312559876769009190224 5245323403501 Tomasz Goluch Visual Basic .NET Wybrane typy danych Typ Single Double Decimal Char Boolean Object Date Rozmiar 4 8 16 2 1 4 albo 8 8 String 10+2·dł. Wartości ≈ −1.5 · 10−45 ..3.4 · 1038 (precyzja 7 cyfr) ≈ −5.0 · 10−324 ..1.7 · 10308 (precyzja 15-16 cyfr) ≈ ±1.0 · 10−28 ..±7.9 · 1028 (28-29 cyfr znacz.) 0..65535 True lub False wsk. każdy typ danych Jan. 1, 0001 12:00:00 AM Dec. 31, 9999 11:59:59 PM 0..2147483647 znaków Unicode Tomasz Goluch Visual Basic .NET Typ Decimal Dim f As Single = 0 For i As Integer = 0 To 8 f += 0.1F ’0.0(0011) - syst. bin. Next ’wynik f = 0.9000001 Tomasz Goluch Visual Basic .NET Typ Decimal Dim f As Single = 0 For i As Integer = 0 To 8 f += 0.1F ’0.0(0011) - syst. bin. Next ’wynik f = 0.9000001 Dim f As Decimal = 0 For i As Integer = 0 To 8 f += 0.1D Next Tomasz Goluch Visual Basic .NET Typ Decimal Dim f As Single = 0 For i As Integer = 0 To 8 f += 0.1F ’0.0(0011) - syst. bin. Next ’wynik f = 0.9000001 Dim f As Decimal = 0 For i As Integer = 0 To 8 f += 0.1D Next ’wynik f = 0.9 Tomasz Goluch Visual Basic .NET Typ Decimal Dim f As Single = 0 For i As Integer = 0 To 8 f += 0.1F ’0.0(0011) - syst. bin. Next ’wynik f = 0.9000001 Dim f As Decimal = 0 For i As Integer = 0 To 8 f += 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 System.Byte System.SByte System.Int16 System.UInt16 System.Int32 System.UInt32 System.Int64 System.UInt64 System.Single System.Double System.Decimal System.Char System.String System.Boolean System.Object Typ VB Byte SByte Short UShort Integer UInteger Long ULong Single Double Decimal Char String Boolean Object C# byte sbyte short ushort int uint long ulong float double decimal char string bool object Tomasz Goluch zakres 0..255 -128..127 -32 768..32 767 0..65 535 -231 ..231 − 1 0..232 − 1 -263 ..263 − 1 0..264 − 1 32 bity 64 bity 128 bitów unicode 16· dł. True,False 32 bity Visual Basic .NET Funkcje konwersji typu Funkcja CBool CByte CChar CDate CDbl CDec CInt CLng Konwersja do Boolean Byte Char Date Double Decimal Integer Long Funkcja CObj CSByte CShort CSgn CStr CUInt CULng CUShort Tomasz Goluch Konwersja do Object SByte Short Single String UInteger ULong Ushort Visual Basic .NET Funkcje konwersji typu różną się od rzutowania możliwością konwersji literałów sprawdzają przekroczenie zakresu – odpowiednik słowa kluczowego checked z C#. Tomasz Goluch Visual Basic .NET Funkcje konwersji typu różną się od rzutowania możliwością konwersji literałów sprawdzają przekroczenie zakresu – odpowiednik słowa kluczowego checked z C#. tak jak niejawna konwersja typów, nie gwarantują braku utraty informacji: Dim ui As UInteger = 3000000001 Dim s1 As Single = ui ’3.0E+9 Dim 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łowa kluczowego checked z C#. tak jak niejawna konwersja typów, nie gwarantują braku utraty informacji: Dim ui As UInteger = 3000000001 Dim s1 As Single = ui ’3.0E+9 Dim s2 As Single = CSng(ui) ’3.0E+9 Tomasz Goluch Visual Basic .NET Wybrane instrukcje sterujące If ... Then ... End If For i=0 To 10 Step 1 For i As Double=2 To 0 Step -0.25 ... Next [i] If ... Then ... [ ElseIf ... Then ... ] Else ... End If While ... ... End While Select x Case 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ów wartość logiczna pierwszego określa, która wartość, jednego z dwóch kolejnych argumentów, zostanie zwrócona – odpowiednik operatora warunkowego: ? w C#. If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugi argument nie będzie oceniany zatem, nie wywoła wyjątku. Tomasz Goluch Visual Basic .NET Wybrane operatory If( [arg1,] arg2, arg3 ) – dla trzech argumentów wartość logiczna pierwszego określa, która wartość, jednego z dwóch kolejnych argumentów, zostanie zwrócona – odpowiednik operatora warunkowego: ? w C#. If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugi argument nie będzie oceniany zatem, nie wywoła wyjątku. dla dwóch argumentów wartość pierwszego zostanie zwrócona jeśli będzie różna od Nothing, w przeciwnym razie zostanie zwrócona wartość drugiego argumentu – odpowiednik operatora: ?? (null coalescing) w C# Tomasz Goluch Visual Basic .NET Wybrane operatory If( [arg1,] arg2, arg3 ) – dla trzech argumentów wartość logiczna pierwszego określa, która wartość, jednego z dwóch kolejnych argumentów, zostanie zwrócona – odpowiednik operatora warunkowego: ? w C#. If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugi argument nie będzie oceniany zatem, nie wywoła wyjątku. dla dwóch argumentów wartość pierwszego zostanie zwrócona jeśli będzie różna od Nothing, w przeciwnym razie zostanie zwrócona wartość drugiego argumentu – odpowiednik operatora: ?? (null coalescing) w C# If( out, "" ) Tomasz Goluch Visual Basic .NET Wybrane operatory If( [arg1,] arg2, arg3 ) – dla trzech argumentów wartość logiczna pierwszego określa, która wartość, jednego z dwóch kolejnych argumentów, zostanie zwrócona – odpowiednik operatora warunkowego: ? w C#. If( div <> 0, num \ div, 0 ) – jeśli div=0 to drugi argument nie będzie oceniany zatem, nie wywoła wyjątku. dla dwóch argumentów wartość pierwszego zostanie zwrócona jeśli będzie różna od Nothing, w przeciwnym razie zostanie zwrócona wartość drugiego argumentu – odpowiednik operatora: ?? (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. 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) ? * # [...] [!...] A-Z 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ście 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 w różnych plikach. Niezdefiniowane metody częściowe są całkowicie ignorowane podczas kompilacji (znajduje zastosowanie podczas generowania kodu GUI przez VS) metoda musi być procedurą (Sub), nie może być funkcją (Function) 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 w różnych plikach. Niezdefiniowane metody częściowe są całkowicie ignorowane podczas kompilacji (znajduje zastosowanie podczas generowania kodu GUI przez VS) metoda musi być procedurą (Sub), nie może być funkcją (Function) ciało metody musi pozostać puste 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 w różnych plikach. Niezdefiniowane metody częściowe są całkowicie ignorowane podczas kompilacji (znajduje zastosowanie 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) 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 w różnych plikach. Niezdefiniowane metody częściowe są całkowicie ignorowane podczas kompilacji (znajduje zastosowanie 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 w różnych plikach. Niezdefiniowane metody częściowe są całkowicie ignorowane podczas kompilacji (znajduje zastosowanie 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 modyfikatory: Overloads – ponowna deklaracja (domyślne działanie w C#) Overrides – przesłonienie metody bazowej (override 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 klasie pochodnej (sealed w C#) MustOverride – nie zaimplementowana i przed użyciem musi zostać 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 klasie pochodnej (sealed w C#) MustOverride – nie zaimplementowana i przed użyciem musi zostać 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 z konkretną instancją (static w C#) Shadows – ponowna deklaracja i ukrcie metody w klasie bazowej bądź wszystkich przeciążonych metod w hierarchii dziedziczenia (new 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 z konkretną instancją (static w C#) Shadows – ponowna deklaracja i ukrcie metody w klasie bazowej bądź wszystkich przeciążonych metod w hierarchii dziedziczenia (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 z konkretną instancją (static w C#) Shadows – ponowna deklaracja i ukrcie metody w klasie bazowej bądź wszystkich przeciążonych metod w hierarchii dziedziczenia (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 w C#, wymaga przeciążenia osobno każdej metody interfejsu) 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 w C#, 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 w C#, 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 do zwracania elementów kolekcji (brak odpowiednika w C#) Tomasz Goluch Visual Basic .NET Deklaracja procedur i funkcji Function myFunction(ByVal j As Integer) As Double Return 3.87 * j End Function Function myFunction(ByVal j As Integer) As Double myFunction = 3.87 * j Exit 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 funkcja otrzymuje kopię zmiennej. Public Sub A(ByVal i As Integer) i += 1 ’ nie zmienia wart. ’ org. zmiennej End Sub Tomasz Goluch Przez referencję – procedura lub funkcja otrzymuje wskaźnik do zmiennej. Public Sub A(ByRef i As Integer) i += 1 ’ inkrementacja ’ org. zmiennej End Sub 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ą 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 (opcjonalna tablica elementów określonego typu) 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 (opcjonalna tablica elementów określonego typu) nie można używać Optional i ParamArray jednocześnie 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 (opcjonalna tablica elementów określonego typu) nie można używać Optional i ParamArray jednocześnie ByVal jest domyślnym mechanizmem; jeśli parametr jest referencją, to procedura może modyfikować wskazywany obiekt (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 (opcjonalna tablica elementów określonego typu) nie można używać Optional i ParamArray jednocześnie ByVal jest domyślnym mechanizmem; jeśli parametr jest referencją, to procedura może modyfikować wskazywany obiekt (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 (jawne rozgraniczenie) 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 (jawne rozgraniczenie) 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 (jawne rozgraniczenie) można definiować klasy zagnieżdżone Tomasz Goluch Visual Basic .NET Słowa kluczowe Async i Await Async – umieszczane w deklaracjach metod, metod anonimowych oraz wyrażeń lambda. Informuje kompilator, że w metodzie będą wykorzystywane możliwości asynchroniczne (pozwala na użycie słowa kluczowego Await, inaczej będzie ono traktowane jako zwykły identyfikator) Await – powoduje uruchomienie oznaczonej nim metody w trybie asynchronicznym wraz z obsługą powinowactwa do wątku Tomasz Goluch Visual Basic .NET Słowa kluczowe Async i Await Async – umieszczane w deklaracjach metod, metod anonimowych oraz wyrażeń lambda. Informuje kompilator, że w metodzie będą wykorzystywane możliwości asynchroniczne (pozwala na użycie słowa kluczowego Await, inaczej będzie ono traktowane jako zwykły identyfikator) Await – powoduje uruchomienie oznaczonej nim metody w trybie asynchronicznym wraz z obsługą powinowactwa do wą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 &= result End 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 getStringTask Return urlContents.Length End Function http://msdn.microsoft.com/en-us/library/hh191443.aspx Tomasz Goluch Visual Basic .NET Słowo kluczowe Global Namespace SpecialSpace Namespace System Class abc Function getValue() As System.Int32 Dim n As System.Int32 Return n End Function End Class End Namespace End Namespace http://msdn.microsoft.com/en-us/library/zt9tafza.aspx Tomasz Goluch Visual Basic .NET Słowo kluczowe Global Namespace SpecialSpace Namespace System Class abc Function getValue() As Global.System.Int32 Dim n As Global.System.Int32 Return n End Function End Class End Namespace End 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 8 Console.ReadKey() End Sub Private Iterator Function _ SomeNumbers() As System.Collections.IEnumerable Yield 3 Yield 5 Yield 8 End Function Tomasz Goluch Visual Basic .NET Częściowe klasy i procedury pozwala umieścić fragmenty kodu klasy w różnych fragmentach pliku lub w różnych modułach, co najmniej jeden z fragmentów musi być poprzedzony słowem Partial, ale dla przejrzystości kodu sugeruje się używać przy każdym fragmencie Tomasz Goluch Partial Public Class A Public x As Integer End Class ... inny kod ... Partial Public Class A Public y As Double End Class Visual Basic .NET Częściowe klasy i procedury pozwala umieścić fragmenty kodu klasy w różnych fragmentach pliku lub w różnych modułach, co najmniej jeden z fragmentów musi być poprzedzony słowem Partial, ale dla przejrzystości kodu sugeruje się używać przy każdym fragmencie Partial Public Class A Public x As Integer End Class ... inny kod ... Partial Public Class A Public y As Double End Class przydatne, gdy kilka osób pracuje nad różnymi fragmentami jednej klasy. Tomasz Goluch Visual Basic .NET Częściowe klasy i procedury pozwala umieścić fragmenty kodu klasy w różnych fragmentach pliku lub w różnych modułach, co najmniej jeden z fragmentów musi być poprzedzony słowem Partial, ale dla przejrzystości kodu sugeruje się używać przy każdym fragmencie Partial Public Class A Public x As Integer End Class ... inny kod ... Partial Public Class A Public y As Double End Class przydatne, gdy kilka osób pracuje nad różnymi fragmentami jednej klasy. Tomasz Goluch Visual Basic .NET Częściowe klasy i procedury częściowa procedura pozwala na oddzielenie jej deklaracji od implementacji używamy wraz z częściową klasą: w jednej części klasy umieszczamy deklarację, natomiast w drugiej implementację Partial Class A Private x As Integer ’ deklaracja: Partial Private Sub powieksz() End Sub End Class ... Partial Class Product ’ implementacja: Private Sub powieksz() x = x+1 End Sub End Class Tomasz Goluch Visual Basic .NET Częściowe klasy i procedury częściowa procedura pozwala na oddzielenie jej deklaracji od implementacji używamy wraz z częściową klasą: w jednej części klasy umieszczamy deklarację, natomiast w drugiej implementację Partial Class A Private x As Integer ’ deklaracja: Partial Private Sub powieksz() End Sub End Class ... Partial Class Product ’ implementacja: Private Sub powieksz() x = x+1 End Sub End Class Tomasz Goluch Visual Basic .NET Dostępność Public – klasa dostępna dla całego kodu, również poza modułem Protected – stosowane tylko w odniesieniu do klas; dostęp tylko w obrębie klasy i klas pochodnych Tomasz Goluch Visual Basic .NET Dostępność Public – klasa dostępna dla całego kodu, również poza modułem Protected – stosowane tylko w odniesieniu do klas; dostęp tylko w obrębie klasy i klas pochodnych Friend (domyślne) – klasa dostępna dla całego kodu w module oraz poza modułem wewnątrz tego samego projektu. Różnice w stosunku do Public są przy tworzeniu bibliotek. Tomasz Goluch Visual Basic .NET Dostępność Public – klasa dostępna dla całego kodu, również poza modułem Protected – stosowane tylko w odniesieniu do klas; dostęp tylko w obrębie klasy i klas pochodnych Friend (domyślne) – klasa dostępna dla całego kodu w module oraz poza modułem wewnątrz tego samego projektu. Różnice w stosunku do Public są przy tworzeniu bibliotek. Protected Friend – suma dwóch powyższych. Tomasz Goluch Visual Basic .NET Dostępność Public – klasa dostępna dla całego kodu, również poza modułem Protected – stosowane tylko w odniesieniu do klas; dostęp tylko w obrębie klasy i klas pochodnych Friend (domyślne) – klasa dostępna dla całego kodu w module oraz poza modułem wewnątrz tego samego projektu. Różnice w stosunku do Public są przy tworzeniu bibliotek. 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ż poza modułem Protected – stosowane tylko w odniesieniu do klas; dostęp tylko w obrębie klasy i klas pochodnych Friend (domyślne) – klasa dostępna dla całego kodu w module oraz poza modułem wewnątrz tego samego projektu. Różnice w stosunku do Public są przy tworzeniu bibliotek. 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 na dwa sposoby: “zwykłe klasy” ze współdzieloną (Shared) zawartością Tomasz Goluch Visual Basic .NET Dziedziczenie brak klas statycznych, można symulować ich zachowanie na dwa sposoby: “zwykłe klasy” ze współdzieloną (Shared) zawartością moduły – słowo kluczowe: Module Tomasz Goluch Visual Basic .NET Dziedziczenie brak klas statycznych, można symulować ich zachowanie na dwa 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). Tomasz Goluch Visual Basic .NET Dziedziczenie brak klas statycznych, można symulować ich zachowanie na dwa 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 na dwa 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 Figura Public MustOverride Sub Pole() End Class Public Class Kwadrat Inherits Figura Public Overrides Sub Pole() ... End Sub End Class Tomasz Goluch Visual Basic .NET Dziedziczenie – przykład Private MustInherit Class A Public x As Integer Public Sub f(ByVal x As Integer) Me.x = x End Sub End Class Private Class B Inherits A Public Overloads Sub f(ByVal x _ As Integer) Me.x = 2 * x End Sub End Class Tomasz Goluch Visual Basic .NET Dim a As A a = New B a.f(5) ’ a.x = 5 Dim b As B b = New B b.f(5) ’ b.x = 10 Dziedziczenie – przykład Private MustInherit Class A Public x As Integer Public Overridable Sub f(ByVal x As Integer) Me.x = x Dim a As A End Sub a = New B End Class a.f(5) ’ a.x = 10 Private Class B Inherits A Public Overrides Sub f(ByVal x _ As Integer) Me.x = 2 * x End Sub End Class Tomasz Goluch Visual Basic .NET Dim b As B b = New B b.f(5) ’ b.x = 10 Dziedziczenie – przykład Private MustInherit Class A Public x As Integer Public Sub New() x = 1 End Sub End Class Private Class B Inherits A Public Shadows x As Integer Public Sub New() x = 2 End Sub End Class Tomasz Goluch Dim a As A Dim b As B a = New B b = New B Console.WriteLine(a.x) Console.WriteLine(b.x) Visual Basic .NET ’1 ’2 Tworzenie obiektu deklaracja zmiennej dowolnej klasy to alokacja 4 bajtów pamięci i przypisanie jej domyślnej wartości Nothing przy braku konstruktorów, przy tworzeniu obiektu używamy słowa New bez parametrów Tomasz Goluch Visual Basic .NET Tworzenie obiektu deklaracja zmiennej dowolnej klasy to alokacja 4 bajtów pamięci i przypisanie jej domyślnej wartości Nothing przy braku konstruktorów, przy tworzeniu obiektu używamy słowa New bez parametrów konstruktor to procedura o nazwie New (zwykle kilka i z parametrami). Tomasz Goluch Visual Basic .NET Tworzenie obiektu deklaracja zmiennej dowolnej klasy to alokacja 4 bajtów pamięci i przypisanie jej domyślnej wartości Nothing przy braku konstruktorów, przy tworzeniu obiektu używamy słowa New bez parametrów konstruktor to procedura o nazwie New (zwykle kilka i z parametrami). pierwsza linia konstruktora powinna być wywołaniem konstruktora w klasie bazowej, co realizujemy poprzez MyBase.New(parametry) Tomasz Goluch Visual Basic .NET Tworzenie obiektu deklaracja zmiennej dowolnej klasy to alokacja 4 bajtów pamięci i przypisanie jej domyślnej wartości Nothing przy braku konstruktorów, przy tworzeniu obiektu używamy słowa New bez parametrów konstruktor to procedura o nazwie New (zwykle kilka i z parametrami). pierwsza linia konstruktora powinna być wywołaniem konstruktora w klasie bazowej, co realizujemy poprzez MyBase.New(parametry) powyższe można pominąć jeśli klasa bazowa posiada konstruktor bez parametrów i wówczas zostanie on wywołany domyślnie Tomasz Goluch Visual Basic .NET Tworzenie obiektu deklaracja zmiennej dowolnej klasy to alokacja 4 bajtów pamięci i przypisanie jej domyślnej wartości Nothing przy braku konstruktorów, przy tworzeniu obiektu używamy słowa New bez parametrów konstruktor to procedura o nazwie New (zwykle kilka i z parametrami). pierwsza linia konstruktora powinna być wywołaniem konstruktora w klasie bazowej, co realizujemy poprzez MyBase.New(parametry) powyższe można pominąć jeśli klasa bazowa posiada konstruktor bez parametrów i wówczas zostanie on wywołany domyślnie Tomasz Goluch Visual Basic .NET Konstruktory – przykład Public Class Osoba Public imie As String Public nazw As String Public Sub New(ByVal i As String, ByVal n As String) imie = i nazw = n End Sub Public Sub New() Me.New("-", "-") End Sub End Class Tomasz Goluch Visual Basic .NET Tworzenie obiektu – przykład Public Class Osoba Public imie As String Public nazw As String Public Sub New(Optional ByVal i As String = "-", _ Optional ByVal n As String = "=") imie = i nazw = n End Sub End Class Dim a As Osoba = New Osoba Dim b As Osoba = New Osoba("Jan") Dim b As Osoba = New Osoba("Jan", "K") Tomasz Goluch Visual Basic .NET ’ -,= ’ Jan,= ’ Jan,K Uwaga o składowych Private Jeśli składowa klasy (np. zmienna) jest zadeklarowana jako Private, to obiekt danej klasy ma również dostęp do tej składowej w innej instancji tej samej klasy. Public Class Punkt Private x As Double Public Function Porownaj(ByVal inny_punkt As Punkt) _ As Boolean If x > inny_punkt.x Then return True Else return False End If End Function End Class Tomasz Goluch Visual Basic .NET Metoda Finalize Garbage collector zwalnia pamięć przydzieloną obiektom, do których nie ma referencji w programie. Możemy zlecić wykonanie kodu tuż przed zwolnieniem pamięci przesłaniając metodę Finalize zdefiniowaną w Object. metoda Finalize nie musi być wywołana bezpośrednio po tym, gdy przestaną istnieć w programie referencje do obiektu Public Class A ... Protected Overrides Sub Finalize() ... End Sub End Class Tomasz Goluch Visual Basic .NET Metoda Finalize Garbage collector zwalnia pamięć przydzieloną obiektom, do których nie ma referencji w programie. Możemy zlecić wykonanie kodu tuż przed zwolnieniem pamięci przesłaniając metodę Finalize zdefiniowaną w Object. metoda Finalize nie musi być wywołana bezpośrednio po tym, gdy przestaną istnieć w programie referencje do obiektu w celu natychmiastowego zwalniania zasobów używamy Dispose Public Class A ... Protected Overrides Sub Finalize() ... End Sub End Class Tomasz Goluch Visual Basic .NET Metoda Finalize Garbage collector zwalnia pamięć przydzieloną obiektom, do których nie ma referencji w programie. Możemy zlecić wykonanie kodu tuż przed zwolnieniem pamięci przesłaniając metodę Finalize zdefiniowaną w Object. metoda Finalize nie musi być wywołana bezpośrednio po tym, gdy przestaną istnieć w programie referencje do obiektu w celu natychmiastowego zwalniania zasobów używamy Dispose Public Class A ... Protected Overrides Sub Finalize() ... End Sub End 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. 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 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 czym Sub/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 czym Sub/Function używamy słowa kluczowego Operator, a nazwą metody jest przeciążany operator Tomasz Goluch Visual Basic .NET Przeciążanie operatorów Class Punkt Private x, Public Sub Me.x = Me.y = End Sub y As Double New(ByVal x As Double, ByVal y As Double) x y 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 Operator End Class Tomasz Goluch Visual Basic .NET Przeciążanie operatorów – przykład Private Class A Public x As Integer Public Sub New() x = 1 End Sub Public Shared Widening Operator CType(ByVal x As Integer) As A Dim r As A = New A r.x = x Return r End Operator End Class ... Dim a As A = New A a = 101 Uwaga: musimy użyć: Widening – gdy rzutowanie zawsze się powiedzie Tomasz Goluch Visual Basic .NET Przeciążanie operatorów – przykład Private Class A Public x As Integer Public Sub New() x = 1 End Sub Public Shared Widening Operator CType(ByVal x As Integer) As A Dim r As A = New A r.x = x Return r End Operator End Class ... Dim a As A = New A a = 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 A Public x As Integer Public Sub New() x = 1 End Sub Public Shared Widening Operator CType(ByVal x As Integer) As A Dim r As A = New A r.x = x Return r End Operator End Class ... Dim a As A = New A a = 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ątrz pliku lub przestrzeni nazw Tomasz Goluch Visual Basic .NET Definicja modułu [ <atrybuty> ] [ dostęp ] Module nazwa [ zawartość ] End Module typ referencyjny, może być zdefiniowany jedynie wewnątrz pliku lub przestrzeni nazw czas życia identyczny jak czas życia programu Tomasz Goluch Visual Basic .NET Definicja modułu [ <atrybuty> ] [ dostęp ] Module nazwa [ zawartość ] End Module typ referencyjny, może być zdefiniowany jedynie wewnątrz pliku lub przestrzeni nazw czas życia identyczny jak czas życia programu dostęp jedynie Friend (domyslny) i Public Tomasz Goluch Visual Basic .NET Definicja modułu [ <atrybuty> ] [ dostęp ] Module nazwa [ zawartość ] End Module typ referencyjny, może być zdefiniowany jedynie wewnątrz pliku 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ątrz pliku 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 przestrzeni nazw w którym jest on zdefiniowany (promocja typu) nie można dziedziczyć, implementować oraz tworzyć obiektów modułu. 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 przestrzeni nazw w którym jest on zdefiniowany (promocja typu) nie można dziedziczyć, implementować oraz tworzyć obiektów modułu. wszystkie składowe modułu są współdzielone – Shared, (static w 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 przestrzeni nazw w którym jest on zdefiniowany (promocja typu) nie można dziedziczyć, implementować oraz tworzyć obiektów moduł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 przestrzeni nazw w którym jest on zdefiniowany (promocja typu) nie można dziedziczyć, implementować oraz tworzyć obiektów moduł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 thisModule Sub 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 Integer Dim num As Integer = Array.FindIndex( _ bins, AddressOf IsGreaterThanZero) Return num End Function Private Shared Function IsGreaterThanZero _ (ByVal value As Integer) As Boolean Return 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 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 jest niejawna 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 jest niejawna 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że pasować 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że pasować 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 Boolean Return value > Threshold End Function Public Function GetIsGreaterThanPredicate() _ As Predicate(Of Integer) Return New Predicate(Of Integer) _ (AddressOf IsGreaterThan) End Function End 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 trakcie wykonywania 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: +, +=, -, -= dla delegatów Tomasz Goluch Visual Basic .NET Wywoływanie delegatów Dim trueCount As Integer = 0, falseCount As Integer = 0 For Each p As Predicate(Of Integer) In _ multicastDelegate.GetInvocationList() If (p(42) = True) Then falseCount = falseCount + 1 Else trueCount = trueCount + 1 End If Next zmienne trueCount i falseCount przyjmą wartość 2 metoda na którą wskazuje delegat greaterThanHundred zostanie wywołana dwa razy Tomasz Goluch Visual Basic .NET Wywoływanie delegatów Dim trueCount As Integer = 0, falseCount As Integer = 0 For Each p As Predicate(Of Integer) In _ multicastDelegate.GetInvocationList() If (p(42) = True) Then falseCount = falseCount + 1 Else trueCount = trueCount + 1 End If Next zmienne trueCount i falseCount przyjmą wartość 2 metoda na którą wskazuje delegat greaterThanHundred zostanie 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 A i B to istnieje również niejawna konwersja pomiędzy typami Predicate(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 A i B to istnieje również niejawna konwersja pomiędzy typami Predicate(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 B Private x As Integer Public Property x_pr() Get Return x End Get Set(ByVal value) x = value End Set End Property End Class 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 kod bloku try wykona się bezbłędnie lub gdy zakończy się obsługa błędu w bloku 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 kod bloku try wykona się bezbłędnie lub gdy zakończy się obsługa błędu w bloku Catch wyjątki od powyższego, to napotkanie wyrażenia End lub pojawił się wyjątek StackOverflowException w bloku Try lub 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 kod bloku try wykona się bezbłędnie lub gdy zakończy się obsługa błędu w bloku Catch wyjątki od powyższego, to napotkanie wyrażenia End lub pojawił się wyjątek StackOverflowException w bloku Try lub 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 IFigura Function pole() As Double Property X() As Double Property Y() As Double End 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 IFigura Function pole() As Double Property X() As Double Property Y() As Double End Interface Tomasz Goluch Visual Basic .NET Interfejsy Public Class Kwadrat Implements IFigura Public Function pole() As Double _ Implements IFigura.pole End Function Property X() As Double Implements IFigura.X Get End Get Set(ByVal a As Double) End Set End 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 jest referencją (4 bajty). 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 jest referencją (4 bajty). przypisanie w przypadku struktury kopiuje całą jej zawartość; w przypadku obiektów - przypisanie powoduje, że obie zmienne 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 jest referencją (4 bajty). przypisanie w przypadku struktury kopiuje całą jej zawartość; w przypadku obiektów - przypisanie powoduje, że obie zmienne 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ązane z jednakowymi nazwami, np. klas. przestrzenie nazw mogą tworzyć hierarchiczną strukturę Dim a As Siec.Polaczenie Dim b As Zasoby.Polaczenie Tomasz Goluch Visual Basic .NET Przestrzenie nazw (Namespaces) przestrzenie nazw pozwalają rozwiązywać problemy związane z jednakowymi nazwami, np. klas. przestrzenie nazw mogą tworzyć hierarchiczną strukturę nie są typami, służą do organizacji kodu Dim a As Siec.Polaczenie Dim b As Zasoby.Polaczenie Tomasz Goluch Visual Basic .NET Przestrzenie nazw (Namespaces) przestrzenie nazw pozwalają rozwiązywać problemy związane z jednakowymi nazwami, np. klas. przestrzenie nazw mogą tworzyć hierarchiczną strukturę nie są typami, służą do organizacji kodu Dim a As Siec.Polaczenie Dim b As Zasoby.Polaczenie Tomasz Goluch Visual Basic .NET Namespaces – Imports wyrażenia typu System.Drawing.Rectangle nie są wygodne i utrudniają czytanie kodu. umieszczamy na początku pliku Imports System.Drawing i wówczas w kodzie wcześniejsze wyrażenie zastępujemy Rectangle Tomasz Goluch Visual Basic .NET Namespaces – Imports wyrażenia typu System.Drawing.Rectangle nie są wygodne i utrudniają czytanie kodu. umieszczamy na początku pliku Imports System.Drawing i wówczas w kodzie wcześniejsze wyrażenie zastępujemy Rectangle plik może zawierać (zawsze podane na początku) dowolną liczbę instrukcji Imports Tomasz Goluch Visual Basic .NET Namespaces – Imports wyrażenia typu System.Drawing.Rectangle nie są wygodne i utrudniają czytanie kodu. umieszczamy na początku pliku Imports System.Drawing i wówczas w kodzie wcześniejsze wyrażenie zastępujemy Rectangle plik może zawierać (zawsze podane na początku) dowolną liczbę instrukcji Imports jeśli chcemy importować różne moduły dla różnych fragmentów kodu, to trzeba kod podzielić pomiędzy kilka plików. Tomasz Goluch Visual Basic .NET Namespaces – Imports wyrażenia typu System.Drawing.Rectangle nie są wygodne i utrudniają czytanie kodu. umieszczamy na początku pliku Imports System.Drawing i wówczas w kodzie wcześniejsze wyrażenie zastępujemy Rectangle plik może zawierać (zawsze podane na początku) dowolną liczbę instrukcji Imports jeśli chcemy importować różne moduły dla różnych fragmentów kodu, to trzeba kod podzielić pomiędzy kilka plikó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ć jej element. 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 element w nim zdefiniowany do niej należy (bezpośrednio lub pośrednio). Można definiować własną przestrzeń nazw (wewnątrz przestrzeni nazw projektu): Namespace StrukturyDanych Public Class Lista ... End Class End Namespace Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych Każdy projekt posiada swoją przestrzeń nazw – każdy element w nim zdefiniowany do niej należy (bezpośrednio lub pośrednio). Można definiować własną przestrzeń nazw (wewnątrz przestrzeni nazw projektu): Namespace StrukturyDanych Public Class Lista ... End Class End Namespace Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych Do powyżej zdefiniowanej klasy Lista kod wewnątrz przestrzeni 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ątrz przestrzeni 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 przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, właściwości (properties), procedur, zdarzeń (events). Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych wewnątrz przestrzeni nazw można definiować inne przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, właściwości (properties), procedur, zdarzeń (events). można jedną przestrzeń nazw definiować w kilku fragmentach. Przydatne, gdy: Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych wewnątrz przestrzeni nazw można definiować inne przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, 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, Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych wewnątrz przestrzeni nazw można definiować inne przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, 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, Tomasz Goluch Visual Basic .NET Namespaces – definiowanie własnych wewnątrz przestrzeni nazw można definiować inne przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, 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 przestrzenie nazw, klasy, struktury, moduły, typy wyliczeniowe, interfejsy. wewnątrz przestrzeni nazw nie można definiować bezpośrednio zmiennych, 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 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 Then Console.WriteLine("send telegram") End If If customer?.Age >= 100 Then Console.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=freud age=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 list Let address = Lookup(i) ’look up name Select 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