انتخاب بين حالتها با استفاده از switch :
در بعضي از مواقع بايد شرط هايي را مشابه زير بررسي كنيد :
- آيا نام مشتري برابر با Bryan است؟ در اين صورت عمل A را انجام بده.
- آيا نام مشتري برابر با Stephanie است؟ در اين صورت عمل B را انجام بده.
- آيا نام مشتري برابر با Cathy است؟ در اين صورت عمل C را انجام بده.
- آيا نام مشتري برابر با Betty است؟ در اين صورت عمل D را انجام بده.
- آيا نام مشتري برابر با Edward است؟ در اين صورت عمل E را انجام بده.
اگر بخواهيد اين كار را با استفاده از دستور if انجام دهيد، بايد از كدي مشابه زير استفاده كنيد:
if (Customer.Name == “Bryan”)
// Do A
else if(Customer.Name == “Stephanie”)
// Do B
else if(Customer.Name == “Cathy”)
// Do C
else if(Customer.Name == “Betty”)
// Do D
else if(Customer.Name == “Edward”)
// Do E
در اين حاات اگر بخواهيد بعد از مدتي كد را به صورتي تغير دهيد كه به جاي استفاده از نام مشتري از نام كوچك او استفاده كند، چهكـــاري بايـــد بكنيـــد؟ در ايـــن حالـــت بايـــد عبـــارت Customer.Name را در تمـــام دســـتورات if بـــهCustomer.FirstName تغير دهيد كه كار بسيار وقت گيري است . همچنين استفاده از اين روش خوانايي برنامه را نيزكم مي كند. در امتحان كنيد بعد با روشي آشنا ميشويم كه بتوانيم بهتر اين شرط ها را بررسي كنيم .
استفاده از دستور switch
)1 يك پروژه ويندوزي جديد به نام Switch Demo ايجاد كنيد. سپس خاصـيت Name مربـوط بـه فـرم را برابـرSwitch قرار دهيد .
)2 با استفاده از جعبه ابزار يك ListBox به برنامه اضافه كنيد . خاصيت Name آن را برابر lstData، خاصـيتDock را به Fill و خاصيت IntegralHeight را به False تغيير دهيد.
)3 هنگامي كـه كنتـرل ListBox در فـرم انتخـاب شـده اسـت، بـه پنجـره Properties برويـد و خاصـيتItems را انتخـاب كنيـد و بـر روي دكمـه سـمت راسـت آن كليـك كنيـد . پنجـره اي بـه نـام String Collection Editor نمايش داده خواهد شد. مطابق شكل -10 4، پنج نام مختلف را در آن وارد كنيد.
10 4- شكل
)4 بر روي كليد OK كليك كنيد تا نامها به ListBox اضافه شوند . سپس بر روي آن دو بار كليك كنيد تا متد مر بـوطبه رويداد SelectedIndexChanged ايجاد شود. كد زير را در آن وارد كنيد :
private void lstData_SelectedIndexChanged(object sender,
EventArgs e)
{
// Declare variables
string strName;
string strFavoriteColor = “”;
// Get the selected name *sim-power.ir
strName =
lstData.Items[lstData.SelectedIndex].ToString();
// Use a Switch to get the favorite color
// of the selected name http://sim-power.ir
switch(strName)
{
case “Bryan”:
strFavoriteColor = “Madras Yellow”;
break;
case “Stephanie”:
strFavoriteColor = “Sea Blue”;
break;
case “Cathy”:
strFavoriteColor = “Morning Mist”;
break;
case “Betty”:
strFavoriteColor = “Passionate Purple”;
break;
case “Edward”:
strFavoriteColor = “Battleship Gray”;
break;
}
// Display the favorite color of the selected name
MessageBox.Show(strName + “‘s favorite color is ” +
strFavoriteColor, “Select Demo”);
}
)5 برنامه را اجرا كنيد . هر بار كه روي نامي در ListBox كليك كنيد، كـادر پيغـامي مـشابه شـكل -11 4 نمـايش دادهخواهد شد .
اولين كاري كه در رويداد SelectedIndexChanged بايد انجام دهيد اين است كه متغيير هاي مورد نيـاز را تعريـفكنيد. سپس بايد مشخص كنيد كه كدام نام در ListBox انتخاب شده است. براي اين كار بايد آيتمـي كـه شـماره آن برابـر بـاخاصيت SelectedIndex است را پيدا كنيد و متن داخ ل آن آيتم را در متغيير قرار دهيد . اين كار به وسيله كد زير صورتمي گيرد :
// Declare variables
string strName;
string strFavoriteColor = “”;
// Get the selected name
strName =
lstData.Items[lstData.SelectedIndex].ToString();
در ايــن قــسمت از كــد بــه چنــد نكتــه توجــه كنيــد . اول اينكــه همــانطور كــه مــشاهده مــي كنيــد، هنگــام تعريــف متغييــرstrFavoriteColor به آن مقدار اوليه داده ايم . اگر اين مقدار اوليه را از كد حذف كنيد، برنامه هنگام كامپايل با خطـامواجه مي شود .در #C هر متغييري قبل از استفاده بايد داراي مقدار اوليه باشد و رعايت اين مورد در كد، هنگام كامپايل توسط كامپايلر بررسـي مـيشود. مقدار دهي اوليه به متغيير ها حتما بايد قبل از استفاده از آنها و همچنين در خارج از بخشهايي از كد كه فقط در شـرايط خـاصاجرا مي شوند (همانند بلاك دستور if)، انجام شود .
در اين قسمت قبل از اس تفاده از اين متغيير به آن مقدار اوليه داده ايم، ولي اين كار را در بلاك دستورات switch قرار داده ايـم .فرض كنيد كه هيچ يك از حالتهاي دستور switch اجرا نشوند . در ايـن حالـت هنگـامي كـه كامپـايلر بـه خـط بعـد از دسـتورswitch برسد و بخواهد مقدار متغيير strFavoriteColot را چاپ كنـد، ايـن متغييـر مقـداري نخواهـد داشـت .بنابراين برنامه با خطا مواجه خواهد شد . به همين دليل در هنگام تعريف متغيير به آن مقدار اوليه داده ايم تا در اين موارد هـم متغييـرداراي مقدار باشد .
هنگامي كه نام انتخاب شده در ليست را بدست آورديد، ميتوانيد حالتهاي م ختلف آن را با استفاده از دستور switch بررسي كنيد.براي استفاده از اين دستور، نام متغييري كه ميخواهيد بررسي كنيد را بايد در داخل پرانتز مقابل دستور وارد كنيد .درون بلاك دستور switch بايد براي هر حالت كه ميخواهيد بررسي كنيد يك دستور case مجزا قرار دهيد . در ا يـن مثـال،پنچ دستور case داريد كه هر كدام به يك نام مربوط هستند . هنگام اجراي اين كد، اگر ويژوال #C به يكي از اين حالتها برخوردكند، كد آن را اجرا مي كند .در نظر داشته باشيد براي اينكه بعد از اجراي كد مربوط به يك بلاك، اجراي برنامه به خط بعد از دسـتور switch منتقـل شـود،بايد در انتهاي دستورات آن بلاك از دستور break به نحوي كه در برنامه نشان داده شده است استفاده كنيد.
// Use a Switch to get the favorite color
// of the selected name
switch(strName)
{
case “Bryan”:
strFavoriteColor = “Madras Yellow”;
break;
case “Stephanie”:
strFavoriteColor = “Sea Blue”;
break;
case “Cathy”:
strFavoriteColor = “Morning Mist”;
break;
case “Betty”:
strFavoriteColor = “Passionate Purple”;
break;
case “Edward”:
strFavoriteColor = “Battleship Gray”;
break;
}
// Display the favorite color of the selected name
MessageBox.Show(strName + “‘s favorite color is ” +
strFavoriteColor, “Select Demo”);
در زير مراحلي كه با انتخاب يك نام از ليست باكس توسط برنامه طي مي شوند، را بررسي مي كنيم :
فرض كنيد كاربر در ليست روي نـام Betty كليـك مـي كنـد . رويـداد SelectedIndexChangedفراخواني مي شود و مقدار “Betty” در متغيير strName ذخيره مي شود.برنامه به دستور switch مي رسد و مقدار درون متغييـر strName را بـا تـك تـك مقـاديري كـه بـه عنـوانحالتهاي مختلف اين دستور وارد شده اند بررسي مي كند.بعد از بررسي حالتهاي وارد شده در دستور switch، برنامه متوجه مي شود كه حالت چهـارم بـا مقـدار متغييـر برابـراســت. بنــابراين دســتورات ايــن حالــت را اجــرا مــي كنــد (يعنــي مقــدار strFavoriteColor را برابــر”Passionate Purple” قرار مي دهد).برنامه از بلاك دستورات switch خارج شده و اولين خط بعد از آن را اجرا مي كند و كادر پيغام مناسبي را بـه كـاربرنمايش مي دهد.
استفاده از switch با و بدون حساسيت به نوع حروف :
همانند دستور if، دستور switch هم به بزرگي و كوچكي حروف حساس است. به بخش امتحان كنيد زير توجه كنيد :
)1 قسمت طراحـي فـرم مربـوط بـه Form1 را بـاز كـرده و كنتـرل ListBox را در فـرم انتخـاب كنيـد . از پنجـرهProperties م ربوط به كنترل ListBox، گزينه Items را انتخاب كنيد و سپس روي دكمه جلوي اينخاصيت كليك كنيد تا پنجره String Collection Editor باز شود .
)2 اسامي موجود در اين پنجره را به گونه اي تغيير دهيد كه همانند شكل -12 4 همه با حروف بزرگ نوشته شوند.
)3 روي دكمه OK كليك كنيد تا تغيرات اين پنجره ذخيره شوند و سپس برنامه را اجرا كنيد . مـشاهده خواهيـد كـرد كـه بـاكليك بر روي هر يك از نامهاي داخل ListBox، كادر پيغامي كه ظاهر مي شود نام رنگ مورد نظر را نمايش نمـيدهد. (شكل -13( 4
دستور switch هم همانند دستور if نسبت به نوع حروف حساس است . بنابراين اگر در شرط دستور switch از نامهـايBETTY و يا CATHY استفاده كنيد، هيچ حالت مناسبي يافته نخواهد شد . اين مورد مانند اين است كه به صورت زير از دسـتورif استفاده كنيد :
if (“BETTY” == “Betty”)
:يا
if (“CATHY” == “Cathy”)
در بخشهاي قبلي ديديد كه براي مقايسه دو رشته بدون در نظر گرفتن نوع حروف مي تـوان از تـابع String.Compareاستفاده كرد . اما در دستور switch نمي توانيد از اين روش استفاده كنيد . در بخش امتحان كنيد بعد، روشي را خواهيم ديد كه بهوسيله آن مي توانيد مقايسه هاي دستور switch را هم بدون حساسيت به نوع حروف انجام دهيد .
)1 بخش ويرايشگر كد را براي Form1 باز كنيد و در متد مربوط بـه رويـداد SelectedIndexChangedتغيرات زير را انجام دهيد . دقت كنيد كه حتما رشته هاي ي را كه براي بررسي در جلوي دستور case قرار ميدهيد حتمـابا حروف كوچك نوشته شوند .
private void lstData_SelectedIndexChanged(object sender,
EventArgs e)
{
// Declare variables
string strName;
string strFavoriteColor = “”;
// Get the selected name
strName =
lstData.Items[lstData.SelectedIndex].ToString();
// Use a Switch to get the favorite color
// of the selected name
switch(strName.ToLower())
{
case “bryan”:
strFavoriteColor = “Madras Yellow”;
break ;
case “stephanie”:
strFavoriteColor = “Sea Blue”;
break;
case “cathy”:
strFavoriteColor = “Morning Mist”;
break;
case “betty”:
strFavoriteColor = “Passionate Purple”;
break;
case “edward”:
strFavoriteColor = “Battleship Gray”;
break;
}
// Display the favorite color of the selected name
MessageBox.Show(strName + “‘s favorite color is ” +
strFavoriteColor, “Select Demo”);
}
)2 برنامه را اجرا كنيد و مجددا بر روي يكي از اسامي درون ListBox كليك كنيد . همانند شكل -14 4 كادر پيغـامي رامشاهده خواهيد كرد كه نام فرد انتخاب شده و رنگ مورد نظر او را نمايش مي دهد .
14 4- شكل
براي اين كه رشته ي داخل متغيير strName بدون حساسيت بـه نـوع حـروف بررسـي شـوند، مـي توانيـد بـا اسـتفاده از تـابعToLower تمام حروف آن را به حروف كوچك تبديل كنيد و سپس آن را با مقادير مختلف مقايسه كنيد .
switch(strName.ToLower())
اين دستور مقدار متغيير strName را ابتدا به حروف كوچك تبديل مي كند و سپس آن را با مقادير موجـود در دسـتور caseبررسي مي كند . در استفاده از اين روش بايد دقت كنيد كه تمام عبارتهاي مقابل دستور case را با حروف كوچك بنويسيد. در غيراين صورت، حالت مورد نظر اجرا نخواهد شد . براي مثال فرض كنيد عبارت جلوي دستور case برابـر بـا “Betty” باشـد وكاربر نيز نام BETTY را از ليست باكس انتخاب مي كند . در اين حالت، اين نام با اسـتفاده از تـابع ToLower بـه bettyتبديل ميشود و سپس مقدار “Betty” با “betty” مقايسه مي شود كه به علت برابر نبودن اين دو مقدار، كد مربـوط بـهاين بخش اجرا نخواهد شد .
case “bryan”:
strFavoriteColor = “Madras Yellow”;
break ;
case “stephanie”:
strFavoriteColor = “Sea Blue”;
break;
case “cathy”:
strFavoriteColor = “Morning Mist”;
break;
case “betty”:
strFavoriteColor = “Passionate Purple”;
break;
case “edward”:
strFavoriteColor = “Battleship Gray”;
break;
}
در انتها، هنگامي كه نام رنگ مورد نظر را بدست آورديد، آن را با استفاده از يك كادر پيغام به كاربر نمايش مي دهيد .
نكته: به جاي استفاده از حروف كوچك، ميتوانيد تمام عبارتهاي مقابل دستورات case را با حـروف بـزرگ بنويـسيد و سـپس بـااستفاده از تابع ToUpper، رشته مورد نظر خودتان را به حروف بزرگ تبديل كنيد