PDA

نسخه کامل مشاهده نسخه کامل : عدم گرفتن خطا



iranch
03-07-2015, 18:46
درود و سلام

چرا اینجا با اینکه من null رو بهش دادم باز هم کامپایلر اعضای اون کلاس رو بهم نشون میده و حتی کامپایل میکنم، ارور نداره..تا وقتی که اجرا بشه ؟
به نظرتون نباید قبل از runtime error اینجا خودش ارور بده؟

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Msba
04-07-2015, 18:33
خیر. از دید شما، در بهترین حالت می توانست یک warning بدهد.
دقت کنید آنالیز کد به صورت flow توسط کامپایلر صورت بدین معنا نیست بیاید ببیند آیا شما متغیری را null کرده اید که بعد بخواهید بدان دسترسی داشته باشید یا خیر. کامپایلر null شدن متغیر را درک می کند و فرض بر آن است که این null کردن عمدی بوده و در جایی دیگر از برنامه این null بودن قابل استفاده است و یا قصد خام سازی متغیر خود را داشته ایم.
هر کامپایلر یک optimization level دارد که نسبت به آن این حرکت Flow تغییر می کند. یعنی برنامه ی شما با یک سطح optimization بالا، خط های :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
را نخواهد داشت گویی که نوشته نشده است. اما باز این بهینه سازی کاری به null شدن و استفاده از null ندارد. در اینگونه موارد که خود برنامه نویس نیز نمی داند عنصرش null هست یا نه از بررسی null متغیر های ? و یا try catch استفاده می کند.
اضافه: optimization در زمان های native تر پر رنگ تر است.
مطالب بیشتر optimization:
Microsoft ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
DotnetPerl ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

موفق باشید.

_H2_
05-07-2015, 01:02
سلام
بادیدن تاپیک تان یک مطلب را یادم آمد، گفتم جهت اطلاع عمومی بیان کنم، اعتراف میکنم فقط کمی به موضوع بحث مرتبط است... ولی هیجان انگیز است ...!
در نسخه آتی VS2015 که احتمالا در همین هفته های آتی و کمی قبل از Win10 عرضه خواهد شد، اپراتور جدید "?." اضافه شده که از بروز خطاهای nullrefernce جلوگیری خواهد کرد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

استفاده مکرر و سلسه مراتبی این اپراتور هم کدنویسی و هم فهم کد را راحت میکند و نیاز به استفاده مکرر از if برای بررسی null را تا حد زیادی کاهش میدهد...
a.?[5].?c.?d(123).?e