سفارش تبلیغ
صبا ویژن
آنکه گرفتاری اش را به نامهربان شکوه کند، حکیم نیست . [امام علی علیه السلام]

علمی ،آموزشی،تحقیقاتی

ظاهرا به نظر می رسد که توابع فقط می توانند یک 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- نحوه ی تعریف و استفاده از آرایه ها به صورت آرگومان ورودی را نیز می توان در مثال فوق آموخت

 

تعریف متدها در سی شارپ

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



 

در سی شارپ یک تابع به صورت زیر تعریف می شود :



 

(نوع و اسامی پارامترها) نام تابع نوع خروجی تابع سطح دسترسی به تابع
}
بدنه ی تابع
{



 

برای تعریف یک متد یا تابع ابتدا سطح دسترسی به آن مانند public و private سپس نوع خروجی تابع مانند void ( هیچی ) ذکر می گردد که داخل این پرانتزها می توان ورودی های تابع یا بقولی آرگومان های ورودی را معرفی کرد. سپس تابع باید با { شروع و با یک } خاتمه یابد.



 

برای مثال :



 

public int myFunc( int x )
{
...….
}



 

 


 


 


هر تابعی می تواند صفر تا تعداد بیشماری آرگومان ورودی و صفر تا تعداد بیشماری خروجی داشته باشد. بوسیله یک تابع می توان پیچیدگی کار را مخفی کرد و صرفا با صدا زدن نام آن ، یک سری از عملیات را انجام داد. گاهی از اوقات لازم می شود دو یا چند تابع با یک نام داشته باشیم بطوریکه پارامترهای ورودی یا مقادیر خروجی و یا نوع آرگومان های ورودی آنها با هم متفاوت باشد به این کار overloading می گویند.
بسیاری از کلاس های دات نت فریم ورک متدها و یا توابع مفید حاضر و آماده ای را دارند. برای مثال کلاس DateTime ، متدی به نام ToLongDatastring دارد که تاریخ را به صورت یک رشته طولانی بر می گرداند.



 

توابع void :



 

توابعی که با نوع void معرفی می شوند هیچ خروجی ندارند و در زبان ویژوال بیسیک به آْنها sub و در دلفی به آنها procedure می گویند.



 

بازگرداندن یک مقدار از یک تابع :



 

پس از اینکه عملیات یک مجموعه از کدها درون تابع به پایان رسید با استفاده از کلمه ی return می توان خروجی تابع را معرفی کرد. لازم به ذکر است ، هرجایی این کلمه ی return ذکر شود کار تابع خاتمه می یابد.



 

بهتر است موارد فوق را با چند مثال مرور کنیم :



 

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex13 انتخاب نمایید. در اینجا می خواهیم تابعی را تعریف کنیم که سه برابر جذر یک عدد را بر می گرداند.



 

using System;



 

namespace ex13
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine( int3SQL(3) );
Console.ReadLine();
}



 

public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}
}
}



 

توضیحاتی در مورد کد فوق :



 

1- از شیء Math در سی شارپ می توان برای انجام یک سری عملیات ریاضی ابتدایی استفاده کرد. در اینجا از متد جذر گرفتن آن استفاده شده است.
2- در تعریف تابع خودمان از کلمه ی کلیدی static استفاده شده است. درون تابع Main نمی توان توابع غیر استاتیک را فراخوانی کرد. فعلا این نکته را بخاطر را داشته باشید تا در مقالات بعدی بیشتر راجع به آن صحبت شود.
3- بد نیست تابع تعریف شده را کمی بیشتر آنالیز کنیم :



 

public static double int3SQL( double intInput )
{
double i=0;
i = Math.Sqrt( intInput );
return i;
}



 

