پارامترها و مقادیر برگشتی در مقابل داده ی سراسری
اجازه دهید نگاه دقیق تری به تبادل داده با تابع ها از طریق پارامترها و مقادیر برگشتی(return values) داشته باشیم. به طور خلاصه، به کد زیر نگاهی بیندازید:
class Program
{
static void ShowDouble(ref int val)
{
val *= 2;
WriteLine($"val doubled = {val}");
}
static void Main(string[] args)
{
int val = 5;
WriteLine($"val = {val}");
ShowDouble(ref val);
WriteLine($"val = {val}");
}
}
نکته: این کد کمی با کدی که قبلا در این فصل دیدیم کمی متفاوت است. یعنی کدی که در آن از نام متغیر myNumber در Main() استفاده کردیم. این موضوع، این حقیقت را نشان می دهد که متغیرهای محلی می توانند نام های یکسانی داشته باشند و اما در کار یکدیگر دخالت نکنند.
اکنون آن را با کد زیر مقایسه کنید:
class Program
{
static int val;
static void ShowDouble()
{
val *= 2;
WriteLine($"val doubled = {val}");
}
static void Main(string[] args)
{
val = 5;
WriteLine($"val = {val}");
ShowDouble();
WriteLine($"val = {val}");
}
}
در کدها، نتیجه ی تابع های ShowDouble() یکسان است. هیچ دستور سفت و سختی برای استفاده از یک تکنیک به جای تکنیک دیگر وجود ندارد و هردوی این تکنیک ها کاملاً معتبر هستند، اما ممکن است بخواهید دستورالعمل های زیر را لحاظ کنید:
برای شروع، همان طور که در شروع این موضوع گفتیم، نسخه ی ShowDouble() که از مقدار سراسری(global value) استفاده می کند، تنها از مقدار سراسری val استفاده می کند. برای استفاده از این نسخه، باید از این متغیر سراسری استفاده کنیم. این، همه منظوره بودن تابع را کمی محدود می کند و یعنی اینکه اگر ما قصد ذخیره ی متایج را داشته باشیم، باید به طور مداوم مقدار متغیر سراسری را در دیگر متغیرها کپی کنیم.
علاوه بر این، داده های سراسری(global data) ممکن است توسط کدها، در جاهای دیگری در اپلیکیشن ما، تغییر داده شوند؛ که می تواند باعث نتایج غیرقابل پیش بینی شود(در زمانی که خیلی دیر شده است، مقادیر ممکن است بدون اینکه متوجه شوید تغییر کنند).
البته، می توانیم استدلال کنیم که این سادگی، در حقیقت باعث می شود درک کد ما سخت تر شود. مشخص کردن صریح پارامترها به ما این امکان را میدهد که با یک نگاه ببینیم چه چیزی در حال تغییر است. اگر تابعی به صورت FunctionName(val1, out val2) داشته باشیم، فوراً می فهمیم که val1 و val2 متغیرهای مهمی هستند و val2 وقتی که تابع کامل شود، یک مقدار جدید خواهد داشت.
برعکس، اگر این تابع پارامتری نداشته باشد، آنگاه نمی توانیم هیچ فرضی در مورد اینکه چه دادههایی دستکاری شده است، داشته باشیم. برای تبادل داده، میتوانید از هر دو تکنیک استفاده کنید. به طور کلی، به جای داده های سراسری(global data) از پارامترها استفاده کنید. با این حال، مطمئناً مواردی وجود دارد که دادههای سراسری ممکن است مناسبتر باشند، و مطمئناً استفاده از این تکنیک خطا نیست.
- بازدید: 43
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.