VisualStudio.Net Janusz Górczyński
Agenda Składniki .Net .NET Framework – podstawowe składniki Zadania .NET Framework Architektura .NET Framework CLR Wspólne środowisko uruchomieniowe Biblioteka klas Języki programowania a CLS Czym jest MSIL?
Składniki .Net Produkty .Net – obecne i przyszłe produkty wchodzące w skład .Net. Najważniejszym (obecnie) elementem jest VisualStudio.Net Usługi .Net – to gotowe usługi oferowane przez MS, np. Passport .Net Framework – produkt całkowicie zintegrowany z systemem operacyjnym Windows. Pozwala na tworzenie szybkich, elastycznych, skalowalnych i efektywnych aplikacji. Pozwala na tworzenie aplikacji współpracujących z innymi aplikacjami .Net oraz komponentami napisanymi w innych językach.
.NET Framework – podstawowe składniki Biblioteka klas .NET Framework – zbiór funkcji, obiektów, właściwosci i metod do wykorzystania w dowolnym języku .Net. Jest tu także ADO.NET. Wspólne środowisko uruchomieniowe CLR (Common Language Runtime) – odpowiada za uruchamianie aplikacji .NET, zarządzanie nimi i kompilację do kodu maszynowego. WindowsForms (WinForms) – pozwala na tworzenie aplikacji dla Win32 w środowisku .NET ASP.NET – to kolejna generacja ASP dostosowana do pracy w środowisku .NET. Aplikacje ASP.NET są kompilowane, co znakomicie przyspiesza ich udostępnianie.
Zadania .NET Framework Zapewnienie spójnego środowiska programowania obiektowego Zapewnienie takiego środowiska wykonywania kodu, które: minimalizuje konflikty przy rozprowadzaniu kodu i jego wersjonowania gwarantuje bezpieczne wykonywanie kodu oraz kontrolę kodu utworzonego przez innych programistów Eliminuje problemy związane z wydajnością skryptów czy języków interpretowanych Zapewnienie spójnego środowiska przy pracy nad różnymi typami aplikacji Zabezpieczenie integracji .NET Framework z innymi produktami
Architektura .NET Framework
CLR Wspólne środowisko uruchomieniowe Podstawa .NET Framework – zarządza kodem w czasie jego działania Udostępnia takie usługi jak: Zarządzanie pamięcią Zarządzanie wątkami Wywołania zdalne Innym zadaniem jest ścisła kontrola typów Kod zarządzany – taki, który ma być wykonywany w tym środowisku Kod niezarządzany – taki, który nie jest przeznaczony do wykonania w tym środowisku
Biblioteka klas Jest integralną częścią .NET Framework, zawiera klasy lub typy przeznaczone do wielokrotnego użycia wykorzystywane do projektowania aplikacji różnych typów: Aplikacji wiersza poleceń Aplikacji z graficznym interfejsem użytkownika korzystających z: Windows Forms ASP.NET Web Forms Usług sieciowych XML
Języki programowania a CLS NET Framework obsługuje języki VB.NET, C++.NET, C#.NET i VJ#.NET Języki te są zgodne ze standardem Common Language System (CLS), który definiuje infrastrukturę niezbędną do uruchomienia kodu IL (Intermediate Language) Kompilatory wymienionych języków kompilują kod źródłowy do kodu pośredniego IL – co jest podstawą współpracy tych języków wsparte wspólnym systemem typów CST (Common System Type)
Czym jest MSIL? Jest to niezależny od procesora zbiór instrukcji wykorzystywanych przez aplikacje .NET Zawiera instrukcje ładowania, zapisywania i inicjalizacji obiektów
Metadane Podczas kompilacji poza kodem IL kompilator generuje metadane będące zbiorem informacji o aplikacji Metadane są zapisywane w postaci binarnej w przenośnym pliku wykonywalnym PE (Portable Executable) Przy wykonywaniu aplikacji system operacyjny ładuje plik PE oraz wszystkie biblioteki podrzędne ładowane dynamicznie W kolejnym kroku system operacyjnych wykonuje kod IL korzystając z pośrednictwa kompilatora JIT
Kompilator JIT Kompilator JIT (Just in time) odpowiada za biężące tłumaczenie kodu IL na kod maszynowy zrozumiały przez procesor Kod maszynowy po wykonaniu jest buforowany w celu ponownego wykonania
Składniki CLR
Zadania CLR (1) Moduł ładowania klas – odpowiada za ładowanie klas do wspólnego środowiska uruchomieniowego Kompilatory MSIL – odpowiadają za konwersję kodu IL do kodu maszynowego (robi to JIT) Zarządzanie kodem – zarządza kodem w trakcie jego wykonywania Usuwanie nieużytków – odpowiada za zarządzanie pamięcią (automatyczne zwalnianie pamięci) Moduł bezpieczeństwa – wymusza ograniczenia nakładane przez zabezpieczenia dostępu do kodu Kontroler typów – zapewnia ścisłą kontrolę typów
Zadania CLR (2) Obsługa wątów – zapewnia obsługę wielowątkowości Obsługa wyjątków – zapewnia obsługę wyjątków za pomocą bloków Try … Catch…Finally Moduł debugowania – zapewnia debugowanie różnych typów aplikacji Moduł szeregujący COM – pozwala na wymianę danych z aplikacjami COM Obsługa podstawowej biblioteki klas – udostępnia aplikacji potrzebne klasy (typy)
Biblioteka klas .NET Framework Jest zbiorem klas i związanych z nimi struktur, które mogą być wykorzystane jako podstawowe elementy budulcowe aplikacji Biblioteka .NET Framework zawiera klasy, interfejsy i typy wartości, które nie tylko zapewniają dostęp do mechanizów systemu, ale także optymalizują proces tworzenia aplikacji Typy zgromadzone w .NET Framework pozwalają na: Reprezentację podstawowych typów danych i wyjątków Hermetyzację struktur danych Wykonywanie operacji wejścia-wyjścia Dostęp do informacji o załadowanych typach Wywoływanie mechanizmów zabezpieczeń z .NET Zapewnienie dostępu do danych poprzez GUI
Organizacja klas w bibliotece .NET Framework Podstawową jednostką organizacyjną jest przestrzeń nazw Przestrzeń klas to pojemnik na funkcje – opisuje ona grupę klas i konstrukcji o podobnym przeznaczeniu Koncepcja przestrzeni nazw jest podobna do koncepcji organizacji plików za pomocą katalogów (folderów) Wszystkie przestrzenie nazw mają wspólny korzeń, jest nim przestrzeń System Przestrzeń nazw System zawiera wspólne typy danych wykorzystywanych w .NET (Boolean, Int32 itd.) Zawiera także typ danych Object, który jest klasą, po której dziedziczą wszystkie pozostałe klasy w .NET
Podzespół w .NET Podstawowa jednostka w aplikacjach .NET, wprowadzona jako remedium na problemy z DLL Podzespół reprezentuje logiczny zbiór jednego lub większej liczby programów wykonywalnych lub bibliotek dołączanych dynamicznie (DLL), które zawierają kod aplikacji oraz zasoby Podzespoły zawierają tzw. manifest, który jest opisem kodu i zasobów zawartych wewnątrz podzespołu Podzespół zawiera: Manifest Metadane typów Moduł Zasoby
Manifest, jego zawartość Identyfikator – składa się z nazwy, numeru wersji, opcjonalnego kodu lokalizacji i podpisu cyfrowego Lista plików – kompletna lista plików tworzących podzespół. Zawiera także dodatkowe informacje na temat każdego z plików wchodzących w skład podzespołu Typy i zasoby – jest to lista typów i zasobów udostępnianych przez podzespół. Zawiera informację o tym, czy dany typ jest publiczny czy prywatny Uprawnienia – podzespoły są modułami, w których wykorzystywane są uprawnienia dostępu dla kodu
Podstawy języka VB.NET Deklarowanie zmiennych – słowa kluczowe: Dim – deklaruje zmienną wykorzystywaną w podprogramie lub w jego części Private – deklaruje zmienną, która może być wykorzystywana przez więcej niż jeden podprogram w klasie lub module Public – deklaruje zmienną, która może być wykorzystywana we wszystkich klasach i modułach projektu Static – deklaracja zmiennej w podprogramie, która zachowuje swoją wartość między wywołaniami Przykłady: Dim errHandler as String Dim ocena as Single = 3 Private i, j as Integer, x as Double
Zmienne, poziom deklaracji Zmienna lokalna – deklarowana wewnątrz podprogramu Zmienna modułu – deklarowana w module, ale nie w podprogramie W przypadku klasy lub struktury (typu użytkownika) poziom zmiennej nielokalnej zależy od tego, czy jest współdzielona czy też nie. Jeżeli jest współdzielona, to ze słowem kluczowym Shared. Istnieje wtedy tylko jedna kopia tej zmiennej we wszystkich instancjach takiej klasy. Jeżeli nie jest współdzielona, to każda instancja ma swoją kopię takiej zmiennej
Zmienne, deklaracja typu Klauzula As pozwala na zdefiniowanie typu danych lub typu obiektowego deklarowanej zmiennej Dla zmiennej można określić dowolny z poniższych typów: Podstawowy typ danych – np. Boolean, Long czy Decimal Złożony typ danych, taki jak tablica lub struktura (typ użytkownika) Typ obiektowy Klasa z VB.NET lub innej aplikacji, np. ComboBox Wybór typu danych wymaga staranności, nie może być nadmiarowy
Zmienne, czas życia i dostępność Czas życia to czas, w którym można ze zmiennej korzystać Zmienne lokalne (deklarowane za pomocą DIM) istnieją tylko w czasie wykonywania podprogramu, a po jego zakończeniu zniakają, a ich wartości są tracone – wyjątek to użycie Static Zmienne modułu, współdzielone i instancyjne, przechowują swoje wartości tak długo, jak długo działa aplikacja Dostępność zmiennej zależna jest od sposobu deklaracji: Dim, Private, Public, Protected, Friend, Protected Friend Wewnątrz podprogramu można użyć tylko Dim
Zmienne, deklaracja zasięgu Zasięg zmiennej to obszar kodu, w którym można się odwołać do zmiennej bez potrzeby użycia nazwy kwalifikowanej Zasięg zmiennej jest określony przez miejsce jej deklaracji Zmienne lokalne są najlepsze dla pomocniczych działań (z uwagi na szybkie zwalnianie pamięci) Zmienne modułu zajmują miejsce w pamięci przez czas działania aplikacji Przy deklarowaniu zasięgu ważne są reguły: Zasięgiem zmiennej modułu jest przestrzeń nazw, w której zdefiniowany jest dany moduł Zasięgiem zmiennej współdzielonej lub instancyjnej jest struktura lub klasa, w której zmienna jest zadeklarowana Zasięgiem zmiennej lokalnej jest podprogram
Użycie przestrzeni nazw Niezbędne z uwagi na dużą liczbę klas .NET Dzięki umieszczeniu klas w przestrzeni nazw unika się kolizji nazw (działa to tak, jak w systemie plików może istnieć wiele plików o nazwie np. aza.txt , pod warunkiem, że są umieszczone w innych folderach) Jeżeli tworzymy nowy projekt o nazwie np. Nowy, to można umieścić go w przestrzeni nazw: Namespace Nowy Public Class Form1 Inherits System.Windows.Forms.Form ……. Tu jest kod …. End Class End NameSpace
Słowo kluczowe Imports W poprzednim przykładzie prawdziwa nazwa klasy nie jest Form1, lecz Nowy.Form1 (nazwa w pełni kwalifikowana) W przypadku odwoływania się do tej klasy poza przestrzenią nazw Nowy musimy użyć nazwy w pełni kwalifikowanej, chyba, że skorzystamy ze słowa kluczowego Imports w celu zaimportowania przestrzeni nazw Nowy Zapis Imports System.Windows.Forms powoduje, że w kodzie można się odwoływać w sposób uproszczony – bez używania nazwy kwalifikowanej
Tworzenie modułów w VB.NET Moduł jest podobny do klasy, a różnica polega na tym, że składniki modułu są współdzielone i tym samym są widoczne w całej przestrzeni nazw, w której jest zadeklarowany moduł, a nie tylko w samym module Moduł może być deklarowany tylko w przestrzeni nazw i nie może być zagnieżdżony Moduł w VB.NET to znany z VB 6.0 czy VBA moduł standardowy zawierający zestaw funkcji i procedur dostępnych dla aplikacji Klasa w VB.NET to znany z VB 60 czy VBA moduł klasy Klasa jest zorientowana obiektowo, a moduł nie
Struktury sterujące, pętle W VB.NET można stosować pętle typu” While DoWhile…Loop Do….LoopWhile DoUntil….Lopp Do ….Loop Until For…Next ForEach…Next
Pętla While Pętla While wykonywana jest do momentu, gdy warunek nie stanie się prawdą Dim produkt As Integer = 2 While produkt <=1000 produkt = produkt * 2 End While
Pętla DoWhile…Loop Pętla ta działa podobnie do pętle While W pętli DoWhile ….Loop warunek jest sprawdzany przed wykonaniu obrotu, co oznacza, że pętla może nie być wykonana (jeżeli warunek jest False) Dim produkt As Integer = 2 Do While produkt <=1000 produkt = produkt * 2 Loop
Pętla Do ….LoopWhile W pętli Do ….LoopWhile warunek jest sprawdzany po wykonaniu obrotu, co oznacza, że pętla będzie wykonana co najmniej raz. Dim produkt As Integer = 2 Do produkt = produkt * 2 Loop While produkt <=1000
Pętla DoUntil … Loop Inaczej niż w pętlach DoWhile pętla DoUntil wykonywana jest wtedy, gdy warunek jest False Z uwagi na umieszczenie słowa Until wraz z warunkiem po Do pętla może nie być wykonana Dim produkt As Integer = 2 Do Until produkt >1000 produkt = produkt * 2 Loop
Do …LoopUntil Inaczej niż w pętlach DoWhile pętla DoUntil wykonywana jest wtedy, gdy warunek jest False Z uwagi na umieszczenie słowa Until wraz z warunkiem po Loop pętla będzie wykonana co najmniej raz Dim produkt As Integer = 2 Do produkt = produkt * 2 Loop Until produkt >1000
Pętla For … Next Inaczej zwana pętlą z licznikiem. Stosowana wtedy, gdy wiemy, ile razy ma być wykonana Dim i As Integer, x as Double = 0 For i=1 to 100 x=x+i Next For i=1 to 100 Step 2 x=x*i Next i
Pętla ForEach … Next Ten typ pętli wykorzystujemy wtedy, gdy chcemy wykonać operacje na elementach kolekcji Powiedzmy, że na naszym formularzu chcemy zmienić kolor tła wszystkich formantów na jasnoniebieski Imports System.Windows.Forms Dim ctl As Control For Each ctl in currentForm.Controls ctl.BackColor=System.Drawing.Color.LightBlue Next
Warunkowe zakończenie pętli - Exit Każda pętla może być warunkowo przerwana za pomocą słowa kluczowego Exit Dim i As Integer, x as Double = 0 For i=1 to 100 x=x+i if x>25 Then Exit for Next Exit może być także użyte do przerwania działania także innych struktur niż pętle, np. Select Case
Operatory przypisania Zapis i=i+1 jest opisaniem przypisania: zmienna i będzie równa poprzedniej wartości zmiennej i powiększonej o 1 Operatory dwuargumentowe to +, -, *, ^, &, \ oraz / Można użyć skróconego zapisu wg schematu: <zmienna> <operator>=<wyrażenie> Np.. i+=1 jest równoważne i=i+1 x\=2 jest równoważne x=x\2 y*=x jest równoważne y=y*x Operator przypisania może wystąpić w wyrażeniu tylko raz
Operatory logiczne VB.NET oferuje kilka interesujących operatorów logicznych dla budowania złożonych warunków Poza znanymi operatorami And, Or, Xor oraz Not mamy takie operatory jak AndAlso i OrElse Zapis np.. If (i>5) and (j>10) Then można teraz zapisać jako If (i>5) AndAlso (j>10) Then W pierwszym zapisie sprawdzane są oba warunki pojedyncze, a następnie warunek łączny – w drugim jeżeli pierwszy jest False, to drugi nie jest już sprawdzany
Funkcje konwertujące Szereg funkcji konwertujących zmienną jednego typu na inny typ. Cbool – konwersja na typ logiczny Cbyte Cchar Cdate Cdbl Cint Clng Cstr Ctype – konwertuje na dowolny typ
Przydatne funkcje tekstowe Len Chr Asc Left Right Mid Instr Lcase Ucase Ltrim, Rtrim, Trim Substring
Inne przydatne funkcje IsArray – zwraca True jeżeli tak IsDate – zwraca True, jeżeli parametr jest datą IsNumeric – zwraca True, jeżeli parametr jest liczbą IsObject – zwraca True, jeżeli parametr jest typem obiektowym TypeName – zwraca nazwę typu danych parametru Now – zwraca bieżącą datę i czas Today – zwraca bieżącą datę z czasem ustawionym na 00:00:00
Try…Catch W trakcie wyknywania programu mogą się zdarzyć różne błędy, np. brak wskazanego pliku w danej lokalizacji, wyłączona drukarka, brak papieru, brak krążka w napędzie CD, brak dostępu do sieci czy do serwera SQL, brak pamięci czy brak stosownych uprawnień. Obowiązkiem programisty jest zapewnienie obsługi takich sytuacji (wyjątków). Środowisko VisualStudio.NET dostarcza konstrukcję Try …Catch …End Try tworząca pułapkę na możliwy wyjątek. Jest to znakomite rozszerzenie znanaych z VBA isntrukcji On Error Goto i On Error Resume Next
Składnia Try Catch [Finally] End Try … tu wstawiamy kod, który może spowodować błąd wykonania … Catch … tu wstawiamy kod obsługujący wystąpienie wyjątku … [Finally] … fragment nieobowiązkowy, jeżeli jest, to jest wykonywany zawsze niezależnie od tego, czy wystąpił wyjątek czy nie End Try Przy obsłudze błędu można wykorzystać obiekt err z jego właściwościami Number i Description do doprecyzowania rodzaju błędu
Przykład Try FileOpen(1, Me.OpenFileDialog1.FileName, _ OpenMode.Input) Do Until EOF(1) txt = txt + LineInput(1) + vbCrLf Loop Catch MsgBox("Mam problem z odczytem pliku") Finally FileClose(1) Me.txtPlik.Text = txt Me.Text = txtNazwaPliku + " metoda FileOpen" End Try
Przykład obsługi błędu z licznikiem Dim ileErr as Integer = 0 Try PictureBox1.Image = _ System.Drawing.Bitmap.FromFile(„D:\wszim.bmp”) Catch ileErr += 1 If ileErr <= 2 then MsgBox(„Proszę włożyć dysk do napędu") Else MsgBox(„Operacja odczytu pliku graficznego nieudana”) Exit Sub (lub jakieś inne zakończenie – JG) End If End Try
Zagnieżdzone Try…Catch PictureBox1.Image = _ System.Drawing.Bitmap.FromFile(„D:\wszim.bmp”) Catch MsgBox(„Proszę włożyć dysk do napędu i nacisnąć OK") MsgBox(„Operacja odczytu pliku graficznego nieudana”) Exit Sub (lub jakieś inne zakończenie – JG) End Try
Wykorzystanie obiektu Err Try PictureBox1.Image = _ System.Drawing.Bitmap.FromFile(„D:\wszim.bmp”) Catch When Err.Number = 53 MsgBox(„Plik nie odnaleziony”) Catch When Err.Number = 7 MsgBox(„Brak pamięci”) Catch MsgBox(„Operacja odczytu pliku graficznego nieudana”) End Try
Jak było bez Try…Catch If File.Exists(„D:\WSZiM.bmp”) Then Else End if PictureBox1.Image = _ System.Drawing.Bitmap.FromFile(„D:\wszim.bmp”) Else MsgBox(„Plik nie odnaleziony”) End if Taka konstrukcja wymaga zaimportowania przestrzeni nazw System.IO, jest oczywiścia dopuszczalna, ale Try…Catch działa szybciej