מדריך NET. – המרות טבעיות בין טיפוסים (cast)

‏ • John Bryce

בשפת #C לאחר שמצהירים משתנה מסוג מסויים לא ניתן לאחסן בו ערכים מסוג אחר, אלא אם כן יש סוג שניתן להמרה לסוג של המשתנה. לדוגמה, משתנה מסוג int יכול לקבל ערכים מסוג short אך הוא אינו יכול לקבל ערכים מסוג string:

int numInt;
short numShort = 10;
string str = "Hello";

numInt = numShort; //OK

//Error: Cannot implicitly convert type 'string' to 'int'
numInt = str;

קיימות שתי אפשרויות עיקריות לביצוע המרה מטיפוס אחד לטיפוס אחר:

  • implicit casting – המרה מרומזת ללא צורך בכתיבת ה- casting. מתבצעת אוטומטית ע”י המהדר.
  • explicit casting – המרה מפורשת שבה חובה לבצע כתיבת ה- casting. מתבצעת ע”י המתכנת אשר מציין במפורש את סוג הטיפוס אליו הוא רוצה להמיר.

 

המרה מרומזת (implicit casting)

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

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

לדוגמא, המרה מרומזת של טיפוס מסוג short לטיפוס מסוג int. מיכוון שכל int (מספר שלם בין 2147483647 ל- 2147483648-) יכול לקבל כל ערך מסוג short (מספר שלם בין 32767 ל- 32768-). כפי שראינו בדוגמת הקוד הנ"ל.

// Implicit conversion.  Long number can       
// hold any value an int can hold, and more!      
int num = 2147483647;      
long bigNum = num;

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

Derived d = new Derived();       
Base b = d;
// Always OK.


הטבלה הבאה מפרטת את ההמרות המרומזות הקיימות בטיפוסים הבסיסיים ב- Net. :

טיפוס מקור

טיפוס יעד (אליו ניתן להמיר ללא צורך בהמרה מפורשת)

sbyte

short, int, long, float, double, decimal

byte

short, ushort, int, uint, long, ulong, float, double, decimal

short

int, long, float, double, or decimal

ushort

int, uint, long, ulong, float, double, decimal

int

long, float, double, decimal

uint

long, ulong, float, double, decimal

long

float, double, decimal

char

ushort, int, uint, long, ulong, float, double, decimal

float

double

ulong

float, double, decimal

המרה מפורשת (explicit casting)

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

המרה מפורשת מ- double ל- int (שימו לב שבדוגמא זו אנחנו נאבד חלק מהדיוק של המספר, מיכוון שטיפוס היעד – int – אינו מאפשר להכיל חלק עשרוני):

double x = 1234.6;
int a;

a = (int)x; // Cast double to int

Console.WriteLine(a);
// Output: 1234

המרה מפורשת מ-Employee ל-Person (המרה של מופע ממחלקת בסיס למופע של המחלקה הנגזרת):

// Create a new derived type:
Employee e1 = new Employee();

// Implicit conversion to base type is safe:
Person p = e1;

// Explicit conversion is required to cast back
// to derived type.
Employee e2 = (Employee)p;

תגיות: , ,

ליאור זמיר

כיום אני ה- Webmaster של תוכנית החדשנות של HPE Software.לפני כן, הייתי מנהל תחום Webmaster ומרצה בכיר בג'ון-ברייס (במשך 9 שנים) בקורסים לפיתוח ותיכנות באמצעות Microsoft .NET, מולטימדיה, בניית אתרי אינטרנט ואינטראנט. פיתוח הדרכה ומתן ייעוץ טכנולוגי.

תגובות בפייסבוק