View Full Version : پارامتر بدون تعریف وضعیت
A.Nemati
شنبه 05 آبان 1386, 11:36 صبح
یک پارامتر ورودی میتونه سه وضعیت داشته باشه: Var ، Const و بدون تعریف.
فرق این سه تا دقیقا چیه؟
میدونم شاید سوالم خیلی ابتدایی باشه اما چند تناقض در علما باعث شد که مطرحش کنم.
m-khorsandi
شنبه 05 آبان 1386, 15:50 عصر
Value Parameter
Variable Parameter
Constant Parameter
Out Parameter
متغیرها رو میشه به 4 شکل به تابع یا پروسیجر پاس کرد، که توضیح 3 تای اونها رو در زیر مینویسم:
یک روش By Value هست که روش معمول ارسال مقدار متغیر هست.
یک روش By Reference هست که آدرس متغیر رو پاس میکنی
یک روش هم Constant Parameter هست که مانند یک Const معمولی یا یک متغیر Read-Only کار میکنه به این معنی که مقداری رو نمیتونی به اون تخصیص بدی و مقدار اون پارامتر ثابت میمونه.
وقتی یک متغیر رو به شکل By Value ارسال کنی، تابع یا پروسیجر یک کپی از اون ایجاد میکنه و تغییراتی که روی اون اعمال میکنید روی متغیر اصلی تاثیری نداره. اما ارسال به شکل By Reference به جای کپی از پوینتر استفاده میکنه و در واقع آدرس متغیر رو در اختیار داره و حاصل اون تغییر مقدار اصلی متغیر در تابع فراخونی کننده میشه.
A.Nemati
یک شنبه 06 آبان 1386, 08:30 صبح
ممنون، ولی حالا سه سوال:
1- وقتی متغیر را به صورت یک Const پاس میدم، حافظه دیگری اشغال نمیشه؟ یعنی از نظر اشغال حافظه مانند By Reference نیست؟
2- در برخی موارد مشاهده کردم که وقتی متغیر به صورت By Reference هم پاس میشه، تغییر در اون، مقدار اصلی رو هم عوض میکنه، فکر میکنید علت این مسئله چیه؟
3- متغیری که به واسطه پارامتر By Reference، در تابع ایجاد میشه، کی آزاد میشه؟
vcldeveloper
یک شنبه 06 آبان 1386, 22:29 عصر
- وقتی متغیر را به صورت یک Const پاس میدم، حافظه دیگری اشغال نمیشه؟ یعنی از نظر اشغال حافظه مانند By Reference نیست؟
Const مثل پارامترهایی که بصورت By Value پاس میشند عمل میکنه. مورد استفاده آن در جایی هست که نمی خواید بصورت اتفاقی مقدار یک متغیر را در داخل یک تابع تغییر بدید. پارامترهای const را نمی توان به عنوان پارامتر By Reference به یک تابع دیگر پاس کرد. یکی از کاربردهای مهم const در زمان پاس کردن مقادیر string یا Dynamic Array هست؛ در صورتی که نیازی به تغییر مقدار این نوع از داده ها در داخل تابع ندارید، آنها را بصورت const تعریف کنید. در صورت انجام این کار، Compiler از اضافه کردن یک بلوک مخفی try-finally و کد Clean-up برای این نوع از داده ها، در داخل تابع، صرف نظر می کند و این باعث افزایش سرعت اجرای تابع می شود.
- در برخی موارد مشاهده کردم که وقتی متغیر به صورت By Reference هم پاس میشه، تغییر در اون، مقدار اصلی رو هم عوض میکنه، فکر میکنید علت این مسئله چیه؟
فکر کنم مفهوم By Reference را با By Value اشتباه گرفتید. وقتی پارامتری بصورت By Reference پاس داده میشه (یعنی قبل از تعریف پارامتر از کلمه کلیدی var استفاده می کنید)، تغییر در مقدار پارامتر بر روی متغیر اولیه تاثیر میزاره.
اگر می خواید که این تغییر بر روی متغیر اولیه تاثیر نزاره، باید پارامتر را بصورت By Value پاس بدید (همون تعریف عادی پارامتر که قبلش هیچ کلمه کلیدی استفاده نمیشه). بعضی از داده ها حتی اگر بصورت By Value یا Const تعریف بشند، باز بصورت By Reference پاس میشند، مثل آرایه های دینامیک، string یا Object ها.
متغیری که به واسطه پارامتر By Reference، در تابع ایجاد میشه، کی آزاد میشه؟
متغیرهایی که برای پارامترهای By Value ایجاد میشند، در زمان خروج از تابع آزاد میشند. برای پارامترهای By Reference متغیر جدیدی در تابع تعریف نمیشه.
A.Nemati
دوشنبه 07 آبان 1386, 15:21 عصر
با تشکر.
درسته، من مفهوم این دو را اشتباه گرفتم.!
بعضی از داده ها حتی اگر بصورت By Value یا Const تعریف بشند، باز بصورت By Reference پاس میشند، مثل آرایه های دینامیک، string یا Object ها.
منظور من همین بود، دقیقا چه نوع دادههایی؟
vcldeveloper
سه شنبه 08 آبان 1386, 07:17 صبح
منظور من همین بود، دقیقا چه نوع دادههایی؟
...مثل آرایه های دینامیک، string یا Object ها.
______________________________
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.