C sharp (programming language)

C# (C sharp ဟု အသံထွက်ရန်) သည် Microsoft မှ ပြုလုပ်သော .NET ကို ဦးတည်သည့် ECMA (ECMA-334) and ISO (ISO/IEC 23270) စံမှီ object-oriented programming language ဖြစ်သည်။ Delphi တီထွင်သူ Anders Hejlsberg ဦးဆောင်သော C# language သည် C++ ၏ object-oriented syntax ကို အခြေခံပြီး ရှင်းလင်းလွယ်ကူရေးအတွက် အခြား programming language များ (အထူးသဖြင့် Delphi နှင့် Java) ကိုလည်း တုယူထားသည်။

## တည်ဆောက်ပုံ ရည်ရွယ်ချက် 
ECMA စံတွင် C# ၏ တည်ဆောက်ပုံ ရည်ရွယ်ချက် ကို အောက်ပါအတိုင်း ပြသည်။
* C# သည် ရှင်းလင်းသော၊ ခေတ်မှီသော၊ ယေဘူယျသုံး၊ object-oriented programming language ဖြစ်သည်။
* software ခိုင်မြဲမှု (robustness)၊ တာရှည်ခံခြင်း (durability) နှင့် ပရိုဂရမ်မာ ထုတ်လုပ်မှု မြင့်တင်စေရေးအတွက် strong type checking၊ array bounds checking၊ မဖြစ်သေးသော ကိန်းရှင် များ သိခြင်း၊ source code portability၊ အလိုလျောက် garbage collection ပြုလုပ်ခြင်းတို့ ပါရှိရန်လိုသည်။
* language တွင် distributed environment တွင်သုံးနိုင်သော software components ထုတ်လုပ်နိုင်ရန်။
* C နှင့် C++ သုံးသော ပရိုဂရမ်မာများ ပြောင်းလည်းသုံးစွဲနိုင်မှု အရေးကြီးသော အချက်ဖြစ်သည်။
* internationalization ရနိုင်မှုသည် အရေးကြီးသည်။
* C# သည် hosted နှင့် embedded system များတွင် အသုံးပြုနိုင်ရန် အရေးကြီးသည်။
* C# သည် memory နှင့် processing power သုံးစွဲမှုကို လျှော့ချရန် ရည်ရွယ်သော် လည်း C သို့မဟုတ် assembly language တို့နှင့် ယှဉ်ရန် မလိုပေ။

## သမိုင်း 
.NET စလုပ်စဉ်တွင် class library များကို Simple Managed C (SMC) ခေါ် language/compiler သုံး၍ရေးသားခဲ့သည်။ ၁၉၉၁တွင် Anders Hejlsberg သည် Cool ခေါ် programming language ကို တည်တွင်ခဲ့သည်။ ၂၀၀၀ တွင် Professional Developers Conference (PDC) ၌ ထို programming language ကို C# ဟု အမည်ပေးခဲ့သည်။ ထို class library များနှင့် ASP.NET များကို C# သို့ ပို့ခဲ့သည်။ 

C# ဒီဇိုင်နာ ဖြစ်သော Anders Hejlsberg သည် Microsoft တွင် ထိပ်တန်း architect ဖြစ်ပြီး Visual J++, Borland Delphi နှင့် Turbo Pascal တို့၏ ဒီဇိုင်နာ တွင်လည်း ပါဝင်ခဲ့သည်။ သူ၏ အင်တာဗျူးနှင့် စာတမ်းများတွင် C++, Java, Delphi, နှင့် Smalltalk တို့၏ အားနည်းချက်များကို ဆွေးနွေးထားပြီး Common Language Runtime (CLR) အခြေခံ ဖြစ်ပေါ်ပုံကို တင်ပြထားသည်။ ထိုမှတစ်ဆင့် C# ဒီဇိုင်းလုပ်ခဲ့ခြင်းဖြစ်သည်။ အခြားသူများကမူ C# တွင် ထို programming language အပြင် အခြား programming language များကိုလည်း တုယူထားကြောင်း ငြင်းဆိုချက်များရှိသည်။

## အသွင်လက္ခဏာများ 
ဒီဇိုင်းအားဖြင့် C# သည် Common Language Infrastructure (CLI) ၏ အတွင်းသဘော သဘာဝကို ဖော်ပြသော programming language ဖြစ်သည်။ C# ၏ အတွင်း type များမှာ CLI framework ၏ အသီးသီး value-type များကို တည်ဆောက်ထားသည်။ သို့သော် C# language ဖော်ပြချက်တွင် compiler ၏ code generation လိုအပ်ချက်တွင် C# compiler သည် CLI နှင့် ကိုက်ညီရမည် ကိုလည်းကောင်း ၊ Common Intermediate Language (CIL) ကို ထုတ်လုပ်ရမည်ကိုလည်းကောင်း ဖော်ပြမထားပေ။ သီအိုရီအားဖြင့် C# သည် C++ နှင့် Fortran တို့ကဲ့သို့ machine code များ ထုတ်လုပ်နိုင်သော်လည်း လက်တွေ့တွင်မူ CIL ကိုသာ ရည်ရွယ်သည်။ 

