DCSIMG
C# - שלמה גולדברג (הרב דוטנט)
Sign in | Join | Help

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

Browse by Tags

Exception handling in application
05 December 11 09:40 AM | Shlomo | 1 comment(s)
טיפול נכון בשגיאות הוא אחד הדברים המאתגרים בפיתוח אפליקציות, לדעתי אחד הדברים השגויים לעשות זה לכתוב בכל קטע קוד try, catch בלי לעשות כלום בקטע ה - catch רק כדי לבלום את התרסקות האפליקצייה. הסיבה שהגישה הזו לא נכונה לדעתי, היא ש"טיפול" מסוג זה (כלומר לא לטפל רק להתעלם) יגרום בהכרח להתרסקות האפליקצייה במקום אחר מכיוון שאם קוד מסויים התרסק ולא עשה את העבודה כמו שצריך סביר להניח שקוד אחר המבוסס על הקוד שהתרסק לא יעבוד כמו שצריך, ובסוף התהליך כשנתרסק לא נדע את הסיבה האמיתית להתרסקות האפליקציה...
Exception Message Box
29 November 11 11:45 AM | Shlomo | 6 comment(s)
מי לא כתב את הקוד הבא: try { } catch ( Exception ex) { MessageBox .Show(ex.Message); } ובכלל הצגת הודעות באפליקציות חלונאיות תתבצע הרבה פעמים בעזרת MessageBox. מתברר (משהו יחסית ישן) שהחברה של sql server פתחו MessageBox משלהם - בטח ראיתם מתי שהוא את החלון הבא: (אם עבדתם עם Sql Server Managment Studio) לחלון הזה יש כמה פיצ'רים מאוד נחמדים, ראשית הוא נראה הרבה יותר טוב מה - MessageBox הסטנדרטי, בנוסף יש בתחתית החלון אפשרות להעתקת הודעת השגיאה ולחצן נוסף להצגת הפרטים הנוספים: כדי שתוכלו להשתמש בזה...
הפעלת Linq Queries על פקדים המכילים Collections ללא חשיפה של IEnumerable מתאים
25 November 11 11:25 AM | Shlomo | 2 comment(s)
אחד מהיכולות החזקות של השפה שאנחנו משתמשים בהם רבות זהו היכולת להפעיל Linq to Objects על כל מי שמממש את: IEnumerable<T> ב - windows forms ישנם הרבה פקדים המכילים collections - כמו TabControl, TreeView ועוד. הבעייה עם כל הפקדים הללו שהם חושפים את IEnumerable הרגיל, (ללא T) מה שגורם לכך שאי אפשר להפעיל עליהם שאילתות לינק. כדי לתקן זאת ניתן להוסיף Extension Method מתאים לכל פקד ולהמיר את ה - IEnumerable לאחד שתומך ב - Generic, לדוגמא: internal static class Extension { internal static IEnumerable...
Cast from Generic type
23 October 11 10:15 AM | Shlomo | 3 comment(s)
אחד הדברים המפריעים בעבודה עם Generic Type, שאי אפשר לעשות להם casting לאובייקטים אחרים, לדוגמא: static void MyFunc<T>(T item) { Work(( Entity )item); } static void Work( Entity item) { } הקוד הא יזרוק שגיאה של: Cannot convert type 'T' to 'ConsoleApplication1.Entity' כדי לבצע בכל זאת המרה בין האובייקטים ניתן להשתמש ב - Convert.ChnageType בצורה הבאה: static void MyFunc<T>(T item) { Work(( Entity ) Convert .ChangeType(item, typeof ( Entity ))); } כדי לחסוך קצת זמן ולכתוב...
List with main item
09 October 11 10:51 AM | Shlomo | with no comments
הרבה פעמים יש לנו List של אובייקטים שאחד מהם אמור להיות האובייקט הראשי, לדוגמא רשימת טלפונים, רשימת אנשי קשר וכדומה. כדי לתמוך בזה בקלות בלי להצטרך בכל פעם לכתוב פונקצייה המחזירה את האובייקט הראשי כתבתי את הקוד הבא: public interface IItemWithMain { bool IsMain { get ; set ; } } public class ListWithMain <T> : List <T> where T : IItemWithMain { public T MainItem { get { return this .FirstOrDefault(x => x.IsMain); } set { var mainItem = MainItem; if (mainItem != null ) { mainItem.IsMain...
תגים:,
כתיבה למאפיינים של תמונה מקוד
21 June 11 12:15 PM | Shlomo | with no comments
לקבצי תמונה יש במאפיינים שלהם טאב שנקרא Details ובו מידע אודות התמונה (למשל הערות וכו'). כדי לכתוב ולקורא משם נתונים מקוד ניתן להוריד את הספרייה הזו אבל במידה וכל מה שאתם צריכים זה לכתוב למאפיין אחד תוכלו לכתוב את הקוד הבא. אנחנו משתמשים במחלקת PropertyItem ומשתמשים בפונקציות GetPropertyItem , SetPropertyItem של Image. Image img = Image .FromFile(imageFilePath); PropertyItem item = img.GetPropertyItem(0X9C9C); string value = Encoding .Unicode.GetString(item.Value); item.Value = Encoding .Unicode...
תגים:, ,
Attach web page to email
09 June 11 09:35 PM | Shlomo | 3 comment(s)
אתם מכירים את זה שלבוסים יש לפעמים דרישות מוזרות, קורה לכולם לא ? קחו למשל את הדרישה הבאה. לשלוח מייל כלשהו ולצרף למייל את תוכן הדף כפי שהוא עם כל הפרטים שהמשתמש כתב, כלומר - סוג של Print Screen. אבל היות שבוסים הם בוסים, ואם אחרי שמתווכחים איתם על המוזרות שבדרישה שלהם עדיין הם מתעקשים אז צריך לבצע את הבקשות שלהם. הדרך לעשות זאת היא לא מסובכת. (בדוגמא כאן אני יוצא מתוך הנחה שאתם מכירים כיצד שולחים מיילים מקוד) ראשית צריך לקבל את קוד ה - html הסופי, ואת זה ניתן לקבל במתודה render StringBuilder sb...
תגים:, , ,
boxing - unboxing
24 May 11 11:41 AM | Shlomo | 2 comment(s)
בתפוז עלתה השאלה, מהו boxing - להלן הסבר בסיסי. בעולם ה - NET המשתנים מחולקים לשני סוגים, אלה שנקראים value type ואלה שנקראים reference type, (נקרא להם val, ref בהתאמה) ההבדל המרכזי ביניהם הוא היכן הם ממוקמים בזיכרון כשמגדירים אותם, ה - val ממוקם במקום שנקרא stack, שנניח נראה ככה (לא בדיוק) name type value i int 10 c12 char f לעומת זאת האובייקטים מסוג ref ממוקמים במקום אחר הנקרא heap כשהגישה אליו היא דרך מצביע מה - stack i int 10 c12 char f p1 Perons 23F2A (address of p1 data) עכשיו נעבור לרגע לנקודה...
תגים:, ,
Collection Initializers for custom object
12 May 11 11:27 AM | Shlomo | with no comments
אחד הפיצ'רים הנחמדים שנכנסו ב - C# 3.0 הוא Collection Initializers. עד C# 3.0 יכולנו לכתוב קוד כזה: int [] arr = new int [] { 1, 2, 3, 34 }; מ - C# 3.0 אפשר גם לכתוב עבור Collections List < int > list = new List < int >() { 1, 2, 3, 34 }; Dictionary < string , int > dic = new Dictionary < string , int >() { { "a" , 1}, { "b" , 2}, { "c" , 3}, { "d" , 4}, }; שזה באמת נחמד. אבל יש דבר נוסף שטוב להכיר, מסתבר שכל אובייקט שמממש את ICollection<T...
תגים:,
yield
26 April 11 10:39 AM | Shlomo | 3 comment(s)
כמו שהבטחתי בפוסט הקודם אני אראה דרך קצרה יותר לממש את IEnumerable ללא מימוש עצמאי של IEnumerator בעזרת yield. ראשית נראה את הדוגמא ואז את ההסברים: הנה המחלקה מהפוסט הקודם: class PersonManager : IEnumerable { private List < Person > _persons; public PersonManager() { _persons = new List < Person >(); } public IEnumerator GetEnumerator() { } } כעת נממש את המתודה בעזרת yield. public IEnumerator GetEnumerator() { foreach ( var item in _persons) { yield return item; } } למעשה אפשר פשוט להשתמש...
תגים:, ,
foreach
21 April 11 06:53 AM | Shlomo | 8 comment(s)
מה זה foreach וכיצד מממשים אותו. לאלו שנכנסים לעולם הפיתוח ולומדים #C, כשמגיעים ללולאות לומדים שיש כמה סוגים, כשהנפוצים הם, for ו - foreach, ההסבר ללולאת for הוא די פשוט, לדוגמא: int [] arr = { 1, 2, 3, 4, 5 }; for ( var i = 0; i < arr.Length; i++) { Console .WriteLine(arr[i]; } מבצעים את שורת הקוד שבתוף גוף הלולאה כגודל המערך ובכל פעם מדפיסים מספר אחד מתוך המערך. אותה תוצאה בתחביר foreach foreach ( int item in arr) { Console .WriteLine(item); } איכשהו המשתנה item יהיה כל פעם הערך הבא במערך, ובפוסט...
תגים:,
Aggregate
18 March 11 02:36 AM | Shlomo | 3 comment(s)
שימוש נחמד ב - Aggregate של LINQ זה היכולת לחבר מערך כלשהו למחרוזת אחת המופרדת עם פסיקים (עבור שאילתת in). לדוגמא: int [] arr = { 1, 2, 3, 4, 5, 6 }; string s = arr.Select(x => x.ToString()).Aggregate< string >((x, y) => x + "," + y); יחזיר: "1,2,3,4,5,6" המשתנה x יכיל בכל סיבוב של הלולאה את הערכים הקודמים ואילו המשתנה y יכיל כל פעם את המשתנה הנוכחי. אפשר להריץ את הקוד הבא כדי להווכח בכך: string s = arr.Select(x => x.ToString()).Aggregate< string >((x, y)...
תגים:, ,
propdm - snippet for a property with DataMember Attribute
17 March 11 07:25 PM | Shlomo | with no comments
אחד ה - snippets המוכרים ביותר הוא prop שזה קיצור דרך ליצירת automatic property. אם תכתבו prop ותלחצו פעמיים על טאב ייוצר הקוד הבא: public int MyProperty { get ; set ; } אני כותב הרבה מחלקות עבור wcf ואני מעדיף לשים את ה - DataMember על המאפיינים אפילו שלא חייבים, כדי לקצר את התהליך יצרתי את ה - snippet שתוכלו להוריד אותו מכאן, לאחר מכן ייבאו אותו בעזרת ה - Code Snipped Manager תחת תפריט Tools, ולאחר מכן כתיבה של propdm ייוצר הקוד הבא: [ DataMember ] public int MyProperty { get ; set ; }
תגים:,
How to get the return value of main
12 January 11 01:35 PM | Shlomo | with no comments
מתודת Main יכולה להחזיר או void או int, בדרך כלל היא תהיה void אבל לפעמים נרצה לכתוב אפליקציות שיחזירו ערך כלשהו (בדרך כלל האם הצליח או מספר שגיאה), בפוסט הזה נראה כיצד אפשר לקרוא את הערך שחוזר מתוך אותם שפליקציות שמחזירות int. לצורך הדוגמא נניח שיש לנו Console Application אחד שמקבל שלושה פרמטרים (שני מספרים וסימן החישוב) ומחזיר את התוצאה. הקוד יראה כך: static int Main( string [] args) { int num1 = int .Parse(args[0]); int num2 = int .Parse(args[1]); int res = 0; switch (args[2]) { case "+"...
תגים:,
הוספה של פונט מקוד - חלק שני
04 January 11 02:19 PM | Shlomo | 1 comment(s)
לא מזמן פרסמתי פוסט - כיצד להוסיף פונט מקוד . מסתבר שהחברה מפרוייקט אתגר לא נחים - וכרגע הם רוצים להוסיף את הפונט כ - Embedded Resource (כדי שלא יצטרכו להעתיק את הפונט כל פעם יחד עם קובץ ה - exe) השלב הראשון הוא די פשוט, יש להוסיף את קובץ הפונט ל - Resources. השאלה הנשאלת כעת: כיצד להוסיף את הפונט, מסתבר שיש מתודה בשם AddMemoryFont, אבל למרבה הצער זה מקבל IntPtr ולכן צריך לכתוב את הקוד הבא: IntPtr pointer = Marshal .AllocHGlobal( Resources .ahronbd.Length); Marshal .Copy( Resources .ahronbd, 0, pointer...
תגים:,
More Posts Next page »