پاسخ به:مقدمه ای بر سی شارپ
شنبه 17 خرداد 1393 2:17 AM
مقدمه ای بر سی شارپ : قسمت هشتم
چگونه از یک تابع بیش از یک خروجی دریافت کنیم.
ظاهرا به نظر می رسد که توابع فقط می توانند یک return داشته باشند و بلافاصله پس از فراخوانی return کار تابع پایان یافته است. در سی شارپ دو کلمه ی کلیدی به نام های ref و out اضافه شده اند که این امر را ساده تر می کنند.
استفاده از کلمه ی کلیدی out :
از out در تعریف تابع قبل از معرفی نوع آرگومان ورودی استفاده می کنیم . در این حالت بجای اینکه به این آرگومان ، آرگومان ورودی بگوییم ، می توان آنرا آرگومان خروجی نامید. تا یک مثال را در این زمینه با هم مرور نکنیم این مورد مفهوم نخواهد بود :
مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex15 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :
using System;
namespace ex15
{
class Class1
{
public static int TestOut(out char i)
{
i = 'b';
return -1;
}
[STAThread]
static void Main(string[] args)
{
char i; // variable need not be initialized
Console.WriteLine(TestOut(out i));
Console.WriteLine(i);
Console.ReadLine();
}
}
}
توضیحاتی در مورد کد فوق :
1- در تابع TestOut آرگومان i از با کلمه ی کلیدی out مشخص شده است. یعنی اینکه درون تابع هر گونه تغییری روی i انجام شود ، خارج از تابع قابل دسترسی است.
2- توابعی که دارای آرگومانهایی تعریف شده با کلمه ی کلیدی out هستند نیز می توانند از return هم استفاده کنند. همانند مثال فوق.
استفاده از کلمه ی کلیدی ref :
این کلمه ی کلیدی نیز دقیقا همانند out عمل می کند و نحوه ی تعریف و استفاده از آن نیز مشابه است با این تفاوت که آرگومانی که به این نوع توابع فرستاده می شود باید مقدار دهی اولیه شده باشد.
مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex16 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :
using System;
namespace ex16
{
class Class1
{
public static void FillArray(ref int[] arr)
{
// Create the array on demand:
if (arr == null)
arr = new int[10];
// Otherwise fill the array:
arr[0] = 123;
arr[4] = 1024;
}
[STAThread]
static void Main(string[] args)
{
// Initialize the array:
int[] myArray = {1,2,3,4,5};
// Pass the array using ref:
FillArray(ref myArray);
// Display the updated array:
Console.WriteLine("Array elements are:");
for (int i = 0; i < myArray.Length; i++)
Console.WriteLine(myArray[i]);
Console.ReadLine();
}
}
}
توضیحاتی در مورد کد فوق :
1- همانطور که ملاحظه می کنید در اینجا هنگام استفاده از تابع FillArray باید آرگومانی را که می خواهیم به آن پاس کنیم مقدار دهی اولیه کنیم.
2- پس می توان نتیجه گرفت آرگومانهایی که با out تعریف می شوند به صورت خالص خروجی هستند و نیازی به مقدار دهی اولیه هنگام استفاده از آنها وجود ندارد. از ref هنگامی استفاده می کنیم که بخواهیم روی متغیر موجود و مقدار دهی شده ی خارج از تابع ، درون تابع عملیاتی صورت گیرد و سپس همان متغیر دستکاری شده ، عودت داده شود.
تعریف تابعی با تعداد آرگومانهای نامعلوم :
گاهی از اوقات نیاز است تا تابعی تعریف کنیم که تعداد آرگومانهای آن متغیر باشند .برای این منظور از کلمه ی کلیدی params استفاده می شود.
دونکته در اینجا حائز اهمیت است:
1- در هر تابعی تنها می توان یکبار از params استفاده کرد.
2- پس از بکار بردن params دیگر نمی توان هیچ آرگومانی را تعریف کرد.
یکی از مثالهایی که در این زمینه می توان ارائه داد استفاده از آرایه ها به عنوان آرگومان ورودی است. در این حالت یا می توان یک آرایه را به صورت کامل به تابع معرفی کرد و یا تنها نام آنرا به تابع پاس کرد. مثال زیر را ملاحظه کنید :
مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex17 انتخاب نمایید. سپس کد زیر را درون آن بنویسید :
using System;
namespace ex17
{
class Class1
{
public static void UseParams(params int[] list)
{
for ( int i = 0 ; i < list.Length ; i++ )
Console.WriteLine(list[i]);
Console.WriteLine();
}
[STAThread]
static void Main(string[] args)
{
UseParams(1, 2, 3);
int[] myarray = new int[3] {10,11,12};
UseParams(myarray);
Console.ReadLine();
}
}
}
توضیحاتی در مورد کد فوق :
1- در تابع main به دو صورت از تابع UseParams ما استفاده شده است. یا اینکه خیلی ساده هر تعداد آرگومان را می توان به تابع فرستاد و یا اینکه در ادامه آرایه ایی رسما تعریف و سپس به تابع فرستاده شود.
2- نحوه ی تعریف و استفاده از آرایه ها به صورت آرگومان ورودی را نیز می توان در مثال فوق آموخت.