Visual Basic .NET

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש
Visual Basic .NET
VBNet2005.png
צילום מסך של VB Net 2005 בגרסה 8.0 (2005) כחלק מחבילת הסטודיו
מפתח מיקרוסופט
גרסה אחרונה 10.0, ב־אוגוסט 2010
מערכת הפעלה חלונות
רישיון קנייני
קטגוריה סביבת פיתוח
דף בית http://msdn.microsoft.com/vstudio/

Visual Basic .NET היא גרסה של שפת התכנות ויז'ואל בייסיק, ששוכתבה מהיסוד ועברה מקצה שיפורים גדול, כדי שתתאים לסביבת ה.NET של חברת Microsoft. גרסה זו הוכרזה לראשונה בפברואר 2002. אף שהיא ממשיכתה של VB6 הוויזואלית, ניתן לראות שהיא עברה מהפכה של ממש וששולבו בה אלמנטים רבים משפות אחרות כדי להתאימה לסביבה הטכנולוגית החדשה, ולהעצים את מעמדה בעולם התכנותי.

כמו כל יישומי הדוט נט, ניתן להשתמש בשפה זו למגוון רחב של מכשירים, החל מטלפונים ניידים (סמארטפון) ומחשבי כף יד (פוקטפיסי), דרך סביבת הדסקטופ, וכלה בסביבת האינטרנט. בערך זה נסקרת בעיקר יכולת הפיתוח בשפה בסביבת חלונות -WinForms. ניתן להשתמש בשפה גם עבור פיתוח ASP.NET לאתרי אינטרנט וכן ל-Console - מסך שחור הדומה לסביבת DOS.

תוכן עניינים

מהות השפה [עריכה]

מחולל תפריטים ב-VB 2005. ניתן לראות שהתכנות הוויזואלי, הגרפיקה, הגמישות והמורכבות של התפריטים חוזקה בגרסה זו באמצעות תפריטי הStrip.
עבודה עם בסיסי נתונים. ניתן לסייר בבסיסי נתונים, ליצור להם ייצוגים ויזואליים שונים, ליצור שאילתות ולהריץ אותם, ואף ליצור טופסי קלט ודוחות, באמצעות תכנות ויזואלי המשולב בתכנות רגיל, ותוך שימוש מינימלי בקוד.

שפת Visual Basic .NET היא שפה מרובת פרדיגמות, מכיוון שבנוסף להיותה שפה מונחת עצמים, היא גם שפה פרוצדורלית, ומשולבים בה הנחיית אירועים ותכנות פונקציונלי. בשונה מ-C#‎ ובדומה לשפת C++‎ שפה זו היא שפה היברידית שמשלבת בין תכנות מונחה עצמים למודולים פרוצדורליים, כך שניתן לכתוב משתנים ופונקציות גלובליות במודולים שאינן מחלקות.

בגרסה זו הושלמה יכולת תכנות מונחה עצמים במלואה, עם אפשרות של ירושה, העמסת פרמטרים, העמסת אופרטורים (Operator), פונקציות המרה, דריסת פונקציות/מאפיינים/אירועים (Overloads) והצללתן (Overrides או Shadows), יצירת ממשקים (Interface) וחשיפתם (Implements), הגדרת מאפייני רכיבי תכנות (Attribute), רפלקציה (Reflection) ועוד.

כמו כן, הוספה יכולת לשפה לטפל בהיבטים תכנותיים שונים כמו יצירת תהליכי-משנה (Threading), שימוש במצביעים לפונקציות ושגרות (Delegate), סימון קטעים קריטיים (Critical section), עבודה עם תבניות גנריות (Generic), אריזת קטעי קוד במרחב שמות (Namespace), חלוקת קטעי קוד (Region) ועוד.

אף שתפיסת הפיתוח של VB נשמרה, והשימוש בתכנות ויזואלי נשמר ואף הועצם, תחביר השפה שונה ונעשה יישור קו לכיוון תחביר מקובל בשפות העיליות החזקות, כדי להגדיל את התאימות לתפיסות המקובלות, ובכדי להעצים את השפה. נוספו אובייקטים וספריות רבות שמקלות על עבודת התכנות בהיבטים רבים ומגוונים. החל משפה זו קובצי ההרצה (RUN TIME) של התוכנה (ה-Framework) הם קבצים משותפים לכל שפות הדוט נט, ואינם ייחודיים לשפת VB כפי שהיה עד גרסה 6, ולכן אף שמדובר בקובץ ריצה גדול יותר פי כמה וכמה, סביר להניח שהוא כבר יהיה מותקן, בשל התפוצה הגדולה של יישומי הדוט נט.

עם כל יציאה של מהדורה נוספת של הדוט נט, שפת ה-VB.NET שהחלה מנקודת מוצא שונה משפת #C, ויועדה לתחומי פיתוח אחרים כמו ממשקים ובסיסי נתונים, החלה להתכנס מבחינת יכולותיה ויעודה ליכולותיה של שפת #C (כאשר ב-#C משולבת הידידותיות של VB), ולמעשה האסטרטגיה של מיקרוסופט, היא להפוך שתי שפות אלו לסוג של תאומות לא זהות, במה שקרוי על ידי מנהלי הפיתוח קו-אבולוציה[1].

מאפייני השפה [עריכה]

כמו ב-VB השפה הינה מונחת אירועים. והתמיכה באירועים אף חוזקה בה. השפה הינה שפה סלחנית בעלת המרה אוטומטית. ניתן לבצע השמה ממשתנה מחרוזתי למשתנה מספרי כאשר הדבר אפשרי (משתנה המחרוזת מכיל ערך מספרי). בשעת דיבגינג ניתן לשנות קוד תוך כדי ריצה (edit and continue). ישנה השלמה אוטומטית של פקודות וביטויים לאחר שהם מתחילים להיכתב. טקסט הקוד מאורגן אוטומטית: קיימת אינדנטציה אוטומטית של הקוד לפי תוכנו ומחיקה אוטומטית של רווחים.

גרסאות [עריכה]

גרסה 2002 [עריכה]

