Darmowy fragment publikacji:
Visual Basic 2005.
Almanach
Tim Patrick, Steven Roman, Ron Petrusha, Paul Lomax
T³umaczenie: Miko³aj Szczepaniak
ISBN: 83-246-0475-8
Tytu³ orygina³u: Visual Basic 2005 in a Nutshell
Format: B5, stron: 880
Przyk³ady na ftp: 7 kB
Visual Basic po raz pierwszy pojawi³ siê na rynku w roku 1991 jako po³¹czenie
oferowanego przez Microsoft jêzyka QBasic z mechanizmem projektowania graficznego
interfejsu u¿ytkownika. Od tej pory przeszed³ spor¹ ewolucjê, zyskuj¹c jednoczeœnie
ogromne grono zwolenników. W roku 2001 wprowadzono na rynek platformê
programistyczn¹ .NET wraz z ca³kowicie zmienion¹ i odnowion¹ wersj¹ Visual Basica
pod nazw¹ Visual Basic .NET. Visual Basic dla platformy .NET by³ jêzykiem w pe³ni
obiektowym i oferowa³ znacznie wiêksze mo¿liwoœci ni¿ jego poprzednicy. Visual Basic
2005 to najnowsze wcielenie tego popularnego jêzyka programowania.
Ksi¹¿ka „Visual Basic 2005. Almanach” to kompleksowe omówienie wszystkich
zagadnieñ zwi¹zanych z programowaniem w tym jêzyku. Czytaj¹c j¹, poznasz genezê
platformy .NET, jej sk³adniki i konstrukcjê oraz s³owa kluczowe jêzyka Visual Basic.
Przeczytasz o programowaniu obiektowym, klasach platformy .NET, obs³udze zdarzeñ
oraz typach uniwersalnych. Dalsza czêœæ ksi¹¿ki to niezwykle przydatne ka¿demu
programiœcie zestawienie dokumentacji wszystkich istotnych wyra¿eñ, procedur, funkcji
i obiektów Visual Basica zawieraj¹ce omówienie sk³adni i argumentów, wskazówki
dotycz¹ce sposobu stosowania omawianego elementu jêzyka, przyk³ady kodu oraz
opisy nieudokumentowanych zachowañ.
W ksi¹¿ce omówiono:
(cid:129) Podstawowe wiadomoœci o platformie .NET
(cid:129) Zasady programowania obiektowego
(cid:129) Zmienne, typy danych i operatory
(cid:129) Struktura programów w Visual Basic
(cid:129) Klasy platformy .NET
(cid:129) Typy uniwersalne
(cid:129) Obs³uga b³êdów i wyj¹tków
(cid:129) Leksykon elementów jêzyka Visual Basic 2005
Zostañ ekspertem w dziedzinie programowania w Visual Basicu
Wydawnictwo Helion
ul. Koœciuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treści
Przedmowa ................................................................................................................... 21
I Podstawy .................................................................................................29
1. Wprowadzenie ..............................................................................................................31
32
36
42
43
Dlaczego Visual Basic .NET?
Czym jest Visual Basic .NET?
Co możemy zrobić w środowisku Visual Basic .NET?
Wersje języka Visual Basic .NET
2. Platforma .NET Framework: pojęcia ogólne ................................................................45
45
46
47
48
49
51
52
52
Środowisko uruchomieniowe wspólnego języka
Kod zarządzany
Przestrzenie nazw
Typy i obiekty
Podzespoły
Biblioteka klas platformy .NET (FCL)
Wdrażanie aplikacji
Platforma .NET i język Visual Basic
3. Wprowadzenie do programowania obiektowego .....................................................53
53
58
Reguły programowania obiektowego
Programowanie obiektowe w języku Visual Basic
4. Zmienne i typy danych ..................................................................................................77
77
93
97
98
98
99
100
Typy danych
Zmienne
Stałe
Typy wyliczeniowe
Tablice
Kolekcje
Parametry i argumenty
3
5. Operatory ....................................................................................................................105
105
107
107
112
114
115
117
119
Operatory arytmetyczne
Operatory konkatenacji
Operatory logiczne i bitowe
Operatory przypisania
Operatory porównania
Operatory obiektowe
Przeciążanie operatorów
Priorytety operatorów
6. Struktura programu .....................................................................................................121
121
122
123
126
127
Rodzaje aplikacji tworzonych w środowisku Visual Studio
Techniki odwołań do komponentów i klas
Punkty wejścia aplikacji
Zawartość pliku z kodem źródłowym
Struktura programu Visual Basica
7. Biblioteka klas platformy .NET ................................................................................... 135
136
142
142
143
144
146
146
Przestrzeń nazw System
Przestrzeń nazw System.Collections
Przestrzeń nazw System.Data
Przestrzeń nazw System.IO
Przestrzeń nazw System.Text.RegularExpressions
Przestrzeń nazw System.Windows.Forms
Pozostałe przestrzenie nazw
8. Delegacje i zdarzenia ..................................................................................................149
150
153
Delegacje
Zdarzenia i wiązanie zdarzeń
9. Atrybuty ......................................................................................................................159
160
163
166
Składnia i techniki stosowania
Definiowanie atrybutów niestandardowych
Korzystanie z atrybutów niestandardowych
10. Typy uniwersalne .........................................................................................................171
171
172
173
173
174
175
Czym są typy uniwersalne?
Parametry typów
Stosowanie wielu parametrów typów
Ograniczenia
Ograniczenia złożone
Uzyskiwanie dostępu do składowych parametrów typów
4
|
Spis treści
Metody uniwersalne
Zagnieżdżone typy uniwersalne
Typy i składowe przeciążone
177
177
177
11. Obsługa błędów w Visual Basicu ............................................................................... 179
179
180
188
191
Wykrywanie i obsługa błędów
Obsługa błędów wykonywania
Obsługa błędów logiki
Stałe błędów
II Leksykon ................................................................................................ 193
12. Leksykon języka Visual Basic ......................................................................................195
197
198
200
200
201
202
203
203
205
206
207
208
209
209
210
211
212
214
215
216
217
218
220
220
221
222
223
224
225
#Const (dyrektywa)
#If...Then...#Else (dyrektywa)
#Region...#End Region (dyrektywa)
Abs (funkcja)
Acos (funkcja)
AddHandler (wyrażenie)
AddressOf (operator)
AppActivate (procedura)
Application (klasa)
Application.CompanyName (właściwość)
Application.DoEvents (metoda)
Application.ExecutablePath (właściwość)
Application.ProductName (właściwość)
Application.ProductVersion (właściwość)
Application.Run (metoda)
Array (klasa)
Array.BinarySearch (metoda)
Array.Copy (metoda)
Array.IndexOf (metoda)
Array.LastIndexOf (metoda)
Array.Reverse (metoda)
Array.Sort (metoda)
Asc i AscW (funkcje)
AssemblyVersion (atrybut)
Asin (funkcja)
Atan (funkcja)
Atan2 (funkcja)
AttributeUsage (atrybut)
Beep (procedura)
Spis treści
|
5
Call (wyrażenie)
CallByName (funkcja)
CBool (funkcja)
CByte (funkcja)
CChar (funkcja)
CDate (funkcja)
CDbl (funkcja)
CDec (funkcja)
Ceiling (funkcja)
ChDir (procedura)
ChDrive (procedura)
Choose (funkcja)
Chr i ChrW (funkcje)
CInt (funkcja)
Class...End Class (wyrażenie)
Clipboard (klasa)
CLng (funkcja)
CLSCompliant (atrybut)
CObj (funkcja)
Collection (klasa)
Collection.Add (metoda)
Collection.Count (właściwość)
Collection.Item (właściwość)
Collection.Remove (metoda)
ColorDialog (klasa)
COMClass (atrybut)
Command (funkcja)
Const (wyrażenie)
Continue (wyrażenie)
Cos (funkcja)
Cosh (funkcja)
CreateObject (funkcja)
CSByte (funkcja)
CShort (funkcja)
CSng (funkcja)
CStr (funkcja)
CType (funkcja)
CUInt (funkcja)
CULng (funkcja)
CUShort (funkcja)
CurDir (funkcja)
Custom Event (wyrażenie)
6
|
Spis treści
225
226
228
228
229
230
231
231
232
233
234
235
237
238
239
241
241
242
243
244
245
247
248
248
249
251
252
254
255
256
257
257
259
260
261
262
263
265
266
267
268
268
DateAdd (funkcja)
DateDiff (funkcja)
DatePart (funkcja)
DateSerial (funkcja)
DateString (właściwość)
DateValue (funkcja)
Day (funkcja)
DDB (funkcja)
Debug (klasa)
Debug.Assert (metoda)
Debug.Listeners (właściwość)
Debug.Write (metoda)
Debug.WriteIf (metoda)
Debug.WriteLine (metoda)
Debug.WriteLineIf (metoda)
Declare (wyrażenie)
DefaultMember (atrybut)
Delegate (wyrażenie)
DeleteSetting (procedura)
Dim (wyrażenie)
Dir (funkcja)
DirectCast (funkcja)
Directory (klasa)
Directory.CreateDirectory (metoda)
Directory.Delete (metoda)
Directory.Exists (metoda)
Directory.GetCreationTime (metoda)
Directory.GetDirectories (metoda)
Directory.GetDirectoryRoot (metoda)
Directory.GetFiles (metoda)
Directory.GetFileSystemEntries (metoda)
Directory.GetLogicalDrives (metoda)
Directory.GetParent (metoda)
Directory.Move (metoda)
Do...Loop (wyrażenie)
E (pole)
End (wyrażenie)
Enum (wyrażenie)
Environ (funkcja)
EOF (funkcja)
Erase (wyrażenie)
Erl (właściwość)
270
272
274
276
277
278
278
279
280
282
283
284
284
285
286
287
290
292
294
296
300
302
303
304
305
306
307
307
309
310
311
312
313
314
315
316
317
319
321
323
324
324
Spis treści
|
7
Err (obiekt)
Err.Clear (metoda)
Err.Description (właściwość)
Err.GetException (metoda)
Err.HelpContext (właściwość)
Err.HelpFile (właściwość)
Err.LastDLLError (właściwość)
Err.Number (właściwość)
Err.Raise (metoda)
Err.Source (właściwość)
Error (wyrażenie)
ErrorToString (funkcja)
Event (wyrażenie)
Exception (klasa)
Exit (wyrażenie)
Exp (funkcja)
File (klasa)
File.Exists (metoda)
FileAttr (funkcja)
FileClose (procedura)
FileCopy (procedura)
FileDateTime (funkcja)
FileGet i FileGetObject (procedury)
FileLen (funkcja)
FileOpen (procedura)
FilePut i FilePutObject (procedury)
FileWidth (procedura)
Filter (funkcja)
Fix (funkcja)
Flags (atrybut)
Floor (funkcja)
FontDialog (klasa)
For...Next (wyrażenie)
For Each...Next (wyrażenie)
Format (funkcja)
FormatCurrency, FormatNumber i FormatPercent (funkcje)
FormatDateTime (funkcja)
FreeFile (funkcja)
Friend (słowo kluczowe)
Function (wyrażenie)
FV (funkcja)
GetAllSettings (funkcja)
8
|
Spis treści
325
326
327
328
328
329
330
331
331
333
333
334
334
336
338
339
339
340
341
342
343
343
344
346
347
350
351
352
353
354
354
355
357
359
360
364
365
366
367
368
372
373
GetAttr (funkcja)
GetChar (funkcja)
GetObject (funkcja)
GetSetting (funkcja)
GetType (operator)
Global (słowo kluczowe)
GoTo (wyrażenie)
Guid (atrybut)
Handles (słowo kluczowe)
Hashtable (klasa)
Hashtable.Add (metoda)
Hashtable.ContainsKey (metoda)
Hashtable.ContainsValue (metoda)
Hashtable.CopyTo (metoda)
Hashtable.Item (właściwość)
Hashtable.Keys (właściwość)
Hashtable.Remove (metoda)
Hashtable.Values (właściwość)
Hex (funkcja)
Hour (funkcja)
IEEERemainder (funkcja)
If...Then...Else (wyrażenie)
IIf (funkcja)
Implements (słowo kluczowe)
Implements (wyrażenie)
Imports (wyrażenie)
Inherits (wyrażenie)
Input (procedura)
InputBox (funkcja)
InputString (funkcja)
InStr (funkcja)
InStrRev (funkcja)
Int (funkcja)
Interface...End Interface (wyrażenie)
IPmt (funkcja)
IRR (funkcja)
Is (operator)
IsArray (funkcja)
IsDate (funkcja)
IsDBNull (funkcja)
IsError (funkcja)
IsNot (operator)
374
375
376
377
379
379
380
382
382
384
385
386
386
387
388
389
389
390
390
391
391
392
394
395
396
398
399
400
402
403
404
405
406
407
410
411
412
413
414
415
416
417
Spis treści
|
9
IsNothing (funkcja)
IsNumeric (funkcja)
IsReference (funkcja)
Join (funkcja)
Kill (procedura)
LBound (funkcja)
LCase (funkcja)
Left (funkcja)
Len (funkcja)
Like (operator)
LineInput (funkcja)
Loc (funkcja)
Lock (procedura)
LOF (funkcja)
Log (funkcja)
Log10 (funkcja)
LSet (funkcja)
LTrim (funkcja)
MarshalAs (atrybut)
Max (funkcja)
Me (słowo kluczowe)
Mid (funkcja)
Mid (wyrażenie)
Min (funkcja)
Minute (funkcja)
MIRR (funkcja)
MkDir (procedura)
Mod (operator)
Module...End Module (wyrażenie)
Month (funkcja)
MonthName (funkcja)
MsgBox (funkcja)
MTAThread (atrybut)
MyBase (słowo kluczowe)
MyClass (słowo kluczowe)
Namespace (wyrażenie)
New (słowo kluczowe)
Nothing (słowo kluczowe)
Now (właściwość)
NPer (funkcja)
NPV (funkcja)
Obsolete (atrybut)
10
|
Spis treści
418
419
419
420
421
422
423
423
424
425
426
427
428
430
430
432
432
433
434
437
438
439
440
441
442
442
443
444
445
446
446
447
449
450
451
453
453
454
455
455
457
458
Oct (funkcja)
Of (słowo kluczowe)
On Error (wyrażenie)
OpenFileDialog (klasa)
Operator (wyrażenie)
Option Compare (wyrażenie)
Option Explicit (wyrażenie)
Option Strict (wyrażenie)
Out (atrybut)
ParamArray (atrybut)
Partial (słowo kluczowe)
Partition (funkcja)
PI (pole)
Pmt (funkcja)
Pow (funkcja)
PPmt (funkcja)
Print i PrintLine (procedury)
Private (słowo kluczowe)
Property (wyrażenie)
Protected (słowo kluczowe)
Public (słowo kluczowe)
PV (funkcja)
QBColor (funkcja)
Queue (klasa)
Queue.Contains (metoda)
Queue.CopyTo (metoda)
Queue.Dequeue (metoda)
Queue.Enqueue (metoda)
Queue.Peek (metoda)
Queue.ToArray (metoda)
RaiseEvent (wyrażenie)
Randomize (procedura)
Rate (funkcja)
ReDim (wyrażenie)
Rem (wyrażenie)
RemoveHandler (wyrażenie)
Rename (procedura)
Replace (funkcja)
Reset (procedura)
Resume (wyrażenie)
Return (wyrażenie)
RGB (funkcja)
459
459
460
462
464
466
467
468
469
471
471
472
474
475
476
476
478
479
480
484
486
487
488
489
490
491
492
493
493
494
494
496
497
498
500
501
502
503
504
505
506
507
Spis treści
|
11
Right (funkcja)
RmDir (procedura)
Rnd (funkcja)
Round (funkcja)
RSet (funkcja)
RTrim (funkcja)
SaveFileDialog (klasa)
SaveSetting (procedura)
ScriptEngine (właściwość)
ScriptEngineBuildVersion (właściwość)
ScriptEngineMajorVersion (właściwość)
ScriptEngineMinorVersion (właściwość)
Second (funkcja)
Seek (funkcja)
Seek (procedura)
Select Case (wyrażenie)
Send, SendWait (metody)
SetAttr (procedura)
Shadows (słowo kluczowe)
Shared (słowo kluczowe)
Shell (funkcja)
Sign (funkcja)
Sin (funkcja)
Sinh (funkcja)
SLN (funkcja)
Space (funkcja)
SPC (funkcja)
Split (funkcja)
Sqrt (funkcja)
Stack (klasa)
Stack.Contains (metoda)
Stack.CopyTo (metoda)
Stack.Peek (metoda)
Stack.Pop (metoda)
Stack.Push (metoda)
Stack.ToArray (metoda)
STAThread (atrybut)
Static (wyrażenie)
Stop (wyrażenie)
Str (funkcja)
StrComp (funkcja)
StrConv (funkcja)
12
|
Spis treści
508
509
510
511
512
513
514
515
517
518
518
519
519
520
521
522
524
526
528
528
529
531
532
532
533
534
534
535
536
537
538
539
540
541
541
542
542
543
543
544
545
546
StrDup (funkcja)
StrReverse (funkcja)
Structure...End Structure (wyrażenie)
Sub (wyrażenie)
Switch (funkcja)
SYD (funkcja)
SyncLock (wyrażenie)
SystemTypeName (funkcja)
TAB (funkcja)
Tan (funkcja)
Tanh (funkcja)
ThreadStatic (atrybut)
Throw (wyrażenie)
TimeOfDay (właściwość)
Timer (właściwość)
TimeSerial (funkcja)
TimeString (właściwość)
TimeValue (funkcja)
Today (właściwość)
Trim (funkcja)
Try...Catch...Finally (wyrażenie)
TryCast (funkcja)
TypeName (funkcja)
TypeOf (operator)
UBound (funkcja)
UCase (funkcja)
Unlock (procedura)
Using...End Using (wyrażenie)
Val (funkcja)
VarType (funkcja)
VBFixedArray (atrybut)
VBFixedString (atrybut)
VbTypeName (funkcja)
WebMethod (atrybut)
WebService (atrybut)
Weekday (funkcja)
WeekdayName (funkcja)
While...End While (wyrażenie)
With...End With (wyrażenie)
WithEvents (słowo kluczowe)
Write i WriteLine (procedury)
Year (funkcja)
547
548
549
551
554
555
556
557
557
558
559
560
561
562
562
563
564
565
566
566
567
569
570
572
573
573
574
575
577
577
579
580
581
582
583
584
585
586
587
588
588
590
Spis treści
|
13
13. Leksykon przestrzeni nazw My ..................................................................................591
592
593
594
595
596
597
597
598
599
599
600
601
602
603
603
605
605
606
607
608
609
610
611
611
612
613
613
614
616
618
619
620
620
621
622
623
624
625
626
627
629
AllUsersApplicationData (właściwość)
AltKeyDown (właściwość)
Application (obiekt)
ApplicationContext (właściwość)
AssemblyName (właściwość)
Audio (obiekt)
AvailablePhysicalMemory (właściwość)
AvailableVirtualMemory (właściwość)
ButtonsSwapped (właściwość)
CapsLock (właściwość)
ChangeCulture (metoda)
ChangeUICulture (metoda)
ClassesRoot (właściwość)
Clear (metoda)
Clipboard (obiekt)
Clock (obiekt)
Close (metoda)
CombinePath (metoda)
CommandLineArgs (właściwość)
CommentTokens (właściwość)
CompanyName (właściwość)
Computer (obiekt)
ContainsAudio (metoda)
ContainsData (metoda)
ContainsFileDropList (metoda)
ContainsImage (metoda)
ContainsText (metoda)
CopyDirectory (metoda)
CopyFile (metoda)
Copyright (właściwość)
CreateDirectory (metoda)
CtrlKeyDown (właściwość)
Culture (właściwość)
CurrentConfig (właściwość)
CurrentDirectory (właściwość)
CurrentPrincipal (właściwość)
CurrentUser (właściwość)
CurrentUserApplicationData (właściwość)
DefaultFileLogWriter (właściwość)
DeleteDirectory (metoda)
DeleteFile (metoda)
14
|
Spis treści
Delimiters (właściwość)
Deployment (właściwość)
Description (właściwość)
Desktop (właściwość)
DirectoryExists (metoda)
DirectoryPath (właściwość)
DoEvents (metoda)
DownloadFile (metoda)
Drives (właściwość)
DynData (właściwość)
EndOfData (właściwość)
ErrorLine (właściwość)
ErrorLineNumber (właściwość)
FieldWidths (właściwość)
FileExists (metoda)
FileSystem (obiekt)
FindInFiles (metoda)
Forms (obiekt)
GetAudioStream (metoda)
GetData (metoda)
GetDataObject (metoda)
GetDirectories (metoda)
GetDirectoryInfo (metoda)
GetDriveInfo (metoda)
GetEnvironmentVariable (metoda)
GetFileDropList (metoda)
GetFileInfo (metoda)
GetFiles (metoda)
GetImage (metoda)
GetName (metoda)
GetParentPath (metoda)
GetTempFileName (metoda)
GetText (metoda)
GetValue (metoda)
GmtTime (właściwość)
HasFieldsEnclosedInQuotes (właściwość)
Info (obiekt składowy obiektu My.Application)
Info (obiekt składowy obiektu My.Computer)
InitializeWithWindowsUser (metoda)
InstalledUICulture (właściwość)
IsAuthenticated (właściwość)
IsAvailable (właściwość)
630
632
633
634
634
635
636
637
638
639
640
641
642
643
644
645
646
648
649
650
651
652
653
655
656
657
658
660
661
662
663
664
665
666
667
668
669
670
670
671
672
672
Spis treści
|
15
IsInRole (metoda)
IsNetworkDeployed (właściwość)
Keyboard (obiekt)
LineNumber (właściwość)
LoadedAssemblies (właściwość)
LocalMachine (właściwość)
LocalTime (właściwość)
Log (obiekt składowy przestrzeni nazw My)
Log (obiekt składowy obiektu My.Application)
MinimumSplashScreenDisplayTime (właściwość)
Mouse (obiekt)
MoveDirectory (metoda)
MoveFile (metoda)
My (przestrzeń nazw)
MyDocuments (właściwość)
MyMusic (właściwość)
MyPictures (właściwość)
Name (właściwość składowa obiektu My.Computer)
Name (właściwość składowa obiektu My.User)
Network (obiekt)
NetworkAvailabilityChanged (zdarzenie składowe obiektu My.Application)
NetworkAvailabilityChanged
(zdarzenie składowe obiektu My.Computer.Network)
NumLock (właściwość)
OpenForms (właściwość)
OpenSerialPort (metoda)
OpenTextFieldParser (metoda)
OpenTextFileReader (metoda)
OpenTextFileWriter (metoda)
OSFullName (właściwość)
OSPlatform (właściwość)
OSVersion (właściwość)
PeekChars (metoda)
PerformanceData (właściwość)
Ping (metoda)
Play (metoda)
PlaySystemSound (metoda)
Ports (obiekt)
ProductName (właściwość)
ProgramFiles (właściwość)
Programs (właściwość)
ReadAllBytes (metoda)
673
674
675
676
677
678
679
680
680
681
682
683
684
686
687
688
689
690
690
691
692
693
694
695
696
698
699
701
702
703
704
705
706
706
707
709
710
711
711
712
713
16
|
Spis treści
ReadAllText (metoda)
ReadFields (metoda)
ReadLine (metoda)
ReadToEnd (metoda)
Registry (obiekt)
RenameDirectory (metoda)
RenameFile (metoda)
Request (obiekt)
Resources (obiekt)
Response (obiekt)
Run (metoda)
SaveMySettingsOnExit (właściwość)
Screen (właściwość)
ScrollLock (właściwość)
SendKeys (metoda)
SerialPortNames (właściwość)
SetAudio (metoda)
SetData (metoda)
SetDataObject (metoda)
SetDelimiters (metoda)
SetFieldWidths (metoda)
SetFileDropList (metoda)
SetImage (metoda)
SetText (metoda)
Settings (obiekt)
SetValue (metoda)
ShiftKeyDown (właściwość)
Shutdown (zdarzenie)
SpecialDirectories (obiekt)
SplashScreen (właściwość)
StackTrace (właściwość)
Startup (zdarzenie)
StartupNextInstance (zdarzenie)
Stop (metoda)
Temp (właściwość)
TextFieldParser (obiekt)
TextFieldType (właściwość)
TickCount (właściwość)
Title (właściwość)
TotalPhysicalMemory (właściwość)
TotalVirtualMemory (właściwość)
TraceSource (właściwość)
714
715
716
717
718
719
720
721
722
723
724
725
726
727
727
730
731
732
733
734
735
736
737
738
739
741
743
743
744
745
746
748
749
750
751
752
753
754
755
756
757
757
Spis treści
|
17
Trademark (właściwość)
TrimWhiteSpace (właściwość)
UICulture (właściwość)
UnhandledException (zdarzenie)
UploadFile (metoda)
User (obiekt)
Users (właściwość)
Version (właściwość)
WebServices (obiekt)
WheelExists (właściwość)
WheelScrollLines (właściwość)
WorkingSet (właściwość)
WriteAllBytes (metoda)
WriteAllText (metoda)
WriteEntry (metoda)
WriteException (metoda)
759
759
760
761
762
764
765
766
767
768
769
770
770
771
772
774
III Dodatki .................................................................................................. 777
A Elementy języka Visual Basic według kategorii ........................................................779
780
780
781
782
782
782
783
784
784
785
786
787
787
788
789
789
790
791
791
793
793
Obsługa tablic
Schowek
Obiekty kolekcji
Popularne okna dialogowe
Kompilacja warunkowa
Konwersja
Data i godzina
Diagnostyka
Deklaracja
Obsługa błędów
System plików
Operacje finansowe
Informacja
Wejście-wyjście
Zintegrowane środowisko programowania
Interakcja
Matematyka
Struktura programu i przepływ sterowania
Programowanie obiektowe i różne konstrukcje programowe
Rejestr
Operacje na łańcuchach
18
|
Spis treści
B Hierarchia przestrzeni nazw ......................................................................................795
795
801
Hierarchia przestrzeni nazw My
Hierarchia przestrzeni nazw System
C Stałe i typy wyliczeniowe .......................................................................................... 805
805
808
809
Stałe wbudowane Visual Basica
Klasa ControlChars
Typy wyliczeniowe Visual Basica
D Co dodano, a co zmieniono w Visual Basicu .NET 2002? ..........................................815
815
824
826
827
827
Zmiany językowe wprowadzone w Visual Basicu .NET 2002
Zmiany dotyczące konstrukcji programistycznych
Przestarzałe konstrukcje programistyczne
Ustrukturalizowana obsługa wyjątków
Zmiany w technikach programowania obiektowego
E Co dodano, a co zmieniono w Visual Basicu .NET 2003? ..........................................831
831
Zmiany językowe wprowadzone w Visual Basicu .NET 2003
F Co dodano, a co zmieniono w Visual Basicu 2005? ................................................. 833
834
837
838
Rozszerzenia istniejącej funkcjonalności
Przestrzeń nazw My
Pozostałe nowości
G Elementy Visual Basica 6, które nie są już obsługiwane ..........................................841
H Kompilator Visual Basica obsługiwany z poziomu wiersza poleceń .......................847
847
848
853
854
Podstawy kompilatora Visual Basica
Przełączniki wiersza poleceń
Stosowanie pliku odpowiedzi
Stałe kompilacji warunkowej
Skorowidz ....................................................................................................................857
Spis treści
|
19
ROZDZIAŁ 4.
Zmienne i typy danych
Mechanizmy odpowiedzialne za przetwarzanie danych są sercem wszystkich aplikacji pro-
gramowych. Moglibyśmy oczywiście przetwarzać dane tak jak robi to procesor komputera,
czyli bit po bicie, jednak praca nad odpowiednimi algorytmami szybko by nas znużyła —
właśnie dlatego takie języki jak Visual Basic oferują rozmaite typy danych oraz implementacje
narzędzi zarządzających danymi (z których każdy bazuje na jakimś podzbiorze możliwych
wartości danych). W niniejszym rozdziale zajmiemy się typami danych, sposobami zarzą-
dzania danymi przez te typy oraz technikami ich przetwarzania w języku Visual Basic i plat-
formie .NET.
Pojęcie „typ danych” nie jest tożsame z bardziej ogólnym terminem „typ” wykorzystywanym
w rozmaitych aspektach w tej i innych publikacjach poświęconych technologii .NET. Cała
koncepcja platformy .NET bazuje na pojęciu typu, czyli podstawowej konstrukcji danych
obejmującej klasy, struktury, delegacje i inne wysokopoziomowe elementy wykorzystywane
w procesie konstruowania aplikacji oraz podczas przekazywania danych pomiędzy progra-
mami. Typy danych dostępne w platformie .NET bazują właśnie na tych ogólnie rozumianych
typach (podobnie zresztą jak klasy budowane przez samych programistów). Typy danych
oferują stosunkowo niewielki, ale bardzo istotny zbiór narzędzi przetwarzania danych pogru-
powanych według podzbiorów możliwych wartości (zarządzanych w ramach poszczególnych
typów danych).
Typy danych
Środowisko uruchomieniowe wspólnego języka platformy .NET (CLR) obejmuje między inny-
mi wspólny system typów (CTS), który definiuje typy danych obsługiwane właśnie przez śro-
dowisko CLR. Wszystkie języki programowania przystosowane do współpracy z platformą
.NET muszą implementować przynajmniej podzbiory typów danych środowiska CLR (część
języków implementuje wszystkie, np. Visual Basic począwszy od wydania z 2005 roku).
W technologii .NET typy danych mają postać specjalnych klas i struktur, których egzemplarze
reprezentują wartości danych należące do ograniczonych przedziałów (właściwych dla poszcze-
gólnych typów). Przykładowo, typ danych Byte oferuje możliwość reprezentowania i zarzą-
dzania 8-bitowymi wartościami całkowitoliczbowymi bez znaku, czyli liczbami z przedziału
od 0 do 255. Egzemplarze tego typu nie mogą zawierać wartości spoza tego przedziału (pod-
zbioru), ale przynajmniej z tym konkretnym podzbiorem radzą sobie znakomicie. Platforma
.NET oferuje typy danych dla tych podzbiorów wartości, które są najczęściej wykorzystywane
77
przez programistów podczas wytwarzania aplikacji. Za pomocą tych typów można reprezen-
tować niemal dowolne kombinacje danych. Jeśli predefiniowane typy danych platformy .NET
nie odpowiadają naszym potrzebom, możemy te typy wykorzystać w roli bloków składających
się na naszą własną klasę zarządzającą danymi.
Platforma .NET Framework implementuje blisko dwadzieścia podstawowych typów danych,
z których większość zaprojektowano z myślą o przetwarzaniu liczb całkowitych i zmienno-
przecinkowych. Rdzenne typy danych Visual Basica (znane jeszcze sprzed wprowadzenia plat-
formy .NET) stanowią tylko opakowania dla wspomnianych typów podstawowych systemu
CTS. Przykładowo, stosowany w Visual Basicu typ danych Integer jest opakowaniem struktury
System.Int32. Jedną z wartości struktury Int32 jest stała MaxValue reprezentująca mak-
symalną wartość numeryczną, którą można składować w tym typie danych. Oznacza to, że
choć składowa MaxValue nie jest oficjalną częścią Visual Basica, pełna zależność typu danych
Integer od wspomnianego typu podstawowego Int32 systemu CTS powoduje, że poniższa
para wyrażeń zostanie prawidłowo skompilowana i wykonana:
Dim usesInt32 As Integer
MsgBox(usesInt32.MaxValue) Wyświetla 2147483647
Przed wydaniem wersji 2005 tylko niektóre spośród podstawowych typów danych platformy
.NET były implementowane w Visual Basicu. Nawet mimo braku odpowiednich opakowań
Visual Basica, wcześniejsze wydania tego języka (oczywiście już w ramach platformy .NET)
udostępniały „nieopakowane” typy danych systemu CTS. Ponieważ podstawowe typy danych
platformy .NET mają postać klas i struktur, można z nich korzystać w Visual Basicu dokład-
nie tak jak z innych klas czy struktur.
Typy wartościowe i referencyjne
Typy danych w języku Visual Basic można podzielić pomiędzy dwie dość ogólne kategorie:
typy wartościowe (ang. data types) oraz typy referencyjne (ang. reference types). Typy wartościo-
we różnią się od typów referencyjnych przede wszystkim sposobem składowania w pamięci.
Pamięć przydzielana zmiennej typu wartościowego zawiera właściwą wartość tej zmiennej.
Przykładowo, w czasie wykonywania poniższego wyrażenia:
Dim simpleValue As Integer = 5
zostanie zarezerwowane miejsce w pamięci potrzebne do składowania przypisywanej warto-
ści 5. Inaczej jest w przypadku typów referencyjnych, gdzie pod adresami pamięci przydzielo-
nymi tym zmiennym są składowane adresy innych bloków pamięci, w których znajdują się wła-
ściwe dane. Mechanizm stosowany w typach referencyjnych przypomina trochę usługę
pocztową polegającą na przesyłaniu pod inny adres listów oryginalnie kierowanych do okre-
ślonego odbiorcy. Przykładowo, dla poniższej deklaracji typu referencyjnego:
Dim somewhereElse As New MyCustomClass
kompilator Visual Basica utworzy w pamięci egzemplarz klasy MyCustomClass, po czym przy-
pisze zmiennej somewhereElse rzeczywisty adres w pamięci tego egzemplarza. Programistom,
którzy mają doświadczenie w pracy ze wskaźnikami oferowanymi przez takie języki jak C++,
zrozumienie mechanizmu stosowanego w Visual Basicu nie powinno sprawić najmniejszych
problemów, ponieważ oba rozwiązania są bardzo podobne.
Najkrócej mówiąc, zmienne typów wartościowych zawierają dane, natomiast zmienne typów
referencyjnych tylko na te dane wskazują.
78
|
Rozdział 4. Zmienne i typy danych
Różnice pomiędzy typami wartościowymi a typami referencyjnymi powodują szereg konse-
kwencji — jedną z najważniejszych jest sposób wykonywania popularnych operacji przypi-
sania. Przeanalizujmy poniższą klasę, która zawiera tylko jedno pole składowe:
Public Class SimpleClass
Public Age As Short
End Class
oraz strukturę będącą odpowiednikiem tej klasy:
Structure SimpleStruct
Public Age As Short
End Structure
W przeciwieństwie do struktur, które są typami wartościowymi, klasy są typami referencyj-
nymi. Poniższy kod ilustruje podstawową różnicę w korzystaniu z tej pary podobnych, ale
mimo wszystko różnych typów:
----- Deklaruje cztery zmienne, po dwie dla każdego z typów.
Dim refType1 As SimpleClass
Dim refType2 As SimpleClass
Dim valType1 As SimpleStruct
Dim valType2 As SimpleStruct
----- W pierwszej kolejności skoncentrujemy się na typach referencyjnych.
Przypisanie refType2 = refType1 spowoduje, że obie zmienne refType2
będą wskazywały na ten sam adres w pamięci. Od tej pory zmiany
składowych zmiennej refType1 będą miały wpływ na składowe zmiennej
refType2 i odwrotnie. Obie zmienne współdzielą ten sam egzemplarz.
refType1 = New SimpleClass
refType1.Age = 20
refType2 = refType1
refType2.Age = 30
Debug.WriteLine(refType1.Age) -- Wyświetla 30
Debug.WriteLine(refType2.Age) -- Wyświetla 30
----- Przyjrzyjmy się teraz typom wartościowym. Przypisanie valType2 = valType1
powoduje wykonanie kopii składowych zmiennej valType1. Od tej pory zmiany
składowych jednej z tych zmiennych nie będą miały wpływu na wartości
składowych drugiej zmiennej.
valType1 = New SimpleStruct
valType1.Age = 20
valType2 = valType1
valType2.Age = 30
Debug.Writeline(valType1.Age) -- Wyświetla 20
Debug.Writeline(valType2.Age) -- Wyświetla 30
W pewnym sensie obie operacje przypisania jednej zmiennej drugiej zmiennej realizują to samo
zadanie — kopiują wartość reprezentowaną przez zmienną użytą po prawej stronie do zmien-
nej na lewo od operatora przypisania. Ponieważ jednak rzeczywistą wartością typu referen-
cyjnego (w tym przypadku zmiennej refType1) jest adres w pamięci, właśnie adres został skopio-
wany do zmiennej refType2. Ponieważ obie zmienne wskazują na ten sam obszar w pamięci
(miejsce przechowywania składowych obiektu klasy SimpleClass), w praktyce zmienne ref-
Type1 i refType2 współdzielą jeden zbiór składowych.
Przypisanie jednej zmiennej typu wartościowego (valType1) innej zmiennej typu wartościowego
(valType2) także polega na skopiowaniu wartości zmiennej użytej na prawo od operatora przy-
pisania do zmiennej użytej z lewej strony tego operatora. Różnica polega na tym, że zmienna
valType1 zawiera rzeczywiste składowe (nie adres miejsca ich przechowywania w pamięci).
Oznacza to, że zmienna docelowa valType2 zawiera odrębną kopię tych składowych (w tym
przypadku jedynej składowej Age).
Typy danych
|
79
Wyzerowanie zmiennej typu referencyjnego wymaga przypisania jej wartości Nothing. Typy
wartościowe zawsze reprezentują jakieś wartości (nawet jeśli są to same zera), zatem w ich
przypadku przypisywanie „wartości” Nothing nie jest możliwe.
Wszystkie podstawowe typy danych Visual Basica, które zarządzają wartościami numerycz-
nymi (czyli np. Integer oraz Double), są typami wartościowymi. Typ danych String jest co
prawda przykładem typu referencyjnego, jednak z perspektywy programisty funkcjonuje
dokładnie tak jak typy wartościowe. Za każdym razem gdy przypisujemy jedną zmienną
łańcuchową innej, wbrew pozorom w łańcuchu docelowym nie jest zapisywana referencja do
pierwszego łańcucha (jak w przypadku innych typów referencyjnych). Wynika to z faktu, że
stosowana w Visual Basicu implementacja typu danych String każdorazowo (zarówno pod-
czas przypisywania, jak i modyfikowania) tworzy zupełnie nowy egzemplarz oryginalnego
łańcucha.
Podstawowe typy danych Visual Basica: przegląd
Język programowania Visual Basic począwszy od wersji 2005 implementuje wszystkie pod-
stawowe typy danych platformy .NET Framework (a konkretnie wspólnego systemu typów,
CTS). Okazuje się, że podstawowe typy danych oferują bardzo szeroki zakres funkcjonalności
i pozwalają zarządzać niemal wszystkimi kategoriami danych. Typy danych należące do sys-
temu CTS można podzielić na pięć grup (według rodzaju zarządzanych danych):
Dane logiczne
Pojedynczy typ danych, który obejmuje tylko jeden bit reprezentujący prawdę lub fałsz
(odpowiednio True lub False).
Dane znakowe
Visual Basic oferuje typy danych zarządzające zarówno pojedynczymi znakami, jak i dłu-
gimi łańcuchami znaków.
Dane czasu i daty
Pojedynczy typ danych zarządzający wartościami reprezentującymi zarówno datę, jak
i godzinę.
Dane zmiennoprzecinkowe
Rozmaite typy danych reprezentujące wartości zmiennoprzecinkowe — każdy z tych typów
zarządza ograniczonym podzbiorem liczb wymiernych. Niektóre z tych typów oferują więk-
szą precyzję matematyczną od pozostałych.
Dane całkowitoliczbowe
Ta kategoria obejmuje wiele całkowitoliczbowych typów danych, które umożliwiają skła-
dowanie liczb całkowitych należących do właściwego (zależnego od typu) przedziału (od
wartości minimalnej do maksymalnej). Część typów danych całkowitoliczbowych obsłu-
guje wartości ujemne.
W dalszej części tego punktu przedstawimy definicje i stosowne komentarze do każdej z wy-
mienionych powyżej kategorii typów danych obsługiwanych przez Visual Basic.
Typ danych Boolean
Podstawowe fakty
Podstawowy typ .NET: System.Boolean
Implementacja: Typ wartościowy (struktura)
80
|
Rozdział 4. Zmienne i typy danych
Ilość zajmowanej pamięci: 2 bajty
Zakres wartości: True lub False
Typ danych Boolean może reprezentować tylko dwie wartości (True lub False). W języku
Visual Basic mamy do dyspozycji słowa kluczowe True i False, które są stosowane w roli warto-
ści zmiennych typu Boolean. Zmiennym tego typu można też przypisywać wyniki dowol-
nych operacji logicznych.
Kiedy wartość numeryczna jest konwertowana na wartość typu Boolean, wszystkie wartości
różne od zera są przekształcane w wartość True, a jedyną wartością tłumaczoną na False jest
zero. W razie konwersji w drugą stronę wartość False jest zamieniana na zero, natomiast
wartość True jest zamieniana na liczbę –1. (Ta część funkcjonalności odróżnia Visual Basica
od pozostałych języków platformy .NET, które konwertują wartość True na 1. W Visual Basicu
zastosowano w tej roli liczbę –1, aby zapewnić zgodność wstecz. W razie współdzielenia danych
logicznych pomiędzy komponentami napisanymi w różnych językach platformy .NET, środo-
wisko uruchomieniowe .NET Framework i tak automatycznie przekształci te wartości w spo-
sób gwarantujący pełną zgodność).
Typ danych Byte
Podstawowe fakty
Podstawowy typ .NET: System.Byte
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 1 bajt
Zakres wartości: Od 0 do 255 (bez znaku)
Typ danych Byte jest najmniejszym dostępnym w Visual Basicu typem całkowitoliczbowym
bez znaku. Mimo bardzo niewielkiego przedziału obsługiwanych wartości zmienne typu Byte
doskonale zdają egzamin podczas pracy z nieprzetworzonymi danymi binarnymi.
Typ danych Char
Podstawowe fakty
Podstawowy typ .NET: System.Char
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 2 bajty
Zakres wartości: Kody znaku z przedziału od 0 do 65535 (bez znaku)
Typ danych Char reprezentuje pojedynczy, 16-bitowy znak Unicode. Wszystkie znaki w plat-
formie .NET są reprezentowane właśnie za pomocą kodów 16-bitowych, co oczywiście wy-
starczy do obsługi języków wymagających stosowania 2-bajtowego zbioru znaków (ang. Double-
-Byte Character Set — DBCS), czyli np. języka japońskiego. Wersje Visual Basica sprzed wprowa-
dzenia platformy .NET nie zawierały żadnego odpowiednika typu danych char.
Stosując stałe wartości typu Char, należy do nich dołączać (za cudzysłowem zamykającym)
pojedynczą literę c:
Dim singleLetter As Char = A c
Typy danych
|
81
Zmienna łańcuchowa (typu String), która zawiera tylko jeden znak, nie jest tożsama ze
zmienną typu Char zawierającą ten sam znak. Ponieważ są to dwa zupełnie różne typy,
ewentualne przenoszenie danych pomiędzy zmiennymi tych typów wymaga stosownej kon-
wersji (jeśli włączono opcję Option Strict).
Typ danych DateTime
Podstawowe fakty
Podstawowy typ .NET: System.DateTime
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 8 bajtów
Zakres wartości: Od 1 stycznia 1 roku n.e. do 31 grudnia 9999 roku n.e. (w kalendarzu
gregoriańskim)
Wartości reprezentujące daty i czas mają postać 64-bitowych, długich liczb całkowitych zgod-
nych ze standardem IEEE. Za pomocą tak długich liczb można reprezentować daty z prze-
działu od 1 stycznia 1 roku n.e. do 31 grudnia 9999 roku n.e. oraz godziny z przedziału od
0:00:00 do 23:59:59. Odpowiednie wartości reprezentują liczbę „tyknięć”, które upłynęły od 1 sty-
cznia 1 roku n.e. Każde takie „tyknięcie” odpowiada 100 nanosekundom.
Stałe daty należy umieszczać pomiędzy dwoma znakami krzyżyków (#):
Dim independenceDay As Date = #7/4/1776#
Typ danych Decimal
Podstawowe fakty
Podstawowy typ .NET: System.Decimal
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 12 bajtów
Zakres wartości: +/–79 228 162 514 264 337 593 543 950 335 bez części dziesiętnej;
+/–7.9228162514264337593543950335 z 28 miejscami po przecinku; najmniejsza wartość
różna od zera wynosi +/–0.0000000000000000000000000001
Wartości typu danych Decimal są składowane w formie 96-bitowych liczb całkowitych ze
znakiem; reprezentacja tych wartości dodatkowo obejmuje wewnętrzny (obsługiwany i sto-
sowany w pełni automatycznie) współczynnik skali z przedziału od 0 do 28. Takie rozwią-
zanie zapewnia wysoki poziom precyzji matematycznej w przypadku liczb należących do
odpowiedniego przedziału wartości (typ Decimal szczególnie dobrze sprawdza się w przypadku
danych walutowych).
Na końcu wartości stałych typu Decimal należy umieszczać albo pojedynczą literę D, albo
znak @:
Dim startingValue As Decimal = 123.45D
Dim endingValue As Decimal = 543.21@
Znak @ można stosować także do oznaczania deklarowanych zmiennych jako egzemplarzy
typu Decimal:
Dim startingValue@ = 123.45D
82
|
Rozdział 4. Zmienne i typy danych
Składowe typu danych Decimal nazwane MaxValue i MinValue reprezentują granice obsłu-
giwanego przedziału wartości (odpowiednio wartość maksymalną i minimalną).
W implementacjach Visual Basica sprzed wprowadzenia technologii .NET typ danych Deci-
mal w praktyce nie stanowił odrębnego, autonomicznego typu danych — był podtypem typu
danych Variant. Dopiero w wersjach kwalifikujących Visual Basic do rodziny języków plat-
formy .NET zaimplementowano typ Decimal w formie pełnowartościowego typu danych.
Typ danych Double
Podstawowe fakty
Podstawowy typ .NET: System.Double
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 8 bajtów
Zakres wartości: Od –1.79769313486231E+308 do –4.94065645841247E-324 w przypadku
liczb ujemnych; od 4.94065645841247E–324 do 1.79769313486232E+308 w przypadku
liczb dodatnich
Wartości typu Double są zgodne ze standardem IEEE dla 64-bitowych (8-bajtowych) liczb
zmiennoprzecinkowych podwójnej precyzji ze znakiem. Mimo ogromnego przedziału obsłu-
giwanych wartości, stosując typ danych Double musimy się liczyć z utratą precyzji w pew-
nych obliczeniach matematycznych.
Stałe egzemplarze typu danych Double należy oznaczać wielką literą R lub znakiem krzyżyka
(#) dołączanym bezpośrednio po wartościach numerycznych:
Dim startingValue As Double = 123.45R
Dim endingValue As Double = 543.21#
Znak krzyżyka (#) można stosować także do oznaczania deklarowanych zmiennych jako egzem-
plarzy typu Double:
Dim startingValue# = 123.45R
Typ danych Int32 (Integer)
Podstawowe fakty
Podstawowy typ .NET: System.Int32
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 4 bajty
Zakres wartości: Od –2 147 483 648 do 2 147 483 647
Typ danych Integer umożliwia reprezentowanie 32-bitowych liczb całkowitych ze znakiem.
Właśnie tyle wynosi rdzenna długość słowa w procesorach 32-bitowych, zatem stosowanie
tego rodzaju wartości powinno się przekładać na nieznacznie wyższą wydajność w porówna-
niu z pozostałymi typami całkowitoliczbowymi.
W wersjach Visual Basica sprzed wprowadzenia platformy .NET zmienne i stałe typu Integer
zajmowały tylko 16 bitów i — tym samym — mogły służyć do reprezentowania liczb całko-
witych z dużo mniejszego przedziału. W wersjach języka Visual Basic wchodzących w skład
rodziny języków platformy .NET dodatkowo mamy do dyspozycji typ danych Short, czyli
16-bitowy typ całkowitoliczbowy ze znakiem.
Typy danych
|
83
Stałe egzemplarze typu Integer można opcjonalnie oznaczać wielką literą I lub znakiem
procenta ( ) dołączanym na końcu wartości numerycznej:
Dim startingValue As Integer = 123I
Dim endingValue As Integer = 543
Znak procenta ( ) można stosować także do oznaczania deklarowanych zmiennych jako egzem-
plarzy typu Integer:
Dim startingValue = 123I
Typ danych Int64 (Long)
Podstawowe fakty
Podstawowy typ .NET: System.Int64
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 8 bajtów
Zakres wartości: Od –9 223 372 036 854 775 808 do 9 223 372 036 854 775 807
Long jest 64-bitowym typem danych całkowitoliczbowych ze znakiem. W wersjach Visual Basica
sprzed wprowadzenia platformy .NET zmienne i stałe typu Long zajmowały tylko 32 bity i tym
samym mogły służyć do reprezentowania liczb całkowitych z dużo mniejszego przedziału.
W wersjach języka Visual Basic wchodzących w skład rodziny języków platformy .NET mamy
do dyspozycji typ danych Integer, czyli 32-bitowy typ całkowitoliczbowy ze znakiem.
Stałe egzemplarze typu Long należy oznaczać wielką literą L lub znakiem dołączanym na
końcu wartości numerycznej:
Dim startingValue As Long = 123L
Dim endingValue As Long = 543
Znak można stosować także do oznaczania deklarowanych zmiennych jako egzemplarzy typu
Long:
Dim startingValue = 123L
Stosując znak do oznaczania stałych typu Long, w żadnym razie nie należy pozostawiać
spacji pomiędzy wartością całkowitoliczbową a tym znakiem, ponieważ znak dodatkowo
pełni w Visual Basicu funkcję operatora konkatenacji łańcuchów.
Typ danych Object
Podstawowe fakty
Podstawowy typ .NET: System.Object
Implementacja: Typ referencyjny (klasa)
Ilość zajmowanej pamięci: 4 bajty
Zakres wartości: Zmienna typu Object może reprezentować dowolny typ
Object jest uniwersalnym typem danych, co oznacza, że zmienna typu Object może się odwo-
ływać do danych (wskazywać na dane) dowolnego innego typu danych. Przykładowo, egzem-
plarz klasy Object może wskazywać na wartość typu Long, wartość typu String lub egzem-
plarz dowolnej innej klasy.
Dim amazingVariable As Object
amazingVariable = 123L
amazingVariable = Czyż to nie wspaniałe?
amazingVariable = New MyCustomClass
84
|
Rozdział 4. Zmienne i typy danych
Warto pamiętać, że ze stosowaniem zmiennych typu Object wiążą się pewne koszty w wy-
miarze wydajności oprogramowania. Visual Basic nie może związać właściwych składowych
reprezentujących dane ze zmienną typu Object w czasie kompilacji, co oznacza, że odpo-
wiednie łączenie musi nastąpić w czasie wykonywania programu — to z kolei powoduje, że
przetwarzanie metod związanych z tym obiektem wymaga większej ilości kodu. Opisywana
technika bywa nazywana późnym wiązaniem (ang. late binding). Deklarowanie obiektów z wła-
ściwymi (konkretnymi) typami danych skutkuje wczesnym wiązaniem (ang. early binding),
ponieważ za zarządzanie związkami wszystkich składowych odpowiada kompilator. Przy-
kładowo, poniższy fragment kodu:
Dim lateBound As Object
. . .
lateBound = New MyCustomClass
lateBound.SomeMethod( )
wymusi na aplikacji dopasowanie zmiennej lateBound do składowej SomeMethod klasy MyCu-
stomClass w czasie wykonywania. Przedstawione rozwiązanie jest więc dużo mniej wydajne
od mechanizmu zastosowanego poniżej:
Dim earlyBound As MyCustomClass
. . .
earlyBound = New MyCustomClass
earlyBound.SomeMethod( )
W wersjach języka Visual Basic sprzed wprowadzenia technologii .NET programista miał do
dyspozycji funkcję VarType, która identyfikowała konkretny podtyp wartości typu Variant.
Okazuje się, że funkcja VarType istnieje także w kolejnych wersjach Visual Basica .NET i służy
do identyfikacji faktycznych typów zmiennych lub wartości. Klasa System.Object (i klasy
potomne, czyli wszystkie klasy w technologii .NET) dodatkowo udostępnia metodę GetType,
która zwraca informację o prawdziwym typie danego obiektu. Chociaż wymienione rozwią-
zania można stosować dla dowolnych typów danych, ich przydatność jest szczególnie widoczna
właśnie w przypadku obiektów typu Object.
Typ danych SByte
Podstawowe fakty
Podstawowy typ .NET: System.SByte
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 1 bajt
Zakres wartości: Od —128 do 127
Nowość w wersji 2005. SByte jest najmniejszym typem danych całkowitoliczbowych ze zna-
kiem obsługiwanym przez Visual Basica. Typ SByte jest więc odpowiednikiem opisanego wcze-
śniej typu danych Byte (bez znaku) obejmującym znak.
SByte jest jednym z czterech typów danych dodanych do języka programowania Visual Basic
w wydaniu z roku 2005, które nie są wymienione w minimalnej specyfikacji wspólnego języka
(CLS). W związku z tym, komponenty i aplikacje zbudowane według zaleceń tego minimal-
nego standardu mogą nie być kompatybilne z aplikacjami wykorzystującymi ten typ danych.
Typy danych
|
85
Typ danych Int16 (Short)
Podstawowe fakty
Podstawowy typ .NET: System.Int16
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 2 bajty
Zakres wartości: Od —32768 do 32767
Short jest 16-bitowym typem danych całkowitoliczbowych ze znakiem. W wersjach języka
Visual Basic sprzed wprowadzenia technologii .NET funkcję 16-bitowego typu całkowitolicz-
bowego ze znakiem pełnił inny typ danych, Integer; typ danych Short w ogóle nie wystę-
pował w tamtych wydaniach Visual Basica.
Stałe egzemplarze typu Short należy oznaczać wielką literą S dołączaną na końcu wartości
numerycznej:
Dim startingValue As Short = 123S
Typ danych Single
Podstawowe fakty
Podstawowy typ .NET: System.Single
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 4 bajty
Zakres wartości: Od –3.402823E+38 do –1.401298E–45 w przypadku liczb ujemnych; od
1.401298E–45 do 3.402823E+38 w przypadku liczb dodatnich
Wartości typu Single są zgodne ze standardem IEEE dla 32-bitowych (4-bajtowych) liczb
zmiennoprzecinkowych pojedynczej precyzji ze znakiem. Mimo stosunkowo dużego prze-
działu obsługiwanych wartości, stosując typ danych Single, musimy się liczyć z utratą precyzji
w pewnych obliczeniach matematycznych.
Stałe egzemplarze typu danych Single należy oznaczać wielką literą F lub znakiem wykrzyk-
nika (!) dołączanym bezpośrednio po wartościach numerycznych:
Dim startingValue As Single = 123.45F
Dim endingValue As Single = 543.21!
Znak wykrzyknika (!) można stosować także do oznaczania deklarowanych zmiennych jako
egzemplarzy typu Single:
Dim startingValue! = 123.45F
Typ danych String
Podstawowe fakty
Podstawowy typ .NET: System.String
Implementacja: Typ referencyjny (klasa)
Ilość zajmowanej pamięci: 10 + (2 * długość_łańcucha) bajtów
Zakres wartości: Od zera do około dwóch miliardów znaków Unicode
Typ danych String umożliwia reprezentowanie łańcuchów znakowych zmiennej długości
złożonych maksymalnie z około dwóch miliardów znaków.
86
|
Rozdział 4. Zmienne i typy danych
Wszystkie łańcuchy w technologii .NET są niezmienne (ang. immutable). Oznacza to, że warto-
ści raz przypisanej zmiennej łańcuchowej nie można zmieniać. Kiedy modyfikujemy zawartość
łańcucha, typ danych String zwraca nowy egzemplarz uwzględniający wprowadzone zmiany.
Zmienna String zawierająca pojedynczy znak nie jest tożsama ze zmienną typu Char zawie-
rającą ten sam pojedynczy znak. Ponieważ są to dwa zupełnie różne typy, ewentualne prze-
noszenie danych pomiędzy zmiennymi tych typów wymaga stosownej konwersji (jeśli włą-
czono opcję Option Strict).
Typ danych UInt32 (UInteger)
Podstawowe fakty
Podstawowy typ .NET: System.Int32
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 4 bajty
Zakres wartości: Od 0 do 4 294 967 295 (bez znaku)
Nowość w wersji 2005. UInteger jest 32-bitowym typem danych całkowitoliczbowych bez
znaku. Typ UInteger jest więc odpowiednikiem bez znaku opisanego wcześniej typu danych
Integer (ze znakiem).
UInteger jest jednym z czterech typów danych dodanych do języka programowania Visual
Basic w wydaniu z roku 2005, które nie są wymienione w minimalnej specyfikacji wspólnego
języka (CLS). W związku z tym, komponenty i aplikacje zbudowane według zaleceń tego
minimalnego standardu mogą nie być kompatybilne z aplikacjami wykorzystującymi ten typ
danych.
Typ danych UInt64 (ULong)
Podstawowe fakty
Podstawowy typ .NET: System.Int64
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 8 bajtów
Zakres wartości: Od 0 do 18 446 744 073 709 551 615 (bez znaku)
Nowość w wersji 2005. ULong jest 64-bitowym typem danych całkowitoliczbowych bez zna-
ku. Typ ULong jest więc odpowiednikiem bez znaku opisanego wcześniej typu danych Long
(ze znakiem).
ULong jest jednym z czterech typów danych dodanych do języka programowania Visual Basic
w wydaniu z roku 2005, które nie są wymienione w minimalnej specyfikacji wspólnego języka
(CLS). W związku z tym, komponenty i aplikacje zbudowane według zaleceń tego minimal-
nego standardu mogą nie być kompatybilne z aplikacjami wykorzystującymi ten typ danych.
Typ danych UInt16 (UShort)
Podstawowe fakty
Podstawowy typ .NET: System.Int64
Implementacja: Typ wartościowy (struktura)
Ilość zajmowanej pamięci: 2 bajty
Zakres wartości: Od 0 do 65535 (bez znaku)
Typy danych
|
87
Nowość w wersji 2005. UShort jest 16-bitowym typem danych całkowitoliczbowych bez znaku.
Typ UShort jest więc odpowiednikiem bez znaku opisanego wcześniej typu danych Short
(ze znakiem).
UShort jest jednym z czterech typów danych dodanych do języka programowania Visual Basic
w wydaniu z roku 2005, które nie są wymienione w minimalnej specyfikacji wspólnego języka
(CLS). W związku z tym, komponenty i aplikacje zbudowane według zaleceń tego minimal-
nego standardu mogą nie być kompatybilne z aplikacjami wykorzystującymi ten typ danych.
Typy danych definiowane przez użytkownika
Chociaż pojedyncze zmienne w zdecydowanej większości przypadków zaspokajają potrzeby
programistów, nierzadko bardziej efektywnym rozwiązaniem jest łączenie wielu podstawowych
wartości danych w ramach logicznych grup. Te niestandardowe typy danych (definiowane
przez użytkownika) rozszerzają zbiór podstawowych typów danych o nowe typy dostosowane
do potrzeb konkretnych programów.
Wersje języka Visual Basic sprzed wprowadzenia technologii .NET oferowały możliwość two-
rzenia typów danych definiowanych przez użytkownika za pośrednictwem wyrażenia Type.
Budowane w ten sposób struktury danych były zwykłymi grupami zmiennych pozbawio-
nymi jakiejkolwiek funkcjonalności (oczywiście poza możliwością ustawiania i odczytywania
wartości reprezentowanych w poszczególnych składowych). W wydaniach Visual Basica
wchodzących w skład platformy .NET Framework znacznie rozszerzono tego rodzaju mechani-
zmy, implementując możliwość definiowania kodu zarówno we wspomnianych strukturach
danych, jak i podstawowych elementach platformy .NET. Typy znane z Visual Basica 6 zastą-
piono konstrukcjami powszechnie stosowanymi w technologii .NET — strukturami (definio-
wanymi ze słowem kluczowym Structure).
Podstawową konstrukcją gromadzącą kod i dane w platformie .NET jest klasa. Klasy pod
wieloma względami przypominają struktury, ale są wolne od pewnych ograniczeń, które
dotyczą wyłącznie struktur. Bodaj najważniejszą różnicą dzielącą struktury od klas jest to, że
w przeciwieństwie do klas (które implementują typy referencyjne), struktury implementują
typy wartościowe (dziedziczące bezpośrednio po typie System.ValueType).
Aby zadeklarować strukturę, należy użyć wyrażenia Structure:
[Public|Private|Friend] Structure structureName
deklaracje składowych
End Structure
Składowymi struktury mogą być pola, właściwości, metody, zdarzenia dzielone, typy wylicze-
niowe oraz inne, zagnieżdżone struktury. Każda ze składowych musi zostać zadeklarowana
z jednym z trzech modyfikatorów dostępu: Public, Private lub Friend.
Najprostszym i najczęściej spotykanym zastosowaniem struktur jest grupowanie wzajemnie
powiązanych zmiennych (nazywanych polami). Przykładowo, w naszym programie możemy
korzystać z prostej struktury definiującej podstawowe informacje o jednej osobie:
Structure Person
Public Name As String
Public Address As String
Public City As String
Public State As String
Public Zip As String
Public Age As Short
End Structure
88
|
Rozdział 4. Zmienne i typy danych
Poniżej przedstawiono standardową deklarację definiującą zmienną typu Person:
Dim onePerson As Person
Dostęp do składowych struktury wymaga użycia standardowej składni „z kropką”, która jest
stosowana także w przypadku składowych klas:
onePerson.Name = Beethoven
Bardziej złożone struktury mogą zawierać zarówno proste pola składowe, jak i właściwości:
Public Structure NameAndState
----- Pola publiczne i prywatne.
Public Name As String
Private theState As String
Public Function ShowAll( ) As String
----- Metoda publiczna. Wyświetla wszystkie składowane wartości.
If (theState = ) And (Name = ) Then
Return No Name from Nowhere
ElseIf (theState = ) Then
Return Name from Nowhere
ElseIf (Name = ) Then
Return No Name from theState
Else
Return Name from theState
End If
End Function
Public Property State( ) As String
----- Właściwość publiczna. Ogranicza zbiór wartości reprezentujących stany.
Get
Return theState
End Get
Set(ByVal value As String)
If (Len(value) = 2) Then
theState = UCase(value)
Else
Throw New System.ArgumentException( _
Stan musi być reprezentowany przez dwa znaki. , State )
End If
End Set
End Property
End Structure
Egzemplarze tej struktury mogą być od tej pory tworzone i wykorzystywane dokładnie tak
jak egzemplarze klas:
Dim onePerson As New NameAndState
onePerson.Name = Donna
onePerson.State = CA
MsgBox(onePerson.ShowAll())
Struktury mogą być przekazywane na wejściu funkcji w formie argumentów lub wykorzysty-
wane w roli typów zwracanych przez funkcje. Chociaż struktury pod wieloma względami przy-
pominają klasy, nie obsługują szeregu rozwiązań znanych z klas:
• Struktury nie mogą ani dziedziczyć po innych strukturach, ani same nie mogą być dzie-
dziczone.
• Wszystkie konstruktory struktur muszą pobierać parametry wejściowe.
• Struktury nie mogą definiować destruktorów (metoda Finalize i tak nigdy nie jest wy-
woływana).
Typy danych
|
89
• Deklaracje składowych nie mogą inicjalizować ich wartości, stosować konstrukcji skład-
niowej As New ani określać początkowego rozmiaru tablic.
Szczegółowe omówienie terminologii programowania można znaleźć w rozdziale 3.
Konwersja typów danych
Proces konwersji wartości jednego typu na wartość innego typu nazywamy rzutowaniem (ang.
casting) lub po prostu konwersją. Techniki konwersji mogą być stosowane dla wartości sta-
łych, zmiennych lub wyrażeń określonego typu. Język programowania Visual Basic oferuje
szereg funkcji konwertujących, które rzutują wartości jednego typu danych do postaci ich odpo-
wiedników innego typu danych:
Dim miniSize As Byte = 6
Dim superSize As Long
superSize = CLng(miniSize) Konwertuje wartość zmiennej typu Byte na wartość typu Long.
superSize = CLng( 12 ) Konwertuje stałą typu String na wartość typu Long.
Rzutowania mogą mieć charakter działań rozszerzających lub zawężających. Rzutowanie
rozszerzające (ang. widening cast) ma miejsce wtedy, gdy docelowy typ danych może z powo-
dzeniem reprezentować wszystkie możliwe wartości typu źródłowego (z taką sytuacją mamy
do czynienia np. wtedy, gdy konwertujemy wartość typu Short na wartość typu Integer lub
wartość typu Integer na wartość typu Double). Rzutowanie rozszerzające nigdy nie powoduje
utraty danych. Rzutowanie zawężające (ang. narrowing cast) polega na konwersji oryginal-
nego typu danych na typ, który nie może reprezentować wszystkich możliwych danych typu
źródłowego. Rzutowanie zawężające może prowadzić do utraty części danych lub wręcz błędu
konwersji.
Konwersje typów w Visual Basicu mogą być realizowane na dwa sposoby: jawnie (wprost) lub
w ukryciu. Konwersja niejawna (ang. implicit conversion) jest realizowana przez kompilator,
jeśli okoliczności na to pozwalają (i jeśli samo rzutowanie jest prawidłowe). Przykładowo, jeśli
umieścimy w naszej aplikacji następującą sekwencję wyrażeń:
Dim smallerData As Integer = 3948
Dim largerData As Long
largerData = smallerData
wartość zmiennej smallerData automatycznie zostanie rzutowana do większego typu danych
Long (wykorzystywanego przez zmienną largerData). Ten rodzaj konwersji niejawnej po
części jest uzależniony od ustawienia wyrażenia Option Strict. Wyrażenie Option Strict
powinno się znajdować na samym początku pliku z kodem źródłowym (przed właściwym
kodem klasy):
Option Strict {On | Off}
Jeśli opcja Option Strict jest włączona (On), kompilator będzie automatycznie wykonywał
tylko rzutowania rozszerzające, co oznacza, że takie rzutowania zawężające jak:
Dim smallerData As Integer
Dim largerData As Long = 3948
smallerData = largerData
spowodują wygenerowanie błędów kompilacji (nawet jeśli faktycznie konwertowane dane mogą
być bez trudu reprezentowane przez typy zmiennych docelowych). Oznacza to, że należy zasto-
sować konwersję jawną (ang. explicit conversion):
smallerData = CInt(largerData)
90
|
Rozdział 4. Zmienne i typy danych
Ustawiając wartość Off w opcji Option Strict, zezwalamy na stosowanie techniki konwersji
niejawnej nawet wtedy, gdy może to prowadzić do występowania błędów w czasie wykony-
wania programu.
Oprócz wspomnianej opcji Option Strict, Visual Basic oferuje też wyrażenie Option Explicit,
które również powinno być stosowane na początku plików z kodem źródłowym:
Option Explicit {On | Off}
Kiedy opcja Option Explicit jest włączona (On), wszystkie zmienne muszą być deklarowane
(za pomocą słowa kluczowego Dim lub innego, podobnego) przed użyciem. Kiedy opcja Option
Explicit jest wyłączona (Off), kompilator Visual Basica automatycznie doda (w czasie kompila-
cji) niezbędne deklaracje dla wszystkich nazw napotkanych zmiennych, które nie zostały
wcześniej zadeklarowane. (Nowe wyrażenia Dim nie zostaną umieszczone w naszym kodzie
źródłowym — niezbędne deklaracje zostaną dodane „po cichu” w czasie kompilacji). Wyłą-
czenie tej opcji może prowadzić do występowania w programie trudnych do zlokalizowania
błędów. Więcej informacji na ten temat można znaleźć w podrozdziale „Wyrażenie Option
Explicit” w rozdziale 12. Wartości domyślne obu opcji (Option Strict oraz Option Expli-
cit) można ustawić we właściwościach projektu.
Język Visual Basic zawiera funkcje konwertujące dla wszystkich podstawowych typów danych.
Funkcja CBool
Konwertuje dowolny prawidłowy łańcuch lub wyrażenie numeryczne na wartość typu
Boolean. Kiedy wartość numeryczna jest konwertowana na wartość typu Boolean, wszyst-
kie liczby różne od zera są zamieniane na True i tylko zero jest zamieniane na False.
Funkcja CByte
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Byte) na wartość typu Byte, zaokrąglając ewentualną część
ułamkową.
Funkcja CChar
Konwertuje pierwszy znak łańcucha na wartość typu danych Char.
Funkcja CDate
Konwertuje dowolną prawidłową reprezentację daty lub godziny na egzemplarz typu Date.
Funkcja CDbl
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Double) na wartość typu Double.
Funkcja CDec
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Decimal) na wartość typu Decimal.
Funkcja CInt
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Integer) na wartość typu Integer, zaokrąglając ewentualną
część ułamkową.
Funkcja CLng
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Long) na wartość typu Long, zaokrąglając ewentualną część
ułamkową.
Typy danych
|
91
Funkcja CObj
Konwertuje dowolne wyrażenie na egzemplarz typu Object. Takie rozwiązanie jest uza-
sadnione w sytuacji, gdy chcemy, aby typ wartościowy był traktowany jak typ referen-
cyjny.
Funkcja CSByte
Nowość w wersji 2005. Konwertuje dowolne wyrażenie numeryczne (którego wartość nale-
ży do przedziału obsługiwanego przez typ danych SByte) na wartość typu SByte, zaokrą-
glając ewentualną część ułamkową.
Funkcja CShort
Konwertuje dowolne wyrażenie numeryczne (którego wartość należy do przedziału obsłu-
giwanego przez typ danych Short) na wartość typu Short, zaokrąglając ewentualną część
ułamkową.
Funkcja CSng
Konwertuje dowolne wyrażenie numeryczne (któ
Pobierz darmowy fragment (pdf)