C# သည် C နှင့် C++ တို့နှင့် ခြားနားသလောက် Java နှင့် တူသည်။ ၎င်းတို့မှာ -
* global ကိန်းရှင် သို့မဟုတ် ဖန်ရှင် ဟူ၍မရှိပေ။ အားလုံးသော method နှင့် member များကို class ထဲတွင် ကြေညာရမည်။ သို့သော် public class များ၏ static method/variable များ အဖြစ်နှင့်မူ global ဖန်ရှင်/ကိန်းရှင် အစားရနိုင်သည်။
* C နှင့် C++ တို့နှင့် မတူပဲ local variable များကို enclosing blog အတွင်း shadow variable အဖြစ် လုပ်၍မရပေ။ Variable shadowing ကို C++ ရေးထုံးများတွင် ရောထွေးစေတတ်ကြောင်း ဖော်ပြသည်။
* C# သည် တိကျသော boolean type `bool` ကို အသုံးပြုသည်။ `while` နှင် `if` တို့ကဲ့သို့ ရွေးချယ်ချက်လိုသော အကြောင်းများတွင် boolean type လိုအပ်သည်။ C++ တို့တွင် boolean type အစား ကိန်းဂဏန်းတို့ကိုလည်း အသုံးပြုနိုင်သည်။ ဥပမာ `if(a)` တွင် `a` သည် bool အဖြစ်ပြောင်းရန်သာလိုသောကြောင့် `a` သည် int သို့မဟုတ် pointer လည်း ဖြစ်နိုင်ပေသည်။ C# သည် int ဆိုသည်မှာ မှန်သည် မှားသည် ဟု အဓိပ္ပာယ်မရပေ။ ထို့ကြောင့် = အစား == သုံးသော `if (a = b)` ဆိုသော တွေ့နေကြ အမှားများ ကင်းလေသည်။
* C# တွင် *unsafe* ဟုပြထားသော block အတွင်းမှလွဲ၍ memory address pointer များကို သုံးမရပေ။ unsafe ကုတ်ပါသော ပရိုဂရမ် များသည်လည်း run ရန် အထူး အခွင့်လိုသည်။ unsafe pointer များသည် value-type, array, string သို့မဟုတ် stack တွင် ထားသော မက်မိုရီ ပို point လုပ်ထားနိုင်သည်။ unsafe အဖြစ် လုပ်မထားသော C# ကုတ်သည် `System.IntPtr` သုံး၍ pointer များကို သုံးနိုင်သော်လည်း ၎င်းတို့ကို dereference ကား လုပ်၍မရပေ။ 
* Managed memory များကို free လုပ်၍မရပေ။ အလိုလျရောက် garbage collected ဖြစ်မည်။ Garbage collection ကြောင့် memory leaks ဖြစ်နိုင်သည်။ C# သည် `using` ကိုသုံး၍ finalization တွင်သေချာရန် ကုတ်ထည့်နိုင်သည်။ 
* C# တွင် interface များစွာကို implement လုပ်နိုင်သော လည်း multiple inheritance ကား မရပေ။ ၎င်းအချက်မှာ C# ကို ဒီဇိုင်လုပ်စဉ်ကပင် ဆုံးဖြတ်ခဲ့သော dependency hell ကို ကာကွယ်ရန်ဖြစ်ပြီး CLI အဘောတယားတွင် ရှင်းလင်းစေသည်။ 
* C# သည် C++ ထက် typesafe ဖြစ်စေသည်။ မူလ ပါဝင်သော type conversion များတွင် အန္တရာယ် မရှိသော အပြောင်းများသာ ခွင့်ပြုသည်။ ဥပမာ integer တို့တွင် ပို၍ ကြီးမားသော type သို့ပြောင်းခြင်းမျိုး၊ derived type မှ base type သို့ ပြောင်းခြင်းမျိုးတို့ ဖြစ်သည်။ ၎င်းတို့ကို compile-time၊ JIT အတွင်း နှင် တစ်ခါတစ်ရံ runtime တွင် အတည်ဖြစ် (enforce) စေသည်။ boolean နှင် integer သော်လည်းကောင်း enumeration member နှင် integer သော်လည်းကောင်း မူလ အပြောင်း (implicit conversion) မရှိချေ။ 
* Enumeration member များကို ၎င်းတို့၏ namespace တွင် သီးသန့် ထားရှိသည်။
* Accessor များဖြစ်သည့် Property များသည် C++ member field access များကဲ့သို့ object အတွင်းပိုင်းကို ပြောင်းလဲစေနိုင်သည်။ C++ တွင် member တစ်ခုကို public အဖြစ်ကျေးညာခြင်းဖြင် ထို member ကို ရေးဖတ်ခွင့် ပေးနိုင်ပြီး ပို၍ အသေးစိတ် ထိန်းချူပ်ရန် အတွက်မူ accessor method များကိုသုံးလေသည်။ C# တွင် Property သည်ပင် member access ကို ထိန်းချူပ်နိုင်ပြီး စစ်ဆေးနိုင်သည်။
* ရှာဖွေနိုင်သော reflection အားလုံးရှိသည်။
* ယခု C# တွင် reserved words ၇၇ လုံး ရှိသည်။