השפה החדשה מתבססת על סביבת NET Framework. של מיקרוסופט, שהוסיפה יכולות נרחבות שכלל לא היו קיימות בגרסאות קודמות, ככתיבת ישומי ושירותי רשת וטופסי Web, וחיזוק העבודה עם בסיסי נתונים באמצעות טכנולוגיות ה-ADO.NET והASP.NET, אפשרות פיתוח לפלטפורמות שונות, כמו גם הוספת פקדים מגוונים שמאפשרים פעילויות רבות, כמו גישה קלה יותר לשירותי מערכת בתחום חיפוש הקבצים וההדפסה, כמו PrintDocument להדפסה, PrintPreviewControl לתצוגה מקדימה להדפסה, NotifyIcon - לתצוגת אייקון במגש מערכת, Splitter, RichTextBox, FileSystemWatcher.

התוכנה הפכה להיות רב פלטפורמית, ואפשר לפתח בה ישומים להתקנים ניידים, למחשב האישי וישומי אינטרנט. הוספה לה יכולת תקשורת עם שפות תכנות אחרות הכלולות בדוט נט, באופן שמאפשר התייחסות לקטעי קוד משפה לשפה (ניתן בפתרון אחד לשלב שני פרויקטים בשפות שונות), ללא צורך של כתיבה מחדש. התחביר הדומה לשפת C# גם מאפשר, לתרגם בקלות קטעי קוד משפה לשפה, תוך השגת פונקציונאליות דומה.

שינוי התחביר של ה-VB הפך את התכנות בה ליותר גמיש, אך גם יותר מסובך, וחייב המרה של הגרסאות הקודמות, דבר שעורר תרעומת אצל חלק ממתכנתי ה-VB, שהעדיפו להישאר עם הגרסה הקודמת, עם זאת השינויים הרבים שהיא עברה, הפכו אותה למעשה משפת נישה שמיועדת לממשקים ובסיסי נתונים, למעמד של שפה מובילה בפלטפורמת NET Framework.

גרסה 2003 [עריכה]

גרסה זו יצאה עם גרסת 1.1 NET Framework. בין היכולות הוספה תמיכה בגרסה קומפקטית של הדוט נט פריימוורק שמיועדת להתקנים ניידים כמו מחשבי כף יד. שיפור באשף שדרוג מגרסאות קודמות. שיפור ניכר גם בביצועים ובמהימנות של סביבת הפיתוח המשולבת.

גרסה 2005 [עריכה]

בגרסה 2005 שיצאה עם גרסת 2 NET Framework, יש ניסיון לחזור למוסכמות תכנותיות של ה-VB6, כך למשל בטופס: חלון הקוד פושט וסולקו ממנו בבררת המחדל הגדרות מפורטות של הפקדים, הבנאי ועוד לחלון נפרד של עיצוב הטופס (Just My Code). הוסף האובייקט My, שמאפשר להתייחס בקלות לאובייקטים תכנותיים מגוונים לפי נושאים, חזרה השליטה על הגדרת תחומי מערך, והוסף תחביר להצגה מידית של טפסים, כפי שהיה נהוג בעבר. קיימת מחלקה לטיפול מובנה בפרמטרים של התוכנה, הנשמרים והנקראים מקובץ XML. הוספה אפשרות מובנת לרכז את כל המשאבים של הפרויקט במקום אחד, מה שמונע כפילות שהייתה קיימת עד כה. הוספו תגיות חכמות לפקדים, וניתן לקשור בין אירועי פקד לבין שגרות קיימות, מתוך רשימה קיימת באופן דומה למה שכבר יושם בעבר בתוכנת אקסס.

בגרסה זו הוספה לראשונה יכולת של העמסת אופרטורים והעמסת המרת סוג. הוגמש וחוזק השימוש במאפיינים ובאירועים. הוספו טיפוסי מספרים שלמים מסוג Unsigned, פקודת TryCast לבדיקת ביצוע המרה, פקודת Continue בלולאות, בלוק Using לשימוש מהיר באובייקט ושחרורו, הגדרה אגבית של מונה הלולאה בתחילת לולאות, תמיכה מובנת וחזותית בפרמטרים של הגדרות התוכנה באמצעות מחלקה ייעודית (Settings), הערות מתכנת במבנה XML להסבר הקוד, ותמיכה גנרית באוספי רשומות, למספר רב של טיפוסים כמו ,BitArray HashTable, Queue, StoredList ו-Stack. משמעות חלק מהשיפורים היא הגברת התאימות לשפת #C.

כמו כן, הוספו כחמישה עשר פקדים מובנים חדשים ביניהם SerialPort - לגישה ליציאה הטורית של המחשב, MaskedTextBox ליצירת תיבת טקסט עם מסכות, BackgroundWorker - לביצוע תהליכון ברקע, TableLayoutPanel - לסידור של פקדים במבנה, WebBrowser - לקריאה של קובצי HTML ושירותי דפדפן, ו-FolderBrowserDialog - לדפדוף בתיקיות דיסק. משפחת פקדי תפריטים חדשים (Strip) שמחליפים את פקדי התפריטים הישנים (Bar), ופקדי כריכה לנתונים של קובצי בסיסי נתונים, הכוללים תכנות ויזואלי שמאפשר בקלות לייצר טופסי נתונים באופנים שונים. פקדים אלו מהווים תוספת משמעותית להקלה על העבודה התכנותית בהרבה היבטים. גם הפקדים שכבר היו כלולים באופן כזה או אחר, בחבילת הפקדים השיתופיים של הוויז'ואל ביסיק בגרסה 6, עברו מקצה שיפורים.

כמו בגרסאות הקודמות, ניתן לייצר קובץ התקנה והפצה כפרויקט בתוך פתרון. בגרסה זו הוספה יכולת להורדה של סביבת הדוט.נט מאתר מיקרוסופט, במקרה שהיא עדיין איננה קיימת במחשב.

בשפה זו כמו בכל חבילת השפות של הדוט.נט הוספה גרסת חינם לחובבים וסטודנטים, בשם Visual Basic 2005 Express. לגרסה זו שכוללת סביבת פיתוח חלקית, חסרים כמה וכמה היבטים המצויים בגרסה המלאה ובהם הידור ל-64 ביט ולהתקנים ניידים, ניוון מנגנון ההפצה, היעדר אפשרות להוסיף הרחבות ועוד.

