257. System Convert

הFramework מספק לנו את הטיפוסים “הבסיסיים” הבאים: bool, char, string, System.DateTime, System.DateTimeOffset ואת שאר הטיפוסים הנומריים.

המחלקה הסטטית Convert מגדירה פונקציות המאפשרות לנו להמיר כל טיפוס בסיסי לכל טיפוס בסיסי אחר.

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

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

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

1
2
double real = 2.7182;
int integer = (int) real;

אלא שיש עם שיטה זו בעיה קלה (תלוי איך מסתכלים על זה) – ההסבה תמיד מקצצת את המספר.

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

(ראו זאת גם כאזהרה!)

1
2
double real = 2.7182;
int integer = Convert.ToInt32(real); // 3

אם העיגול הזה הוא בעייתי, אפשר קודם לקרוא לMath.Round המאפשר לנו לשלוט בעיגול.


כאמור לכל טיפוס בסיסי קיים overload מתאים לConvert.ToInt32, למשל:

1
2
3
4
5
6
7
8
9
string text = "42";
int integer = Convert.ToInt32(text); // 42
//int integer = (int) text; // Doesn't compile
//int integer = (int) (object) text; // Throws an exception
bool theTruth = true;
int integer = Convert.ToInt32(theTruth); // 1
//int integer = (int) theTruth; // Doesn't compile
//int integer = (int) (object) theTruth; // Throws an exception

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

1
2
double real = Convert.ToDouble("2.7182"); // 2.7182
bool theTruth = Convert.ToBoolean("True"); // true

המשך יום מומר לטובה!

שתף