<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Myo Zaw Latt</title>
    <description>The latest articles on DEV Community by Myo Zaw Latt (@myozawlatt).</description>
    <link>https://dev.to/myozawlatt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F52942%2F614eb3c8-206b-4ebf-9ba8-c906b70fb643.jpg</url>
      <title>DEV Community: Myo Zaw Latt</title>
      <link>https://dev.to/myozawlatt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/myozawlatt"/>
    <language>en</language>
    <item>
      <title>Async ဆိုတာဘယ်လိုမျိုးလဲ</title>
      <dc:creator>Myo Zaw Latt</dc:creator>
      <pubDate>Sat, 24 May 2025 03:01:00 +0000</pubDate>
      <link>https://dev.to/myozawlatt/async-chiuttaabhyliumiulai-2bm</link>
      <guid>https://dev.to/myozawlatt/async-chiuttaabhyliumiulai-2bm</guid>
      <description>&lt;p&gt;သင်တန်း Page တချို့က Marketing content တွေမှာ Async programming သုံးလိုက်ရင် App တွေကို ပိုမြန်လာစေတယ်ဆိုတာမျိုး ရေးနေတာတွေ့တယ်။ တခုနှစ်ခုမကတော့ဘူးဆိုတော့ လေ့လာနေသူတချို့က ဒါကိုဖတ်မိရင် Async ကို Speed up လုပ်ဖို့ သုံးရတယ်ဆိုတာမျိုး နားလည်မှုလွဲသွားနိုင်တယ်။&lt;/p&gt;