גרסה 2008 [עריכה]

גרסה זו גם מכונה Visual Basic .NET 9.0 יצאה ביחד עם NET Framework 3.5. חידושים בגרסה זו: הוספה שפת LINQ שהיא הרחבה של שפת SQL לאובייקטים, מסדי נתונים ושפת XML, ופישוט התכנות של מבנים ועבודה עם רשומות בעקבות הכנסת חידוש זה. בעקבות זאת פקודות SQL הפכו לחלק מהתחביר של VB.NET. בגרסה זו נוסף פרויקט מסוג WPF שיועד על ידי מיקרוסופט להיות מערכת הדור הבא לישומי לקוח. בפרויקט זה הופרד עיצוב הממשק מהקוד לשפה מבוססת XML, והושם דגש על הוויזואליות של הממשק, ועל שימוש קל בגרפיקה דו ממדית ותלת ממדית, אנימציה, מולטימדיה, טיפול במסמכי XPS ובדיו אלקטרוני ועוד. נוספה תמיכה במולטי טרגטינג שהיא האופציה לתחם את הפרויקט לגרסה מסוימת של .NET, ואף למקד את הפרויקט לגרסת מערכת הפעלה מסוימת. נוספו שיפורים לשפה כמו אפשרות להגדיר משתנים ריקים (שערכם Nothing), ולבצע קריאה לשגרת פקד קיימת ללא פרמטרים, תמיכה בתחשיב למדא, Type inference (זיהוי אוטומטי של סוג טיפוס ערך), Anonymous type -טיפוס אלמוני, שמייתר הגדרה מפורשת בתחשיב למדא, ו-Extension method - תכונה המאפשרת להרחיב יכולות של אובייקטים של המערכת ולהוסיף להם שיטות מותאמות של המתכנת. ה-IDE שופר בתחביר האינטלגנטי שמקפיץ חלונית צפה ובו המילים האפשריות לפי הקשר, וכן בסידור שורות המשך (בשימוש באופרטור _, קו תחתון). הדיבגר שוכלל באופן שמאפשר לעקוב אחרי תהליכונים, ולדלג לתוך קוד המקור של ספריות ה.NET עצמו. נוספה ארכיטקטורה חדשה של הרצת קוד מנוהל שמאפשר להריץ טוב יותר את הקוד. וכן, קוד מטריקס שמאפשר לאבחן את הסיבוכיות וקלות התחזוקה של הקוד המקור של המתכנת לפי מתודות.

גרסה 2010 [עריכה]

גרסה זו שמספרה הוא 10.0 יצאה באמצע אפריל 2010, ביחד עם NET Framework 4. בגרסה זו הורחבה התמיכה בפקודת Lambda. במקרים רבים בוטל הצורך בשימוש במקף החיבור (_) לפקודה שמשתרעת על פני מספר שורות. נוספה אפשרות ליישום אוטומטי (ומקוצר) של מאפיין מחלקה בשורה בודדת בדומה לקיים ב-C#. הוסף אתחול מקוצר של אובייקט אוסף, בדומה לאתחול של מערך. נוספו שיפור עבודה עם מערכים. תמיכה ב-Dynamic Language Runtime, כך שהשפה יכולה לתקשר ביתר קלות עם שפות דינמיות. שיפור בפרמטרים אופציונאלים. והוספת אפשרות להטמעת מעטפת Interop לרכיבי COM בקובץ ההרצה של היישום, במקום DLL עצמאי, כדי למנוע התנגשות בין גרסאות שונות. בטופס נוסף פקד chart - ליצירת גרפים. (לרשימת חידושים רשמית).

בין שפת VB.NET לשפת C# [עריכה]

שתי שפות אלו הן השפות המרכזיות של סביבת הדוט נט, והפונקציונליות התכנותית של שתי שפות אלו בסופו של דבר דומה, אף ששמקורותיהן התחביריים שונים. פונקציונליות זו אף מתכנסת מגרסה לגרסה, כך שקיימים ממירים אוטומטיים שממירים קוד משפה לשפה, ושאת קוד הביניים שנוצר (CIL) ניתן להנדס לאחור לכל אחד משפות אלו. התאימות ביניהן כה חזקה שמחלקה שנכתבה ב-C#‎, ניתן לרשת ב-VB.NET ואף לדרוס פונקציה שקיימת בה.

בעוד שבשפת VB.NET הושם דגש על קלות הפיתוח (השלמה אוטומטית של כתיבת פקודות, הזחה אוטומטית של הקוד, ניווט קל בין אירועי פקד), על האינטואיטיביות והקריאות של הקוד (פקודות מפורשות יותר), ושפה זו יותר סבלנית כלפי המפתח (למשל בהמרה אוטומטית בין טיפוסי משתנים ואף בין טיפוס מחרוזתי לטיפוס מספרי), ופעולות טכניות שונות הוסתרו מאחורי הקלעים, בשפת C#‎ הושם דגש על הדיוק הטכני של השפה, על ההקפדה התכנותית (למשל בהמרה בין סוגי משתנים), על גמישות תחבירית, ועל התאימות וההתממשקות לשפת C++‎ (אפשרות לכתוב קטעי קוד מעורבים של C#‎ ו-C++‎). עם זאת שפת C#‎ יותר פופולרית אצל מתכנתים, והיצע המשרות בה גדול באופן ניכר על פני המשרות בשפת VB.NET.

מבנה השפה [עריכה]

פקדים שיתופיים של השפה

מודול [עריכה]

מודול הוא המתחם הגלובלי של VB. באזור זה שמתחיל במילה השמורה - Module ומסתיים במילה השמורה - End Module ניתן לכתוב קטעי קוד שונים: הגדרות של טיפוסים ומבנים חדשים, הכרזות של משתנים, פונקציות ושגרות ובגרסת הדוט נט, אף מחלקות. כאשר ישנן פונקציות כלליות שאינן שייכות למחלקה מסוימת נהוג לכותבן באזורים אלו. כמו כן, כאשר ישנם משתנים ואף מחלקות שרוצים שיהיו גלובליים ונגישים לכל התוכנית, זהו המקום להכריז עליהם. ישנה שגרה מיוחדת בשם Main() שתיכתב במודול ראשי, שתפקידה הוא להתחיל את הרצת התוכנה כולה. אם כותבים אותה עם פרמטר מערך, אפשר לקבל פרמטרים בהרצת קובץ ה-EXE של התוכנה ולהתייחס אליהם בשגרה.

