ارسال آرگومان ها به روش ارجاع
آرگومانها را میتوان به کمک ارجاع ارسال کرد. این بدان معناست که شما آدرس متغیری را ارسال میکنید نه مقدار آن را. ارسال با ارجاع زمانی مفید است که شما بخواهید یک آرگومان که دارای مقدار بزرگی است (مانند یک آبجکت) را ارسال کنید. در این حالت وقتی که آرگومان ارسال شده را در داخل متد اصلاح میکنیم مقدار اصلی آرگومان در خارج از متد هم تغییر میکند.
در زیر دستورالعمل پایهای تعریف پارامترها که در آنها به جای مقدار از آدرس استفاده شده است نشان داده شده :
returnType MethodName(ref datatype param1) { code to execute; }
فراموش نشود که باید از کلمه کلیدی ref استفاده کنید. وقتی یک متد فراخوانی میشود و آرگومانها به آنها ارسال میشود هم باید از کلمه کلیدی ref استفاده شود.
MethodName(ref argument);
اجازه دهید که تفاوت بین ارسال با ارجاع و ارسال با مقدار آرگومان را با یک مثال توضیح دهیم.
1: using System; 2: 3: public class Program 4: { 5: static void ModifyNumberVal(int number) 6: { 7: number += 10; 8: Console.WriteLine("Value of number inside method is {0}.", number); 9: } 10: 11: static void ModifyNumberRef(ref int number) 12: { 13: number += 10; 14: Console.WriteLine("Value of number inside method is {0}.", number); 15: } 16: 17: public static void Main() 18: { 19: int num = 5; 20: 21: Console.WriteLine("num = {0}n", num); 22: 23: Console.WriteLine("Passing num by value to method ModifyNumberVal() ..."); 24: ModifyNumberVal(num); 25: Console.WriteLine("Value of num after exiting the method is {0}.n", num); 26: 27: Console.WriteLine("Passing num by ref to method ModifyNumberRef() ..."); 28: ModifyNumberRef(ref num); 29: Console.WriteLine("Value of num after exiting the method is {0}.n", num); 30: } 31: }
num = 5 Passing num by value to method ModifyNumberVal() ... Value of number inside method is 15. Value of num after exiting the method is 5. Passing num by ref to method ModifyNumberRef() ... Value of number inside method is 15. Value of num after exiting the method is 15.
در برنامه بالا دو متد که دارای یک هدف یکسان هستند تعریف شدهاند و آن اضافه کردن عدد 10 به مقداری است که به آنها ارسال میشود. اولین متد (خطوط 9-5) دارای یک پارامتر است که نیاز به یک مقدار آرگومان (از نوع int) دارد. وقتی که متد را صدا میزنیم و آرگومانی به آن اختصاص میدهیم (خط 24)، کپی آرگومان به پارامتر متد ارسال میشود. بنابراین مقدار اصلی متغیر خارج از متد هیچ ارتباطی به پارامتر متد ندارد. سپس مقدار 10 را به متغیر پارامتر (number) اضافه کرده و نتیجه را چاپ میکنیم.
برای اثبات اینکه متغیر num هیچ تغییری نکرده است مقدار آن را یکبار دیگر چاپ کرده و مشاهده میکنیم که تغییری نکرده است. دومین متد (خطوط 15-11) نیاز به یک مقدار با ارجاع دارد. در این حالت به جای اینکه یک کپی از مقدار به عنوان آرگومان به ان ارسال شود آدرس متغیر به آن ارسال میشود. حال پارامتر به مقدار اصلی متغیر که زمان فراخوانی متد به آن ارسال میشود دسترسی دارد. وقتی که ما مقدار متغیر پارامتری که شامل آدرس متغیر اصلی است را تغییر میدهیم (خط 13) در واقع مقدار متغیر اصلی در خارج از متد را تغییر دادهایم. در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش میدهیم و مشاهده میشود که مقدار آن واقعاً تغییر کرده است.
سلام و خداقوت حسابی….
یعنی کیف کردما…!! بالاخره یه آموزش با کیفیت و تمیز و ساده.
ایشالا اجرت با مولا علی نه اصلا با هر امامی که دلت میخواد…
تا مینویسم یه سؤالم بپرسم: به نظرتون بهترین زبان برای برنامه نویسی و طراحی یه سامانه تو مایه های انتخاب واحد دانشجوها واین تیپی چیه؟! نسبتا سی شارپ بلدم… (واسه یاد گرفتن asp خیلی باید وقت بذارم؟! php و python چطورن؟! میخوان کارم با کیفیت بشه و سریع 🙂 !!)
سلام، نظر لطفتونه
شما که سی شارپ بلدین همون ASP رو ادامه بدین. هر کدوم از این زبان ها رو که مسلط بشین میشه باهاش یه کار با کیفیت زد. چون همه قوی هستن و صد البته همه چی به تسلط شما بستگی داره
سلام .با تشکر از زحمات شما
لطفا در مورد ارسال دو یا چند آرگومان و دریافت آنها از متد فراخوانی شده توضیح بدهید . من تک آرگومان رو یاد گرفتم اما در مورد چند آرگومان مشکل دارم.
با تشکر
خیلی خیلی ممنونم
خواهش می کنم
سلام،ضمن تشکر از آموزشهای خوبتون.سوالی داشتم از خدمتتون. حرف n در کنار بعضی از جانگهدار ها چه مفهومی میتونه داشته باشه؟ و چرا در خروجی اثرش اعمال نشده؟
سلام دوست عزیز
حرف n به معنای new line هست و یک خط خالی یا همون فاصله ایجاد می کنه مثل بعد از عدد 5 در خط اول ابتدا یک خط خالی ایجاد شده و بعد …passing نوشته شده. یه بار حروف n رو حذف بفرمایید و با خروجی بالا مقایسه کنید بهتر متوجه عرایض بنده میشین
فکر میکنم این ویژگی در نسخه های جدید به ویژوال استودیو اضافه شده . چون من که از نسخه 2012 استفاده میکنم در چنین شرایطی فقط همون حرف n مثل یک رشته معمولی به خروجی منتقل میشه
بله درست می فرمایید، شما تو نسخه های قبلی باید n\ بنویسید
سلام.
آموزشهایتان کامل، دقیق، مفید و کاربردی است. بسیار ممنونم.
سلام…خواهش می کنم