בהמשך לטיפים הקודמים,
לפעמים אנחנו עשויים להיתקל במצב בו יש לנו מספרNamespaceים עם שמות דומים, אבל לא עם אותו שורש.
למשל:
|
|
כאשר Second.Third הוא לא Namespace מקונן של First.
נניח שמוגדר טיפוס בSecond.Third ואנחנו רוצים להשתמש בו מהNamespace הראשון:
|
|
אם נשתמש בusing לפני ההגדרה של הNamespace, הדבר אכן אפשרי:
|
|
אבל בלי זה, זה לא כל כך יעבוד:
|
|
נקבל את שגיאת הקימפול הבאה:
Error: The type or namespace name ‘FirstClass’ does not exist in the namespace ‘First.Second.Third’ (are you missing an assembly reference?)
מה קורה כאן? כאשר אנחנו כותבים Second, הקומפיילר חושב שאנחנו מתכוונים לקיצור של First.Second (כי זהו Namespace מקונן), ולכן כאשר כתבנו Second.Third.FirstClass, הוא חושב שהתכוונו לFirst.Second.Third.FirstClass, ובו כמובן הוא לא מוצא את הטיפוס.
באופן דומה, הקומפיילר יכול להתבלבל בין Nested Types וNested Namespaces עם שמות דומים, למשל:
|
|
אז אם ננסה לגשת לInnerClass של הnamespace ששמו FirstClass מהNamespace ששמו First, לא כל כך נצליח:
|
|
מאותה סיבה – מאחר והNamespace מקונן, הקומפיילר חושב שאנחנו מתכוונים בFirstClass.InnerClass לטיפוס שנמצא בתוך הNamespace שלנו.
כדי לפתור את הבעיות האלה, אפשר להשתמש בKeyword ששמו global::, הוא בעצם אומר לקומפיילר לשכוח מהNamespace שבו הוא נמצא, ולחפש את מה שרשמנו בעזרת השם המלא שלו.
|
|
הבעיות האלה הן לא כל כך נפוצות בחיי היום-יום, ואפשר לפתור אותן ע"י בחירת שמות טובים מספיק למחלקות וNamespaceים.
מתי כן נתקלים בבעיות האלה? אני אישית נתקלתי בהן כשחוללתי קוד: כשמחוללים קוד, אין לנו כל כך שליטה על שמות הNamespaceים והמחלקות של המשתמש, ולכן אפשר להכשל בצורה דומה לדוגמאות שרשמתי למעלה.
מה גם, שCodeDom ספציפית אינו מאפשר להוסיף using מעל הNamespace, אלא רק בתוך הNamespace עצמו, כך שגם הבעיה הראשונה יכולה להתרחש (ואף התרחשה!).
אז מה עושים? אם תסתכלו על הקוד של אובייקט שחולל ע"י כלי של הFramework (למשל, XSD או DataSet), תראו שבכל מקום הוא משתמש בglobal:: ובשמות המלאים, כדי להיות בטוח שהוא ניגש לטיפוס שזה השם המלא שלו, ולא לטיפוס אחר שנמצא בתוך הNamespace בתוכו אנחנו חיים (ואליו הקוד מג’ונרט).
שיהיה המשך יום גלובלי טוב.