מחלקה [עריכה]

המחלקה או האובייקט הוא מושג מרכזי בשפה, והוא האזור השני שבו קוד יכול להתקיים. רבים מרכיבי ה-VB הינם מחלקות, וביניהם אפשר למנות את הטפסים, הפקדים ופקדי המשתמש. למעשה אף המשתנים הרגילים הינם טיפוסי אובייקטים.

כל מחלקה צריכה להתחיל במילה השמורה - Class ולהסתיים ב- End Class. למחלקה יכולים להיות שגרה בונה New()‎ ושגרה הורסת Finalize()‎, כדי שיהיה אפשר לשלוט על הקוד ביצירתו של האובייקט ובסגירתו. לכל מחלקה אפשר להגדיר חמש רמות שונות של חשיפה, בין פומבי (Public) לבין פרטי (Private).

כל מחלקה יכולה להכיל, טיפוסים, קבועים, משתנים, שיטות, תכונות ואירועים.

כל מחלקה יכולה להוריש את תכונותיה למחלקת בן (באמצעות המילה השמורה Inherits). ההתייחסות יכולה להיות אם למחלקה הנוכחית (באמצעות המילה Me), ואם למחלקת הבסיס (באמצעות המילה MyBase). אפשר לבצע דריסה של שגרה או פונקציה במחלקה היורשת (המוגדרת כ-Overrides) על גבי שגרה/פונקציה של מחלקת הבסיס (המוגדרת כ-Overridable), ב-VB אפשר גם ליצור מחלקה אבסטרקטית שהיא מחלקת בסיס שנועדת לירושה בלבד ולא ליצירת מופע ממשי (MustInherits). במחלקה כזאת ניתן לכפות יצירה של שגרות ומאפיינים במחלקות היורשות (MustOverride). מאידך ניתן גם ליצור מחלקה שאיננה נרשת, אלא משמשת רק למופע. (NotInheritable).

ניתן לפצל מחלקה אחת למספר קבצים, כך שכל קובץ יכיל חלק מהמחלקה (Partial).

לשפה יש יכולת להעמסת פונקציות/שגרות. העמסה (OverLoding) היא היכולת להעמיס באותה מחלקה כמה שגרות/פונקציות באותו שם. הדבר יעיל במיוחד כאשר ישנם מספר אופנים של טיפול לדבר מסוים. כך ניתן לרכז מספר רב של פעולות דומות תחת קורת גג אחת. ההבדל בין השגרות/פונקציות יהיה בפרמטרים שלהם: במספרם, בטיפוסם ובסידורם, שחייב להיות שונה, שאילולי כן התוכנית לא תדע לאיזו פונקציה/שגרה להתייחס בזמן הקריאה. (החל מגרסת 2005 נוספה גם אפשרות להעמסת אופרטורים במחלקות).

ב-VB אפשר ליצור מחלקות מקוננות (מחלקה שמכילה מחלקה נוספת), אבל לא פונקציות מקוננות.

Imports Namespace.Class
Public Class ClassName
         Inherits ClassBase
 'משתנים כלליים
 Dim|Private|Public Variable1 As Type, Variable2 As Type
 'שגרה
 
 Private|Public Sub SubName(ByVal|ByRef ParametName As Type) Handles Object.Event
   Dim LocalVariable As Type
   ...
 End Sub
 
 Private|public Function FunctionName(ByVal|ByRef ParametName As Type) As Type
   Dim LocalVariable As Type
   return LocalVariable
 End Function
 
End Class

כדי ליצור מופע חדש של אובייקט, יש להגדיר אותו (New). ניתן לחשוף חברים במחלקה שיוכלו להיות חשופים החוצה ללא יצירת מופע חדש של המחלקה (באמצעות הקדמת המילה Shared למתודה או המאפיין). בשיטה זו ניתן ליצור פונקציות גלובליות ללא שימוש במודולים של VB.

מאפיינים [עריכה]

לכל מחלקה יכולות להיות מאפיינים (Property). המאפיין מהווה חלק מיישום הכמיסות של המחלקה. לחסום אפשרות של עדכון ישיר של משתני מחלקה מבחוץ, ללא בקרה של המחלקה. באמצעות המאפיינים מאפשרים למשתמש במחלקה לעדכן או לקבל מידע ממנה, ועם זאת לבקר את פעולותיו, ולמנוע ממנו גישה חופשית לגמרי, שעלולה לפגום בנתונים ובזאת הופכים את המאפיין ל"משתנה חכם".

המאפיין שיוגדר כפומבי מהווה למעשה פילטר וחוצץ, בין המשתנה הפרטי ש"מוטמן" בעמקי המחלקה לבין המשתמש של המחלקה. באמצעות המאפיינים ניתן גם לחסום את הקריאה (מאפיין לכתיבה בלבד) או את הכתיבה (מאפיין לקריאה בלבד) למאפיין, כאשר פשוט פקודת Get או פקודת Set מושמטת בהגדרתו, והמאפיין מוכרז לקריאה/כתיבה בלבד. המאפיין הופך למעשה את המשתנה הפאסיבי, למשתנה אקטיבי שיש לו יכולת בקרה, שליטה ומניפולציה על התוכן שמושם בו או נלקח ממנו.

ב-VB פקודות Get ו-Set של מאפיינים היו נפרדים, מה שעשה את התוכנה לפחות קריאה. ב-VB.NET פקודות ההשמה ('Set) והקבלה (Get) מרוכזות במאפיין אחד.

Private LocalVariable As VariableType
 
Public Property MyProperty() As VariableType
   Get
      Return LocalVariable
   End Get
   Set(ByVal value As VariableType)
      LocalVariable = value
   End Set
End Property

בדוגמה לעיל ללקוח שישתמש באובייקט, יהיה קיים מאפיין בשם MyProperty, שבאמצעותו הוא יהיה נגיש למשתנה LocalVariable של המחלקה, לפקודות של השמה ושל קבלה. בדוגמה לא נעשה שימוש בבקרה או במניפולציה על המאפיין, אבל בהחלט ניתן ומומלץ לעשות כן. יש לשים לב שסוג הפרמטר של התכונה ושל ה-SET שלה, חייבים להיות זהים.

כמו כן ניתן ליישם ב-VB.NET מאפיינים עם פרמטרים, בדומה לפונקציה. הדבר יכול להיות שימושי בהתייחסות למערכים, במטרה לבצע שליפה של איבר במערך או השמה אליו. בדוגמה מאפיין בשם Bytes שמחזיר/משים איבר מסוים במערך של בתים.

    Private _Bytes() As Byte
 
    Public Property Bytes(ByVal index As Integer) As Byte
        Get
            Return _Bytes(index)
        End Get
        Set(ByVal value As Byte)
            _Bytes(index) = value
        End Set
    End Property

אירועים [עריכה]

שפת ה-VB היא ביסודה גם שפה מונחת אירועים. זאת אומרת שלכל אובייקט, יש אירועים מובנים שונים שמתבצעים בתנאים שונים. האירועים הנפוצים ביותר קשורים לפעולת המשתמש כמו אירועי מקלדת ועכבר, אך יכולים להיות אירועי נוספים כמו אירועים הקשורים לפעילות התוכנה, כמו בעת פתיחת וסגירת טופס, או אירועי שעון מערכת. ב-VB.NET הורחבו האירועים של האובייקטים השונים למקרים רבים, כך שהם מכסים טווח נרחב יותר של אופציות, ומגבירים בכך את הגמישות התכנותית.

ב-VB6 הקשר בין אובייקט לאירוע חד-חד ערכי, לעומת זאת ב-VB.NET הקשר בין אובייקט לאירוע הינו רב ערכי, כך שאירוע יכול להיות מוזנק על ידי מספר רב של אובייקטים אף מטיפוסים שונים (באמצעות הידית (Handles) שבסיומה של השגרה, ולצורך כך אף הוסף פרמטר בשם Sender בשגרות אירוע שבאמצעותו ניתן לזהות את האובייקט שמזניק את האירוע). כמו כן, אובייקט יכול להזניק מספר רב של אירועים בו זמנית באירוע בודד.

בדוגמה, ארבעה כפתורים שמזניקים את אותו אירוע, והתוצאה הודעה למסך עם שמו של הכפתור המזניק.

  Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
     Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
        MessageBox.Show("Name: " & sender.Name)
  End Sub

למעשה אפשר להגדיר אירוע ולהזניקו בכל הליך תכנותי. הדבר חיוני בתכנות מונחה עצמים, לתקשר עם החוץ, ולהוציא הודעות בסיטואציות מסוימות אל מחוץ למחלקה. כדי ליצור אירוע יש:

1. להכריז עליו והפרמטרים שהוא שולח באזור כללי באמצעות המילה Event, בדומה להגדרה של משתנה (שיש לו פרמטרים).
2. ולהזניקו מתוך שגרה באמצעות המילה השמורה RaiseEvent תוך השמת ערכים לטיפוסי הפרמטרים שהוכרזו.

כדי ללכוד אירוע יש:

1. יש להצהיר במקום שבו מגדירים מופע של המחלקה שהאזור מהווה מקום ללכידת אירועי המחלקה, באמצעות הכרזת האובייקט עם המילה השמורה WithEvent.
2. ולאחר מכן כדי ללכוד את האירוע, יש ליצור ידית (Handle) לאירוע בסופה של שגרה בעלת חתימת פרמטרים זהה לאירוע, ובכך לקשור בין האירוע לשגרה.

מבנה - Structure [עריכה]

מבנה (יורשו של ה-Type מה-VB6) בעוד שב-VB6 יכל רק לאגד בתוכו משתנים תחת מרחב שם משותף, בדוט נט בהשראת שפת C++ הוא הורחב מאוד, והפך לסוג של טיפוס שיכול להכיל בתוכו משתנים, מתודות, מאפיינים ואף אירועים ושגרת בנאי. ולמעשה מתנהג כמו מחלקה שיכולותיה הוגבלו מעט וברירות המחדל שלה שונו. אמנם עיקר השימוש שבו נותר ליצור טיפוס משתמש, שמאגד משתנים מסוגים שונים שיש להם עניין משותף.

Private Structure BookType
    Dim Title As String
    Dim URL As String
    Dim Page As integer
End Structure

כאשר מגדירים משתנה מטיפוס זה (עם פקודת New) ניתן לאתחל אותו בהגדרה, כפי שניתן לעשות במחלקה.

Private BookData As New BookType() With {.Title = "The Catcher in the Rye", .Page = 10}

אחד השימושים הנפוצים הוא להגדיר מערך או ליסט של structure היוצרים למעשה UDT (User Defined Types)- שהוא למעשה טבלת משתמש בזיכרון. השימוש במבנה מאפשר לנהל רשומות בזיכרון, וגם לשמור ולקרוא אותם מקובץ באופן קל ופשוט. אפשר גם ליצור מבנים מורכבים יותר, שבו מבנה אחד יכלול מבנה אחר.

Private BookData(12) As BookType
 
BookData(0).Title = "The Catcher in the Rye"
BookData(0).URL = "http://en.wikipedia.org/wiki/The_Catcher_in_the_Rye"

בדוגמה נוצר מערך בשם BookData של המבנה BookType. ומודגמת בו פעולת השמה של מחרוזת, למשתנה URL של האיבר הראשון במערך. ניתן לשמור ולקרוא מקובץ מבנה או מערך של מבנים, באמצעות פקודות השמירה והקריאה לקובץ של VB.NET.

פונקציה ושגרה [עריכה]

מבני הקוד הבסיסיים הם שגרות ופונקציות. מבנים אלו מכילים למעשה את קטעי הקוד להוראה. הם יכולים להיות מוכלים במודלים או במחלקות. ההבדל בין שגרה (Sub) לבין פונקציה (Function), הוא בכך ששגרה מכילה קטע ביצוע מבלי להחזיר ערך, ואילו פונקציה מבצעת קטע ביצועי ומחזירה ערך, ולכן יכולה להיות מושמת למשתנה באמצעות אופרטור =, או להיות כלולה בתחביר תנאי לוגי. צורת החזרת הערך שנעשתה באמצעות השמה לשם הפונקציה ב-VB6, שונתה בשפה זו ונעשית באמצעות פקודת Return כמקובל. יתרון השיטה הזו שבמקרה שמשנים את שם הפונקציה, אין מקומות נוספים שצריך לשנות, דבר מסורבל שבגרסאות שקדמו לדוט נט גרם לשגיאות הרצה.

שני המבנים יכולים לקבל פרמטרים. הפרמטרים כבררת מחדל יהיו לפי ערך (ByVal), אך אפשר גם שהפרמטר יהיה מצביע (באמצעות שימוש במילה השמורה ByRef). אפשר להפוך פרמטר שיהיה אופציונלי (באמצעות המילה Optional) לפני שם הפרמטר, ואז חובה לתת לפרמטר ערך ברירת מחדל. אפשרות נוספת היא לתת בפרמטר מערך באמצעות המילה השמורה ParamArray. אפשר גם לשלוח כפרמטר פונקציה שמחזירה אותו סוג טיפוס של הפרמטר.

צורת הכתיבה הבסיסית של שגרה:
[modifiers] Sub SubName[(parameterlist)]
...
End Sub
צורת הכתיבה הבסיסית של פונקציה:
[modifiers] Function FunctioName[(parameterlist)] As returntype
...
Return {value|variable}
End Function

טופס [עריכה]

הטופס שמהווה רכיב מכולה ואוסף גם יחד, תפקידו המרכזי להכיל בתוכו פקדים. אף שהוא למעשה כיום מקרה פרטי של מחלקה, נותר אחד המחלקות הבסיסיות והחשובות של השפה. ב-Visual Basic .NET נשמרה והורחבה התפיסה שהתכנות מתחיל בשלב הוויזואלי בשרטוט הפקדים על הטופס, הגדרת תכונותיהם בגיליון התכונות, וממשיך לכיוון הקוד. בנוסף לטופס של יישומי חלונות הוסף טופס של יישומי WEB, שמאפשר ליצור יישומי אינטרנט באופן דומה ליישומי חלונות. (דבר שיושם באופן ממצה במחולל האתרים של הקוד הפתוח DotNetNuke). כמו כן הוסף טופס להתקנים ניידים.

הטופס הפך להיות גמיש יותר ומרובה תכונות, ופונקציונליות שהושגה לפני כן באמצעות קריאות לפונקציות מערכת, או באמצעות חישובים מדוקדקים, הוטמעה במחלקת הטופס, כך למשל מיקום דינמי של פקדי טופס נעשה קל ופשוט. הוספו מספר רב של פקדים נוספים בתחומים שונים והוספו מספר רב של תבניות טפסים. השילוב של הטופס עם תכנות מונחה עצמים, מרחיב את הגמישות של הפיתוח, ומאפשר ליצור טפסים על בסיס טופס משתמש, ולירוש ממנו את תכונותיו. באופן זה אפשר לשנות את הממשק של כל טופסי הישום, בשינוי טופס הבסיס בלבד.

החלוקה בין פקדי ממשק לפקדי פעולה שתפקידם לבצע פונקציה מסוימת מאחורי הקלעים, נעשתה ברורה יותר (הם מופיעים באזור מיוחד בתחתית המסך). בפקדים עצמם יכולות שהיו קיימות רק בתכנות, הוספו למבט עיצוב. הגמישות בטיפול בפקדים עצמה הוגדלה, ואפשר לטפל בפקדים כמו במשתנים, דבר שלא היה קיים בגרסת ה-VB6. כל הפקדים קיבלו שיטות גרפיות רבות, שלפני כן היו רק לפקד תמונה, וכעת אפשר לצייר אפילו על פקד Label שנחשב לפקד הבסיסי והנחות ביותר.

הקשר בין פקד לאירועיו חוזק, ושינוי שמו של פקד, כבר איננו מנתק את הקשר לאירועים שלו, דבר שהיווה בעיה לא קטנה בגרסת VB6. מאידך האפשרות ליצור אוסף פקדים, באופן שיהיה אפשר להתייחס לפקדים כמו למערך הוסרה מברירת המחדל, וממומשת רק כתוספת תואמת לגרסאות הקודמות, בצורת פקדים מיוחדים, שמסורבל כיום לתפעל אותם מבעבר.

פקודות בסיסיות [עריכה]

אופרטורים [עריכה]

בנוסף לאופרטורים האריתמטיים הרגילים כמו -,/,+,-,*,^,\, וMOD

  • הוספו אופרטורי השמה דבר המאפשר לבצע פעולות על משתנה באמצעות האופרטורים =+, =-, =*, =/, =^,=<<, =>>, =& - כדי לשרשר מחרוזת למחרוזת, בלי תחביר מסורבל.
  • הוספו האופרטורים << ו >> לתזוזה של ביטים במשתנה שמבוצעת בו פעולת השמה.
  • באופרטורים השוואתיים הוספו על ה-Is האופרטורים IsNot ו-Like שנלקח משפת SQL ויכול לבצע השוואות מחרוזתיות לפי תבנית.
  • בתחום האופרטורים הלוגיים בנוסף לAnd, Not , Or, Xor שכבר היו קיימים הוספו האופרטורים: AndAlso , OrElse , IsFalse , IsTrue
  • באופרטורים הכללים הוספו על TypeOf שהיה קיים, AddressOf - שיוצר התייחסות לשגרה, וGetType - לשם קבלת סוגו של משתנה.

משתנים [עריכה]

השפה כוללת את כל טיפוסי המשתנים הרגילים: בוליאני (Boolean), מספר שלם (Byte, Short, Integer, Long, Decimal), נקודה צפה (Single, Double), תו (Char), ומחרוזת (String = המסוגלת להכיל עד 2 מיליארד תווי יוניקוד). כמו כן ניתן להגדיר מספרים שלמים חיובים (UShort, UInteger, ULong). קיימים גם טיפוס תאריכי (Date), ואובייקט (Object) המסוגל להכיל מגוון רחב של משתנים.

המשתנים הפכו למעשה להיות אובייקטים. ניתן כמובן להכריז ולהשתמש בהם בדרך הרגילה:

Dim String1 As String = OpenFileDialog.FileName

אבל ניתן לעשות הרבה יותר. ניתן להגדיר משתנה ולאתחל את ערכו כשם שעושים באובייקט. למשל אפשר ליצור משתנה מחרוזת שיהיו בו 500 כוכביות, באמצעות הביטוי הבא:

Dim string1 As New String("*", 500)

מכיוון שהם למעשה אובייקטים. למשתנים יש מתודות שמיוחדות לפי כל משתנה. שוב אין צורך לחפש את שם הפונקציה ולבדוק האם היא פועלת על טיפוס המשתנה שהוכרז או מחזירה שגיאה. לאחר כתיבת המשתנה מקלידים נקודה ומקבלים את כל הפונקציות הפועלות על המשתנה. דוגמה שממחישה את הדבר, היא הבדיקה האם התו השלישי במחרוזת הינו "A", ניתנת להעשות בדרך הבאה:

String1.Substring(3, 1).Equals("A") = True

כמו ב-VB ניתן להגדיר מערך הן בגודל קבוע מראש (בהגדרת מספר האיברים שבו), והן בגודל משתנה במהלך הריצה (בהקצאה דינמית באמצעות פקודת ReDim) עם אופציה לשמירת הנתונים שכבר קיימים בו.

ניתן להגדיר בשפה מערך משונן (jagged array), שהוא למעשה מערך של מערכים, ונועד להכיל בתוכו מערכים בגדלים משתנים.

    Dim Array1() As Integer = {1, 2, 3, 4, 5}
    Dim Array2() As Integer = {4, 5}
    Dim JaggedArray()() As Integer = {Array1, Array2}

בנוסף לכל המשתנים הרגילים ובנוסף לטיפוס מערך Array שכבר כולל אפשרויות של מיון וחיפוש שמובנים בו, הוספה מחלקת אוספים (Collections) שמטפלת במשתנים מורכבים: Hashtable, ArrayList, BitArray , CollectionBase, SortedList, DictionaryBase, אוספי מחסנית ועוד, ובגרסה 2 - גרסה גנרית של ArrayList בשם List. למבנים מורכבים אלו יכולות שונות ומשונות לטיפול חכם בנתונים, כמו טיפול במספר איברים בבת אחת, מיון, חיפוש בינארי ועוד, והם פועלים למעשה כמו רשימות מקושרות, כאשר כל הטיפול בזיכרון נעשה מאחורי הקלעים. תפיסה זו של אוספים שהייתה כבר קיימת בVB6 הורחבה ושוכללה לסביבת הדוט נט כולה.

אינדקס למשתנים [עריכה]

השפה מאפשרת ליצור אינדקס למשתנים. לדוגמה:

Dim abc(5) as string

ז"א שיצרנו בעצם אינדקס של 6 משתנים:

  • abc(0)
  • abc(1)

וכו'. באפשרותנו לעשות זאת גם באובייקטים בעלי ממשק. בנוסף, אפשר אפוא לעשות זאת למגוון סוגי המשתנים כולל משתנים שיצרנו במחלקה (Module, Class).

מבני בקרה [עריכה]

השפה כוללת מבנה בקרה מסוגים שונים. מבנה הבקרה הם פקודות שמאפשרות שליטה על זרימת הקוד. באופן עקרוני מבנה הבקרה בגרסת הדוט נט נותרו זהים לגרסאות הקודמת.

מבני תנאי [עריכה]

תנאי If [עריכה]

מבנה התנאי נשאר בתחביר זה לגרסה הקודמת. אפשר ליצור פקודות IF מקוננות אחת בתוך השנייה.

 If condition Then
  statements
 [ElseIf condition Then
  statements ]
 [Else
  statements ]
 End If
תנאי Select Case [עריכה]

מבנה זה מאפשר לכתוב מספר של פקודות תנאי שרק אחת יכולה להתקיים. במקרה שקייס מתקיים, מבוצעת הפקודה שלו, ולאחר מכן מתבצעת יציאה ממנו.

 Select [ Case ] testexpression
    [ Case expressionlist
        [ statements ] ]
    [ Case Else
        [ elsestatements ] ]
 End Select
 
 Select Case MyVariable
  Case 5
   MenuItemToCheck = Value
  Case 7 To 9
   MenuItemToCheck = Value
  Case 3, 11, 13
   MenuItemToCheck = Value
  Case Is > maxNumber
   MenuItemToCheck = Value
  Case Else
   MsgBox("Message")
 End Select

לולאות [עריכה]

לולאות הם מבנים שמבצעים פעילות מחזורית שוב ושוב. מבנים אלו אחראים לחוזק של התכנות באופן כללי, מפני שהם מאפשרים לבצע שוב ושוב מספר רב של מחזורים. שגיאה תכנותית נפוצה קשורה ללואות במקרה שיש לולאות מתמשכות ללא יציאה מהן, נוצרת לולאה אינסופית, שנראית בעיני המשתמש כתקיעה של התוכנה שרצה.

לולאת For [עריכה]

לולאה זו היא לולאה רגילה, שנזקקת למשתנה כדי שימנה את המחזורים שלה. יש לקבוע את התחום התחתון והתחום העליון, מדרגת הקפיצה בכל מחזור הינו אופציונאלי וכברירת המחדל עומד על 1. (אפשר שהמדרגה תהיה מספר שלילי ולהתחיל ממספר גבוה לעבר מספר נמוך)

 For VariableName [As Variable] = StartValue to StoptValue [Step Value]
  statements...
 [Continue For]
 [Exit For]
 Next [VariableName]
לולאת For Each [עריכה]

לולאה זו היא לולאה מתוחכמת שפועלת עם אוסף, ורצה כפי מספר האיברים שבו. לולאה זו היא לולאה בטוחה שלא תחרוג ממספר האיברים שבו. בכל מחזור ריצה היא מצביעה על האיבר הנוכחי באוסף, ואפשר לפנות דרכה לתכונותיו ולמתודות שלו. פעולה שימושית שלה הוא מעבר על כל הפקדים בטופס.

 Dim ObjectItem As ObjectType
 For Each ObjectItem In Object
  statements...
 [Continue For]
 [Exit For]
 Next [ObjectItem]
לולאת Do Loop [עריכה]

לולאה זו היא לולאה שמתבצעת לפי תנאי, בתחילתה או בסופה. היא נכתבת כאשר לא ברורים מראש מספר המחזורים, כמו למשל בקריאת קובץ או בחיפוש איבר במערך.

 Do {While | Until} condition
    statements...
   [Continue While]
   [Exit Do]
 Loop
 
 Do
   statements
  [Continue Do]
  [Exit Do]
 Loop {While | Until} condition

אזור - Region [עריכה]

ניתן לתחום אזור באמצעות הפקודה Region לשם ניווט קל בקוד. אזור כזה יפעל כמו תבנית:מסגרת ניווט בוויקיפדיה, ויהיו לו שני מצבים. פתוח וסגור. לאחר המילה השמורה Region, יש לכתוב מחרוזת זיהוי.

 #Region "heading"
  ...
 #End Region

מרחבי-שם [עריכה]

ניתן לכנוס מספר מחלקות, מודולים או פונקציות תחת שם משותף באמצעות המילה השמורה NameSpace. כדי להשתמש בו יש למקף את האזור באמצעות התחלה וסיום של ה-NameSpace.

טיפול בשגיאות [עריכה]

ב-Visual Basic 6 יכולות הטיפול בשגיאות היו מוגבלות, ונשענו על מבנים תכנותיים מיושנים (קפיצות בקוד בעזרת goto), שהיא ירשה מ-QuickBasic.

ב-Visual Basic .NET קיים מנגנון טיפול בחריגות, הדומה לזה שקיים ב-C++‎ ובג'אווה.

 Try
    ' ... קטע שמנסה להתבצע
 Catch exp As Exception
   ' ... קטע שיתבצע רק במקרה של חריגה
 Finally
   ' ... קטע שיתבצע בכל מקרה
 End Try

המפתח עצמו יכול להזניק חריגים, שילכדו באמצעות מנגנון לכידת החריגים באמצעות הביטוי Throw New IvalidcaseException

דברים עיקריים ששונו בשפה זו לעומת VB6 [עריכה]

  • תחביר פקודות השפה ומבני הבקרה הוגמש וחוזק.
  • הוספו יכולות תכנותיות מובנות בשפה: תהליכי-משנה (Threading), סימון קטעים קריטיים (Critical section), עבודה עם תבניות גנריות (Generic).
  • נעשו שינויים שונים במשתנים: משתנים מספרים הוכפלו בגודלם, משתנה מסוג Variant הומר ל-Object. טיפוס רשומה Type הומר ל-Structure. מחרוזת באורך קבוע fixed String הוסרה מהשפה, גודל מחרוזות נקבע אוטומטית. הגדרה כוללנית של משתנים באמצעות Def הוסרה, מעתה יש להגדיר כל משתנה בנפרד.
  • הוספו פקדים רבים ומגוונים יותר. אוסף פקדים הוסר מברירת המחדל, והפך להיות מעט קשה יותר לביצוע.
  • אירוע אחד ניתן להקשר למספר פקדים, ופקד אחד ניתן להקשר למספר אירועים, בניגוד ל-VB שם הקשר בין פקד לאירוע היה חד חד ערכי.
  • הוספה מערכת משתנים לפי פרויקט שנשמרים בקובץ Settings, שניתן לקשור אותם למאפיינים של פקדים.
  • למנגנון לכידת חריגים ON ERROR הוסף מנגנון נוסף בדומה למנגנון שקיים ב-++C.
  • מנגנון ניהול הזיכרון הפך להיות אוטומטי. במסגרתו קיים מנגנון "איסוף אשפה", שמנקה את הזיכרון ומשחרר אובייקטים שאינם בשימוש בתנאים שנקבעו לו.
  • הוספה שפת LINQ לקיצור תהליכים תכנותיים בעבודה עם מערכים ורשימות בסגנון שפת SQL.

תוכניות לדוגמה [עריכה]

תוכנית שכתובה בגרסה 2005, מנגנת קובץ קול בפורמט WAV, בזמן טעינת טופס, ללא כל שימוש בAPI או קובץ Dll חיצוני בשתי פעולות. דבר המדגים את הפשטות והאלגנטיות של סביבת ה.NET. הפונקציונליות של ניגון קובץ קול מתבצעת ב-

  1. בהגדרת אובייקט SoundPlayer תוך ביצוע השמת תוכן של קובץ קול לתוכו.
  2. הפעלת מתודה של נגינת האובייקט (Play) בזמן טעינת טופס.
 Public Class Form1
   Private Sub Form1_Load(ByVal sender As Object, _
               ByVal e As System.EventArgs) Handles Me.Load
     Dim MySound As New System.Media.SoundPlayer("C:\My Music\test.wav")
     MySound.Play()
   End Sub
 End Class

או בתחביר מקוצר:

 Public Class Form1
   Private Sub PlayAudio()
         My.Computer.Audio.Play("c:\text.wav")
   End Sub
 End Class

תוכנית שמציגה את שם היציאה הטורית הראשונה שבמחשב

 Public Class Form1
   Private Sub ShowSerialPortNames()
        MsgBox(My.Computer.Ports.SerialPortNames.Item(0).ToString)
   End Sub
 End Class

שגרה שמבצעת משלוח אימייל באמצעות שרת SMTP

Imports System.Net.Mail
 
Public Sub SendMailMessage(ByVal UserName As String, ByVal Password As String)
 Dim MySmtpClient As New SmtpClient("smtp.012.net.il", "25")
 MySmtpClient.Credentials = New Net.NetworkCredential(UserName, Password)
 MySmtpClient.UseDefaultCredentials=False
 MySmtpClient.Send(New MailMessage("bibinat@012.net.il", _
                      "alon123@gmail.com", "Hello", "What's new?"))
End Sub

קישורים חיצוניים [עריכה]

ראו גם [עריכה]

הערות שוליים [עריכה]

  1. ^ Scott Wiltamuth's , VB and C# Coevolution, .msdn site