## Common Type system (CTS) 
C# တွင် *unified type system* ရှိသည်။ ၎င်းကို Common Type System (CTS) ဟုခေါ်သည်။

unified type system ဆိုသောကြောင့် type များအားလုံး integer စသည် အခြေခံ type များအပါအဝင် `System.Objec` class ၏ subclass များဖြစ်သည်။ ထို့ကြောင့် မည်သည်မဆို `ToString()` method ရှိသည်။ သို့သော် စွမ်းရည်ကောင်းစေဖို့အတွက် ၎င်း primitive types များကို object များကဲ့သို့ heap တွင် မထားပဲ stack တွင် ထားသည်။

### Datatype အမျိုးအစားများ 
CTS တွင် datatypes ကို အောက်ပါအတိုင်း ကဏ္ဍ နှစ်ခု ကွဲသည် -
* Value Type
* Reference Type

value type များကို ၎င်း၏ တန်ဖိုးကိုသာ stack ၏ မက်မိုရီ တွင် သိုလှောင်ထားပြီး reference type များသည် ၎င်းတန်ဖိုးထားရှိပါ မက်မိုရီ နေရာကိုသာ သိမ်းထားသည်။ Value type တွင် integers (short, long), floating-point numbers (float, double), decimal (a base 10 number), structures, enumerations, booleans and characters တို့ပါဝင်ပြီး Reference Type တွင် objects, strings, classes, interfaces and delegates တို့ ပါဝင်သည်။ 

### User-defined datatypes 
C# သည် `struct` သုံး၍ user-defined value types များ လုပ်နိုင်သည်။ Programmer အတွက်မူ ၎င်းသည် class အပေါ့စားများ အဖြစ်သုံးနိုင်သည်။ သာမန် class များနှင့်မတူပဲ standard primitives များကဲ့သို့ ၎င်းတို့ကို heap မှာ မထားပဲ stack မှာ ထားသည်။ ၎င်းသည် object ၏ အစိတ်ပိုင်း သို့မဟုတ် array တွင်လည်းကောင်း အသုံးပြုနိုင်ပြီး သာမန် class object များကဲ့သို့ memory indirection မလိုအပ်ပေ။ struct သည် များစွာသော အားနည်းချက်များရှိသည်။ struct တွင် null တန်ဖိုး မရှိသောကြောင့် array တွင် initialize မလုပ်ပဲ သုံးနိုင်သည်။ ၎င်းတန်ဖိုးများကို သုံးည ဖြင့်ဖြေဩားမည်ဖြစ်သည် (၎င်းတန်ဖိုးများကို ပြောင်း၍လည်း ရသည်)။ ပရိုဂရမ်မာ အနေဖြင့် argument တစ်ခုနှင့် အထက် ပါ struct constructor များ ပြုလုပ်နိုင်သည်။ အကြောင်းမှာ struct သည် virtual method table မရှိခြင်းကြောင့်ဖြစ်ပြီး ၎င်းကြောင့်ပင် inheritance မရနိုင်ပေ။ သို့သော် interface ကိုတော့ implement လုပ်နိုင်သည်။

### Boxing and unboxing 
*Boxing* ဆိုသည်မှာ value type တစ်ခု၏ value ကို ၎င်း၏ reference type အဖြစ်သို့ ပြောင်းခြင်းဖြစ်သည်။ 

Unboxing ဆိုသည်မှာ (အရင် box လုပ်ထားသော) reference type တစ်ခု၏ value ကို ၎င်း၏ value type အဖြစ်သို့ ပြောင်းခြင်းဖြစ်သည်။ ဥပမာ -

```csharp
int foo = 42; // Value type.
object bar = foo; // foo is boxed to bar.
int foo2 = (int)bar; // Unboxed back to value type.
```

## Features of C# 2.0 
## ကိုးကား