ابتدا سطح دسترسی به تابع ذکر شده است. پابلیک ، یعنی این تابع خارج از کلاس یک برنامه نیز قابل دسترسی است. سپس از کلمه ی static استفاده گردیده که توضیح مختصری را در مورد آن ملاحظه کردید. در ادامه نوع خروجی تابع که در اینجا double می باشد معرفی گردیده است. دقت کنید که حتما باید نوع تعریف شده با مقداری که یک تابع بر می گرداند یکسان باشد و گرنه با یک خطا برنامه متوقف می شود. سپس نام تابع تعریف شده است. داخل پرانتز ها نوع و نام آرگومانی ارائه شده است که در بدنه ی تابع استفاده می گردد. اگر به تعداد بیشتری پارامتر و یا آرگومان نیاز بود می توان آنها را با , از هم جدا کرد.
پس از اینکه عملیات تابع خاتمه می یابد با استفاده از return این خروجی را معرفی می نماییم.
برای استفاده از این تابع به سادگی نام تابع و سپس پرانتزها به همراه یک عدد دلخواه را می نویسم که آنرا در متد Main برنامه می توان مشاهده کرد.



 

تعریف توابع در کلاس های دیگر برنامه و نحوه ی استفاده از آنها :



 

یکی از زیبایی های برنامه نویسی شیء گرا نظم و ترتیب و بسته بندی کارها می باشد که اصطلاحا در اینجا به آن encapsulation می گویند. یعنی ما یک سری از توابع و خواص را درون کپسولی به نام کلاس قرار می دهیم تا به سادگی بارها و بارها از آن استفاده نماییم.
برای اینکار به سادگی یک توابع را به صورت معمول درون کلاس تعریف می نماییم و سپس همانند خواص که در مورد آنها صحبت شد ، از توابع می توان استفاده کرد با این تفاوت که هنگام کار با توابع حتی اگر آنها هیچ آرگومان و یا پارامتر ورودی هم نداشته باشند ذکر پرانتزها الزامی است.



 

مثالی دیگر در این زمینه :



 

مثال : یک برنامه ی سی شارپ جدید console را در VS.NET باز کنید و نام آنرا درابتدا ex14 انتخاب نمایید. سپس از منوی پروژه یک کلاس جدید را به برنامه اضافه نمایید (نام آنرا clsTools بگذارید) .



 

using System;



 

namespace ex14
{
public class clsTools
{
public clsTools()
{
}



 

public uint intCalc ( uint a , uint b )
{
uint c = Math.Min (a,b);
double x = Math.Sqrt(c) ;
uint w = Convert.ToUInt32 ( x);
return w;
}
}
}



 

سپس در متد Main برنامه می توان به صورت زیر از آن استفاده کرد :



 

using System;



 

namespace ex14
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
clsTools m_var = new clsTools();
Console.WriteLine( m_var.intCalc(4,9));
Console.ReadLine();
}
}
}



 

توضیحاتی در مورد کد فوق :
1- تابع intCalc ما دو عدد صحیح مثبت را می گیرد و سپس جذر کوچکترین دو عدد ورودی را محاسبه می کند.
2- برای تبدیل نوع های عددی مختلف به هم می توان از شیء Convert استفاده کرد.
3- بدون استفاده از شیء Convert یکبار برنامه را اجرا کنید و دلیل خطای بوجود آمده را بیان نمایید


آرایه ها در سی شارپ :

هنگامی آرایه ها ایجاد می شوند که بخواهیم با مجموعه ای از اطلاعات همجنس کار کنیم. برای نمونه از یک آرایه برای ذخیره تعدادی کاراکتر می خواهیم استفاده نماییم. آرایه ها هم یک نوع متغیر هستند پس باید تعریف و مقدار دهی اولیه شوند ، نوع و تعداد اعضای آنها نیز باید معین گردد.
فرض کنید 10 داده ی هم جنس داریم ( برای مثال رشته (string) ) و می خواهیم آنها را ذخیره کنیم. یا می توان 10 متغیر مختلف را تعریف کرد و سپس تک تک آنها را مقدار دهی نمود و یا یک آرایه تعریف نمود و سپس در خانه های مختلف آن این ده عضو را چید. این مطلب زمانی حائز اهمیت می شود که داده های همجنس و به نوعی مرتبط ما تعداد زیادی داشته باشند.


 


 


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



 

 



 