&lt;p&gt;Async သုံးလိုက်လို့ ပိုမြန်သွားတာမဟုတ်ဘူးလားဆိုရင်တော့ ဟုတ်ပါတယ်။ ဒါပေမဲ့ Performance efficiency ဖြစ်လို့ ပိုမြန်တာလို့ပြောရလိမ့်မယ်။ သဘောကတော့ ရိုးရိုးတန်းတန်း Synchronous method တခုက တမိနစ်ကြာတယ်ဆိုပါတော့။ Async ပြောင်းလိုက်လို့ စက္ကန့် ၃၀ ဖြစ်မသွားပါဘူး။ တမိနစ်ကြာတဲ့ Task က တမိနစ်ပါဘဲ။ Async သုံးလိုက်လို့ ဘာကွာခြားသွားတာလဲဆိုတော့ အက်သည့်ကြာနေတဲ့ တမိနစ်အတွက် စောင့်နေစရာမလိုဘဲ တခြား Task တခုလုပ်လို့ရသွားတာပါ။ ဒါကို Performance efficiency ဖြစ်တယ်ပြောတာပါ။လဘက်ရည်ဆိုင်တခုမှာ ဝိတ်တာ ဆယ်ယောက်ရှိတယ်ဆိုပါတော့။ ဝိုင်း ၁ က ဝိတ်တာ ၁ ကို စားစရာတခုမှာလိုက်တယ်။ ဝိတ်တာ ၁ က အက်တာကို စားဖိုဆောင်ဆီသွားမှာပြီး စားစရာမပြီးမချင်းထိုင်စောင့်နေပါတယ်။ စားဖိုဆောင်က စားစရာရပြီပြောရင် အက်တာကိုယူလာပြီး ဝိုင်း ၁ ဆီပြန်သွားပေးပါတယ်။ ကြည့်လိုက်ရင် သူမှာလိုက်တဲ့ ဝိတ်တာကဘဲ သူမှာတဲ့စားစရာကို မပြီးမချင်းစောင့်ယူပြီး လာပြန်ပို့ပေးတာပါ။ ဒီပုံစံနဲ့ လည်ပတ်နေတယ်ဆိုရင် ဝိတ်တာ ၁၀ ယောက်ရှိတဲ့အတွက် ဝိုင်း ၁၀ ဝိုင်းအထိ ပြသနာရှိမှာမဟုတ်သေးပါဘူး။ ၁၁ ဝိုင်းမြောက်ကတော့ သူ့ရှေ့က ၁၀ ဝိုင်းထဲက တယောက်လွတ်တဲ့ အထိစောင့်ရမှာပါ။ ပြီးမှ လွတ်တဲ့ ဝိတ်တာကို လိုချင်တာမှာမယ်။ ပြီးရင် မှာတဲ့ဟာမပြီးမချင်းပါ ထပ်စောင့်နေရလို့ ၂ ခါ အချိန်ကုန်တော့မှာပါ။ ဒါဟာ Synchronous programming ရဲ့ အလုပ်လုပ်တဲ့ပုံစံပါ။ တခါ နောက်ပုံစံတမျိုးမှာတော့ ဝိုင်း ၁ က ဝိတ်တာ ၁ ကို စားစရာတခုမှာပြီဆို ဝိတ်တာ ၁ က ဒါကိုစားဖိုဆောင်ဆီပဲ သွားမှာပေးအုံးမှာပါဘဲ။ ဒီတခါတော့ အရင်တခါနဲ့မတူတော့ပါဘူး။ စားဖိုဆောင်ဆီ Schedular တခုပေးခဲ့ပါတယ်။ ဒီစားစရာပြီးရင်တော့ ဝိုင်း ၁ ကို ပို့ပေးပါဆိုတာမျိုးပေါ့။ ဒီတော့ သူက စားစရာမပြီးမချင်း ထိုင်စောင့်နေစရာမလိုတော့ပါဘူး။ တခြားဝိုင်းက ခေါ်တာကိုသွားပေးလို့ရပါပြီ။ စားစရာရပြီဆို စားဖိုဆောင်က ဝိတ်တာ ၁ ပေးခဲ့တဲ့ Schedular အတိုင်းအော်ပေးလိုက်ရင် အားတဲ့ဝိတ်တာက ယူပြီး သက်ဆိုင်ရာ ဝိုင်းကို ပို့ပေးမှာပါ။ ဒီတော့ ဆိုင်မှာ ဝိုင်း ဆန့်သလောက် လူအကုန်လာထိုင်ရင်တောင် ဝိတ်တာတွေကိုမှာဖို့ တဝိုင်းနဲ့ တဝိုင်း စောင့်နေစရာမလိုဘဲ မှာလို့ရသွားမှာပါ။ တခုသတိထားရမှာက အရင်ပုံစံမှာရော နောက်ပုံစံမှာရော စားစရာကို ချက်ပြုတ်နေတဲ့ အချိန်ကတော့ အတူတူပါဘဲ။ ၁၁ ဝိုင်းမြောက်ဟာ ရှေ့က ဝိုင်းတွေကို စောင့်ရတဲ့အချိန် မလိုအပ်တော့တာဘဲ ကွာသွားတာပါ။ ဒါက Asynchronous programming ရဲ့ အလုပ်လုပ်တဲ့ ပုံစံဘဲဖြစ်ပါတယ်။ ဒီနေရာမှာ Speed up ရဲ့ သဘောတရားက Task handling နဲ့ မတူပါဘူး။ ထားပါတော့ ထမင်းကြော်တပွဲကို ၅ မိနစ်လောက်ကြော်နေရရင် ပိုမြန်လာအောင်က ဝိတ်တာတွေကိုမှာတဲ့ပုံစံနဲ့ မဆိုင်ပါဘူး။ စားဖိုခန်းကို အဆင့်မြှင့်ရမှာဖြစ်ပါတယ်။ Async သုံးလိုက်လို့ ပိုမြန်လာမှာ မဟုတ်ဘူးဆိုတာ ဒါကိုပြောတာပါ။&lt;/p&gt;

&lt;p&gt;ဒီတော့ ဘာလို့ Async သုံးလိုက်တာနဲ့ ပိုမြန်လာတယ်ထင်ရတာလဲ ဆက်ပြောပြပါမယ်။ ဥပမာ Web server တခုဆိုပါတော့။ Server က တချိန်တည်းမှာ Request 100 ကိုလက်ခံနိုင်ပြီး Sync နဲ့ run နေမယ်ဆိုရင် 101 ခုမြောက် Request ဟာ လေးနေမှာပါ။ လေးတာက Code နဲ့မဆိုင်ပါဘူး။ Server မှာ thread တွေမလွတ်တော့လို့ စောင့်နေရတာပါ။ အဲ Async သုံးတဲ့အခါမှာတော့ အဲတာကို စောင့်မနေရတော့တဲ့အတွက် မြန်မြန်ဆန်ဆန် Handle လုပ်ပြီး Response လုပ်လိုက်မှာပါ။ ဒါက Request ဘက်က ကြည့်ရင် ပိုမြန်သွားတယ်လို့ ခံစားရစေတာပါ။&lt;/p&gt;

