תרגיל - סיור בהמרה והמתן של סוגי נתונים
- 30 דקות
קיימות כמה טכניקות לביצוע המרת סוג נתונים. השיטה שתבחר תלויה בתשובה שלך לשתי שאלות חשובות:
- האם ייתכן, בהתאם לערך, שניסיון לשנות את סוג הנתונים של הערך יציג חריגה בזמן ריצה?
- האם ייתכן, בהתאם לערך, שניסיון לשנות את סוג הנתונים של הערך גורמת לאובדן מידע?
בתרגיל זה, אתה מעיין בשאלות אלה, בהשלכות של תשובותיהם ובטכניקה שבה עליך להשתמש כאשר עליך לשנות את סוג הנתונים.
הכנת סביבת הקידוד שלך
מודול זה כולל פעילויות מעשיות שמנחה אותך לאורך תהליך הבנייה וההפעלה של קוד הדגמה. מומלץ להשלים פעילויות אלה באמצעות Visual Studio Code כסביבת הפיתוח שלך. השימוש בקוד Visual Studio עבור פעילויות אלה עוזר לך להיות נוח יותר לכתיבה והפעלה של קוד בסביבת מפתחים המשמשת מומחים ברחבי העולם.
הערה
אם השלמת מודולים אחרים של Microsoft Learn בסדרת C# זו, ייתכן שכבר יצרת תיקיית פרוייקט עבור דוגמאות קוד. במקרה זה, באפשרותך לדלג על סעיף השלבים הבא ולמחוק Program.cs את הקוד בקובץ ששימש לתרגיל קודם.
הערה
דוגמאות הקוד בתרגיל זה נועדו בהתבסס על en-US התרבות, ולהשתמש בנקודה (.) כתו המפריד העשרוני. בנייה והפעלה של הקוד באמצעות הגדרת תרבות המשתמשת במפרידים עשרוניים שונים (כגון פסיק ,) עשויות לגרום לתוצאות או לשגיאות בלתי צפויות. כדי לפתור בעיה זו, החלף את המפרידים העשרוניים של הנקודה במדגמאות הקוד במפריד העשרוני המקומי (כגון ,).
לחלופין, כדי להפעיל תוכנית באמצעות הגדרת התרבות en-US, הוסף את הקוד הבא לחלק העליון של התוכנית: using System.Globalization; ולאחר כל משפט using אחר, הוסף CultureInfo.CurrentCulture = new CultureInfo("en-US");.
פתח את Visual Studio Code.
באפשרותך להשתמש בתפריט ההתחלה של Windows (או במשאב שווה ערך עבור מערכת הפעלה אחרת) כדי לפתוח את Visual Studio Code.
בתפריט קובץ קוד של Visual Studio, בחר פתח תיקיה.
בתיבת הדו-שיח פתיחת תיקיה, נווט אל תיקיית שולחן העבודה של Windows.
אם יש לך מיקום תיקיה אחר שבו אתה שומר פרוייקטי קוד, באפשרותך להשתמש במיקום תיקיה זה במקום זאת. להדרכה זו, הדבר החשוב הוא שיהיה לך מיקום שקל לאתר ולזכור.
בתיבת הדו-שיח פתיחת תיקיה, בחר בחר תיקיה.
אם אתה רואה תיבת דו-שיח של אבטחה השואלת אם אתה נותן אמון בעורכים, בחר כן.
בתפריט מסוף קוד Visual Studio , בחר מסוף חדש.
שים לב שבקשה לפקודה בלוח המסוף מציגה את נתיב התיקיה עבור התיקיה הנוכחית. לדוגמה:
C:\Users\someuser\Desktop>כדי ליצור יישום מסוף חדש בתיקיה שצוינה, הקלד שורת הפקודה Terminal:
dotnet new console -o ./CsharpProjects/TestProjectולאחר מכן הקש Enter.פקודה זו של .NET CLI משתמשת בתבנית של תוכנית .NET כדי ליצור פרוייקט יישום חדש של מסוף C# במיקום התיקיה שצוין. הפקודה יוצרת עבורך את התיקיות CsharpProjects ו- TestProject, ומשתמשת ב- TestProject כשם
.csprojהקובץ.בלוח EXPLORER, הרחב את התיקיה CsharpProjects .
אתה אמור לראות את התיקיה TestProject ושני קבצים, קובץ תוכנית C# בשם Program.cs וקובץ פרוייקט C# בשם TestProject.csproj.
בלוח EXPLORER, כדי להציג את קובץ הקוד בלוח 'עורך', בחר Program.cs.
מחק את שורות הקוד הקיימות.
השתמש בפרוייקט זה של מסוף C# כדי ליצור, לבנות ולהפעיל דוגמאות קוד במהלך מודול זה.
סגור את לוח המסוף.
שאלה: האם ייתכן שניסיון לשנות את סוג הנתונים של הערך יציג חריגה בזמן ריצה?
המהדר של C# מנסה להכיל את הקוד שלך, אך אינו מבצע קומפילציה של פעולות שעלולות להוביל לחריגה. כאשר אתה מבין את החשש העיקרי של מהדר C#, הבנת הסיבות לכך שהוא פועל בדרך מסוימת היא קלה יותר.
כתוב קוד שינסה להוסיף ו int - ולשמור string את התוצאה ב- int
ודא שהאפשרות קוד Visual Studio פתוחה Program.cs בלוח 'עורך'.
הערה
Program.cs צריך להיות ריק. אם לא, בחר ומחק את כל שורות הקוד.
הקלד את הקוד הבא בעורך הקוד של Visual Studio:
int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);כאן, אתה מנסה להוסיף את הערכים ואת
24. הערך הוא4מסוגstring. האם זה יעבוד?בתפריט קוד Visual Studio קובץ, בחר שמור.
יש Program.cs הקובץ לפני בנייה או הפעלה של הקוד.
בלוח EXPLORER, כדי לפתוח מסוף במיקום התיקיה TestProject, לחץ באמצעות לחצן העכבר הימני על TestProjectולאחר מכן בחר פתח במסוף משולב.
לוח מסוף אמור להיפתח, ועלי לכלול שורת פקודה המציגה שמסוף פתוח במיקום התיקיה TestProject שלך.
בשורת הפקודה של Terminal, כדי להפעיל את הקוד, הקלד
dotnet runולאחר מכן הקש Enter.אתה אמור לראות את הפלט המשוער הבא
C:\Users\someuser\Desktop\csharpprojects\TestProject\Program.cs(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'הערה
אם אתה רואה הודעה המציינת כי "לא היתה אפשרות למצוא פרוייקט להפעלה", ודא שבקשה לפקודה של Terminal מציגה את מיקום התיקיה TestProject הצפוי. לדוגמה:
C:\Users\someuser\Desktop\csharpprojects\TestProject>התחשב לדקה מדוע המהדר לא הצליח להפעיל את דוגמת הקוד הראשונה.
החלק החשוב של הודעת השגיאה ,
(3,14): error CS0029: Cannot implicitly convert type 'string' to 'int'מציין שהבעיה היא בשימוש בסוגstringהנתונים.אך מדוע המהדר של C# אינו יכול פשוט לטפל בשגיאה? אחרי הכל, באפשרותך לבצע את ההפך כדי לשרשר מספר ב- ולשמור
stringאותו במשתנה מחרוזת. כאן תוכל לשנות את סוג הנתונים של המשתנהresultמ- לint-string.עדכן את הקוד שלך בעורך קוד Visual Studio באופן הבא:
int first = 2; string second = "4"; string result = first + second; Console.WriteLine(result);שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
עליך לבחון את הפלט הבא:
24הפלט שגוי מבחינה מתמטית אך משלים על-ידי שילוב הערכים כתווים "2" ו- "4".
בדוק, שוב, את דוגמת הקוד הראשונה שבה המשתנה
resultהוא מסוגint. הקוד עם הודעת השגיאה.int first = 2; string second = "4"; int result = first + second; Console.WriteLine(result);מדוע המהדר של C# אינו יכול להבין שברצונך להתייחס למשתנה
secondהמכיל4מספר, ולא כ-string?
מהדרים מבצעים המרות בטוחות
המהדר של C# רואה בעיה פוטנציאלית בהתהוות. המשתנה second הוא מסוג string, לכן ייתכן שהוא מוגדר לערך אחר כגון "hello". אם המהדר של C# ניסה להמיר "hello" למספר שעלול לגרום לחריגה בזמן ריצה. כדי למנוע אפשרות זו, המהדר של C# אינו מבצע עבורך את ההמרה stringint במפורש.
מנקודת המבט של המהדר של C# , intstring הפעולה הבטוחה יותר תהיה לבצע המרה לשרשור ולבצע אותו במקום זאת.
אם בכוונתך לבצע הוספה באמצעות מחרוזת, המהדר של C# דורש ממך לקבל שליטה מפורשת יותר בתהליך המרת הנתונים. במילים אחרות, היא מאלץ אותך להיות מעורב יותר כדי שתוכל להציב את אמצעי הזהירות המתאימים כדי לטפל באפשרות שההמרה עלולה לגרום לחריגה.
אם עליך לשנות ערך מסוג הנתונים המקורי לסוג נתונים חדש והשינוי עלול להביא לחריגה בזמן ריצה, עליך לבצע המרת נתונים.
כדי לבצע המרת נתונים, באפשרותך להשתמש באחת מהשיטות הבאות:
- שימוש בפעולת שירות של עוזר בסוג הנתונים
- שימוש בפעולת שירות של עוזר במשתנה
- השתמש בשיטות
Convertשל הכיתה
עיין בכמה דוגמאות לטכניקות אלה להמרת נתונים בהמשך יחידה זו.
שאלה: האם ייתכן שניסיון לשנות את סוג הנתונים של הערך גורמת לאובדן מידע?
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:int myInt = 3; Console.WriteLine($"int: {myInt}"); decimal myDecimal = myInt; Console.WriteLine($"decimal: {myDecimal}");שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
אתה אמור לראות את הפלט הבא:
int: 3 decimal: 3המפתח לדוגמה זו הוא שורת קוד זו:
decimal myDecimal = myInt;מאחר שערך
intכלשהו יכול להתאים בקלות בתוךdecimal, המהדר מבצע את ההמרה.המשמעות של המרת הרחבת המונח היא שאתה מנסה להמיר ערך מסוג נתונים שעשוי להכיל פחות מידע לסוג נתונים שיכול להכיל מידע נוסף. במקרה זה, ערך המאוחסן במשתנה מסוג מומר
intלמשתנהdecimalמסוג , אינו מאבד מידע.כאשר אתה יודע שאתה מבצע המרה הרחבת, באפשרותך להשתמש בהמרה משתמעת. המהדר מטפל בהמרות משתמעות.
ביצוע המרת שדר
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:decimal myDecimal = 3.14m; Console.WriteLine($"decimal: {myDecimal}"); int myInt = (int)myDecimal; Console.WriteLine($"int: {myInt}");כדי לבצע המרת שדר, השתמש באופרטור
()הליהוק כדי להקיף סוג נתונים ולאחר מכן מקם אותו לצד המשתנה שברצונך להמיר (לדוגמה:(int)myDecimal). אתה מבצע המרה מפורשת לסוג נתוני ההמרה המוגדר (int).שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
אתה אמור לראות את הפלט הבא:
decimal: 3.14 int: 3המפתח לדוגמה זו הוא שורת קוד זו:
int myInt = (int)myDecimal;המשתנה
myDecimalמכיל ערך בעל דיוק לאחר הנקודה העשרונית. על-ידי(int)הוספת הוראת הליהוק , אתה אומר למהדר C# שאתה מבין שזה אפשרי שתאבד את הדיוק הזה, ובמצב זה, זה בסדר. אתה מציין למהדר שאתה מבצע המרה מכוונת, המרה מפורשת.
קביעה אם ההמרה שלך היא "הרחבת המרה" או "המרה מצמצת"
המונח צמצום ההמרה פירושו שאתה מנסה להמיר ערך מסוג נתונים שעשוי להכיל מידע נוסף לסוג נתונים שעשוי להכיל פחות מידע. במקרה זה, ייתכן שתאבד מידע כגון דיוק (לדוגמה, מספר הערכים אחרי הנקודה העשרונית). דוגמה היא המרת ערך המאוחסן במשתנה מסוג decimal למשתנה מסוג int. אם תדפיס את שני הערכים, ייתכן שתבחין מאובדן מידע.
כאשר אתה יודע שאתה מבצע המרה מצמצת, עליך לבצע המרת Cast. ליהוק הוא הוראה למהדר C# שאתה יודע שייתכן ודיוק אבד, אך אתה מוכן לקבל אותו.
אם אינך בטוח אם תאבד נתונים בהמרה, כתוב קוד כדי לבצע המרה בשתי דרכים שונות ובחן את השינויים. מפתחים כותבים לעתים קרובות בדיקות קטנות כדי להבין טוב יותר את אופני הפעולה, כפי שממחישים עם המדגם הבא.
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:decimal myDecimal = 1.23456789m; float myFloat = (float)myDecimal; Console.WriteLine($"Decimal: {myDecimal}"); Console.WriteLine($"Float : {myFloat}");שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
אתה אמור לראות פלט דומה ל:
Decimal: 1.23456789 Float : 1.2345679באפשרותך לצפות מתוך הפלט המרת לתוך a
decimalfloatהוא המרה מצמצת מכיוון שאתה מאבד דיוק.
ביצוע המרות נתונים
מוקדם יותר, צוין ששינוי ערך מסוג נתונים אחד לסוג אחר עלול לגרום לחריגה בזמן ריצה ועלך לבצע המרת נתונים. עבור המרות נתונים, קיימות שלוש טכניקות שניתן להשתמש בהן:
- שימוש בפעולת שירות של עוזר במשתנה
- שימוש בפעולת שירות של עוזר בסוג הנתונים
- השתמש בשיטות
Convertשל הכיתה
השתמש ToString() כדי להמיר מספר למספר string
לכל משתנה סוג נתונים יש פעולת ToString() שירות. הפעולות ToString() שהשיטה עושה תלויות באופן המיושם בסוג נתון. עם זאת, ברוב הפרימיטיביים, הוא מבצע המרת הרחבת. למרות שזה אינו הכרחי לחלוטין (מאחר שניתן להשתמש בהמרה משתמעת ברוב המקרים), הוא יכול לתקשר עם מפתחים אחרים שאתה מבין מה אתה עושה וזה מכוון.
להלן דוגמה מהירה לשימוש בשיטה להמרה ToString() מפורשת int של ערכים ל- strings.
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:int first = 5; int second = 7; string message = first.ToString() + second.ToString(); Console.WriteLine(message);שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד. בעת הפעלת הקוד, הפלט אמור להציג שרשור של שני הערכים:
57
המרת לשיטה stringint מסייעת Parse()
לרוב סוגי הנתונים המספריים יש Parse() שיטה, אשר ממירה מחרוזת לסוג הנתונים הנתון. במקרה זה, עליך להשתמש בפעולת Parse() השירות כדי להמיר שתי מחרוזות לערכים int ולאחר מכן להוסיף אותן יחד.
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:string first = "5"; string second = "7"; int sum = int.Parse(first) + int.Parse(second); Console.WriteLine(sum);שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד. בעת הפעלת הקוד, הפלט אמור להציג סכום של שני הערכים:
12האם לקחת דקה כדי לנסות לאתר את הבעיה הפוטנציאלית בדוגמה הקודמת של הקוד? מה קורה אם אחד מהמשתנים
firstאוsecondמוגדר לערכים שלא ניתן להמיר ל-int? אירעה חריגה בזמן ריצה. המהדר ותזמן הריצה של C# מצפים ממך לתכנן מראש ולמנוע המרות "לא חוקיות". באפשרותך לצמצם את חריגת זמן הריצה בכמה דרכים.הדרך הקלה ביותר לצמצם מצב זה היא באמצעות
TryParse(), שהיא גירסה טובה יותר שלParse()השיטה.
המרת ל string - int באמצעות Convert הכיתה
Convert הכיתה כוללת שיטות עוזרות רבות להמרת ערך מסוג אחד לסוג אחר. בדוגמה הבאה של הקוד, עליך להמיר כמה מחרוזות לערכים מסוג int.
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:string value1 = "5"; string value2 = "7"; int result = Convert.ToInt32(value1) * Convert.ToInt32(value2); Console.WriteLine(result);שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
אתה אמור לראות את הפלט הבא:
35הערה
מדוע שם פעולת השירות
ToInt32()?ToInt()למה לא .System.Int32הוא השם של סוג הנתונים המשמשים כמקור בספריית הכיתה של .NET שפת התיכנות C# ממופה למילת המפתחint. מאחר שהמחלקהConvertמהווה גם חלק מספריית הכיתה של .NET, היא נקראת בשם המלא שלה, ולא לפי שם ה- C# שלה. על-ידי הגדרת סוגי נתונים כחלק מספריית הכיתה של .NET, שפות .NET מרובות כגון Visual Basic, F#, IronPython ואחרים יכולות לשתף את אותם סוגי נתונים ואת אותן מחלקות בספריית הכיתה של .NET.לפעולת
ToInt32()השירות יש 19 גירסאות עמוסות מדי ומאפשרות לה לקבל כמעט כל סוג נתונים.השתמשת בפעולת
Convert.ToInt32()השירות עם מחרוזת כאן, אך סביר להניח שעליך להשתמש בה כאשרTryParse()הדבר אפשרי.אז מתי כדאי שתשתמש בכיתה
Convert?Convertהכיתה מתאימה ביותר להמרת מספרי שברים למספרים שלמים (int) מכיוון שהיא מעגלת כלפי מעלה את ציפיותך.
השוואה בין ליהוק להמרה ל decimal - int
הדוגמה הבאה מדגימה decimalint מה קורה כאשר אתה מנסה להמיר ל- (המרה מצמצת) Convert.ToInt32() לעומת שימוש בשיטה להמרה זהה decimal ל- int.
מחק את אופרטור הערות השורה
//או השתמש בו כדי להוסיף הערות לקוד משלב התרגיל הקודם ולהוסיף את הקוד הבא:int value = (int)1.5m; // casting truncates Console.WriteLine(value); int value2 = Convert.ToInt32(1.5m); // converting rounds up Console.WriteLine(value2);שמור את קובץ הקוד ולאחר מכן השתמש ב- Visual Studio Code כדי להפעיל את הקוד.
אתה אמור לראות את הפלט הבא:
1 2
יציקת חיתוך והמרת עיגולים
כאשר אתה מיציקת int value = (int)1.5m;, 1ערך הציפה נחתך כך שהתוצאה היא , כלומר הערך שלאחר הנקודה העשרונית אינו מוערך לחלוטין. תוכל לשנות את הציפה המיללולית 1.999m ל- והתוצאה של הליהוק תהיה זהה.
כאשר אתה ממיר באמצעות , ערך Convert.ToInt32()הציפה המיללולי מעוגל כראוי כלפי מעלה ל- 2. אם שינית את הערך המיללולי ל 1.499m- , הוא יעוגל כלפי מטה ל- 1.
סיכום
חיפית על כמה מושגים חשובים של המרת נתונים והמיציקה:
- מניעת שגיאת זמן ריצה בעת ביצוע המרת נתונים
- בצע המרת טקסט מפורשת כדי לציין למהדר שאתה מבין את הסיכון לאיבוד נתונים
- מסתמכות על המהדר כדי לבצע המרה משתמעת בעת ביצוע המרה מתרחבת
- השתמש באופרטור
()השחקנים ובסוג הנתונים כדי לבצע המרת שדר (לדוגמה,(int)myDecimal) - השתמש בכיתה
Convertכאשר ברצונך לבצע המרה מצמצת, אך ברצונך לבצע עיגול, ולא חיתוך של מידע
בדוק את הידע שלך
משוב
האם עמוד זה היה מועיל?
לא
זקוק לעזרה בנושא זה?
רוצה לנסות להשתמש ב'שאל את Learn' כדי להבהיר או להדריך אותך בנושא זה?