حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

استفاده از آرایه ها به صورت pointer در سی شارپ

در زبان سی شارپ، می توان از آرایه ها به صورت Pointer استفاده کرد. یعنی Pointer ای تعریف کنیم که به یکی از خانه های آرایه اشاره می کند. اما مشکلی که وجود دارد این است که آرایه ها توسط GC مدیریت می شوند و ممکن است در طول اجرای عملیات GC آرایه ها در حافظه جابجا شوند، در حالی که ما Pointer ای که ایجاد می کنیم به آدرس حافظه یکی از خانه های آرایه اشاره می کند و این موضوع می تواند باعث بروز مشکل شود.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

برای حل این مشکل می توانیم از کلمه کلیدی fixed استفاده کنیم. کلمه کلیدی fixed به gc می گوید که آرایه مورد اشاره می بایست در حافظه ثابت مانده و مکان آن تغییری نکند. البته این موضوع می تواند باعث بروز به هم ریختگی حافظه شود، اما برای کار با آرایه بوسیله Pointer ها باید مکان آن را در حافظه ثابت کرد.در ادامه با مثالی با کاربرد این کلمه کلیدی آشنا می شویم، فرض کنید آرایه داریم و می خواهیم مقادیر آن را بوسیله Pointer ها در خروجی چاپ کنیم، در اولین قدم می بایست آرایه را بوسیله کلمه کلیدی fixed در حافظه ثابت نگه داریم:

unsafe
{
    int[] numbers = { 2, 6, 1, 3, 8, 7 };

    fixed (int* pointer = &numbers[0])
    {
        Console.WriteLine(*pointer);
    }
}

با اجرای کد بالا عدد 2 در خروجی چاپ می شود. حال می خواهیم خانه های دیگر آرایه را نیز در خروجی چاپ کنیم، آرایه ها به صورت خطی در حافظه قرار میگیرند، یعنی مقادیر به ترتیب و پشت سر هم در حافظه ذخیره شده اند و می توانیم بوسیله عملگر ++، pointer را یک خانه به سمت جلو حرکت دهیم. اما مشکلی که وجود دارد این است که pointer تعریف شده در قسمت fixed در بدنه آن قابل تغییر نیست، زیرا pointer به صورت readonly تعریف ایجاد می شود، به همین دلیل می بایست Pointer دیگری در بدنه fixed تعریف کرده و از آن استفاده کنیم، مانند کد زیر:

unsafe
{
    int[] numbers = { 2, 6, 1, 3, 8, 7 };

    fixed (int* pointer = &numbers[0])
    {
        Console.WriteLine(*pointer);
        int* tempPointer = pointer;
        tempPointer++;
        Console.WriteLine(*tempPointer);
    }
}

همانطور که مشاهده می کنید عملگر ++ بدون مشکل بر روی اشاره گر tempPointer کار می کند و عدد 6 بعد از عدد 2 در خروجی چاپ می شود. پس به خاطر داشته باشیم، در صورتی که بخواهیم اشاره گری برای آرایه ها تعریف کنیم، ابتدا باید مکان آن آرایه را در حافظه بوسیله کلیمه کلیدی fixed ثابت کنیم. ITPRO باشید

نویسنده: حسین احمدی

منبع: ITPRO


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات