
01-20-2011
|
 |
|
|
تاریخ عضویت: Sep 2009
محل سکونت: Tehran
نوشته ها: 4,838
سپاسها: : 1,717
2,520 سپاس در 663 نوشته ایشان در یکماه اخیر
|
|
انواع دادهها در زبان سي شارپ
انواع دادهها در زبان سي شارپ
كپي برابر اصل!
در زبانهاي قديميمثل C و ++C دادهها هميشه به صورت Value - Type تعريف ميشدند، به اين صورت كه وقتي يك متغير يا يك شيء تعريف ميشود، در حافظه Stack ذخيره شده و در صورت نياز از آن حافظه خوانده ميشود. اما استفاده از Stack و متغيرهاي Value - Type يك مشكل دارند!
فرض كنيد يك تابع نوشتيد كه 2 مقدار int از ورودي گرفته و حاصل جمع آن را در مقدار اول به صورت زير نگه ميدارد:
Void add(int a،int b){ a+=a+b; } حال يك تابع، 2 مقدار a و b را به تابع add ميدهد و تابع را به صورت زير فراخواني ميكند.
Int a=10,b=20; Add(a,b); Print(a); انتظاري كه ما داريم اين است كه دستور (printa) مقدار 30 را در خروجي چاپ كند، اما اين اتفاق نميافتد! علت چيست؟
وقتي يك تابع فراخواني ميشود از پارامترهاي ورودياي كه قرار است به تابع داده شود، يك كپي تهيه و به تابع داده ميشود و پس از پايان فراخواني، آن كپي از بين ميرود. سادهتر بگوييم، همين مثال بالا را ببينيد وقتي تابع add فراخواني ميشود، يك كپي از 2 متغير a و b تهيه شده و به تابع add داده ميشود. سپس تابع فراخواني ميشود و زماني كه كار تابع addتمام شده و كنترل را به تابع فراخواننده ميدهد، كپيهاي تهيه شده از متغيرهاي a و bاز بين ميروند. پس هيچ وقت دستور (printa) مقدار 30 را چاپ نميكند. خب، حال مشكل بالا را چگونه حل كنيم؟ به 2 روش ميتوان اين مشكل را حل كرد.
1 ـ مقدار بازگشتي؛ تابع add يك مقدار بازگشتي داشته باشد و زماني كه كارش تمام شد حاصل را به عنوان خروجي برگرداند.
اين روش يك مشكل دارد و آن هم اين است كه دستور return حداكثر يك مقدار بر ميگرداند و اجراي دستور return به منزله اين است كه كار تابع تمام شده است، در نتيجه هيچ وقت نميتوان چند دستور return پشت سرهم داشت. اين روش براي مثال بالا جوابگو است، اما اگر آرگومانهاي ورودي تابع بيشتر از ? تا باشند و مقدار تغير داده شده آنها براي ما مهم باشند ديگر اين روش جوابگو نيست (اين مشكل در زبان سي شارپ قابل حل است، يعني يك تابع چند متغير را برميگرداند، پياده سازي اين روش در سي شارپ بر عهده خواننده گذاشته شده است.)
2 ـ استفاده از اشارهگرها؛ وقتي شما يك متغير اشارهگر تعريف ميكنيد، اين اشارهگر به يك خانه حافظه اشاره دارد و در واقع آدرس آن خانه را در خود نگه ميدارد و هر تغييري در مقدار متغير ميتواند مقدار آن خانه حافظه را تغيير دهد. اما در مورد مشكل بالا، اگر پارامترهاي ورودي يك تابع از نوع اشارهگر باشند، وقتي بخواهيم آن تابع را فراخواني كنيم بايد آدرس متغير را به تابع بدهيم. پس از آن اگر هر تغييري درون تابع روي متغيرهاي ورودي رخ بدهد، چون آدرس متغير بوده، تغييرات در حافظه نوشته ميشود. پس ديگر نگران از بين رفتن تغييرات نيستيم و نيازي هم به استفاده از دستور return براي بازيابي مقدار تغيير داده شده نداريم (البته اين بدان معنا نيست كه يك تابع هيچ مقداري را بر نگرداند، اين امر به نحوه برنامهنويسي شما مربوط است). به اين روش، فراخواني از نوع ارجاع گفته ميشود، يعني به جاي اين كه يك كپي از يك متغير به تابع داده شود، آدرس آن يا ارجاع آن به تابع داده ميشود.
بسيار خب، در زبان سي شارپ متغيرها 2 دسته هستند. دسته اولValue - Type ها هستند كه دقيقا رفتاري مشابه متغيرها در زبان C يا++ C دارند. يعني در Stack ذخيره ميشوند و اگر به عنوان يك پارامتر به تابع داده شدند، يك كپي از آنها به تابع داده ميشود و... دادههايValue - Type در زبان سي شارپ به صورت structure يا enumeration تعريف ميشوند و در بالاترين سطح خود بعد از كلاس Object از كلاس ValueType به ارث ميرسند.
نوع ديگر دادهها در زبان سي شارپ، دادههاي Reference- Type هستند. اين نوع دادهها رفتاري متفاوت با متغيرهايValue - Type دارند.
وقتي يك متغير به صورت Reference-Type تعريف ميشود، خود متغير در حافظه Stack ذخيره ميشود كه خود يك اشارهگر است و اين اشارهگر به خانههاي حافظه Heap اشاره ميكند. اين متغير اگر به عنوان پارامتر به يك تابع داده شود و درون تابع تغييري روي متغير حاصل شود، در بيرون از تابع نيز ديده ميشود. چراكه وقتي به يك تابع داده ميشود، در واقع يك اشارهگر است كه به خانههاي حافظه در Heapاشاره ميكند. داده Reference-Type بايد از نوع class يا Interfaceيا delegate باشند.
اما سوال اصلي در اينجا اين است كه اگر يك متغير Value - Type را بخواهيم به يك تابع بدهيم به طوري كه فراخواني از نوع ارجاع باشد، چه اتفاقي ميافتد؟ آيا زبان سي شارپ اين امكان را به ما ميدهد كه با يك متغير Value - Type رفتاري شبيه نوع دادههاي Reference-Type داشته باشيم؟ در مقالات بعدي به اين سوال جواب داده خواهد شد.
__________________
and the roads becomes my bride
|
جای تبلیغات شما اینجا خالیست با ما تماس بگیرید
|
|