بررسی Reference Type ها در زبان برنامه نویسی سی شارپ

بررسی Reference Type ها در زبان برنامه نویسی سی شارپ

در این پست از وبسایت پرووید، در رابطه با بررسی Reference Type ها در زبان برنامه نویسی سی شارپ صحبت خواهیم کرد. به ادامه ی مطلب بروید.

در قسمت قبل از این آموزش در وب سایت پرووید در رابطه با Value Type ها در زبان برنامه نویسی سی شارپ صحبت کردیم. در سی شارپ Data Type ها براساس اینکه مقدار خود را به چه صورت در حافظه ذخیره میکنند، به سه دسته ی Value Type و Reference Type و Pointer Type تقسیم می شوند. در این قسمت از این آموزش از وب سایت پرووید در رابطه با Reference Type ها صحبت خواهیم کرد.

بررسی Reference Type ها

برخلاف اتفاقی که برای Value Type ها در زبان سی شارپ رخ میدهد، یک Reference Type مقدار خود را به طور مستقیم در فضایی از حافظه که به آن اختصاص داده شده است، ذخیره نمی کند. در عوض یک Reference Type در آن فضایی از حافظه که به آن اختصاص داده شده است، آدرس یک مکان دیگر از حافظه را ذخیره میکند که درآن خانه از مقصد، مقدار واقعی متغیر قرار میگیرد. به عبارت دیگر یک Reference Type حاوی یک Pointer به یک مکان دیگر از حافظه است، که داده در آنجا قرار دارد. برای مثال فرض کنید که یک متغیر از نوع String و با نام S شبیه به کد زیر تعریف کرده ایم.

string s = "Hello World!!"; 

تصویر زیر نحوه ذخیره شدن این متغیر در درون حافظه را نشان می دهد.

همانطور که در این تصویر مشاهده می کنید، یک فضای تصادفی یا یک مکان تصادفی در حافظه سیستم با آدرس 0x803200 برای متغیر S در نظر گرفته شده است. اما مقدار متغیر S کلمه Hello World است در این خانه از حافظه قرار داده نشده است، بلکه آدرس یک مکان دیگر از حافظه (0x600000) که در آن مکان مقدار Hello World ذخیره شده است در این آدرس قرار می گیرد. بنابراین Reference Type ها در زبان سی شارپ در درون مکانی از حافظه که به آن اختصاص داده شده است، آدرس یک مکان دیگر را ذخیره میکنند نه یک مقدار واقعی را. لیستی که در ادامه میبینید تمامی Data Type های زبان سی شارپ که به صورت Reference Type پیاده سازی می شوند را نشان می دهد.

  • String
  • Array
  • Class
  • Delegate

بررسی Pass by Reference

زمانی که یک Reference Type را به عنوان یک متغیر از یک متد به یک متد دیگر پاس می دهید، یک کپی از آن متغیر تولید نمی شود، بلکه آدرس آن متغیر به متد دوم تحویل داده می شود. بنابراین اگر مقدار آن متغیر در متد دوم تغییر کند، این تغییرات در مقدار متغیر اول نیز تاثیرگذار خواهد بود. کدی که در قسمت زیر مشاهده میکنید، این موضوع را نشان میدهد.

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}

static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);

    Console.WriteLine(std1.StudentName);
}

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

همانطور که در قسمت بالا نیز مشاهده میکنید، یک شی از کلاس Student با نام Stu1 ایجاد شده  است و سپس به متد ChangeReferenceType تحویل داده شده است. دقت کنید که آدرس متغیر Std1 به متد ChangeReferenceType ارسال می شود و نه مقدار واقعی آن. بنابراین زمانی که متد ChangeReferenceType اقدام به تغییر دادن پروپرتی StudentName می کند، در واقع مقدار این Property در متغیر Std1 تغییر کرده است. و از آنجایی که هر دو متغیر Std1 و Std2 به یک مکان یکسان از حافظه اشاره میکنند، تغییر در هرکدام از آن ها بر روی دیگری نیز قابل مشاهده است.

بررسی Null

در زبان برنامه نویسی سی شارپ مقدار پیش فرض Reference Type ها مقدار Null می باشد. زمانی که یک Reference Type مقداردهی اولیه یا اصطلاحاً Initialize نشده است، مقدار درون آن Null می باشد. برای مثال فرض کنید یک متغیر از نوع String و یا هر Reference Type دیگری را تعریف میکنید و مقداری را برای آن در نظر نمیگیرد. در چنین مواردی مقدار درون این متغیر Null خواهد بود. این به این معنی است که فضایی از حافظه که به این متغیر اختصاص داده شده است، به هیچ فضایی دیگری از حافظه اشاره نمی کند. بنابراین در درون آن مقدار Null ذخیره شده است. این موضوع در تصویر زیر نیز نشان داده شده است.

در زبان برنامه نویسی  سی شارپ یک Value Type نمی تواند Null باشد چرا که در درون آن یک مقدار قرار میگیرد و نه یک آدرس از حافظه.

بسته ی آموزش ویدئویی مباحث پیشرفته در برنامه نویسی سی شارپ

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی مباحث پیشرفته در برنامه نویسی سی شارپ دیدن کنید.

با این وجود متغیرهایی که از نوع Value Type هستند حتما باید قبل از استفاده، مقداردهی شده باشند. اگر این اتفاق نیافتد کامپایلر یک خطا ایجاد میکند. کدی که در قسمت زیر مشاهده میکنید نحوه استفاده کردن از یک متغیر با نام i بدون اختصاص دادن یک مقدار به آن را نشان میدهد.

void someFunction()
{
    int i;

    Console.WriteLine(i);
}

نکته مهم دیگری که باید آن را ذکر کنیم این است که Field های درون یک کلاس که از یک Value Type هستند، می توانند مقداردهی نشوند. دقت کنید که Field های درون یک کلاس و نه متغیرهای درون یک متد. این نوع از Field ها یک مقدار پیش فرض براساس Data Type مورد استفاده دارند. برای مثال برای int مقدار صفر و برای bool مقدار False. این موضوع در کد زیر نشان داده شده است.

class myClass
{
    public int i;
}

myClass mcls = new myClass();

Console.WriteLine(mcls.i);

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

نکته مهم دیگری که باید به آن اشاره کنیم، این است که در از سی شارپ ورژن دوم Nullable Type ها معرفی شده اند که با استفاده از آن ها می توانیم مقدار Null را در Value Type ها قرار بدهیم. به عبارت دیگر می توانیم یک Value Type را بدون مقداردهی کردن آن تعریف کرده و در درون آن مقدار Null را قرار بدهیم.

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه تمامی دوستان عزیز قرار گرفته باشد. از شما دعوت می‌کنیم که از دیگر آموزش های ما در رابطه با زبان سی شارپ استفاده کنید. لیست کامل این آموزش ها را می توانید در پست مربوط به آموزش کامل توسعه نرم افزار با سی شارپ مشاهده کنید.

مرتضی گیتی
بدون نظر

ارسال نظر

نظر
نام
ایمیل
وب سایت