ဒီလိုမ်ိဳး C# ရဲ႕ Features အသစ္ေတြ အေၾကာင္းကို ႏုိင္ငံၿခားဖိုရမ္ေတြမွာ အမ်ားၾကီးရွာေတြ႔ႏုိင္ပါတယ္။ C# 2008 ထြက္တာလည္း ေတာ္ေတာ္ၾကာေနပါၿပီ။ ဒါေပမယ့္ ၿမန္မာႏုိင္ငံက C# 2005 ကို သံုးေနတဲ့ သူေတြ အေနနဲ႔ C# 2008 မွာ ဘာမ်ား အသစ္ရိွလဲဆုိတာသိခ်င္တယ္ဆိုရင္ ၿမန္မာလို ေလ့လာလုိ႔ရေအာင္ေရးေပးလိုက္တာၿဖစ္ပါတယ္။ သိၿပီးသားဆုိရင္လည္း က်ေနာ္ ေရးတာက်န္ေနရင္ ၿဖည့္ေပးၾကဖုိ႔ ထပ္မံေၿပာခ်င္ပါတယ္။
အမ်ိဳးမ်ိဳးေသာ language extensions ေတြကို C# 3.0 မွာ “Orcas” ဆုိတဲ့ code-named နဲ႔ မိတ္ဆက္ခဲ့ၿပီးၿဖစ္ပါတယ္။ အဲဒီ့ Extension ေတြဟာ C# 2.0 ေပၚမွာအေၿခခံၿပီးတည္ေဆာက္ထားတာ ၿဖစ္ၿပီးေတာ့ Programming ေရးသားရာမွာ ေခတ္စားေနတဲ့ Functional Programming Style ကိုလည္း အေထာက္အကူၿဖစ္ေအာင္ ဖြဲ႔စည္းေပးထားပါတယ္။ အသစ္ၿဖစ္တဲ့ Feature ေတြကေတာ့...
• Auto-implemented Properties
• Implicitly Typed Local Variables
• Extension Methods
• Lambda Expressions
• Object Initializers
• Collection Initializers
• Anonymous Types
• Partial Methods
• Expression Trees
• Query Expressions စတာေတြဘဲၿဖစ္ပါတယ္။
အဲဒီ့ Feature အသစ္ေတြ အေၾကာင္းမေၿပာခင္ က်ေနာ့္အေနနဲ႔ .NET Programmer ေတြရဲ႕ ေရးသားနည္း အသစ္ၿဖစ္တဲ့ Functional Programming Style အေၾကာင္း အနည္းငယ္ေၿပာခ်င္ပါတယ္။ အဲဒီ့မွာ ၂ ပိုင္းခြဲထားပါေသးတယ္....
1. Functional Programming
Functional Programming ဆုိတာကေတာ့ Problem Solving လုပ္ရာမွာ Function စစ္စစ္ကိုသာ အဓိကသံုးၿပီးေရးသြားတဲ့ ပံုစံၿဖစ္ပါတယ္။ OOP programming language အမ်ားစုၿဖစ္တဲ့ Java,C#,C++ စတာေတြဟာေတာ့ Procedural Programming ကို ဦးစားေပးၿပီးေတာ့ Support လုပ္ပါတယ္။
2. Procedural Programming
Procedural Programming ဆုိတာကေတာ့ task တစ္ခု ဒါမွမဟုတ္ နည္းလမ္းတစ္ခုခုဟာ ၿပႆနာေၿဖရွင္းတဲ့ အခါမွာ ဘယ္လိုမ်ိဳးပံုစံနဲ႔ အလုပ္လုပ္သြားတယ္ဆုိတာကိုဘဲ အဓိကထားၿပီးေရးသားပါတယ္။ ဆုိလိုတာကေတာ့ Program တစ္ခုလံုးရဲ႕ Algorithms ေတြကို အဓိကထားၿပီးေရးၾကပါတယ္။ ဒါေပမယ့္ Functional Programming နဲ႔ ေရးေလ့ရိွတဲ့ Programmer ေတြအေနနဲ႔ကေတာ့ Method ဒါမွမဟုတ္ရင္ Function ေတြကို ေၾကၿငာတဲ့အခါမွာ အခ်က္အလက္ေတြဟာ ဘယ္ကေန ဘယ္ကို ၊ ဘယ္လိုပံုစံမ်ိဳးနဲ႔ ေၿပာင္းလဲသြားၾကတယ္ဆုိတာကို သာၾကည့္ၾကပါတယ္။ Procedure တစ္ခုလုံးရဲ႕ Algorithms ေတြကို အဓိကထား မစဥ္းစားေတာ့ပါဘူး။
အဲဒါေတြကေတာ့ Coding ေရးသားတဲ့ Style ႏွစ္ခုရဲ႕ ကြာၿခားခ်က္ေလးကို က်ေနာ္ သိသေလာက္ နည္းနည္းရီႊးၾကည့္တာပါ။
Auto-implemented Properties
က်ေနာ္ C# 2005 ကို သံုးဖူးတုန္းကဆုိရင္ Properties တစ္ခုကို ေၾကၿငာမယ္ဆုိရင္ေတာင္မွ Coding ရိုက္ရတာ တအားရွည္တဲ့ အတြက္ C# 2005 ကို ၁ လ သံုးၾကည့္ၿပီးေတာ့ ဆက္မသုံးေတာ့ပါဘူး။ အခု C# 2008 ထြက္လာေတာ့ သူ႔ရဲ႕ ဖီးခ်ား အသစ္ေတြကို နည္းနည္း ေလ့လာၾကည့္တဲ့အခါ Auto-Implemented Properties ပါေနတာေတြ႔ရလို႔ က်ေနာ့္အေနနဲ႔ C# ကို ၿပန္ေလ့လာၿဖစ္တာပါ။ ႏို႔မို႔ဆုိရင္ ခုခ်ိန္ထိ VB ကေန ထြက္ႏုိင္ဦးမွာမဟုတ္ေသးဘူး။ (ခုလည္း VB ကေန ခဏထြက္လာတာပါ။ ၿပီးရင္ ၿပန္၀င္ရဦးမွာ။ ပိုက္ပိုက္က အဲဒါနဲ႔ ရွာရမွာ။ ေလနည္းနည္းရွည္သြားဘီ။ ဆက္ေၿပာပါမယ္။
က်ေနာ္တုိ႔ C# 2.0 (2005) တုန္းကဆုိရင္ Properties တစ္ခုကို Declare လုပ္မယ္ဆုိရင္ ေအာက္ပါအတုိင္းလုပ္ရပါတယ္။
private int iStudID;
private string strStudName;
public int StudID
{
get { return iStudID; }
set { iStudID = value; }
}
public string StudName
{
get { return strStudName; }
set { strStudName = value; }
}
စာဖတ္သူအတြက္ေတာ့ ဘယ္လိုေနလဲမသိဘူး ၊ က်ေနာ့္အေနနဲ႔ကေတာ့ အဲဒီ့ Code ကို ရိုက္ရတာ ေတာ္ေတာ္ပင္ပန္းတယ္ဗ်ာ။
ဒါေပမယ့္ အခု C# 3.0 (2008) ထြက္လာတဲ့အခါမွာေတာ့ Auto-Implemented Properties နဲ႔တင္ ေတာ္ေတာ္ေလး အဆင္ေၿပသြားတယ္....မယံုရင္ ေအာက္က Coding ကိုၾကည့္လိုက္ပါ။
public class AutoProperties
{
public int StudID { get; set; }
public string StudName { get; set;}
}
ကဲ ဘယ္ေလာက္ တုိလဲ။ ေရးရတာမ်ား သက္သာလိုက္တာ ေၿပာမေနနဲ႔။ ဒါေပမယ့္ ဒီလို အလြယ္လိုက္ခ်င္ရင္ေတာ့ နည္းနည္း စဥ္းစားတတ္ဖို႔ေတာ့လိုမယ္ေနာ္။ သူ႔အလုပ္လုပ္ပံုကေတာ့ Program Run ေနတုန္းမွာ ေနာက္ကြယ္ကေနၿပီးေတာ့ Anonymous Data Fields ေတြကို Create လုပ္ပါတယ္။ အဲဒီ့လို Create လုပ္ရင္းနဲ႔ Auto-Implemented Properties ကေနၿပီးေတာ့ Program ကိုထိန္းခ်ဳပ္ေပးသြားပါလိမ့္မယ္။
Implicitly Typed Local Variables
အကယ္လို႔မ်ား က်ေနာ္တုိ႔ဟာ ကိုယ့္ Program မွာ Local Variable တစ္ခုအေနနဲ႔ var ဆုိၿပီးေၾကၿငာခဲ့မယ္ဆိုရင္ Compiler ကေနၿပီးေတာ့ အဲဒီ့ Variable သက္ဆုိင္ရာ Datatype ကို အလုိလိုသတ္မွတ္ေပးသြားပါတယ္။
ဥပမာအားၿဖင့္
var iAge = 17;
var strName = "SYKO";
var Exp = 2.0 * 3.0;
အဲလိုေၾကၿငာခဲ့မယ္ဆုိရင္ေတာ့ သူတို႔ဟာ ေအာက္ပါ Code ေတြရဲ႕ အဓိပၸါယ္နဲ႔ တူညီပါတယ္။
int iAge = 17;
string strName = "SYKO";
double Exp = 2.0 * 3.0;
အဲဒီ့ Datatype ကို တစ္ခါတည္း မသတ္မွတ္ထားတဲ့ Implicit Local Variable ေတြဟာလည္း ကန္႔သတ္ခ်က္တစ္ခ်ိဳ႕ေတာ့ရိွပါတယ္။ အဲဒီ့ကန္႔သတ္ခ်က္ေတြ နဲ႔ ေရးသားသင့္တဲ့ နည္းေတြကေတာ့...
• Implicit Variables ေတြကို Local မွာဘဲေၾကၿငာပိုင္ခြင့္ရွိပါတယ္. Global အေနနဲ႔ ေၾကၿငာပိုင္ခြင့္မရိွပါဘူး။
• null အၿဖစ္သတ္မွတ္ထားတဲ့ Variable ေတြကိုလည္း 'var' အေနနဲ႔ ေၾကၿငာခြင့္မရွိပါဘူး။
var x = null;
• var နဲ႔ ေၾကၿငာမယ္ဆုိရင္ေတာ့ ၊ အဲဒီ့ေၾကၿငာတဲ့ Variable တန္ဖုိးကို အရင္ဆုံး တစ္ခုခုေတာ့ သတ္မွတ္ေပးရပါလိမ့္မယ္။ ေအာက္က Code လုိမ်ိဳးေရးလို႔ မရပါ။
var y;
• Intialize တန္ဖိုး သတ္မွတ္တဲ့အခါ Object ကို သတ္မွတ္လို႔လည္းရပါတယ္။ Object ကို သတ္မွတ္မယ္ဆုိရင္ေတာ့ keyword ၿဖစ္တဲ့ "new" ဆုိတာကို ထည့္ေပးရပါလိမ့္မယ္။
var x = new Int32[] { 1, 2, 3 };
အကယ္လို႔ ေအာက္က Code လိုမ်ိဳး new ဆုိတာ မပါခဲ့ရင္ေတာ့ Error တက္ပါလိမ့္မယ္။
var x = { 1, 2, 3 };
var x = Int32[] { 1, 2, 3 };
• အေပၚက Feature အသစ္ၿဖစ္တဲ့ Auto-Implemented Properties ကိုလည္း var နဲ႔ ေအာက္မွာေရးထားသလို တြဲသံုးလို႔မရပါဘူး။
public var StudID { get; set; }
• Implicit Variables ေတြကို Iterative Statements(Looping) ေတြၿဖစ္တဲ့ "for" ေတြနဲ႔ေတာ့ တြဲသံုးလို႔ရပါတယ္။
foreach (var a in new Int32[] {1, 2, 3})
Console .WriteLine(a);
• Implicit Type သံုးထားတယ္ဆုိရင္ေတာ့ Methods ေတြဟာ Return ၿပန္ႏိုင္စြမ္းမရိွေတာ့ပါဘူး။ မယံုရင္ ေအာက္က Code ကို Run ၾကည့္ပါ။ Compile လုပ္ေနခ်ိန္မွာ Error တက္မွာေသခ်ာပါတယ္။
public var BadThings()
{
return 0;
}
ဒါကေတာ့ Implicitly Typed Local Variables နဲ႔ ပါတ္သက္လို႔ က်ေနာ္ေလ့လာမိသေလာက္ပါ။ က်န္ရင္လည္းက်န္မယ္ထင္တယ္။ တခ်ိဳ႕ ႏုိင္ငံၿခားဖိုရမ္ေတြမွာေတာ့ ရွင္းထားတာ ပိုၿပီးမ်ားတယ္ထင္တယ္။
Extension Methods
Extension Method ဆုိတာကေတာ့ instance method ေတြမွာပါေလ့ရိွတဲ့ static method ေတြကိုေခၚတာပါ။ Static Method ကိုေတာ့ Static Class ေတြမွာသာ ေၾကၿငာလို႔ရတယ္ဆုိတာ Programmer တုိင္းသိၾကမယ္ထင္ပါတယ္။ မသိေသးတဲ့ ပရုိဂရမ္မာေပါက္စေလးေတြလည္း က်ေနာ္နဲ႔ အတူေလ့လာၾကည့္ရေအာင္ေနာ္။(က်ေနာ္လည္း ဘာမွမသိေသးလို႔ပါ
public static void ExportToExcel (this DataSet ds)
{
//do something...
}
Extension Methods ေတြကို "this" ဆုိတဲ့ keyword နဲ႔ ေၾကၿငာၿပီးေတာ့ ေရွ႕ဆုံးက ပါရာမီတာ မွာ ေမာ္ဒီဖိုင္ရာ တစ္ခုအေနနဲ႔ သတ္မွတ္ပါတယ္။ အေပၚက ကုဒ္မွာဆုိရင္ ExportToExcel ဆုိတဲ့ method ဟာ Dataset ဆုိတဲ့ Class တစ္ခုရဲ႕ Extension Method အေနနဲ႔ ေၾကၿငာထားတာပါ။
Extensin Method ေတြဟာ သူတို႔ကိုေၾကၿငာထားတဲ့ Static Class ေတြရိွေနတဲ့ NameSpace ထဲမွာပါ ရိွေနပါတယ္။
ေအာက္က ဥပမာကို ေလ့လာၾကည့္ပါမယ္။
namespace Orcas.Samples
{
public static class Extensions
{
public static void ExportToExcel(this DataSet ds)
{
//do something...
}
}
}
အေပၚက Method ေလးကေတာ့ Client Program မွာပါတတ္ပါတယ္။ ဘယ္လိုပါတတ္လဲဆုိေတာ့
using Orcas.Samples;
DataSet ds = new DataSet();
ds.ExportToExcel();
Extension methods ကို အသံုးၿပဳခ်င္တယ္ဆုိရင္ေတာ့ လိုက္နာရမယ့္စည္းကမ္းေတြလည္းရိွပါေသးတယ္။
* Instance methods ေတြကို Static Class ေတြထဲမွာဘဲ declared လုပ္ပိုင္ခြင့္ရိွပါတယ္။
* Instance methods ေတြဟာ extension methods ေတြထက္ ဦးစားေပးခံရပါတယ္။
* Inner NameSpace ထဲမွာရိွတဲ့ Extension methods ေတြဟာ ၊ တၿခား namespace ေတြေပၚမွာရိွတဲ့ Extension Methods ေတြထက္ ဦးစားေပးခံရပါတယ္။