our notes for our youngers

September 4, 2009

basic of C# (part 19)

Filed under: Basic of C# — Tags: , , , — sevenlamp @ 9:57 AM

ကြၽန္ေတာ္တို႔ မေန႔က ေရးခဲ႔တဲ႔ structure test program ေလးနဲ႔ပဲ ဆက္ျပီး ေျပာရေအာင္ဗ်ာ။ structure ကိုသံုးျခင္းအားျဖင့္ ကြၽန္ေတာ္တို႔ record ေတြသိမ္းလို႔ ရတယ္ဆိုတာ သိခဲ႔ပါျပီ။ structure ဟာ object-oriented programming မွာ အေျခခံအက်ဆံုး အပိုင္းျဖစ္တဲ႔ class ေတြျဖစ္ေပၚလာဖို႔ ကနဦး အစပါပဲ။ structure က value type ပါ။ ဒါေၾကာင့္ OOမွာ သံုးလို႔ အဆင္မေျပပါဘူး။ ဒီအခါမွာ structure ပံုစံအတိုင္း reference type အေနနဲ႔ သံုးနိုင္မယ့္ class ကို ေနာက္ပိုင္းမွာ အသံုးတြင္က်ယ္လာပါတယ္။ OOP မွာ အဓိကအက်ဆံုးကေတာ့ class ေတြပါပဲ။ ဟုတ္ျပီ၊ class တစ္ခုမွာ အေျခခံအားျဖင့္ေတာ့ data member ေတြနဲ႔ member function ေတြပါေလ႔ရွိပါတယ္။ member data ေတြဟာ သက္ဆိုင္ရာ classရဲ႕ ၀ိေသသ လကၡဏာေတြကို ကိုယ့္စားျပဳျပီးေတာ့၊ member function ေတြကေတာ့ အဲ့ဒီ classရဲ႕ လုပ္ေဆာင္ခ်က္ေတြပါ။ ဥပမာအားျဖင့္ People ဆိုတဲ႔ class တစ္ခုမွာ အမည္(name)၊ အသက္(age) စသည္တို႔ဟာ member data ေတြ ျဖစ္ၾကျပီး၊ စားသည္(eat())၊ အိပ္သည္(sleep()) စသည္တို႔ကေတာ့ member function ေတြ ျဖစ္ၾကမွာပါ။

class People
{
	string name;		// member data
	int age;		// member data
	void  eat()		// member function
	{
		// eat something…
	}
	void sleep()		// member function
	{
		// sleep at night.
	}
}

အခုကြၽန္ေတာ္ ေရးလိုက္တဲ႔ People class ကို datatype class လို႔ ေခၚပါတယ္။ မေန႔က program ေလးကို class အေနနဲ႔ ျပန္ျပီး ေရးၾကည့္ရေအာင္။

class Student
{
	public int roll;
	public string name;
	public int mark;
	public void Display()
	{
		Console.WriteLine(“\n Roll : {0} \n Name : {1} \n Mark : {2}”,
			roll, name, mark);
	}
}
class StudentTest
{
	static void Main()
	{
		Student s1 = new Student();
		s1.roll = 1; s1.name = “Ag Ag”; s1.mark = 90;
		Student s2 = new Student();
		s2.roll = 2; s2.name = “Zw Zw”; s2.mark = 88;
		Student s3 = s2;
		s3.roll = 3; s3.name = “Ma Ma”;
		// display 
		s1.Display();
		s2.Display();
		s3.Display();
		Console.Read();
	}
}

OUTPUT :

1       Ag Ag                90

3       Ma Ma                88

3       Ma Ma                88

