Enumeration ကိုသံုးျခင္းအားျဖင့္ ကြၽန္ေတာ္တို႔ ကိုယ္ပိုင္data type ေတြေဆာက္ျပီး သံုးလို႔ရလာပါမယ္။ enumeration သံုးတာ ဘာပိုေကာင္းလာလဲ အတိအက်ေတာ့ မသိဘူးဗ်။ ကြၽန္ေတာ္စိတ္ထင္ေတာ့ enumeration သံုးလိုက္ျခင္းအားျဖင့္ ၁။ memory ေပၚမွာ ေနရာယူတဲ႔ size ေသးသြားမယ္၊ ၂။ project တစ္ခုကို develop လုပ္တဲ႔ programmer ေတြ ၾကားထဲမွာ standardized ျဖစ္သြားမယ္ ( ဥပမာ.. developer တစ္ေယာက္က Sunday လို႔ေပါင္းရင္ေပါင္းမယ္၊ ေနာက္တစ္ေယာက္က SUNDAY လို႔ေပါင္းမယ္၊ တျခားတစ္ေယာက္က sun လို႔ပဲ ေပါင္းရင္ေပါင္းမယ္၊ enum defined လုပ္လိုက္ျခင္းအားျဖင့္ ဒါမ်ိဳးကိစၥေတြ မရွိနိုင္ေတာ့ဘူး ေပါ့ )။
Enumeration သံုးရင္ ကြၽန္ေတာ္တို႔က data type တစ္မ်ိဳးထဲပဲ သံုးလို႔ရတယ္။ integer ဆို integer, byte ဆို byte ေပါ့၊ record တစ္ခုပံုစံမ်ိဳး data type အစံုသိမ္းခ်င္ရင္ေတာ့ enum အစား structure ေဆာက္ျပီးသံုးၾကပါတယ္။ (ဆိုင္မဆိုင္ေတာ့ မသိဘူး တြဲျပီးေျပာလိုက္တာ
) ဥပမာ.. ကြၽန္ေတာ္က ေက်ာင္းသားတစ္ေယာက္ရဲ႕ data ေတြသိမ္းခ်င္တယ္ဆိုရင္ သိမ္းမယ့္ data ေတြထဲမွာ roll (int), name (string), mark (int) စတာေတြ ပါမယ္ဗ်ာ။ ဒါဆိုရင္ enum သံုးလို႔ မရေတာ့ဘူး၊ structure ဒါမွမဟုတ္ class ကိုသံုးရေတာ့မယ္။ structure နဲ႔ class က အဓိက value type နဲ႔ reference type ပဲကြာသြားတာ။ က်န္တာအားလံုး အတူတူနီးပါးပဲ။ example program ေလးၾကည့္ရေအာင္။
using System;
struct Student
{
public int roll;
public string name;
public int mark;
}
class structuretest
{
static void Main()
{
Student s1;
s1.roll = 1; s1.name = "Ag Ag"; s1.mark = 90;
Student s2 = s1;
s2.roll = 2; s2.name = "Mg Mg";
Student s3 = new Student();
s3.roll = 3; s3.name = "Zw Zw"; s3.mark = 80;
Console.WriteLine("\nRoll : {0} \nName : {1} \nMark : {2}", s1.roll, s1.name, s1.mark);
Console.WriteLine("\nRoll : {0} \nName : {1} \nMark : {2}", s2.roll, s2.name, s2.mark);
Console.WriteLine("\nRoll : {0} \nName : {1} \nMark : {2}", s3.roll, s3.name, s3.mark);
Console.Read();
}
}
ျပန္ရွင္းရေအာင္
struct Student
{
public int roll;
public string name;
public int mark;
}
ဒါက Student ဆိုတဲ႔ user defined type တစ္ခု create လုပ္တာပါ။ ဒီလိုေရးလိုက္ျခင္းအားျဖင့္ compiler က Student ဆိုတာမွာေတာ့ integer အမ်ိဳးအစား variable ႏွစ္ခုရယ္၊ string တစ္ခုရယ္ ပါတယ္ဆိုတာ သိသြားပါျပီ။ variable ေတြရဲ႕ေရွ႕မွာ public လို႔ေရးတာကေတာ့ အဲ့ဒီ variable ေတြကို structure ရဲ႕ အျပင္ဘက္ တျခားေနရာကေန ေခၚသံုးခြင့္ျပဳတာပါ။
ျပီးေတာ့ Main function ထဲမွာ ကြၽန္ေတာ္က ေက်ာင္းသား ၃ေယာက္ရဲ႕ data သိမ္းခ်င္တယ္ ဆိုေတာ့ Student variable ၃ ခုေၾကျငာရမွာေပါ့။ ဒါေၾကာင့္ ကြၽန္ေတာ္က s1, s2 နဲ႔ s3 ဆိုျပီး ေၾကျငာလို္က္ပါတယ္။
Student s1;
ဆိုျပီး ေၾကျငာလိုက္တာနဲ႔ ကြၽန္ေတာ္တို႔ စက္ရဲ႕ memory ေပၚမွာ Student အမ်ိဳးအစား data ေတြသိမ္းလို႔ရမယ့္ ေနရာတစ္ခု ေဆာက္ေပးသြားပါတယ္။ အဲ့ဒီ ေနရာထဲမွာ roll, name, mark တို႔ သိမ္းဖို႔ေနရာပါ ပါျပီးသားပါ။
s1.roll = 1; s1.name = "Ag Ag"; s1.mark = 90;
ျပီးေတာ့မွ ကြၽန္ေတာ္က အဲ့ဒီထဲကို 1, “Mg Mg”, 90 တို႔ကို ထည့္လိုက္ပါတယ္။ Student အမ်ိဳးအစား s1 ထဲမွာ ရွိတဲ႔ variable ေတြကို ျပန္ေခၚခ်င္တာျဖစ္လို႔ s1(dot)variable name ဆိုျပီး ေရးရပါတယ္။
Student s2 = s1;
ေနာက္ထပ္ s2 ကို ေၾကျငာတဲ႔ေနရာမွာေတာ့ s1 ထဲက တန္ဖိုးေတြကိုပါ s2 ထဲကို ထည့္လိုက္ပါတယ္။ ဒါဆိုရင္ s2 ထဲမွာ ရွိတဲ႔ roll, name နဲ႔ mark မွာ s1 ထဲက တန္ဖိုးေတြ ေရာက္ျပီးသားျဖစ္သြားပါတယ္။
s2.roll = 2; s2.name = "Mg Mg";
ျပီးေတာ့မွ s2 ရဲ႕ roll နဲ႔ name ကို ျပန္ျပင္လိုက္ပါတယ္။ အမွတ္ကိုေတာ့ မျပင္လိုက္ပါဘူး။ ဒီလိုျပင္လိုက္ျခင္းအားျဖင့္ နဂိုတန္ဖိုးျဖစ္တဲ႔ s1 ထဲမွာ ေျပာင္းသြားမလား? Structure က value type ျဖစ္လို႔ s1 ထဲမွာ လုိက္ျပီး ေျပာင္းသြားမွာ မဟုတ္ပါဘူး။
Student s3 = new Student(); s3.roll = 3; s3.name = "Zw Zw"; s3.mark = 80;
s3 ထပ္ေၾကျငာတယ္၊ တန္ဖိုးထည့္ပါတယ္။ ဒီေနရာမွာ s3 ကို new Student() ဆိုျပီး object ေဆာက္ေပးထားတာ ေတြ႔မွာပါ။ ကြၽန္ေတာ္တို႔ structure ကို object ေဆာက္ျပီးေတာ့ ျဖစ္ျဖစ္ မေဆာက္ပဲနဲ႔ ျဖစ္ျဖစ္ ၾကိဳက္သလိုသံုးလို႔ရပါတယ္။ object ေဆာက္ေပးရင္ structure ထဲက variable ေတြကို default value assign လုပ္ေပးသြားမွာျဖစ္ျပီးေတာ့၊ object မေဆာက္ပဲသံုးရင္ေတာ့ default value assign မလုပ္ေပးပါဘူး။ ဒါဆို default value ကဘာေတြလဲ? ဟုတ္ကဲ႔ number ေတြဆို default value က 0 ပါ။ string အတြက္ကေတာ့ null ေပါ့။
ဒီ program ေလးကို ရိုက္ျပီး run ၾကည့္လိုက္ပါဦး။