Uncommon Keyword یا کلمات کلیدی نادر (قسمت 1)
__arglist
اولین کلمه کلیدی (__arglist) است . با استفاده از این keyword می توانیم یک پارامتر را به متد بفرستیم . یک مثال می زنم ، شما زمانی که می خواهید از آرایه ها استفاده می کنید و می خواهید آنها را مقدار دهی کنید از کلمه کلیدی param)) استفاده می کنید ، ولی شما بوسیله __arglist می توانید به راحتی متدها را مقدار دهی کنید . در ضمن این رو هم بگم که این کلمات رو شاید مستقیم از لیست ویژوال استودیو پیدا نکنید و باید خودتان تایپ کنید . حالا به کد زیر توجه کنید :
public int paramLength(__arglist)
{
ArgIterator iterator = new ArgIterator(__arglist);
return iterator.GetRemainingCount();
}
و حالا آن را صدا می زنیم :
private void button1_Click(object sender, EventArgs e)
{
int x = this.paramLength(__arglist (5 , 4 , 56)); // returns 5
MessageBox.Show(x.ToString());
}
و در نتیجه مقدار سه را بر می گرداند ، زیرا سه تا آرگومان به متد فرستادیم .
yield
Yield کلمه کلیدی است که در دات نت 2.0 معرفی شد . با استفاده از آن می توان مقادیر برگشتی
IEnumrable ها را گرفت . اول می خوام یک توضیح مختصری در مورد ساختار کلمه کلیدی yield بدم که به توانید کد قطعه کد زیر را متوجه بشید .
کلمه کلیدی yield به دو صورت تعریف می شود :
yield return
yield break;
با استفاده از این کلمه می توانید مقادیر را در یک بلاک iterator (شی ای یا روتین که برای دسترسی به یک ارایه یا یک لیست استفاده می شود.) به مقادیر enumerator تبدیل کنید .
برای واضح تر شدن موضوع ابتدا یک مثال ساده می زنم :
در این قطعه کد ما از yield استفاده نکردیم :
IList<string> FindBobs(IEnumerable<string> names)
{
var bobs = new List<string>();
foreach(var currName in names)
{
if(currName == "Bob")
bobs.Add(currName);
}
return bobs;
}
حالا به این قطعه کد توجه کنید :
IEnumerable<string> FindBobs(IEnumerable<string> names)
{
foreach(var currName in names)
{
if(currName == "Bob")
yield return currName;
}
}
در این کد جدید ابتدا بجای IList از IEnumerable استفاده کردیم و با استفاده از yield مقادیر را return کردیم .
اما یکسری از محدودیت های آنها می توان به موارد زیر اشاره کرد :
· در متدها یا پروپرتی هایی از نوع ref و out نمی توان از آنها استفاده کرد .
· در anonymous متدها تمی توان استفاده کرد .
· آنها را نمی توان در بلاکهای try catch به کار برد .
ولی به طور کلی با استفاده از yield هم کد خواناتر می شود و هم در کدنویسی راحتر هستیم!
حالا می توانید از دوحالت استفاده از yield را در کد زیر مشاهده کنید :
/* /*]]>*/
public IEnumerable<string> getYeild()
{
List<string> lst = new List<string>();
lst.Add("Abhishek");
lst.Add("Abhijit");
lst.Add("Manimoy");
lst.Add("Raj");
lst.Add("Ayan");
lst.Add("MacMillanRojer");
lst.Add("Rizzuto");
int[] getnum = {1,2,3,4 , 5 , 6 , 7 , 8 , 9 , 10};
IEnumerable<int> arr = getnum;
foreach (int i in arr)
MessageBox.Show(i.ToString());
foreach (string x in lst)
{
if (x.Length > 12) // Breaks on MacMillanRojer
{
MessageBox.Show(arr.ToList<int>().Count.ToString());
yield break;
}
else if (x.Length > 5) // Only returns those which are having length >5
yield return x;
else continue;
}
}
و حالا در یک رویداد می نویسیم :
var yieldoutput = this.getYeild();
MessageBox.Show("Yield returns : " + yieldoutput.ToList<string>().Count + " elements.");
در واقع yield return x مقادیر را به صورت enumrable باز می گرداند در صورتی که x.Length >5 باشد . و قسمت break هر چه را که با شرط مطابقت داشت را برمیگرداند و حلقه را قطع می کند .
ادامه مطالب در پستهای بعدی.....