שאלות עמרציות בסישארפ
-
-
מה פשר הסינטקס הזה:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiAddress + urlParameters);
long JSDateNow = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds; אם כבר קבעתי לו סוג באתחול, למה צריך להכניס עוד פעם את הסוג בסוגריים? ולמה בלי זה זה מביא שגיאה? -
אם יש int מוקצה, ואני רוצה להכפיל אותו עד כדי שיגיע לדרגת long, אני מקבל מספר שלילי. אפילו אם אני לא מכניס את התוצאה לתוך int אלא לתוך long חדש. כלומר:
int i = 1535468465;
long l = i * 568465465;
Debug.WriteLine(l); // -1253193111 -
לפי מה שקראתי על dynamic, זה מזהה בזמן ריצה את הטייפ ונותן לו את כל המתודות והאופרטורים המתאימים. אבל למעשה אם יש לי JSON שאותחל עם dynamic, ויש לו מפתח עם ערך בולייאני, אני לא מצליח להשתמש בו בהתנייות, אם אני כותב
if(config.one)
זה פולט שגיאה, ורק אם אני מפרשif(config.one== true)
זה עובד?
פורסם במקור בפורום CODE613 ב26/04/2017 00:01 (+03:00)
-
-
- זה מושגי type checked וcasting. קאסטינג זה שבירה טיפוס לאחר - זה סיכון לשגיאת זמן ריצה או לאיבוד נתונים ורוצים שתהא מודע לזה.
גם אם קבעת באתחול, אתה יכול לטעות במהלך הקוד ולהציב שם ערך לא תקין, לכן יש כלל שמחייב אותך לראות מול העיניים שאתה ממיר כל הצבה.
(מבחינת נוחות ויזואלית, כשזה בשורה אחת ההצהרה והאתחול זה נח לכתוב var ולא לראות את הטיפוס כתוב פעמיים...).\
המושג קאסטינג כולל שתי מצבים:
א. הצבה של מופע ממחלקת בן שמוחזק ע"י משתנה מסוג אב למשתנה מסוג הבן. (זה השורה הראשונה - הWebRequest זה מחלקת אב שיש לה מתודה סטטית בשם Create שמחזירה מופע של אחד מבניה: HttpWebRequest, FtpWebRequest וכו'. בגלל הטיפוסיות הקשוחה הפונקציה Create מחזירה WebRequest שזה אב של המחלקות הבנים אך זה לא ספציפית הבן, מה שמחייב אותך כמפתח שיודע (לפעמים) את הבן הספציפי לעשות קאסט כדי להשתמש בחברים (מתודות ומאפייינים) שיש רק לבן הספציפי).
ב. המרה של טיפוס אחד לאחר בידיעה שהמחלקה החדשה תומכת בהמרה הזו. אתה כמפתח מחלקה יכול לכתוב מתודה שתטפל בהמרה של טיפוס כל שהוא לטיפוס שלך, וזה מה שעשה המפתח של מחלקת long - הוא עשה שהיא תוכל לקבל double שעובר קאסטינג אליה. וזה השורה השניה.-
כשאתה כותב int * int חוזר תוצאת int, ובכפל בשורה השניה שתי הצדדים הם int (כל מספר בקוד שאיננו גבוה וללא שברים הוא מפורש כint). ההשמה לlong היא אחרי שכבר בוצעה ההכפלה (זה כלל בהמון שפות תכנות שקודם מבוצע הביטוי ואח"כ ההשמה). אם אתה רוצה שהכפל יחזיר long אתה צריך שהמכפיל יהיה long, או ע"י השמה או ע"י ציון אחרי המספר של האות L. ואז הכלל הוא שמספר כפול מספר בעל זיכרון גדול יותר התוצאה תהא מסוגו.
ככה:int i = 1535468465;
long l = 568465465;
l = l* i;
Debug.WriteLine(l);
או ליטרל לונג שזה ע"י הוספת האות L בסוף:int i = 1535468465;
long l = i * 568465465L;
Debug.WriteLine(l); -
אני לא מספיק מכיר dynamic אבל אכן ניסיתי ועבד לי כפי שרחמים ציין. אולי תראה כמה שורות קוד נוספות שנוכל להתחקות אחרי העניין המעניין.
פורסם במקור בפורום CODE613 ב26/04/2017 10:17 (+03:00)
- זה מושגי type checked וcasting. קאסטינג זה שבירה טיפוס לאחר - זה סיכון לשגיאת זמן ריצה או לאיבוד נתונים ורוצים שתהא מודע לזה.
-
תודה רבה!
זה הקוד של הדיינמיק:
public static dynamic config; config = JsonConvert.DeserializeObject<dynamic>( File.ReadAllText(configPath) ); MessageBox.Show(config.one.ToString()); //true if (config.one) MessageBox.Show("True"); else MessageBox.Show("false");
וזו השגיאה:
An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll Additional information: לא ניתן להמיר באופן מפורש את הסוג 'Newtonsoft.Json.Linq.JValue' ל- 'bool'. קיימת המרה מפורשת (האם חסרה המרה?)
פורסם במקור בפורום CODE613 ב26/04/2017 12:34 (+03:00)