our notes for our youngers

September 3, 2009

basic of C# (part 18)

Filed under: Basic of C# — Tags: , , , , — sevenlamp @ 5:29 PM

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 ေဆာက္ျပီးသံုးၾကပါတယ္။ (ဆိုင္မဆိုင္ေတာ့ မသိဘူး တြဲျပီးေျပာလိုက္တာ :P ) ဥပမာ.. ကြၽန္ေတာ္က ေက်ာင္းသားတစ္ေယာက္ရဲ႕ 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 ၾကည့္လိုက္ပါဦး။

basic of C# (part 17)

Filed under: Basic of C# — Tags: , , , , , — sevenlamp @ 3:22 PM

ဒီေန႔ ကြၽန္ေတာ္ OOP အေၾကာင္း မစခင္ enumeration နဲ႔ structure အေၾကာင္း နည္းနည္း ေျပာခ်င္တယ္ဗ်ာ။  အရင္ဆံုး variable declaration အေၾကာင္းကို ျပန္ေႏႊးရေအာင္။ ကြၽန္ေတာ္တို႔ number တန္ဖိုးတစ္ခု သိမ္းဖို႔ integer အမ်ိဳးအစား variable တစ္ခုေၾကျငာမယ္ဆိုရင္…

int num;

ဆိုျပီးေၾကျငာပါတယ္။ ဒါဆိုရင္ memory ေပၚမွာ integer value တစ္ခုသိမ္းဖို႔ အတြက္ ေနရာ တစ္ေနရာ ယူလိုက္ပါတယ္။ ဟုတ္ျပီ… ဒါဆိုရင္ ကြၽန္ေတာ္က

myOwnType  var1;

ဆိုျပီး ေၾကျငာလိုက္တယ္ ဆိုပါေတာ့။ ဒါဆိုကြၽန္ေတာ္တို႔ program ကို compiler က နားလည္ပါဦးမလား။ နားမလည္နိုင္ေတာ့ပါဘူး ဘာလို႔လဲဆိုေတာ့ myOwnType ဆိုတဲ႔ pre-defined type မဟုတ္တာတစ္ခုကို ေၾကျငာလိုက္လို႔ပါ။ ကြၽန္ေတာ္တို႔ Integer type ေၾကျငာေတာ့ compiler က integer value ေတြထည့္ဖို႔မွန္းသိပါတယ္။ myOwnType ကိုေၾကျငာလိုက္ေတာ့ compiler က ဘာအမ်ိဳးအစားအတြက္ ေၾကျငာေပးရမွန္းမသိဘူး ျဖစ္သြားပါတယ္။ ဒါဆိုရင္ ကြၽန္ေတာ္တို႔က compiler ကို myOwnType ဆိုတာကေတာ့ ဘယ္လို data မ်ိဳးေတြကို သိမ္းခ်င္တာပါဆိုျပီး ေျပာေပးလိုက္ရင္ မျဖစ္ဘူးလား။ ျဖစ္ပါတယ္။ ဘယ္လိုလုပ္ေပးရမွာလဲ ကြၽန္ေတာ္တို႔ user defined data type ေတြ ေၾကျငာေပးရမွာပါ။ ဒီလိုလုပ္ဖို႔အတြက္ ကြၽန္ေတာ္တို႔ enumeration ေတြ၊ structure ေတြ၊ class ေတြ အေၾကာင္းကို သိဖို႔လိုလာပါျပီ။
ကြၽန္ေတာ္တို႔ enumeration ေဆာက္ဖို႔အတြက္ enum keyword ကိုသံုးရပါတယ္။ ဟုတ္ျပီ အခု ကြၽန္ေတာ္ myOwnType ကို create လုပ္ပါေတာ့မယ္။

enum myOwnType
{
	Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}

myOwnType ထဲမွာ ကြၽန္ေတာ္က ေန႔ ၇ ေန႔ကို သိမ္းခ်င္ပါတယ္လို႔ defined လုပ္လိုက္ပါတယ္။ ကြၽန္ေတာ္က ေန႔ေတြကို စာသားေတြနဲ႔ ေရးလိုက္ေပမယ့္ enumeration မွာ တစ္ကယ္သိမ္းသြားမွာက default integer type ပါ။ ကြၽန္ေတာ္က integer type အစား တျခား ကိန္းျပည့္ number type အျဖစ္ ေၾကျငာခ်င္လို႔လည္း ရပါတယ္။ default အားျဖင့္ 0 ကေန စျပီး တခုစီကို 1 ေပါင္းေပါင္းျပီးသိမ္းသြားမွာပါ။ ဆိုလိုတာက ေရွ႕ဆံုးမွာ ရွိတဲ႔ Sunday ရဲ႕ value က 0 ျဖစ္ျပီး Monday က 1 ၊ Tuesday က 2 ပါ။ ကြၽန္ေတာ္တို႔ ၾကိဳက္တဲ႔ number နဲ႔လည္း ကိုယ္စားျပဳလို႔ ရပါတယ္။ ဥပမာ..

enum myOwnType : byte
{
	Sunday, Monday = 5, Tuesday, Wednesday, Thursday = 100, Friday, Saturday
}

အိုေက ဒီပံုစံအတိုင္းဆိုရင္
Sunday = 0,
Monday = 5,
Tuesday = 6,
Wednesday = 7,
Thursday = 100,
Friday = 101,
Saturday = 102
ဆိုျပီး ျဖစ္သြားပါမယ္။
ကြၽန္ေတာ္တို႔ enumeration test လုပ္ဖို႔ program တစ္ခုေလာက္ ေရးၾကည့္ရေအာင္။

using System;
class Program
{
    enum myOwnType : byte
    {
        Sunday, Monday = 5, Tuesday, Wednesday, Thursday = 100, Friday, Saturday
    }

    static void Main()
    {
        myOwnType wd = myOwnType.Friday;
        int i = 7;
        Console.WriteLine("{0} is {1}", wd, (int)wd);
        Console.WriteLine("{0} is {1}", i, (myOwnType)i);
        Console.ReadLine();
    }
}

Output

Friday is 101
7 is Wednesday

Theme: Silver is the New Black. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.