&lt;p&gt;Async programming ဟာ အင်မတန်အကျိုးများသလို သုံးတတ်ရင်ဆေး မသုံးတတ်ရင်ဘေးပါ။ Async အသုံးကောင်းလို့ Deadlock မိတာတို့ Error ရှာမရတာတို့ ဖြစ်တတ်ပါတယ်။ Async ကို အကျိုးရှိရှိအသုံးချနိုင်ဖို့ဆိုရင် Process, Thread, Thread Pool, TAP, CPU Bound Task, IO Bound Task စတဲ့ အခြေခံသဘောတရားတွေ နားလည်ထားဖို့ လိုအပ်ပါတယ်။ ဒီနေရာမှာတော့ Async အကြောင်း အကျယ်မရေးပြနိုင်ပါဘူး။ အဆင်သင့်တဲ့အခါ ရေးပါမယ်။ အဓိကက Async ဆိုတာ Speed up လုပ်ဖို့သုံးရတာ မဟုတ်ဘူးဆိုတာနဲ့ သူ့ရဲ့ အခြေခံသဘောတရားတခုကို မြင်သာအောင် ဖော်ပြလိုက်ခြင်းဖြစ်ပါတယ်။&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>IEnumerable, Iteration and Deferred Execution: behind the scenes</title>
      <dc:creator>Myo Zaw Latt</dc:creator>
      <pubDate>Sat, 22 Feb 2025 15:02:58 +0000</pubDate>
      <link>https://dev.to/myozawlatt/ienumerable-iteration-and-deferred-execution-behind-the-scenes-2fa7</link>
      <guid>https://dev.to/myozawlatt/ienumerable-iteration-and-deferred-execution-behind-the-scenes-2fa7</guid>
      <description>&lt;p&gt;Programming basic လောက်ကိုသိတဲ့လူတယောက်အဖို့တော့ Array ဆိုတာ သိပ်မစိမ်းတဲ့ Data structure ဖြစ်နေမှာပါ။ C# မှာ Array ကို Access လုပ်ဖို့ Indexing, Looping/Iteration, Linq စသဖြင့် နည်းလမ်းများစွာရှိပါတယ်။ အဲဒီလို Collection-like data structure တွေအတွက်အဓိက အရေးပါတာကတော့ &lt;code&gt;IEnumerable&lt;/code&gt; interface ပဲဖြစ်ပါတယ်။ ဒီ Post မှာတော့ C# မှာ Collection data structure တွေအတွက် အဓိက ထောက်ပံ့ပေးထားတဲ့ &lt;code&gt;IEnumerable&lt;/code&gt;, &lt;code&gt;IEnumerator&lt;/code&gt; နဲ့ Iteration တွေအကြောင်း ပြောပြသွားမှာပါ။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iteration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Array ကို Access လုပ်ဖို့ မိမိနှစ်သက်တဲ့ Looping ပုံစံကိုသုံးနိုင်ပါတယ်။ ဒါပေမဲ့ ဘယ် Looping style ပဲသုံးသုံး Compiler က while loop အဖြစ်ပြောင်းရေးလိုက်မှာပါ။ ဒီလိုပါ။ ဆိုကြပါစို့။ အောက်မှာ Array တခုတည်ဆောက်ပြီး Looping ပုံစံနှစ်ခုနဲ့ Access လုပ်လိုက်ပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ဒါကို Compiler က ဒီလိုပြန်ရေးမှာပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// for loop&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;//foreach loop&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
     &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;အခြေခံအားဖြင့် တူညီတဲ့ While looping ပါဘဲ။ ဒါပေမဲ့ ဒီ Array ကိုဘဲ &lt;code&gt;IEnumrable&lt;/code&gt; variable ထဲပြောင်းထည့်ပြီး Looping ပြန်ပတ်လိုက်ရင်တော့ ကွဲပြားတဲ့ပုံစံကို တွေ့ရမှာပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;  &lt;span class="n"&gt;numerated&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numerated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;တခုသတိထားပြီးကြည့်ရင် &lt;code&gt;numerated&lt;/code&gt; ဆိုတဲ့ Variable ကို for loop နဲ့ looping ပတ်လို့မရတာကိုတွေ့ရမှာပါ။ ဘာလို့လဲဆိုတော့ သူ့မှာ Computed property မပါတော့လို့ပါ။ အပေါ်က Array မှာတုန်းကတော့ Length property ကို Counter ထားပြီး Loop ကို exit လုပ်နိုင်ပါတယ်။ &lt;code&gt;numerated&lt;/code&gt; variable ကို foreach နဲ့ပတ်ထားတဲ့ Looping ကိုတော့ Compiler က ဒီလိုပြန်ရေးမှာပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt; &lt;span class="n"&gt;numerated&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;intArray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="n"&gt;enumerator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numerated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MoveNext&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;number2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enumerator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;IDisposable&lt;/span&gt; &lt;span class="n"&gt;disposable&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enumerator&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;IDisposable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disposable&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;disposable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ဒီနေရာမှာ Compiler ပြန်ရေးတဲ့ while loop က ထူးခြားနေတာကိုတွေ့ရမှာပါ။ မူရင်း instance ကနေပြီးတော့ Enumerator object တခုရယူပြီးတော့ အဲဒီ Enumerator မှာရှိတဲ့ &lt;code&gt;MoveNext()&lt;/code&gt; method ကို Counter ထားပြီး Loop ပတ်သွားပါတယ်။ ဒါက Iterator pattern ကို အသုံးပြုထားတာဖြစ်ပါတယ်။ နောက်ထပ်ထူးခြားတာကတော့ try-finally block ကိုသုံးထားပြီး Enumerable object ကို Dispose လုပ်ထားတာပါ။&lt;/p&gt;

