ویرگول
ورودثبت نام
فرشید جهان منش
فرشید جهان منشیک عدد برنامه نویس دات نت .علاقه مند به تکنولوژی های روز. جوون و پر از انگیزه :) همینا برای شناختم کافی نیست؟!
فرشید جهان منش
فرشید جهان منش
خواندن ۳ دقیقه·۶ سال پیش

آیا این NULL ، Object است؟(#c)


خب سلام خدمت همه دوستان عزیز.یک داستانی که من همیشه داشتم سر این بود که این null بودن یک object رو چجوری چک کنم؟قطعا طریق های مختلفی برای این منظور هست و گفتم امروز اون هایی رو که من باهاشون آشنایی دارم و بنظرم باحال هستند رو بهتون معرفی کنم.مسائل گفته شده توی این مطلب همه برای c# هست:)


خب یکی از ساده ترین کارهایی که همیشه میکنیم چیه ؟ if و دیگر هیچ:)

if (myobject == null) { throw new ArgumentNullException(nameof(myobject)); }

قطعا همه با این شیوه اشنایی داریم و خب نیاز نیست سرش توضیحی داده بشه.

از زمان c# ورژن 7 به بعد میشه از عملگر is هم برای چک کردن null بودن یا نبودن استفاده کرد.

if (myobject is null) { throw new ArgumentNullException(nameof(myobject)); }

که چه میکنه که اون متغیر null هست یا خیر .

تا اینجاشم که چیزی نداشت:)

همون طور که همه میدونیم ، هر typeی توی دات نت ، داره از کلاس object ارثبری میکنه و به بیان دیگر ، والد هر type که ما میسازیم یا از قبل موجود هست ، کلاس object هست.داخل این کلاس یک متد بنام ReferenceEquals وجود داره که کد این متد رو پایین میزارم.( از طریق این سایت میتونید سورس کد دات نت کور رو ببینید).

public static bool ReferenceEquals(object? objA, object? objB) { return objA == objB; }

خب میبینیم که این تابع هم کار خیلی خاصی انجام نمیده.دو تا object (که صد البته هر کدومشون میتونن null باشن (به عملگر ? دقت کنید)) دریافت میکنه و یک مقایسه ساده از همون نوع مقایسه ساده خودمون که توی if انجام میدادیم ، انجام میده و نتیجه رو برمیگردونه.

if(object.ReferenceEquals(myobject,null)) { //bla bla bla :) }


خب اینم راه ساده سوم هست برای این منظور.

خب قضیه همینجا تموم نمیشه:)

توی c#7 یک امکان دیگ هم بود به اسم Discards.

حالا جریانش چیه؟بطور خیلی ساده و خلاصه ، یک یا چند متغیر کمکی هستند که داخل کد برنامه بهشون نیازی نداریم.این متغیر ها چیزی داخلشون ذخیره نمیشه و اصلا فضایی هم از حافظه نمیگیرن.

حالا مثال براش چی هست؟

_ = myobject ?? throw new ArgumentNullException(nameof(myobject));



خب کد بالا چک میکنه اگر myobject برابر null بود ، یک exception رخ میده و اگر هم نبود اتفاق خاصی نمیافته. _(underscore) همون discard هست .


خب قضیه به همینجا هم ختم نمیشه:)

یک راه دگ هم داریم براش که توی c# 9 رسید.

if(myobject is not null){ //some code }


خب is که قبلا هم بود (بالا تر یکم دربارش حرف زدیم).این دفعه not هم جلوش اومد.

اگر null , myobject نباشه وارد میشه (به ! میتونیم بگیم که اگر null بود وارد بشه)

متد Equals هم داخل کلاس object وجود داره که نسبت به ReferenceEquals کارهای بیشتری انجام میده.پیشنهاد میدم سورسش رو بخونید(لینک).(البته یکم سر بحث reference type ها و value type ها متفاوت کار انجام میده که توی خود سورس دات نت کور ، یک توضیح مختصری هم بالای کدش داده )

برای رسیدن به null checking هزاران راه است :) شما هم اگر دوست داشتید راه های مورد علاقتون رو بگید

:)

cبرنامه نویسیسی شارپcsharp
۷
۱
فرشید جهان منش
فرشید جهان منش
یک عدد برنامه نویس دات نت .علاقه مند به تکنولوژی های روز. جوون و پر از انگیزه :) همینا برای شناختم کافی نیست؟!
شاید از این پست‌ها خوشتان بیاید