در این مقاله از سری مقاله های آموزش سی شارپ به بررسی چگونگی بکارگیری پارامترهای تابع در زبان سی شارپ می پردازیم..
در درس قبلی، به طور کامل نحوه کار با تابع ها در سی شارپ و فراخوانی و استفاده آن ها را آموزش دادیم. تا حدودی به آموزش نحوه تعیین و ارسال پارامترهای تابع هم پرداختیم. اما در این درس به صورت اختصاصی قابلیت ها و کارکردهای پارامترها را بررسی خواهیم کرد.
اولین چیزی که به بررسی آن خواهیم پرداخت، تغییردهنده های ref و out یا modifiers هستند. زبان سی شارپ همانند اکثر زبان های برنامه نویسی دیگر، بین متغیرهای ارسال با مقدار “by value” و ارسال با رفرنس “by refrence” تفاوت قائل می شود.
حالت پیش فرض در زبان سی شارپ، ارسال با مقدار یا “by value” است. این حالت به معنای آن است که وقتی شما یک متغیر را به تابع ای به عنوان پارامتر ارسال می کنید، درواقع یک کپی از آن شی را می فرستید و نه رفرنس به آدرس عمل واقعی متغیر. از طرف دیگر این کار به این معنی است که شما می توانید تغییرات و عملیات مورد نظر خود را بر روی متغیر پارامتر ارسالی انجام دهید. بدون این که شی اصلی آن متغیر را در حافظه دستکاری نمایید و به عبارت دیگر هر کاری بر روی پارامتر در درون تابع انجام می دهید، بر روی نسخه کپی آن اجرا می شود نه متغیر اصلی. با استفاده از واژه های کلیدی ref و out می توانید عملکرد فوق را تغییر داده و نسخه اصلی یک متغیر را به جای مقدار آن به تابع ارسال نمایید.
کد مثال زیر را مطالعه نمایید :
static void Main(string[] args) { int number = 20; AddFive(number); Console.WriteLine(number); Console.ReadKey(); } static void AddFive(int number) { number = number + 5; }
در کد مثال فوق، یک متغیر عددی به نام number از نوع integer تعریف کرده و مقدار 20 را به آن می دهیم. سپس این متغیر را به تابع AddFive() ارسال نموده سپس مقدار 5 واحد را به آن اضافه می کند. اما آیا متغیر واقعی number تغییر می کند؟
جواب خیر است، مقدار 5 به نسخه کپی متغیر number اضافه شده و فقط درون تابع مورد اشاره تغییر کرده است. زیرا ما یک نسخه کپی از متغیر number را ارسال کرده ایم، نه رفرنس به شی اصلی آن. این روش حالت پیش فرض در سی شارپ بوده و در بیشتر موارد مقصود ما هم همین است.
اما اگر بخواهید مقدار شی اصلی متغیر number را تغیر دهید، بایستی کلید واژه ref را همانند کد زیر به پارامتر اضافه نمایید :
static void Main(string[] args) { int number = 20; AddFive(ref number); Console.WriteLine(number); Console.ReadKey(); } static void AddFive(ref int number) { number = number + 5; }
همانطور که در کد فوق مشاهده می کنید، ما علاوه بر این که در هنگام تعریف تابع، واژه کلیدی ref را به کار برده ایم، در هنگام فراخوانی تابع هم استفاده شده است.
اگر برنامه فوق را اجرا کنید، خواهید دید که مقدار اصلی متغیر number تغییر کرده است، نه نسخه کپی آن.
تغییردهنده out modifier بسیار شبیه ref عمل می کند. هر دو آن ها باعث می شود تا نسخه اصلی و رفرنس متغیر به عنوان پارامتر ارسال شود و نه مقدار آن. اما دارای دو تفاوت عمده با هم هستند :
تا اینجا، توابعی که تعریف کردیم، تعداد مشخصی پارامتر را در هنگام تعریف یا فراخوانی دریافت می کردند. اما مواردی وجود دارد که ممکن است شما بخواهید تابع مورد نظرتان تعداد متفاوتی پارامتر را در هر بار فراخوانی دریافت و ارسال کند. این کار با ارسال یک متغیر مثل آرایه به تابع همانند روش زیر امکان پذیر است :
static void GreetPersons(string[] names) { }
البته فراخوانی این نوع تابع ها کمی پیچیده تر از حالت معمولی است، به صورت زیر :
GreetPersons(new string[] { "John", "Jane", "Tarzan" });
روش فوق کاملا درست است، اما می توان با استفاده از واژه کلیدی Params آن را به صورت زیر بهتر نوشت :
static void GreetPersons(params string[] names) { }
کد فراخوانی فوق همانند فراخوانی به صورت زیر است :
GreetPersons("John", "Jane", "Tarzan");
مزیت دیگر استفاده از کلید واژه Params این است که شما می توانید پارامترهای خالی (2re, Parameters) را هم به تابع ارسال کنید.
در هنگام استفاده از Params، تابع می تواند انواع دیگری از پارامترها را نیز دریافت کند، منتهی پارامترهای Params بایستی در انتها تعریف شوند. از طرف دیگر فقط از یک پارامتر Params در تعریف و فراخوانی هر تابع می توان استفاده کرد.
کد مثال زیر، مثال کاملی از نحوه استفاده از Params در سی شارپ است :
static void Main(string[] args) { GreetPersons(0); GreetPersons(25, "John", "Jane", "Tarzan"); Console.ReadKey(); } static void GreetPersons(int someUnusedParameter, params string[] names) { foreach(string name in names) Console.WriteLine("Hello, " + name); }
با دیگر مقاله های آموزش سی شارپ همراه ما باشید..