RegisterClientScriptBlock - מעניין:

דונג

New member
Add Reference

הבנתי ש Using זה סתם קיצור, ע"מ שלא אצטרך לכתוב את כל ההררכיה לאובייקט מסויים, ומה שיש תחת ה Refernces אלוה DLL's המיובאים. כאשר ביצעתי Add Reference ל DLL שאני כתבתי, הוא הועתק לתיקייה ה Bin שלי. אך יש כמה Reference שמופיעים באופן דיפולטי בפרוייקט חדש, כגון : System System.Data System.Xml וכו' מדוע ה DLL's של הנ"ל לא מועתקים לתיקיית ה BIN שלי ?
 

דונג

New member
אם את ה DLL שאני יצרתי ועשיתי

לו Add Reference אני אמחק מתיקיית ה BIN של הפרויקט, ואעביר לתיקיית ה GAC (וכמובן אדאג שה PATH מצביע לשם) - זה יעבוד, נכון ?
 

yuval k

New member
כי הם של ה-Framework...

הם חלק מה-redist, החבילה הבסיסית שיש לכל משתמש עם יכולת הרצת אפליקציות דוטנטיות, ולכן אין צורך לתת עותק שלהם
 

דונג

New member
Dispose ../images/Emo151.gif

אני רואה בדוגמאות ב MSDN שקוראים למתודה Dispose, גם עבור אובייקטים בסוג SqlConnection, לאחר שביצענו לו Close, וגם ל SqlDataAapter שכבר לא דרוש. האם נכון יהיה הסיק מכך, שרצוי לקרוא ל Dispose, תמיד, בכל אובייקט שקיימת עבורו המתודה הנ"ל, בסיום השימוש בו ? אגב, Dispose למיטב ידיעותי, Dispose עושה 2 דברים : 1. דברים פרטניים השונים מאובייקט לאובייקט 2. מוחקת את המצביע לאובייקט (ובכך מסמנת ל GC שניתן לפנות את הזכרון), האם מדוייק ?
 

gilad g

New member
המממ

"האם נכון יהיה הסיק מכך, שרצוי לקרוא ל Dispose, תמיד, בכל אובייקט שקיימת עבורו המתודה הנ"ל, בסיום השימוש בו ?" כן. לגבי המסקנות שהסקת - זה לא ממש נכון. ה-GC מזהה לבד אילו אובייקטים עליו לנקות. Dispose מנקה דברים שה-GC לא יכול לנקות, הווה אומר Unmanaged resources. לדוגמא, חיבור למסד נתונים, קבצים פתוחים, HWnd-ים למיניהם, וכו'.
 

דונג

New member
כלומר...

בכל אובייקט שאני משתמש, לבדוק אם יש לו Dispose, אם יש - לקרוא לו בסיום => זו המסקנה הכי חשובה
בנוסף, מעניינים אותי 2 דברים : 1. כיצד ה GC מזהה מה עליו לנקות ? (בקצרה, לא צריך מאמר שלם :)) 2. מה מייחד את ה Unmanaged resources מ managed resources ? מה קובע האם משהו יכול להיות מנוקה אוטומטית ע"י GC, ומה לא ?
 

gilad g

New member
המממ

1. אם יכולתי להסביר את זה בקצרה, הייתי מסביר. הסבר כזה בהחלט מצריך מאמר, כי המנגון של ניקוי אובייקטים אוטומטי הוא לא פשוט
2. Managed Memory הוא זיכרון המנוהל ע"י ה-CLR. כל אובייקט (על שדותיו, ומשתניו), שעשית לו new במסגרת ה-CLR (קרי: דוט נט), הוא אובייקט מנוהל (managed). מנוהל ע"י מי? ע"י ה-CLR וה-GC. כל שאר הדברים, הם unmanaged. בדר"כ כשיש לך אובייקט שיש לו Dispose, הניקוי של ה-unmanaged resources ייעשה במתודה זו.
 

דונג

New member
בעעעע ../images/Emo13.gif

1. OK, את לינק למאמר ?
2. בהמשך לסעיף 1, איך אתה מוצא מאמרים טובים ורלוונטים לכל נושא ? פשוט מריץ חיפוש ב MSDN ? GOOGLE ? (חשוב לי ע"מ שאמצא גם בעצמי
) 2. אז לא יותר הגיוני שה GC, בין כל שאר הדברים שהוא עושה, יקרא ל Dispose של האובייקטים, ובכך הוא פוטר אותי מלעשות כן ?
 

gilad g

New member
....ובקשר להרצת חיפושים

קודם נתחיל בזה שהחיפוש של MSDN הוא נוראי. אם אני מחפש משהו על נושא מסוים, אני מריץ חיפוש על הנושא בגוגל. (וכמו שיובל אמר לא מזמן, מוסיף "site:msdn.microsoft.com"). בדר"כ אני סתם מדפדף בין עמודי ה-MSDN, ואם אני מוצא משהו מעניין, אני קורא אותו, ואם הוא טוב, אני שם אותו במועדפים
 

yuval k

New member
ה-GC שייך ל-CLR, לא לשפה מסויימת -

לכן התשובה היא בעצם "כן".
 

Zeliran

New member
אבל בעצם ברוב השפות אין, לא?

רק ליותר חדשות הוסיפו..לא?
 

yuval k

New member
יש את זה בשפות דוט-נטיות וגם ב-Java

ב-++C רגיל אין את זה, למשל. גם לא ב-Pascal... הרעיון הוא, שברגע שהתוכנה שלך לא רצה ישירות על המערכת, אלא על שכבה שיכולה לנטר את מצבהּ - אתה יכול גם לטפל בזיכרון שהתוכנה צורכת, דרך ה"שכבה" הזו (CLR).
 

דונג

New member
כלומר...

הפקודה עצמה מבצעת עבורי את ה new ? אם כן, הבנתי, רק חבל שזה כך, זה פחות קריא, פחות מובן, ופחות סטנדרטי... אגב, מדוע בכלל צריך את זה ? מה היתרון של ה NEW ? מדוע לא רק להגדיר משתנים, ולהשתמש בהם...
 

nattygur

New member
לא בדיוק.

הזכרון בתוכנית מחולק לשני חלקים Heap ו Stack. ה Stack מחזיק משתנים שגודלם ידוע (Int,Long) וה Heap משתנים שגודלם לא ידוע (אוביקטים). משתנה שמוגדר להצביע על אוביקט, המשתנה עצמו, בגודל קבוע והוא נמצא ב Stack ומצביע על האוביקט עצמו שהוא בגודל משתנה ונמצא ב hEAP. כאשר מגדירים משתנה: MyObj o. נוצר ב Stack משתנה מסוג Reference וזהוא. המשתנה הזה עדיין לא מצביע לשום מקום ב Heap בו נמצא האוביקט. ולכן אם תנסה להשתמש בו תקבל Error. בסופו של דבר המשתנה צריך להצביע על אובייקט ב Heap ואת זה ניתן להשיג בשני דרכים : א) אם משתמשים ב new אז נוצר אוביקט חדש על ה HEAP והמשתנה ב Stack מצביע עליו. ב) אם נוצר אובייקט ע"י אובייקט אחר ניתן להעביר את כתובת האוביקט למשתנה ב Stack וכך הוא מצביע על אובייקט ב Heap.
 
למעלה