یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

جمعه, ۲ اسفند ۱۳۹۲، ۰۹:۴۸ ب.ظ

نگاهی به مباحث پایه (قسمت اول)

     یکی از مباحث پایه در همه زبان های برنامه نویسی مبحث Types و مطالعه نوع پیاده سازی هر زبان برای ارائه انواع پایه  و در نهایت ترکیب آنها برای دستیابی به انواع پیچیده تر مثل Structure ها و Classهاست.
در C# از دیدگاه نوع تخصیص حافظه دو گروه Type یا نوع مختلف وجود دارد که Value Types و Reference Types نامیده میشوند.

انواع Value Types

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

من برای نشان دادن این موضوع از یک مثال خیلی ساده استفاده کرده ام که از آنجاییکه نوع استفاده من از Pointerها از دیدگاه کامپایلر Safe و ایمن نیست اجبارا باید آن را در داخل یک بلاک unsafe قرار داده و ضمنا به کامپایلر گوشزد کنم که این کد را unsafe کامپایل نماید.

 

Namespace TypesInCSharp

{

    class Program

    {

        static void Main(string[] args)

        {

            unsafe

            {

                int j = 10;

                int* ip = &j;

                Console.WriteLine(“The value of j which means {0} stored in {1} location.”, j, (int)ip);

                Console.WriteLine(“Please press <Enter> key to exit…”);

                Console.ReadLine();

            }

        }

    }

}

 

 

در سیستم من پس از اجرا خروجی چیزی شبیه به زیر خواهد بود:

 

The value of j which means 10 stored in 92465428

Please press………………………………………..

 

تفسیر ساده این مثال به این صورت است که با تعریف متغیر j فضایی در حافظه تخصیص (Allocate) داده میشود که آدرس این ناحیه از حافظه  92465428 می باشد. در داخل این فضا عدد 4 قرار گرفته است.

زمانیکه متغیر دیگری با همین مقدار (یعنی مقدار 10) تعریف شود لزوما یک فضای جداگانه با یک آدرس جدا گانه در حافظه ایجاد خواهد شد که هیچ ارتباطی با متغیر قبلی ندارد. این دقیقا همان اتفاقیست  که یک متغیر Value Type مثل j وارد یک متد میشود و بنابر این با توجه به اینکه یک کپی از این متغیر ایجاد شده است، هر تغییری در داخل متد انجام شود هیچ تاثیری بر مقدار اصلی متغیر نخواهد داشت. این موضوع در مثال ساده زیر نشان داده شده است:

 

namespace TypesInCSharp

{

    class Program

    {

        static void Main(string[] args)

        {

            unsafe

            {

                int j = 10;

                Console.WriteLine("The value of p before method call is {0} ", j);

                TryToChangeValue(j);

                Console.WriteLine("The value of p after method still unchanged and is {0} ", j);

                Console.WriteLine("Please press <Enter> key to exit...");

                Console.ReadLine();

            }

        }

        public static void TryToChangeValue(int p)

        {

            p = 20;

            Console.WriteLine("The value of p inside method is {0} ", p);

        }

    }

}

 

متد TryToChangeValue سعی بیهوده ای میکند که مقدار پارامتر وارد شده را تغییر دهد. J  قبل از ورود به داخل متد دارای مقدار 10 میباشد . در ادامه j به عنوان پارامتر وارد متد میشود. در داخل متد چنانچه خروجی برنامه نیز نشان میدهد با اینکه پارامتر ورودی تغییر داده شده اما مقدار آن بدون تغییر باقی می ماند. زیرا که متد مذکور فقط به یک کپی از متغیر j دسترسی دارد و توانایی تغییر در متغیر اصلی J را ندارد.

 

The value of p before method call is 10

The value of p inside method is 20

The value of p after method still unchanged and is 10

Please press <Enter> key to exit...

 

  اما در مثال زیر:

 

namespace TypesInCSharp

{

    class SimpleClass

    {

        public int i ;

    }

    class Program

    {

        static void Main(string[] args)

        {

            unsafe

            {

                SimpleClass simpleClass = new SimpleClass();

                simpleClass.i = 10;

                Console.WriteLine("The value of simpleClass.i before method call is {0} ", simpleClass.i);

                TryToChangeValue(simpleClass);

                Console.WriteLine("The value of simpleClass.i after method changed and is {0} ", simpleClass.i);

                Console.WriteLine("Please press <Enter> key to exit...");

                Console.ReadLine();

            }

        }

        public static void TryToChangeValue(SimpleClass simpleclass)

        {

            simpleclass.i = 20;

            Console.WriteLine("The value of simpleclass.i inside method is {0} ", simpleclass.i);

        }

    }

}

 

که خروجی زیر را ایجاد میکند ماجرا به گونه دیگریست

 

The value of simpleClass.i before method call is 10

The value of simpleclass.i inside method is 20

The value of simpleClass.i after method changed and is 20

Please press <Enter> key to exit...

 

                    ادامه دارد ...

موافقین ۰ مخالفین ۰ ۹۲/۱۲/۰۲
مهران حسین نیا

Reference Type

Types

Value Type

unsafe

C#

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی