شاید شما هم در بسیاری از کدهای سی شارپ کدهایی همانند  int? i = 3 را دیده باشید و همیشه از خود پرسیده باشید که علامت سوالی که پس از عبارت int آمده است ، به چه معناست ؟

به راستی فرق بین int و ?int در چیست ؟

بگذارید مستقیم برم سر اصل ماجرا ... (بر خلاف اکثر سایت ها و کتابها ! ، در نت نیک اصلا تاریخچه نویسی و داستان گویی اعتقاد نداریم و صاف میریم سر اصل مطلب !)

در حالت عادی وقتی دارین متغیر هاتونو بوسیله دستوراتی مثل int و یا double و ... می نویسین متغیر هایی که می سازین نمی تونن مقدار null داشته باشن.
چون همانطور که می دونین ما دو نوع متغیر (نوع داده ای) در سی شارپ داریم:

  • Value Type
  • Refrence Type

نوع های داده ای value type  مثل همین int و double و .... می مونن که یک مقدار واحد رو درون خودشون نگهداری می کنن و بدین صورت هستند که با تعریفشون یک بخش از حافظه رم به متغیر شما اختصاص داده میشه و مقدار متغیر توی همون حافظه نگهداری میشه ...

نوع های داده ای refrence type همانند کلاس های سی شارپی مثل SqlConnection و یا کلاس های دست ساز خودتون می مونن که برای استفاده ازشون باید بصورت SqlConnection con = new SqlConncection() عمل کنین و باید حتما از دستور new استفاده کنین و این نوه های داده ای می تونن حاوی چندین خصوصیت (عدد و رشته و ...) و چندین تابع باشن (متد) و نوع پیشرفته تری نسبت به نوع های value type هستند.

استفاده از دستور new برای اینه که شما در اصل دارین یک نمونه (instance) از کلاستون می سازین.

بعنوان مثال من یک کلاس ماشین دارم که توی خودش خصوصیاتی مثل رنگ ، مدل ، اندازه ، حداکثر سرعت و .... داره.

حال می تونم ازش یک نمونه ماشین پراید بسازم  و بعد یک نمونه ماشین بنز بسازم و ....

در اینجا کلاس یکیه ولی نمونه هایی که ازش ساخته شده کاملا مجزاست .. پراید خصوصیات خودشو داره و بنز هم خصوصیات خودش رو ...

خوب چطوریه که اطلاعات این نمونه ها روی رم قاطی پاطی نمیشه و این نمونه ها از هم مجزا میشن ؟

وقتی شما دارین یک نمونه (instance) از یک کلاس می سازین ، روی رم یک بخشی برای نگهداری اطلاعات نمونه ایجاد شده در نظر گرفته میشه و آدرس این بخش از رم درون نمونه شما قرار می گیره ، بنابراین در مثال بالا ، درون متغیر pride  و متغیر benz آدرسی از رم که اطلاعات رنگ و ... درونش ذخیره شده قرار می گیره.

NULL چیست ؟

وقتی که یک نمونه refrence type به هیچ آدرسی از حافظه اشاره نکنه ، با مقدار null پر میشه.

بنابراین null بدین معنی است که برای نمونه هنوز بخشی از حافظه اختصاص داده نشده و بنابراین نمونه ما به هیچ آدرسی از حافظه اشاره نمی کنه.


ضرورت نیاز به متغیرهای NULLABLE :

در برخی از موارد بالاخص مواقعی که با دیتابیس دارین کار می کنین ، وقتی بخواین داده ای از دیتابیس رو درون یک متغیر مثلا از نوع int بریزین ، این احتمال وجود خواهد داشت که مقدار null دریافت کنین و از اونجایی که متغیرهای value type نمی تونن مقدار null درون خودشون جای بدن ، با خطای مهلک مواجه خواهید شد.
(خطای مهلک خطایی است که کلا فعالیت سایت رو متوقف می کنه)
راه حل چیست ؟
برای جلوگیری از این مشکل ، مایکروسافت نوع های داده ای شبیه به ?int و ?double و .... رو معرفی کرده است ، درون این نوع های داده ای مقدار null هم می تونیم بریزیم ، بدون اینکه خطای مهلک دریافت کنیم ...

همانطور که بیان شد ضرورت نیاز به متغیر های nullable که بتونن مقدار null درون خودشون نگهداری کنن بیشتر در زمان کار با دیتابیس مشخص میشه ، زیرا اکثر فیلد های دیتابیس خاصیت قرار گرفتن NULL درونشون رو دارن و دریافت و استفاده از این اطلاعات و ریختن اونها درون متغیر های غیر nullable همیشه ممکنه موجب دریافت خطای مهلک بشه ...

برای اطلاعات بیشتر می تونین به مقاله زیر مراجعه نمایید:
موفق باشید

نوشته شده در تاریخ جمعه 17 آبان 1392    | توسط: ح.م    | طبقه بندی: آموزش سی شارپ،     | نظرات()