آموزش سی شارپ

آموزش سی شارپ

آموزش برنامه نویسی از مبتدی تا پیشرفته
آموزش سی شارپ

آموزش سی شارپ

آموزش برنامه نویسی از مبتدی تا پیشرفته

آموزش بکارگیری پارامترهای تابع در زبان سی شارپ

در این مقاله از سری مقاله های آموزش سی شارپ به بررسی چگونگی بکارگیری پارامترهای تابع در زبان سی شارپ می پردازیم..

 

بکارگیری پارامترهای تابع در زبان سی شارپ

در درس قبلی، به طور کامل نحوه کار با تابع ها در سی شارپ و فراخوانی و استفاده آن ها را آموزش دادیم. تا حدودی به آموزش نحوه تعیین و ارسال پارامترهای تابع هم پرداختیم. اما در این درس به صورت اختصاصی قابلیت ها و کارکردهای پارامترها را بررسی خواهیم کرد.
اولین چیزی که به بررسی آن خواهیم پرداخت، تغییردهنده های ref و out یا modifiers هستند. زبان سی شارپ همانند اکثر زبان های برنامه نویسی دیگر، بین متغیرهای ارسال با مقدار “by value” و ارسال با رفرنس “by refrence” تفاوت قائل می شود.
حالت پیش فرض در زبان سی شارپ، ارسال با مقدار یا “by value” است. این حالت به معنای آن است که وقتی شما یک متغیر را به تابع ای به عنوان پارامتر ارسال می کنید، درواقع یک کپی از آن شی را می فرستید و نه رفرنس به آدرس عمل واقعی متغیر. از طرف دیگر این کار به این معنی است که شما می توانید تغییرات و عملیات مورد نظر خود را بر روی متغیر پارامتر ارسالی انجام دهید. بدون این که شی اصلی آن متغیر را در حافظه دستکاری نمایید و به عبارت دیگر هر کاری بر روی پارامتر در درون تابع انجام می دهید، بر روی نسخه کپی آن اجرا می شود نه متغیر اصلی. با استفاده از واژه های کلیدی ref و out می توانید عملکرد فوق را تغییر داده و نسخه اصلی یک متغیر را به جای مقدار آن به تابع ارسال نمایید.

 

دوره آموزش سی شارپ : آموزش ref modifier

کد مثال زیر را مطالعه نمایید :

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 تغییر کرده است، نه نسخه کپی آن.

 

آموزش CSharp : آموزش تغییر دهنده out modifier

تغییردهنده out modifier بسیار شبیه ref عمل می کند. هر دو آن ها باعث می شود تا نسخه اصلی و رفرنس متغیر به عنوان پارامتر ارسال شود و نه مقدار آن. اما دارای دو تفاوت عمده با هم هستند :

  1. متغیری که به ref modifier ارسال می شود، حتما بایستی قبل از فراخوانی تابع مقداردهی اولیه شده باشد. اما این مورد درباره out صورت نکرده و شما می توانید یک متغیر مقداردهی نشده را به out ارسال کنید.
  2. از طرف دیگر شما نمی توانید بدون این که به یک متغیر out مقدار بدهید، تابع مورد نظر خود را به پارامتر out فراخوانی کنید. درست است که می توانید یک متغیر مقداردهی اولیه نشده را به یک تابع به عنوان out Parameter ارسال کنید، اما برای استفاده از آن در بدنه تابع، بایستی مقدار جدیدی را برای آن تعریف کنید.

 


آموزش زبان سی شارپ : آموزش تغییر دهنده Params modifier

تا اینجا، توابعی که تعریف کردیم، تعداد مشخصی پارامتر را در هنگام تعریف یا فراخوانی دریافت می کردند. اما مواردی وجود دارد که ممکن است شما بخواهید تابع مورد نظرتان تعداد متفاوتی پارامتر را در هر بار فراخوانی دریافت و ارسال کند. این کار با ارسال یک متغیر مثل آرایه به تابع همانند روش زیر امکان پذیر است :

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);
}

 

با دیگر مقاله های آموزش سی شارپ همراه ما باشید..

آموزش سی شارپ-آموزش توابع در C#

به بخش جدید آموزش سی شارپ خوش آمدید.

یک تابع یا Function در C#، به شما امکان می دهد مجموعه ای از دستورات را درون یک ظرف مشخص قرار داده و در هر جای برنامه که لازم داشتید، با به کار بردن نام تابع آن ها را فراخوانی کنید. در برنامه نویسی پروژه ها، شما گاهی مجبور می شوید تا یک قطعه کد را در چندین محل مختلف مورد استفاده قرار دهید، در این حالت است که تابع ها (Function) به کمک شما می آیند. از طرف دیگر، به وسیله توابع شما می توانید کدهای پروژه خود را به بخش های مجزا و قابل تفکیک از هم تبدیل کنید.

آدرس صفحه وبی که میخواهید نمایش دهید را Paste کنید


در زبان C#، یک تابع (Function) به صورت کلی زیر تعریف می شود :

< visibility > < return type > < name > ( < parameters > )

{

< function code >

}

