ה-Namespace השבועי

gilad g

New member
../images/Emo124.gif ה-Namespace השבועי../images/Emo70.gif

והפעם, System.Text. מרחב שמות זה עוסק בשני עניינים הקשורים בטקסט - מימוש למחרוזת-טקסט הניתנת לשינוי (mutable) וקידודים.
המחלקה StringBuilder
ה-StringBuilder מציגה פונקציונליות מאוד דומה לזו של מחרוזת רגילה, קיים הבדל בסיסי ביניהן. מחרוזת ה"רגילה" (System.String) אינה משתנה כשמבצעים עליה פעולה כלשהי, אלא נוצר אובייקט System.String חדש בזיכרון. בגלל יצירת אובייקט מחרוזת חדש כל פעם, נוצר מצב שבו פעולות רבות על מחרוזת אחת (כמו Trim, Replace, וכו') יגררו בזבוז זכרון, ולכן עבודה מיותרת ל-Garbage Collector. כדי לפתור בעיה זו, נוצר ה-StringBuilder. ב-StringBuilder, כל הפעולות נעשות על אובייקט דמוי-מחרוזת. כדי לחבר מחרוזות, משתמשים במתודות Append/AppendFormat. המתודה ToString ממירה את המחרוזת המוכלת ב-StringBuilder לאובייקט מסוג System.String.
מחלקות הקידוד
בקידודים משתמשים בדרך כלל כאשר רוצים לקרוא מ/אל קבצים (אבל לא רק). קובץ, כזכור, הוא מערך של בתים, ולא מחרוזת. לכן, כדי שלבתים האלו תהיה משמעות מסוימת קיים צורך להמיר למחרוזת. את זה צריך לעשות ע"י קידוד מסוים, כי ניתן לייצג תוים של מחרוזת ע"י מערך של בתים בכמה דרכים שונות. לדרכים האלו קוראים קידודים. המחלקה הבסיסית לטיפול בקידודים היא Encoding. לכל קידוד יש codepage מסוים, ושם. כדי ליצור instance של המחלקה הזאת, אפשר להשתמש בקונסטרקטור שמקבל פרמטר Int32 אחד שמייצג את ה-codepage של הקידוד הרצוי. לחילופין, ניתן להשתמש במתודה הסטטית GetEncoding, שמקבלת codepage או שם של קידוד. דוגמא:
Encoding hebrewWindowsEncoding = new Encoding(1255); //or Encoding hebrewWindowsEncoding = Encoding.GetEncoding("windows-1255"); //if we want to use hebrew DOS encoding, for example: Encoding hebrewDosEncoding = Encoding.GetEncoding("DOS-862");​
למחלקה Encoding יש שתי מתודות חשובות - GetBytes ו-GetString. הראשונה, ממירה מחרוזת (שבדוט נט היא תמיד unicode) למערך של בתים בקידוד המסוים שבחרנו, והשניה ממירה מערך של בתים למחרוזת Unicode של דוט נט. קיימות 4 מחלקות מוכנות מראש המייצגות קידודים מסוגים נפוצים - UnicodeEncoding, UTF8Encoding, UTF7Encoding ו-ASCIIEncoding. כולן יורשות מ-Encoding, ומוסיפות פונקציונליות ייחודית לקידוד שהן מייצגות. בנוסף, System.Text מכיל שתי מחלקות אבסטרקטיות - Encoder ו-Decoder. המחלקה Encoder ממירה תוים למערך של בתים, והמחלקה Decoder ממירה מערך של בתים לתוים.
שבת שלום
 
הזדמנות מצויינת להמליץ להשתמש

ב-String.Format מזכיר קצת את מה שהיינו עושים ב-C רק שלא צריך לחשוב על ה-datatype של המשתנה שמוכנס באמצע המחרוזת. נח, ברור, וחשוב מכל - יעיל.
 

dc24

New member
מה הקטע של מחלקת הקידוד....

אחלה תקציר!! אבל... מה ההבדל בין השימוש במחלקת הקידוד (בקבצים) לבין אי שימוש ? מה היתרונות? החסרונות?
 

yuval k

New member
../images/Emo26.gif

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

nattygur

New member
דוגמה קלאסית לנו (העוסקים בעברית)

המרה מ ASCII ל UNICODE וחוזר חלילה.
 
למעלה