220. extern alias

Namespace, כידוע, הוא תחום בו לכל טיפוס יש שם ייחודי.

עם זאת, Namespace אינו חייב להתפרס על Assembly אחד, אלא יכול להתפרס על מספר Assemblyים.

למשל, אנחנו יכולים להוסיף בAssembly שלנו מחלקות משלנו לNamespace ששמו System, והכל יתקמפל ויעבוד…

אלא, שגם מישהו אחר יכול לעשות דבר כזה.

מה שיכול לקרות זה ששני Assemblyים יגדירו אותו שם של Type באותו שם של Namespace. הדבר הזה יגרום לתוכנה שלנו לא להתקמפל, במידה ונחזיק Reference לשני הAssemblyים וננסה להשתמש בטיפוס המשותף:

נקבל את שגיאת הקימפול:

The type ‘CoolNamepsace.CoolClass’ exists in both ‘CoolDLL.dll’ and ‘CoolDLL2.dll’


טוב אז מה עושים?

התשובה הנכונה היא להשתמש בNamespace ייחודי עבור כל Assembly (עדיף שיהיה זהה לשם הפרויקט), ולא להשתמש באותו Namespace משני Assemblyים שונים.

ומה אם אנחנו בכל זאת מתעקשים לעשות משהו כזה? (כי למשל, יש לנו שתי גרסאות שונות של אותו DLL, ואנחנו רוצים להשתמש בשתיהן)

נוכל להוסיף להגדרות של הReference איזשהו AliasלAssembly, זה מתבצע דרך הSolution Explorer, בProperties של הReference המדובר:

220_1.png

לאחר מכן, אפשר לבקש להשתמש בAssembly הרצוי באמצעות הגדרה של extern alias, זו הצהרה שדומה להצהרה של using:

1
extern alias Cool1;

כעת, אם נרצה להשתמש בטיפוס כלשהו מהAssembly הרצוי, הדבר יתבצע כך:

1
Cool1::CoolNamespace.CoolClass

למשל:

1
Cool1::CoolNamespace.CoolClasscoolClass = new Cool1::CoolNamespace.CoolClass();

זה מזכיר קצת את מה שראינו על global:: בפעם הקודמת.

אפשר גם להשתמש בusing directive (טיפ מספר 13) כדי שהשימוש יהיה יותר כיפי:

1
using VeryCool = Cool1::CoolNamespace.CoolClass;

ואז:

1
VeryCool coolClass = new VeryCool();

כאמור, עדיף לא להגיע למצב הזה.

אם אתם משתמשים באותו DLL בשתי גרסאות שונות, צריכה להידלק אצלכם נורה אדומה, ולהבין שמשהו פה לא בסדר.

סופ"ש חיצוני מעולה!

שתף