&lt;p&gt;C# မှာရှိတဲ့ Object တိုင်းဟာ Object class က Inherit လုပ်ထားသလိုမျိုးဘဲ Array တိုင်းဟာ Array class ကို Inherit လုပ်ပါတယ်။ ဒါက Language Semantic ဖြစ်ပါတယ်။ ဒီတော့ Array instance တခုဟာ Array class မှာရှိတဲ့ Public method တွေကို ရရှိပါတယ်။ Array class ဟာ &lt;code&gt;IList&lt;/code&gt; interface ကို Implement လုပ်ထားပြီး &lt;code&gt;IList&lt;/code&gt; interface က &lt;code&gt;IEnumerable&lt;/code&gt; interface ကို &lt;code&gt;ICollection&lt;/code&gt; interface ကဆင့် inherit လုပ်ထားပါတယ်။ ဒါကြောင့်မလို့ &lt;code&gt;IEnumerable&lt;/code&gt; variable ထဲကို Array instance assign လုပ်လို့ရတာပါ။&lt;/p&gt;

&lt;p&gt;&lt;code&gt;IEnumerable&lt;/code&gt; interface မှာ &lt;code&gt;IEnumerator&lt;/code&gt; interface ကို return လုပ်ထားတဲ့ &lt;code&gt;GetEnumerator()&lt;/code&gt; ဆိုတဲ့ Method တခုဘဲပါပါတယ်။ &lt;code&gt;IEnumerator&lt;/code&gt; interface မှာ &lt;code&gt;MoveNext()&lt;/code&gt; နဲ့ &lt;code&gt;Reset()&lt;/code&gt; method နှစ်ခုနဲ့ &lt;code&gt;Current&lt;/code&gt; ဆိုတဲ့ Read-only property တခုပါပါတယ်။ ဒီ Interface နှစ်ခုက C# ရဲ့ Iterator contract ပါ။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iterator pattern&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Iterator_pattern" rel="noopener noreferrer"&gt;Iterator pattern&lt;/a&gt; ဆိုတာ နာမည်ကြီး GOF pattern တခုပါဘဲ။ Pattern definition ကတော့ Collection ထဲက Element တွေကို သူ့ရဲ့ဖွဲ့စည်းတည်ဆောက်ပုံကို သိစရာမလိုဘဲ တခုချင်းစီ Access လုပ်နိုင်ဖို့ပါ။ Iterator တခုမှာ Collection ထဲမှာ Element တွေရှိသေးရဲ့လားဆိုတာ စစ်တဲ့ Flag တခုနဲ့ လက်ရှိရောက်နေတဲ့ Element ရနိုင်တဲ့ Property တခုပါရှိရမှာပါ။ Iterable Collection တခုဖြစ်ဖို့ဆိုရင် Iterator တခုအမြဲရှိရမှာဖြစ်ပါတယ်။ ဒါကြောင့်မလို့ C# မှာဆိုရင် &lt;code&gt;IEnumerable&lt;/code&gt; interface ဟာ Iterable collection ရစေဖို့အတွက် Iterator ဖြစ်တဲ့ &lt;code&gt;IEnumerator&lt;/code&gt; interface ကို contract အနေနဲ့ ထည့်ထားတာဖြစ်ပါတယ်။&lt;br&gt;
ဒီတော့ &lt;code&gt;IEnumerable&lt;/code&gt; interface ကို Implement လုပ်ထားတဲ့ Collection တခုရဖို့ ဒီလိုရေးရမှာပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NameCollection&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;_names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"A name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"B name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"C name"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;NameCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;NameCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NameEnumerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NameEnumerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NameCollection&lt;/span&gt; &lt;span class="n"&gt;_nameCollection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;Current&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;_nameCollection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_nameCollection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;_position&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;


        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;MoveNext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_position&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;_nameCollection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_position&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client code က ဒါမျိုးဖြစ်မှာပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NameCollection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;names2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NameCollection&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;"New name 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"New name 2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"New name 3"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;enumearator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumearator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MoveNext&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumearator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;အပေါ်က code မှာ storage အနေနဲ့ Array ကိုပဲ backing field အနေနဲ့သုံးထားပါတယ်။ &lt;code&gt;NameCollection&lt;/code&gt; ဟာ Looping ပုံစံနှစ်ခုလုံးနဲ့ အလုပ်လုပ်နိုင်တာကိုတွေ့ရမှာပါ။ Enumerable collection တခုကို Access လုပ်ဖို့အတွက် foreach နဲ့ while မှာဆိုရင်တော့ ကျနော့်အနေနဲ့ foreach loop ကိုဘဲရွေးချယ်ဖို့ အကြံပြုပါတယ်။ ဘာလို့လဲဆိုရင် foreach loop က Enumerator ကို Disposable ဖြစ်မဖြစ်စစ်ပေးပြီး တကယ်လို့ Disposable ဖြစ်တဲ့ Enumerator ဆိုရင် finally block ထဲမှာ တခါတည်း Dispose လုပ်ပေးသွားမှာမလို့ပါ။ ဒါကဘာနဲ့တူသလဲဆိုတော့ foreach က using block ကို shadow အနေနဲ့ သုံးပေးထားတာနဲ့တူပါတယ်။ ဒါဟာ Memory safety အတွက်အလွန်ကောင်းပါတယ်။ Disposable enumerator တွေက ဘယ်မှာတွေ့ရတတ်လဲဆိုတော့ &lt;code&gt;System.Collections.Generic&lt;/code&gt; namespace အောက်မှာရှိတဲ့ &lt;code&gt;IEnumerator&amp;lt;T&amp;gt;&lt;/code&gt; interface ကို implement လုပ်ထားတဲ့ enumerator မှာတွေ့ရပါတယ်။ &lt;code&gt;IEnumerator&amp;lt;T&amp;gt;&lt;/code&gt; interface ဟာ &lt;code&gt;IDisposable&lt;/code&gt; interface ကို inherit လုပ်ထားတာမလို့ &lt;code&gt;Dispose()&lt;/code&gt; method ကိုပါ တခါတည်း Implement လုပ်ပေးရမှာပါ။ ဒီတော့ &lt;code&gt;IEnumerable&lt;/code&gt; ကို Implement လုပ်ထားတဲ့ Collection ကို foreach နဲ့ loop ပတ်နိုင်တာဘာကြောင့်လဲ နားလည်လောက်ပြီ ယူဆပါတယ်။ ဒါက C# ရဲ့ Native iteration အကြောင်းပါဘဲ။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deferred execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Iterator/Enumerator တခုကို &lt;code&gt;IEnumeartor&lt;/code&gt; interface ကို Implement မလုပ်ဘဲ yield statement သုံးပြီး တည်ဆောက်နိုင်ပါတယ်။ အောက်မှာကြည့်ပါ။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NameCollection2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"A name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"B name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"C name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;အပေါ်မှာရေးထားတဲ့ Collection နဲ့ပုံစံတူ Collection တခုကိုရရှိမှာဖြစ်ပါတယ်။ ဒါပေမဲ့ ဒီမှာရရှိလာတဲ့ Enumerator ကတော့ Concrete class instance တခုမဟုတ်ဘဲ Compiler generate လုပ်ပေးလိုက်တဲ့ State machine instance ပဲဖြစ်ပါတယ်။ ဒါကို Lazy evaluation လို့ခေါ်တာပါ။ State machine instance ကို Access လုပ်တဲ့အခါမှာတော့ on-demand execution ပုံစံနဲ့လုပ်ဆောင်ပါတယ်။ Deferred execution လို့လည်းခေါ်ပါတယ်။ ဘယ်လိုပုံစံလဲဆိုတော့ Compiler က yield statement ကိုတွေ့ပြီဆိုတာနဲ့ သက်ဆိုင်ရာလိုအပ်ချက်နဲ့ ကိုက်ညီတဲ့ State machine class တခုကို method နာမည်နဲ့ generate လုပ်ပါတယ်။ အဲဒီ့ class က &lt;code&gt;IEnumerator&lt;/code&gt; interface ကို Implement လုပ်ထားပါတယ်။ State machine မှာ Indicator တခုပါပြီးတော့ အဲဒီ Indicator က yield keyword ရှိတဲ့နေရာတိုင်းကိုမှတ်ထားပေးမှာပါ။ &lt;code&gt;MoveNext()&lt;/code&gt; method ကိုတခါခေါ်တိုင်း state က တခါပြောင်းသွားပြီး yield statement ကို return လုပ်ပေးမှာပါ။ ပြီးရင်တော့ နောက်မှာရှိတဲ့ yield statement နေရာမှာ နောက်တခါ &lt;code&gt;MoveNext()&lt;/code&gt; ကိုမခေါ်မချင်း Pause လုပ်ထားမှာပါ။ နောက်တခါ &lt;code&gt;MoveNext()&lt;/code&gt; ကို ထပ်ခေါ်ရင် Pause ထားတဲ့နေရာကနေ ပြန် Run ပေးမှာပါ။ အပေါ်မှာရေးထားတဲ့ &lt;code&gt;GetEnumerator()&lt;/code&gt; method အတွက် State machine က ဒီလိုဖြစ်နေမှာပါ &lt;em&gt;(အတိအကျမဟုတ်ပါဘူး မြင်သာအောင်ရေးပြထားတာပါ။ တကယ် Generate လုပ်လိုက်တဲ့ code က ဒီထက်ပိုရှုပ်ထွေးပါတယ်)&lt;/em&gt;။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GetEnumerator&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;_current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;MoveNext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"A name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"B name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"C name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotSupportedException&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;Current&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deferred execution ကိုသုံးခြင်းအားဖြင့် Lazy evaluation ရရှိမှာဖြစ်ပြီးတော့ Performance efficient ဖြစ်စေမှာပါ။ ဥပမာ အောက်ကလို code မျိုးအတွက်ဆိုရင် Deferred execution က တော်တော်လေး သိသာမြင်သာရှိပါတယ်။&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;GetNormalList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;GetDeferredList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;GetNormalList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;numList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;numList&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetDeferredList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;GetNormalList&lt;/code&gt; method မှာဆိုရင် Client code ကနေခေါ်လိုက်တာနဲ့ ပေးထားတဲ့အကြိမ်ရေ မပြည့်မချင်း Loop ပတ်တာကို စောင့်ရမှာဖြစ်ပြီးတော့ ရလာတဲ့ number တွေကို Memory ထဲမှာသိမ်းထားရမှာပါ။ ဒီအတွက် Memory allocation လိုအပ်ပါတယ်။ Method ကို Execute လုပ်ပြီးတာနဲ့ Client code မှာရှိတဲ့ Looping အတိုင်း ဆက်သွားပြီး အကုန်လုံးကို printout လုပ်တာမလို့ Looping နှစ်ထပ်ဖြစ်ပြီး mean time နှစ်ဆ တက်ပါတယ်။ &lt;code&gt;GetDeferredList&lt;/code&gt; ကတော့ looping ထဲကနေ printout လုပ်တဲ့နေရာအထိ number တွေကို တိုက်ရိုက် Execute လုပ်တာမလို့ Memory allocation မရှိပါဘူး။ နောက်တခါ yield လုပ်ထားတဲ့တွက်ကြောင့် State machine နဲ့ execute လုပ်တာမလို့ Looping နှစ်ခုဟာ တိုက်ရိုက်ချိတ်ဆက်ပြီး အတူတွဲပြီး ပြီးဆုံးတဲ့အတွက် Mean time လည်းပိုနည်းသွားပါတယ်။ Breakpoint ထောက်ကြည့်လိုက်ရင် ပိုမြင်သာသွားမှာပါ။ ဒီတော့ Deferred execution ကို အသုံးပြုခြင်းအားဖြင့် ပိုမိုကောင်းမွန်တဲ့ Performance ကိုရရှိစေမှာဖြစ်ပါတယ်။ ကန့်သတ်ချက်အနေနဲ့ကတော့ Deferred execution က &lt;code&gt;IEnumerator&lt;/code&gt; နဲ့ &lt;code&gt;IEnumerable&lt;/code&gt; interface နှစ်ခုနဲ့ဘဲ yield လုပ်နိုင်ပါတယ်။ C# ရဲ့ Best of the best feature တခုဖြစ်တဲ့ Linq မှာတော့ Method chain တွေ အားလုံးဟာ Deferred execution နဲ့ပဲ Implement လုပ်ထားတာဖြစ်ပါတယ်။ ဒီလောက်ဆိုရင်တော့ Deferred execution အကြောင်း သဘောပေါက်လောက်ပြီ ယူဆပါတယ်။&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ဒီတော့ အားလုံးကို ခြုံငုံကြည့်မယ်ဆိုရင် &lt;code&gt;IEnumerable&lt;/code&gt; interface ဟာ C# ရဲ့ Iterator contract ဖြစ်ပြီး Iteration/Looping တွေဟာ Iterator pattern ကို အသုံးပြုပြီး execute လုပ်တယ်လို့နားလည်ထားရမှာပါ။ &lt;code&gt;IEnumerable&lt;/code&gt; နဲ့ &lt;code&gt;IEnumerator&lt;/code&gt; interface တွေဟာ Deferred execution ကို Enable လုပ်ပေးထားဖြစ်တဲ့အတွက် Lazy evaluation လိုအပ်ရင် yield statement သုံးပြီးရေးသားနိုင်ပါတယ်။&lt;br&gt;
C# မှာရှိတဲ့ Array တွေအားလုံးကို Array class က Backing ပေးထားတာဖြစ်ပြီးတော့ Array class ဟာ &lt;code&gt;IEnumerable&lt;/code&gt; interface ကို Implement လုပ်ထားပါတယ်။ ဒီတော့ C# မှာရှိတဲ့ Array အပါအဝင် Collection Data structure အားလုံးဟာ &lt;code&gt;IEnumerable&lt;/code&gt; interface ကို Implement လုပ်ထားတယ်လို့ ယူဆနိုင်ပါတယ်။ &lt;code&gt;IEnumerable&lt;/code&gt;, &lt;code&gt;IEnumerator&lt;/code&gt; နဲ့ Iterator pattern ကို နားလည်သဘောပေါက်ထားရင် Collection data structure တွေကို ကိုင်တွယ်ရာမှာဘဲ ဖြစ်ဖြစ် ကိုယ်တိုင် တည်ဆောက်ရာမှာဘဲဖြစ်ဖြစ် ပိုပြီးကောင်းမွန်သပ်ရပ်တဲ့ ပုံစံတွေနဲ့ လုပ်ဆောင်နိုင်မှာဖြစ်ပါတယ်။ &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading, happy coding!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