برای فراخوانی یک تابع، کافی است نام آن را نوشته و سپس یک پرانتز باز و بسته در مقابل آن قرار دهید. اگر تابع شما دارای یک یا چند پارامتر باشد، لیست پارامترها را هم در همین پرانتز قرار می دهید. به صورت زیر :

FunctionName ( Parameter1 , Parameter2  ,… ) ;

در کد مثال زیر یک تابع به نام Dostuff را فراخوانی کرده ایم :

public void DoStuff()

{

Console.WriteLine("I'm doing something...");

}

در کد تابع فوق، اولین بخش فراخوانی تابع، یعنی کلمه public، تعیین کننده میدان دید تابع در سطح برنامه بوده و تعیین آن اختیاری است. میدان دید یک تابع مشخص می کند آیا سایر توابع و کلاس های موجود در برنامه امکان مشاهده و دسترسی تابع مورد نظر را خواهند داشت یا خیر. Public به معنای عمومی بوده و یعنی سایر کلاس ها و توابع دیگر برنامه می توانند به تابع فوق دسترسی داشته باشند.

نکته :

اگر میدان دید برای یک تابع تعیین نشود، به صورت پیش فرض Private یا خصوصی در نظر گرفته می شود. Private تابع های هم کلاس تابع مورد نظر امکان دسترسی مستقیم به تابع را دارند.

در درس های بعدی آموزش سی شارپ به طور کامل به بررسی میدان دید یا Scope توابع خواهیم پرداخت. بخش بعدی قسمت فراخوانی تابع تعیین نوع داده ای مقدار خروجی تابع است. این مقدار می تواند هر نوع داده ای خاص در C# بوده و یا Void تعیین شود. به کار بردن کلمه Void به این معناست که این تابع هیچ مقدار خاصی را بر نمی گرداند. از طرف دیگر همانطور که می بینید پرانتزهای مقابل نام تابع خالی هستند و به این معناست که این تابع هیچ پارامتری را دریافت نمی کند. بیایید کمی تابع فوق را به صورت زیر تغییر دهیم :

public int AddNumbers(int number1, int number2)

{

int result = number1 + number2;

return result;

}

در کد جدید تقریبا همه بخش ها را تغییر دادیم. تابع اکنون یک مقدار عددی integer را به عنوان خروجی برمی گرداند، در پارامتر عددی integer دریافت کرده و به جای چاپ متن در خروجی، یک عملیات ریاضی انجام داده و خروجی آن را به عنوان متغیر result بر می گرداند. این کار به این معناست که هر موقع نیاز داشتیم، در هر بخشی از کد برنامه می توانیم تابع فوق را فراخوانی کرده و با ارسال دو عدد مورد نظر به آن، حاصل جمع آن ها را به صورت خروجی دریافت کنیم، تا این که هر بار لازم باشد کد عملیات ریاضی را مجددا بنویسیم. تابع AddNumber() را می توانیم به راحتی توسط کد زیر در هر جای برنامه فراخوانی کرد ه و در حجم و زمان کدنویسی خود صرفه جویی زیادی بکنیم.

int result = AddNumbers(10, 5);

Console.WriteLine(result);

همانطور که اشاره کردیم، این تابع یک مقدار عددی را باز می گرداند. هنگامی که در یک تابع، هر نوع داده ای غیر از Void را تعیین می کنیم، به این معناست که تابع را مجبور نموده ایم تا یک مقدار برگشتی داشته باشد.

نکته :

اگر خط کد return را از کد مثال فوق بردارید، خواهی دید که در هنگام اجرای برنامه، کامپایلر بر بروی این تابع ارور داده و پیام زیر را صادر می کند :

'AddNumbers(int, int)': not all code paths return a value

پیام فوق به ما یادآوری می کند که تابع فوق، علی رغم این که یک مقدار خروجی برای آن در نظر گرفته شده، اما هیچ خروجی را بر نمی گرداند. اما می خواهیم خروجی تابع را کنترل کنید، می توانید کدی مثل کد زیر را به تابع اضافه کنید :

public int AddNumbers(int number1, int number2)

{

int result = number1 + number2;

if(result > 10)

{

return result;

}

}

اما باز هم پیام خطایی همانند مثال قبل صادر می شود، چرا؟ به این دلیل که هیچ ضمانتی وجود نداشته که شرط دستور if درست از آب در بیاید و برنامه خروجی داشته باشد (دستور return اجرا بشود). می توانید مشکل فوق را با تعیین یک مقدار پیش فرض برای عبارت return به صورت زیر حل کنید :

public int AddNumbers(int number1, int number2)

{

int result = number1 + number2;

if(result > 10)

{

return result;

}

return 0;

}

کد اضافه شده فوق، مشکل برنامه ما را حل کرده و از طرف دیگر نشان می دهد می توانیم بیش از یک دستور return را در بدنه تابع خود تعریف کنیم. به محض اجرای دستور return در هر جای کد برنامه، خروجی تابع ارسال شده و اجرای مابقی دستورات تابع لغو می شود. در مثال فوق، اگر مقدار متغیر خروجی return بزرگتر از 10 باشد، هیچ گاه دستور return 0; اجرا نمی شود.

آموزش سی شارپ ادامه دارد