int[] table; // not int table[];



 

 



 

حد پایین آرایه صفر بوده برای مثال اگر آرایه chrData[] ده عضو داشته باشد، اولین عضو آن chrData[0] و آخرین عضو آن chrData[9] است.
مطلب دیگری که در مورد آرایه ها خیلی مهم است اندازه ی آن است. یعنی یک آرایه حاوی چند خانه ی خالی است که ما اجازه داریم آنرا پر کنیم. مثال :



 

 



 

int[] numbers; // declare numbers as an int array of any size
numbers = new int[10]; // numbers is a 10-element array
numbers = new int[20]; // now it"s a 20-element array



 


1- تعریف آرایه ای از رشته ها و مقدار دهی اولیه آن.



 

 



 

String[] strData = new string[2];



 


2- تعریف و مقدار دهی اولیه



 

 



 

string [] strData = { "1234","abcd" };



 


که آرایه ای از نوع رشته ای به طول 2 عضو با مقدار دهی اولیه ایجاد شده است. در این حالت نیازی به تعیین طول آن نمی باشد.



 

3- روشی دیگر برای مقدار دهی اولیه



 

 



 

strData[0] = "1234";
strData[1] = "abcd";



 


مثال : یک پروژه ی جدید Console سی شارپ را باز کنید و نام آنرا در ابتدا ex06 بگذارید. در این مثال می خواهیم نحوه ی کار با آرایه ها را مرور کنیم :



 

 



 

using System;



 

namespace ex06
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string[] sGoalList = new string[3];
string sReplyStatement = "You have choosen Goal "";



 

// Store goals in the array
sGoalList[0] = "Hike the Appalachian Trail";
sGoalList[1] = "Run the marathon";
sGoalList[2] = "Give $1 million to worthwhile causes";



 

// Store response to goals in the array
//(declaring and initializing on same line)
string[] sGoalResponse = {
"If you are staring from GA, you should get "
+ "started in early spring, so you will "+
"not get caught in snow.",
"Make sure that you have a good pair of shoes.",
"Start saving as soon as possible."};



 

// Give the user a list of goals to choose from
Console.WriteLine("GOAL LIST");



 

for(int i = 0; i < sGoalList.Length; i++)
{
Console.WriteLine("Goal " + i +
" - " + sGoalList[i]);
}



 


// Request the user to choose a goal.
Console.WriteLine (""); // Write an empty line for space
Console.Write("Please choose the number of the "
+ "goal that you want to achieve [0,1,2]: ");



 

Console.ReadLine();



 

}
}
}



 


نکاتی در مورد کد فوق :
1- نحوه ی استفاده از عملگر + را برای اتصال رشته های بلند در کد فوق می توان دید.
2- در سی شارپ پایان خط سمی کولون می باشد. بنابراین نگرانی در مورد چند خطی شدن یک دستور وجود ندارد.
3- هنگامی که آرایه ای را با مقادیر درون آکولادها ، مقدار دهی اولیه می کنید لزومی ندارد طول آن آرایه را مشخص کنید ؛ مانند آرایه sGoalResponse در بالا. در غیر اینصورت حتما باید طول یک آرایه را که معرف تعداد خانه های خالی آن است ، معرفی کنید مانند آرایه sGoalList .
4- فعلا حلقه ی for را در این مثال بخاطر داشته باشید تا در مقاله ی بعدی راجع به آن صحبت کنیم


 

آرزو جلولی




مژده فرجی ::: سه شنبه 87/10/24::: ساعت 3:35 عصر

>> بازدیدهای وبلاگ <<
بازدید امروز: 7


بازدید دیروز: 9


کل بازدید :59403
 
 >>اوقات شرعی <<
 
>> درباره خودم<<
مدیر وبلاگ : مژده فرجی[85]
نویسندگان وبلاگ :
سمانه طالبی (@)[0]

مژده فرجی (@)[0]


 
 
>>موسیقی وبلاگ<<
 
>>اشتراک در خبرنامه<<
 
 
>>طراح قالب<<