ဒီ program ေလးကို အေသးစိတ္ျပန္ရွင္းျပပါ႔မယ္။ ပထမဆံုး data type class (Student) ေလး ေဆာက္ပါတယ္။ member data အေနနဲ႔ roll၊ name နဲ႔ mark တို႔ပါျပီး။ student information ေတြ ျပန္ထုတ္ျပေပးဖို႔ Display ဆိုတဲ႔ member function တစ္ခုပါပါတယ္။ student class ထဲက member ေတြ အားလံုးရဲ႕ ေရွ႕မွာ public ဆိုတဲ႔ keyword ေလးေရးထားတာ ေတြ႕မွာပါ၊ class တစ္ခုအတြင္းမွာ member ေတြ ေၾကျငာရင္ default က private ပါ။ ဆိုလိုတာကေတာ့ သက္ဆိုင္ရာ class အတြင္းမွာပဲ သံုးခြင့္ရွိျပီး အျပင္(တျခား class ေတြ) ကေန ေခၚသံုးလို႔ မရဘူးဆိုတဲ႔ အဓိပၸါယ္ပါ။ အခုကြၽန္ေတာ္က public လုပ္ေပးလိုက္တဲ႔ အတြက္ ၾကိဳက္တဲ႔ ေနရာကေန ေခၚသံုးခြင့္ရွိသြားပါတယ္။ ဟုတ္ျပီ။ အခုကြၽန္ေတာ္တို႔ program ေလးကို run ဖို႔ အတြက္ Main function ပါတဲ႔ run class တစ္ခု ထပ္ေဆာက္ပါတယ္။ Main function အတြင္းမွာ ပထမဆံုး ေက်ာင္းသားတစ္ေယာက္ရဲ႕ information သိမ္းဖို႔အတြက္ Student အမ်ိဳးအစား variable a ကို ေၾကျငာျပီး object ေဆာက္ေပးပါတယ္။ class ေတြဟာ reference data type ျဖစ္တဲ႔ အတြက္ variable ေၾကျငာရံုနဲ႔ တန္ဖိုးသိမ္းလို႔ မရေသးပါဘူး။ ဒါေၾကာင့္ တန္ဖိုးတကယ္ သိမ္းနိုင္ဖို႔အတြက္ object ေဆာက္ေပးရပါတယ္။ ရႈပ္သြားျပီထင္တယ္😀
ကြၽန္ေတာ္တို႔ memory မွာ stack အပိုင္းနဲ႔ heap အပိုင္း ဆိုျပီး အပိုင္း၂ပိုင္းရွိတယ္ဗ်။ value type variable ေတြကို stack အပိုင္းမွာပဲ သိမ္းေလ့ရွိတယ္။ ဒါေၾကာင့္ မေန႔က သိမ္းခဲ႔တဲ႔ Student အမ်ိဳးအစား s1, s2, s3 တို႔က structure (value type) ျဖစ္တဲ႔အတြက္ stack အပိုင္းမွာ ေနရာယူသြားပါတယ္။ အဲ့ဒီေနရာမွာပဲ တန္ဖိုးကို တကယ္သိမ္းပါတယ္။ class ကေတာ့ မတူပါဘူး။ သူက stack ရယ္ heat ရယ္ ခြဲျပီးေနရာယူပါတယ္။ object reference(variable) ကို stack မွာ သိမ္းျပီး၊ real object ကိုေတာ့ heat မွာ သိမ္းပါတယ္။ structure နဲ႔ class တို႔ memory ေပၚမွာ ေနရာယူပံုကို ပံုေလး ဆြဲျပေပးထားပါတယ္၊ ပံုၾကည့္လိုက္ရင္ နည္းနည္းနားလည္သြားမယ္ ထင္ပါတယ္။


Structure မွာ သိမ္းသြားတဲ႔ ပံုကေတာ့ ရွင္းပါတယ္ ကြၽန္ေတာ္တို႔ class မွာ သိမ္းသြားတဲ႔ ပံုကိုပဲ ၾကည့္ရေအာင္။ ကြၽန္ေတာ္ေျပာခဲ႔သလိုပဲ class ကို variable ေၾကျငာလိုက္လို႔ ရလာတဲ႔ ေနရာမွာ value ေတြသိမ္းလို႔မရပါဘူး၊ reference ေတြပဲ သိမ္းလို႔ ရပါတယ္။ value တကယ္သိမ္းနိုင္ဖို႔အတြက္ေတာ့ ကြၽန္ေတာ္တို႔က new operator သံုးျပီး object ေဆာက္ေပးရပါတယ္။ အဲ့ဒီလို new နဲ႔ ေဆာက္လိုက္တဲ႔ object ေတြဟာ heap memoryထဲမွာ ေနရာသြားယူပါတယ္။ ဒါေၾကာင့္ Student s3 က object မေဆာက္ထားပါဘူး၊ class variable ပဲ ေၾကျငာထားပါတယ္။ ဒါေၾကာင့္ s3 အတြက္ ကိုယ္ပိုင္ object မရွိပါဘူး။ s3 ထဲကို s2 ကိုထည့္လိုက္ပါတယ္။ ဒီေနရာမွာ s2 ထဲမွာ ဘာရွိလဲ ကြၽန္ေတာ္တို႔ ျပန္ၾကည့္ေတာ့ s2 ေၾကျငာထားတဲ႔ ေနရာမွာ memory address (f002) ပဲ ရွိပါတယ္။ ဒါေၾကာင့္ s3 ထဲကိုလည္း f002 ပဲ ေရာက္သြားမွာပါ။ ဒါဆို s3 ကလည္း memory address f002 ရွိေနတဲ႔ ေနရာက object ကိုပဲ သြားျပီး point လုပ္ပါတယ္။ ဒါေၾကာင့္ s2 နဲ႔ s3 ၂ ခုလံုးက object တစ္ခုထဲကိုပဲ point ထားၾကပါတယ္။ ဒါေၾကာင့္ s3 ထဲကိုထည့္လိုက္တဲ႔ roll 3 နဲ႔ name “Ma Ma” ဟာ s2 ကို ရိုက္ထုတ္တဲ႔ ေနရာမွာပါ ေပၚလာရျခင္းျဖစ္ပါတယ္။ ေတာ္ေတာ္ေလးေတာ့ ရႈပ္သြားမယ္ထင္တယ္။ ကြၽန္ေတာ္ စာအေရးအသား ညံ့ေတာ့ ေသေသခ်ာခ်ာ နားလည္ေအာင္ မရွင္းျပနိုင္လို႔ပါ။

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: