<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; C#</title><link>https://academy.hsoub.com/programming/c-sharp/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x644;&#x63A;&#x629; C#</description><language>ar</language><item><title>&#x627;&#x644;&#x623;&#x62E;&#x637;&#x627;&#x621; &#x627;&#x644;&#x639;&#x634;&#x631;&#x629; &#x627;&#x644;&#x623;&#x643;&#x62B;&#x631; &#x634;&#x64A;&#x648;&#x639;&#x64B;&#x627; &#x641;&#x64A; &#x644;&#x63A;&#x629; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D8%B4%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%83%D8%AB%D8%B1-%D8%B4%D9%8A%D9%88%D8%B9%D9%8B%D8%A7-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-c-r2451/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_11/C.png.75f2c8cc22b934ed70608459b60a7fae.png" /></p>
<p>
	لغة #C إحدى أبرز لغات البرمجة التي تطورها شركة مايكروسوفت ضمن بيئة التطوير المتكاملة Visual Studio. تعمل هذه اللغة ضمن بيئة تنفيذ اللغة المشتركة Common Language Runtime أو CLR اختصارًا والتي توفر ميزات عديدة مثل التكامل بين اللغات المختلفة ومعالجة الاستثناءات وتعزيز مستويات الأمان.
</p>

<p>
	وتعد لغة #C النموذج الأبسط والأكثر انتشارًا للغات التي تعمل ضمن بيئة CLR وهي تستخدم في مختلف أنواع التطبيقات سواء تطبيقات سطح المكتب أو تطبيقات الهاتف المحمول أو تطبيقات الجوال أو حتى ضمن خوادم البيانات.
</p>

<p>
	لغة #C هي لغة كائنية التوجه <a href="https://academy.hsoub.com/programming/general/%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-oop/" rel=""><abbr title="Object-Oriented Programming | البرمجة كائنية التوجه">OOP</abbr></a> وصارمة في تحديد الأنواع أي يجب تحديد نوع البيانات لكل متغير، وتساعد عمليات التحقق الصارمة من أنواع البيانات خلال مرحلة التصريف compile إلى اكتشاف أغلب الأخطاء البرمجية وتحديد مواقعها بدقة وتسريع معالجتها، مقارنة بلغات البرمجة التي تعتمد أسلوب تتبع الأخطاء في مرحلة التنفيذ runtime مما يزيد من صعوبة معرفة السبب الأساسي للخطأ، ومع ذلك يتجاهل العديد من مبرمجي لغة #C الفوائد الكبيرة من الكشف المبكر عن الأخطاء الأمر الذي قد ينجم عنه بعض المشكلات والأخطاء.
</p>

<p>
	يناقش هذا المقال أبرز أخطاء لغة #C على وجه الخصوص، لكن الأخطاء المطروحة هنا  تعمم على جميع لغات البرمجة التي تعمل ضمن بيئة CLR، أو اللغات التي تستخدم مكتبة الأصناف القياسية FCL.
</p>

<h2 id="1">
	الخطأ 1: استخدام المرجع كقيمة أو العكس
</h2>

<p>
	يمكن للمطورين بلغة ++C -وغيرها من لغات البرمجة- التحكم في القيم المسندة إلى المتغيرات سواء كانت قيم مباشرة values أو مراجع references تشير إلى لموقع الذاكرة لمتغير أو كائن موجود مسبقًا، أما في لغة البرمجة #C فمن يتحكم بهذا القرار هو المبرمج الذي كتب الكائن object وليس المبرمج الذي أنشأ نسخة instance من هذا الكائن وأسندها للمتغير، وهذا هو الخطأ الأول الشائع للأشخاص الذين يتعلمون البرمجة.
</p>

<p>
	لنأخذ المثال التالي الذي يوضح بعض المفاجآت التي يمكن أن تحدث إذا لم تكن على دراية بنوع الكائن الذي تستخدمه في برنامجك هل هو من نوع قيمة أم من نوع مرجع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_6" style=""><span class="pln"> </span><span class="typ">Point</span><span class="pln"> point1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Point</span><span class="pun">(</span><span class="lit">20</span><span class="pun">,</span><span class="pln"> </span><span class="lit">30</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">Point</span><span class="pln"> point2 </span><span class="pun">=</span><span class="pln"> point1</span><span class="pun">;</span><span class="pln">
      point2</span><span class="pun">.</span><span class="pln">X </span><span class="pun">=</span><span class="pln"> </span><span class="lit">50</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">point1</span><span class="pun">.</span><span class="pln">X</span><span class="pun">);</span><span class="pln">       </span><span class="com">// 20 (هل تفاجأت من هذه النتيجة)</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">point2</span><span class="pun">.</span><span class="pln">X</span><span class="pun">);</span><span class="pln">       </span><span class="com">// 50</span><span class="pln">

      </span><span class="typ">Pen</span><span class="pln"> pen1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Pen</span><span class="pun">(</span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Black</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">Pen</span><span class="pln"> pen2 </span><span class="pun">=</span><span class="pln"> pen1</span><span class="pun">;</span><span class="pln">
      pen2</span><span class="pun">.</span><span class="typ">Color</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Color</span><span class="pun">.</span><span class="typ">Blue</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">pen1</span><span class="pun">.</span><span class="typ">Color</span><span class="pun">);</span><span class="pln">     </span><span class="com">// Blue (أم تفاجأت من هذه النتيجة)</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">pen2</span><span class="pun">.</span><span class="typ">Color</span><span class="pun">);</span><span class="pln">     </span><span class="com">// Blue</span></pre>

<p>
	لاحظ أن كلًا من الكائنين <code>point</code> و<code>pen</code> أنشئا بنفس الطريقة تمامًا، لكن قيمة <code>point1</code> بقيت على حالها دون تغيير عند تعيين قيمة جديدة للإحداثي X في<code>point2</code>.
</p>

<p>
	أما في الحالة الثانية فقد تعدلت قيمة <code>pen1</code> عند إسناد قيمة لون جديدة إلى <code>pen2</code>، وبالتالي يمكننا استنتاج أن كلًا من <code>point1</code> و<code>point2</code> يحتويان على نسخة من الكائن الأصلي <code>point</code> أما <code>pen1</code> و<code>pen2</code> فيحتويان على مراجع references تشير للكائن الأساسي <code>pen</code> وهذا ما يمكنه أن نتعلمه من خلال التجربة.
</p>

<p>
	لمعرفة الفرق بين الحالتين يمكننا العودة إلى التعريف الخاص بكل كائن وهو ما يمكننا القيام به بسهولة في بيئة التطوير Visual Studio من خلال وضع المؤشر على اسم الكائن والضغط على المفتاح F12.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_10" style=""><span class="kwd">public</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">Point</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> </span><span class="pun">}</span><span class="pln">     </span><span class="com">// نوع قيمة value</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Pen</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> </span><span class="pun">}</span><span class="pln">        </span><span class="com">// نوع مرجع reference</span></pre>

<p>
	تستخدم الكلمة المفتاحية <code>struct</code> في لغة البرمجة #C لتعريف النوع كقيمة value في حين تستخدم الكلمة المفتاحية <code>class</code> لتعريف النوع كمرجع reference.
</p>

<p>
	غالبًا ما يقع المطورون الذين لديهم معرفة مسبقة بلغة البرمجة <a href="https://academy.hsoub.com/programming/cpp" rel="">++C</a> في هذا الخطأ فهناك تشابه كبير بالكلمات المفتاحية بينها وبين لغة #C، فإذا كنت ستعتمد في بعض البرامج على حالات قد تتطلب التمييز بين التمرير بالقيمة والتمرير بالمرجع (مثل القدرة على تمرير كائن ما كوسيط لتابع وجعل هذا التابع يغير من حالة الكائن) سيتوجب عليك اختيار النوع الصحيح للكائن لتجنب الوقوع في مثل هذه المشكلة.
</p>

<h2 id="2">
	الخطأ 2: عدم فهم القيم الافتراضية للمتغيرات غير المهيأة
</h2>

<p>
	عند تعريف متغير من النوع قيمة value عليك إسناد قيمة له، ولا يمكن إسناد القيمة null لهذا المتغير بشكل افتراضي، فالمتغيرات غير المهيأة من النوع قيمة يجب أن تحتوي على قيمة افتراضية معينة وهي القيمة الافتراضية لنوع القيمة المسندة لها.
</p>

<p>
	لذا عليك التحقق دومًا من وجود قيمة افتراضية للمتغير غير المهيَّأ قبل استخدامه، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_12" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Point</span><span class="pln"> point1</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Pen</span><span class="pln"> pen1</span><span class="pun">;</span><span class="pln">
          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">pen1 </span><span class="pun">==</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">      </span><span class="com">// True</span><span class="pln">
              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">point1 </span><span class="pun">==</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">    </span><span class="com">// False (لماذا؟)</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	لاحظ أنه لا يمكن إسناد null إلى <code>point1</code> لأن <code>point</code> من النوع قيمة والقيمة الافتراضية لها هي (0,0) وليست null، إن التعرف على هذا الخطأ في #C أمر بسيط وسهل للغاية لأن معظم الأنواع (وليس كلها) من النوع قيمة تمتلك الخاصية <code>IsEmpty</code> التي تمكنك من التحقق فيما إذا كان الكائن يمتلك قيمة افتراضية أم لا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_14" style=""><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">point1</span><span class="pun">.</span><span class="typ">IsEmpty</span><span class="pun">);</span><span class="pln">        </span><span class="com">// True</span></pre>

<p>
	عليك تهيئة أي متغير بقيمة افتراضية محددة، أو التأكد ما هي القيمة الافتراضية التي يأخذها بشكل افتراضي.
</p>

<h2 id="3">
	الخطأ 3: استخدام توابع مقارنة النصوص بشكل خاطئ
</h2>

<p>
	هناك العديد من الطرق لمقارنة النصوص في لغة #C، ويعد العامل <code>==</code> أقلها تفضيلًا، فعلى الرغم من استخدامه من قبل كثير من المبرمجين إلا أنه لا يحدد بشكل صريح نوع المقارنة المطلوبة في الكود ويفضل ان تستعيض عنه بالتابع <code>Equals</code> لاختبار تساوي النصوص كما يلي:
</p>

<pre class="ipsCode">public bool Equals(string value);
public bool Equals(string value, StringComparison comparisonType);
</pre>

<p>
	في السطر الأول من الكود السابق يعمل التابع <code>Equals</code> بطريقة مشابهة تمامًا للمقارنة باستخدام <code>==</code>، لكن تطبيقه يكون خاصًا بالسلاسل النصية فهو يجري مقارنة ترتيبية بين النصوص بناءً على المقارنة بايت بايت، وهذا مناسب في العديد من الحالات مثل مقارنة أسماء الملفات أو متغيرات البيئة.
</p>

<p>
	لكن في هذه الحالات التي نحتاج فيها لإجراء مقارنة معتمدة على الترتيب الأبجدي، فإن العيب الوحيد لاستخدام التابع <code>Equals</code> دون المعامل <code>comparisonType</code> هو أن القارئ قد لا يعرف نوع المقارنة المطبقة، أما السطر الثاني الذي يتضمن المعامل <code>comparisonType</code> لتحديد نوع المقارنة بدقة فهو يجعل الكود أوضح، ويجبرك على التفكير في نوع المقارنة التي ترغب في إجرائها.
</p>

<p>
	قد لا تتضح فائدة هذا المعامل في بعض اللغات كاللغة الإنجليزية إذ لا توجد اختلافات كبيرة عند استخدام المقارنات الترتيبية، لكن تؤدي المقارنة بدونه في لغات أخرى لحدوث أخطاء كالألمانية فقد يفسر الحرفان "ss" و"ß" على أنهما متساويين في بعض الحالات. لتوضيح ذلك، انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_16" style=""><span class="pln">  string s </span><span class="pun">=</span><span class="pln"> </span><span class="str">"strasse"</span><span class="pun">;</span><span class="pln">

      </span><span class="com">// outputs False:</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s </span><span class="pun">==</span><span class="pln"> </span><span class="str">"straße"</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"straße"</span><span class="pun">));</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"straße"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">Ordinal</span><span class="pun">));</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"Straße"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">CurrentCulture</span><span class="pun">));</span><span class="pln">        
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"straße"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">OrdinalIgnoreCase</span><span class="pun">));</span><span class="pln">

      </span><span class="com">// outputs True:</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"straße"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">CurrentCulture</span><span class="pun">));</span><span class="pln">
      </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="str">"Straße"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">CurrentCultureIgnoreCase</span><span class="pun">));</span></pre>

<p>
	بالتالي الطريقة العملية الآمنة للمقارنة بين النصوص هي تزويد التابع <code>Equals</code> بالمعامل <code>comparisonType</code> دائمًا، وفيما يلي بعض الإرشادات الأساسية:
</p>

<ul>
	<li>
		<p>
			استخدم المقارنة الحساسة للاختلافات بين اللغات عند مقارنة النصوص المدخلة من المستخدم أو التي ستعرض على المستخدم (<code>CurrentCulture</code> أو <code>CurrentCultureIgnoreCase</code>).
		</p>
	</li>
	<li>
		<p>
			استخدم المقارنة الترتيبية عند مقارنة النصوص المسندة برمجيًا (<code>Ordinal</code> أو <code>OrdinalIgnoreCase</code>).
		</p>
	</li>
	<li>
		<p>
			لا تستخدم المعاملين <code>InvariantCulture</code> و <code>InvariantCultureIgnoreCase</code> إلا في حالات محدودة جدًا لأن المقارنات الترتيبية في هذه الحالة أكثر فعالية.
		</p>
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: هناك تابع آخر لمقارنة النصوص بالإضافة إلى التابع <code>Equals</code> وهو التابع <code>Compare</code> الذي يقدم لك معلومات جيدة حول الترتيب النسبي للسلاسل النصية، وهو مناسب عند استخدام عوامل المقارنة <code>&lt;</code> و<code>=&gt;</code> و<code>=&lt;</code>.
</p>

<h2 id="4">
	الخطأ 4: استخدام العبارات التكرارية بدل التصريحية لمعالجة المجموعات
</h2>

<p>
	لقد غيرت استعلامات <a href="https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-linq-%D9%81%D9%8A-dot-net-r948/" rel="">LINQ</a> من طريقة الاستعلام عن المجموعات <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-collections-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r348/" rel="">Collections</a> ومعالجتها بشكل جذري، ولا يجوز استخدام العبارات التكرارية ضمن لغة الاستعلام LINQ. ومع ذلك لازال هناك عدد قليل من مبرمجي #C لا يعرفون بوجود لغة الاستعلام LINQ أو يعتقدون أن استخدامها يقتصر على التعامل مع قواعد البيانات بسبب التشابه الكبير بينها وبين لغة <a href="https://academy.hsoub.com/programming/sql/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-sql-r1368/" rel="">SQL</a>.
</p>

<p>
	تعمل تعليمات LINQ على أي مجموعة قابلة للتعداد enumerable بغض النظر عن نوع الكائن أو مجموعة البيانات التي تستخدمها، فإذا كانت البيانات قابلة للتعداد -أي يمكن المرور عبر العناصر داخلها واحدًا تلو الآخر- فيمكنك استخدام LINQ للقيام بعمليات استعلام وتصفية وتحليل لهذه البيانات.
</p>

<p>
	على سبيل المثال إذا كان لدينا مصفوفة تخزن حسابات مستخدمين فيمكن استعراضها من خلال التعليمة <code>foreach</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_20" style=""><span class="pln">decimal total </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
foreach </span><span class="pun">(</span><span class="typ">Account</span><span class="pln"> account in myAccounts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">account</span><span class="pun">.</span><span class="typ">Status</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"active"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          total </span><span class="pun">+=</span><span class="pln"> account</span><span class="pun">.</span><span class="typ">Balance</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	يمكننا كتابة الكود التالي بدلًا من الكود السابق:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_22" style=""><span class="pln"> decimal total </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">from account in myAccounts
         </span><span class="kwd">where</span><span class="pln"> account</span><span class="pun">.</span><span class="typ">Status</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"active"</span><span class="pln">
         select account</span><span class="pun">.</span><span class="typ">Balance</span><span class="pun">).</span><span class="typ">Sum</span><span class="pun">();</span></pre>

<p>
	المثال السابق هو مثال بسيط جدًا لتجنب الوقوع في مثل هذه المشكلة في #C، ولكن عند الانتقال إلى أمثلة أو حالات معقدة فيمكن لعبارة واحدة من عبارات LINQ أن تحل مكان العشرات من عبارات <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r320/" rel="">الحلقات التكرارية</a> أو الحلقات المتداخلة في الكود.
</p>

<p>
	بالطبع عليك استخدام القرار المناسب لبرنامجك سواء استخدام عبارات لغة الاستعلام المتكاملة LINQ أو استخدام العبارات التكرارية، هذا يعتمد على أداء البرنامج لذا يمكنك إجراء مقارنة لأداء الطريقتين واختيار الأنسب.
</p>

<h2 id="5linq">
	الخطأ 5: الفشل في فهم الكائنات الأساسية في عبارة LINQ
</h2>

<p>
	لغة الاستعلامات التكميلية اللغوية <a href="https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-linq-%D9%81%D9%8A-dot-net-r948/" rel="">LINQ</a> مهمة جدًا في معالجة مجموعات البيانات سواء كانت هذه البيانات كائنات في الذاكرة، أو في جداول قاعدة البيانات، أو حتى في ملفات XML، عادة لا يهمنا معرفة الكائنات الأساسية objects التي تعالجها تعليمات هذه اللغة، ولكن عمليًا يمكن لاستعلامات LINQ المتطابقة أن ترجع نتائج مختلفة عند تطبيقها على البيانات نفسها إذا اختلف تنسيق تلك البيانات.
</p>

<p>
	لاحظ الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_25" style=""><span class="pln">decimal total </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">from account in myAccounts
              </span><span class="kwd">where</span><span class="pln"> account</span><span class="pun">.</span><span class="typ">Status</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"active"</span><span class="pln">
              select account</span><span class="pun">.</span><span class="typ">Balance</span><span class="pun">).</span><span class="typ">Sum</span><span class="pun">();</span></pre>

<p>
	السؤال المطروح هنا ماذا يحدث عندما تكون قيمة <code>account.Status</code> لأحد الكائنات "Active" أي الحرف A كبير؟ الجواب هو كالتالي: إذا كانت المصفوفة <code>myAccounts</code> كائن من النوع <code>DbSet</code> وهو بشكل افتراضي غير حساس لحالة الأحرف فستبقى عبارة <code>where</code> مطابقة لحالة العنصر وتكون النتيجة النهائية صحيحة، أما إذا كانت المصفوفة <code>myAccounts</code> موجودة في الذاكرة فلن تتطابق مع حالة العنصر وتكون النتيجة خطأ.
</p>

<p>
	قد يتبادر لذهنك سؤال آخر: ذكرنا أن العامل <code>==</code> يجري مقارنة حساسة لحالة الأحرف في السلاسل النصية، فلماذا قام هنا بمقارنة غير حساسة للأحرف؟ الجواب عندما تكون الكائنات التي تتعامل معها عبارات LINQ مرتبطة بجدول SQL مثل كائن DbSet في إطار عمل الكيانات Entity Framework، سيحوَّل الاستعلام إلى عبارة T-SQL وفي هذه الحالة يتبع العامل <code>==</code> قواعد لغة SQL وهي غير حساسة لحالة الأحرف، ولن يتبع قواعد #C. لذلك تصبح المقارنة غير حساسة لحالة الأحرف.
</p>

<p>
	إذًا تستخدم لغة LINQ لتبسيط عملية الاستعلام عن البيانات ومعالجتها بغض النظر عن مصدرها، ولكن الفهم الخاطئ للكائنات التي تطبق عليها قد يتسبب بنتائج غير متوقعة، لذا يتوجب فهم كيفية تنفيذ LINQ بناءً على نوع مصدر البيانات. وإذا كانت العبارات التي تكتبها ستترجم إلى لغة أخرى غير #C ضمن إطار العمل عليك تأكد من عمل البرنامج بشكل صحيح عند التنفيذ.
</p>

<h2 id="6">
	الخطأ 6: الغموض عند استخدام توابع التمديد
</h2>

<p>
	كما ذكرنا سابقًا، تعمل لغة الاستعلام LINQ على أي كائن من النوع IEnumerable<t><code>‎</code> فعند استخدام استعلامات LINQ أو توابعها على كائن من النوع IEnumerable<t><code>‎</code>، فقد يبدو  أن هذه التوابع جزء من تعريف الواجهة IEnumerable<t><code>‎</code> نفسها. </t></t></t>
</p>

<p>
	<t><t><t>على سبيل المثال ستعمل الدالة البسيطة <code>Sum</code> في الكود التالي على إضافة الأرصدة إلى مجموعة من الحسابات كما يلي:</t></t></t>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_27" style=""><span class="pln">  </span><span class="kwd">public</span><span class="pln"> decimal </span><span class="typ">SumAccounts</span><span class="pun">(</span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Account</span><span class="pun">&gt;</span><span class="pln"> myAccounts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> myAccounts</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">a </span><span class="pun">=&gt;</span><span class="pln"> a</span><span class="pun">.</span><span class="typ">Balance</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	وسيط الدالة <code>myAccounts</code> في هذا الكود من النوع <code>&lt;IEnumerable&lt;Account</code>، وبما أن <code>myAccounts</code> يشير للتابع <code>()Sum</code> فقد تتوقع أن التابع معرف ضمن الواجهة <code>&lt;IEnumerable&lt;T</code>، لكن تعريف الواجهة <code>&lt;IEnumerable&lt;T</code> لا يتضمن التابع <code>Sum</code> ويبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_29" style=""><span class="kwd">public</span><span class="pln"> interface </span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="pln">out T</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">IEnumerable</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="typ">IEnumerator</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">GetEnumerator</span><span class="pun">();</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	فالسؤال المطروح هنا أين يتواجد تعريف التابع <code>()Sum</code>؟ فكما شرحنا في فقرات سابقة لغة #C هي لغة صارمة في تحديد الأنواع، وإذا كانت الإشارة للتابع <code>Sum</code> غير صحيحة فإن مصرّف لغة #C سيعلن عن وجود الخطأ ولن ينفذ الكود، لكن هذه الفرضية خاطئة والتابع موجود ولكن أين؟ أين توجد تعريفات جميع التوابع الأخرى التي تزودها لغة LINQ؟
</p>

<p>
	الجواب هو أن التابع <code>()Sum</code> غير معرف ضمن الواجهة <code>&lt;IEnumerable&lt;T</code> وإنما هو تابع ثابت يدعى تابع التمديد Extension Method وهو معرّف ضمن الصنف <code>System.Linq.Enumerable</code> كما هو موضح تاليًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_34" style=""><span class="pln"> </span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="pun">...</span><span class="pln">
          </span><span class="com">// الإشارة إلى this IEnumerable&lt;TSource&gt; source</span><span class="pln">
          </span><span class="com">//  هي التي توفر الوصول إلى تابع التمديد Sum</span><span class="pln">
          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> decimal </span><span class="typ">Sum</span><span class="pun">&lt;</span><span class="typ">TSource</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pln"> </span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">TSource</span><span class="pun">&gt;</span><span class="pln"> source</span><span class="pun">,</span><span class="pln">
                                             </span><span class="typ">Func</span><span class="pun">&lt;</span><span class="typ">TSource</span><span class="pun">,</span><span class="pln"> decimal</span><span class="pun">&gt;</span><span class="pln"> selector</span><span class="pun">);</span><span class="pln">
          </span><span class="pun">...</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	السؤال الآن: لماذا يختلف تابع التمديد عن أي تابع ثابت آخر، وكيف يمكن الوصول إليه من أصناف أخرى؟ الجواب هو أن أهم ما يميز تابع التمديد هو وجود المتغير <code>this</code> ضمن المعامل الأول للتعريف، فهو بمثابة المفتاح السحري الذي يخبر مصرّف اللغة أن هذا التابع هو تابع تمديد، ويشير هذا النوع من المعاملات إلى الصنف أو الواجهة وهي في حالتنا <code>IEnumerable&lt;TSource&gt;‎</code><tsource> </tsource>وبهذا، يمكن الوصول إلى التابع وكأنه جزء من الكائن نفسه، رغم تعريفه في الواقع في مكان آخر.
</p>

<p>
	<strong>ملاحظة</strong>: التشابه بين اسم الواجهة IEnumerable واسم الصنف Enumerable الذي يحتوي على تابع التمديد هو مجرد تشابه في الأسماء فقط ولا علاقة مباشرة بينهما.
</p>

<p>
	يمكننا وباعتماد هذا الفهم أن نكتب التابع <code>sumAccounts</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_36" style=""><span class="kwd">public</span><span class="pln"> decimal </span><span class="typ">SumAccounts</span><span class="pun">(</span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Account</span><span class="pun">&gt;</span><span class="pln"> myAccounts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">myAccounts</span><span class="pun">,</span><span class="pln"> a </span><span class="pun">=&gt;</span><span class="pln"> a</span><span class="pun">.</span><span class="typ">Balance</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	في الحقيقة كان بإمكاننا تطبيق هذه الطريقة بدلًا من الطريقة السابقة مما يدفعنا إلى سؤال جديد عن سبب وجود تابع التمديد والفائدة منه؟ الإجابة هي أن تابع التمديد مناسب بشكل كبير للغة البرمجة #C ويسمح بإضافة توابع إلى أنواع موجودة مسبقًا دون الحاجة إلى تعديل تلك الأنواع أو إنشاء أنواع جديدة.
</p>

<p>
	يمكن تضمين تابع التمديد في نطاق الكود عن طريق إضافة العبارة <code>using [namespace]⁢‎</code> في بداية الملف. ومن السهل معرفة المجالات التي تحتوي على توابع التمديد التي تحتاجها في #C. فعندما يستدعي مصرف #C تابعًا لم يتم تعريفه في الكائن، سيبحث في توابع التمديد ضمن المجالات المستوردة. وإذا وجد التابع، يستخدمه ويمرر الكائن كمعامل أول ثم يمرر المعطيات الأخرى. وإذا لم يجد التابع، سيعطي خطأ.
</p>

<p>
	تعد توابع التمديد ميزة في #C لكونها تساعد في كتابة كود أسهل وأوضح وتحقق جمالية الصياغة syntactic sugar وتجعل الكود أسهل في القراءة والفهم. ولكن، إذا لم تكن معتادًا على استخدامها قد تشعر بالارتباك في البداية. لكن مع الوقت والخبرة ستعتاد استخدامها والتعامل معها فقد أصبح استخدام توابع التمديد شائعًا في مكتبات #C البرمجية، مثل مكتبة LINQ، و<a href="https://academy.hsoub.com/programming/game-development/%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-game-engines/" rel="">محرك الألعاب</a> Unity، وإطار <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-web-apis-r2355/" rel="">Web <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>، وغيرها من المكتبات. وكلما كان <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">الإطار البرمجي</a> حديثًا، زادت احتمالية استخدامه لهذه التوابع.
</p>

<p>
	وبالرغم من المميزات التي توفرها هذه التمديد إلا أنها قد تتسبب ببعض الاخطاء في الكود لاسيما عند استخدام نماذج كود الجاهزة على الإنترنت أو أكواد جاهزة مكتوبة مسبقًا وتحتاج كمطور لفهمها بشكل جيد لتجاوز هذه الأخطاء. فعندما ينتج مصرف الكود أخطاء لأنه يستدعي توابع غير معرفة ضمن الأصناف المستدعاة فمن المرجح أن هذا يحدث بسبب تطبيق هذا الكود على إصدار مختلف من المكتبة أو على مكتبة أخرى مختلفة تمامًا مما يجعل المطورين يقضون الكثير من الوقت في البحث عن المكتبة المناسبة والإصدار المناسب للكود، وقد يواجه المطورون بعض الأخطاء عند استخدام توابع التمديد خصوصًا عندما يكون اسم التابع مشابهًا لاسم الكائن. في هذه الحالة، قد يحدث لبس بين التابع العادي وتابع التمديد وقد يكون الخطأ ناتجًا عن عدم التمييز بينهما.
</p>

<p>
	يمكنك أيضًا كتابة توابع التمديد الخاصة بك، ولكن انتبه جيدًا لأنه وبالرغم من أن توابع التمديد تُستدعى بنفس طريقة استدعاء التوابع العادية، إلا أن هناك اختلافًا في التنفيذ، فلا يمكن لتوابع التمديد على سبيل المثال الوصول إلى العناصر الخاصة private أو المحمية protected في الصنف. لذا لا يمكن لتوابع التمديد أن تحل محل الأصناف الأساسية التقليدية التي تستخدم الوراثة.
</p>

<h2 id="7">
	الخطأ 7: اختيار نوع المجموعة غير المناسب للمهمة المطلوبة
</h2>

<p>
	توفر لغة البرمجة #C الكثير من المجموعات <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-collections-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r348/" rel="">collection</a> وفيما يلي بعض منها:
</p>

<ul>
	<li>
		المصفوفة Array
	</li>
	<li>
		المصفوفة الديناميكية ArrayList
	</li>
	<li>
		جدول التعمية HashTable
	</li>
	<li>
		القاموس &lt;Dictionary&lt;K,V
	</li>
	<li>
		القائمة &lt;List&lt;T
	</li>
	<li>
		المكدس Stack
	</li>
	<li>
		الرتل Queue
	</li>
	<li>
		القائمة المرتبة SortedList
	</li>
	<li>
		القاموس النصي StringDictionary
	</li>
</ul>

<p>
	أحيانًا قد يكون وجود العديد من الخيارات أمام المطور محيرًا، ولكن عندما يتعلق الأمر بكائنات المجموعات، فإن تعدد الخيارات ميزة لكونها تمنحه القدرة على اختيار النوع الأنسب لاحتياجات برنامجه وتحقيق أداء أفضل وأخطاء أقل، فإذا كان هناك نوع مجموعات مصمم خصيصًا للتعامل مع نوع معين من البيانات، فمن الأفضل لك استخدامه فهو مصممة للعمل بكفاءة أكبر مع هذا النوع من البيانات.
</p>

<p>
	ولتجنب الأخطاء وضمان أمان الكود، استخدم المجموعات المعممة Generic Interfaces في #C التي تستلزم تعيين نوع العناصر التي ستتعامل معها المجموعة عند التصريح عنها وتتعامل مع نوع محدّد بدلاً من المجموعات غير المعممة Non-generic Interfaces التي  لا تحدد نوع العناصر وتجعل عملية التحقق من صحة الأنواع صعبة على مصرف #C.
</p>

<p>
	فعند التعامل مع أنواع البيانات الأساسية مثل السلاسل النصية أو الأعداد الصحيحة أو الأعداد الحقيقية، سيؤدي استخدام مجموعة غير معممة إلى عدم تحديد نوع البيانات التي ستحتفظ بها المجموعة.وبالتالي عندما تضيف أو تسترجع العناصر، سيحول مصرف اللغة البيانات إلى نوع الكائن العام، وهذا يسمى التعليب boxing وإلغاء التعليب unboxing. ويمكن أن تؤثر هذه العمليات على أداء البرنامج بشكل كبير مقارنة باستخدام مجموعة معممة تحتوي على نوع البيانات المناسب.
</p>

<p>
	ولا تحاول كتابة كود خاص لإنشاء كائنات المجموعات بنفسك، فإطار العمل .NET يوفر بالفعل العديد من المجموعات الجاهزة التي توفر الكثير من الوقت والجهد كما تقدم مكتبة <a href="https://itu.dk/research/c5/" rel="external nofollow">C5</a> في #C مجموعة من الأدوات وهياكل البيانات المتقدمة التي تسهل التعامل مع مجموعات البيانات مثل الأشجار الدائمة persistent trees وارتال الأولوية priority queues والقوائم المرتبطة linked lists وغيرها.. فهذه المجموعات تساعد في تنظيم البيانات وتسهل التعامل مع إضافتها وحذفها واسترجاعها.
</p>

<h2 id="8">
	الخطأ 8: إهمال تحرير الموارد غير المستخدمة
</h2>

<p>
	تستخدم بيئة تنفيذ CLR أداة كنس المهملات Garbage Collector <a href="https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%81%D9%8A-dot-net-r951/" rel="">لإدارة الذاكرة</a> تلقائيًا، فلست بحاجة لتحرير الذاكرة التي حجزتها عند إنشاء الكائنات. وعلى عكس لغات البرمجة مثل لغة ++C التي تحتوي على العامل <code>delete</code> أو لغة C التي تستخدم التابع <code>free</code> لتحرير الذاكرة، لا تتضمن لغة #C شيئًا مشابهًا.
</p>

<p>
	هذا لا يعني ذلك أن بإمكانك ترك مهمة حذف الكائنات لكانس المهملات بمجرد الانتهاء من استخدامها فبعض الكائنات قد تحتوي على موارد إضافية مثل ملفات على القرص، أو اتصالات بقواعد البيانات أو منافذ الشبكة، ويجب عليك تحرير هذه الموارد يدويًا لأن تركها دون تحرير يمكن أن يؤدي إلى نفاد موارد النظام وقد يسبب مشاكل في الأداء وأخطاء في البرنامج.
</p>

<p>
	على الرغم من إمكانية تعريف تابع الهدم <code>destructor</code> في أي صنف من أصناف #C، فإن المشكلة تكمن في أننا لا نعرف متى يستدعى التابع بدقة فهو يستدعى من كانس المهملات عبر خيط thread منفصل وهذا قد يسبب مشكلات إضافية، لأن توقيت الاستدعاء غير معروف، ولحل لهذه المشكلة يمكن استخدام كانس المهملات بصورة قسرية باستخدام التابع <code>()GC.Collect</code> لكن هذه الطريقة غير عملية أيضًا لأنها ستوقف مجموعة من الخيوط threads عن التنفيذ لفترة غير محددة ريثما يتم جمع البيانات غير المهمة. في الواقع توجد عدة استخدامات مفيدة لتابع الهدم في لغة #C، ولكن استخدامه لإجبار تحرير الذاكرة ليس أحد هذه الاستخدامات.
</p>

<p>
	يحتوي إطار العمل .NET على واجهة باسم <code>IDisposable</code> تتضمن تابعًا واحدًا فقط يسمى <code>Dispose()‎</code>. وأي كائن ينفذ هذه الواجهة سينفذ تابع <code>Dispose()‎</code> الذي يساعد في تحرير الموارد بفعالية. فعندما تريد إنشاء وتحرير كائن object في كتلة الكود نفسها استخدم التابع <code>()Dispose</code> بشكل أساسي، ويمكنك استخدام العبارة <code>using</code> للتأكد من استدعاء <code>()Dispose</code> بغض النظر عن الطريقة التي ستخرج فيها من الكود سواء بسبب وقوع استثناء أو بسبب عبارة return أو إغلاق كتلة الكود، والعبارة <code>using</code> المذكورة هنا هي نفس تلك المستخدمة لتضمين فضاء الأسماء namespace أعلى ملف #C، وتجدر الإشارة هنا بأن للعبارة <code>using</code> استخدامًا آخر لا يعرفه الكثير من المطورين وهو ضمان استدعاء التابع <code>()Dispose</code> للكائن عند الخروج من كتلة الكود كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_42" style=""><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="typ">FileStream</span><span class="pln"> myFile </span><span class="pun">=</span><span class="pln"> </span><span class="typ">File</span><span class="pun">.</span><span class="typ">OpenRead</span><span class="pun">(</span><span class="str">"foo.txt"</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
       myFile</span><span class="pun">.</span><span class="typ">Read</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	في المثال السابق وبعد إنشاء العبارة <code>using</code>، سيتأكد المطور أنه التابع <code>()myFile.Dispose</code> سيستدعى بمجرد انتهاء العمل بالملف سواء أصدر التابع <code>()Read</code> استثناء أو لم يصدر.
</p>

<h2 id="9">
	الخطأ 9: تجنب الاستثناءات
</h2>

<p>
	تطبق لغة البرمجة #C مبدأ يسمى أمان النو ع Type safety أثناء تشغيل البرنامج، وهو يساعد المطورين على اكتشاف الأخطاء بسرعة أكبر مقارنة ببعض اللغات الأخرى مثل ++C التي قد يؤدي التحويل الخاطئ بين أنواع البيانات فيها إلى إسناد قيم غير صحيحة أو عشوائية للمتغيرات.
</p>

<p>
	لكن مبرمجي #C لا يستفيدون بشكل كامل من هذه الميزة، مما يؤدي إلى بعض الأخطاء في الكود. فلغة #C تقدم طريقتين لمعالجة الأخطاء: الأولى تعتمد على إصدار استثناءات try/catch`، والثانية لا تستخدم الاستثناءات لإدارة الأخطاء وتتعامل معها بطريقة أخرى مثل التحقق من القيم أو التأكد من صحة المدخلات قبل إجراء العمليات عليها. فبعض المبرمجين يتجنبون استخدام الاستثناءات معتقدين أن ذلك يقلل من حجم الكود، لكن هذا قد يؤدي إلى تجاهل الأخطاء المهمة.
</p>

<p>
	على سبيل المثال، هناك طريقتان مختلفتان للتحويل القسري بين أنواع البيانات أي لتحويل الكائنات بين أنواع البيانات المختلفة كما في الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_44" style=""><span class="com">// طريقة1:</span><span class="pln">
      </span><span class="com">// سيرمى استثناء إذا لم نتمكن من تحويل account إلى  SavingsAccount</span><span class="pln">
      </span><span class="typ">SavingsAccount</span><span class="pln"> savingsAccount </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">SavingsAccount</span><span class="pun">)</span><span class="pln">account</span><span class="pun">;</span><span class="pln">

</span><span class="com">// طريقة2:</span><span class="pln">
      </span><span class="com">// لن يرمى استثناء في حال لم نتمكن من التحويل</span><span class="pln">
      </span><span class="com">// سيتم تعيين savingsAccount إلى null بدلاً من ذلك</span><span class="pln">
      </span><span class="typ">SavingsAccount</span><span class="pln"> savingsAccount </span><span class="pun">=</span><span class="pln"> account as </span><span class="typ">SavingsAccount</span><span class="pun">;</span></pre>

<p>
	الخطأ الأكبر الذي قد يحدث عند استخدام الطريقة الثانية في الكود السابق هو نسيان التحقق من القيمة المرجعة. إذا كانت القيمة <code>null</code>، ولم تتحقق منها، فقد يؤدي ذلك إلى حدوث استثناء من النوع <code>NullReferenceException</code> في وقت لاحق، مما يصعب عليك تحديد السبب الفعلي للمشكلة. أما في الطريقة الأولى، فسيطلق استثناء مباشر من نوع <code>InvalidCastException</code> إذا كان التحويل غير ممكن ممل يساعدك على تحديد مكان المشكلة ومعرفتها بسرعة.
</p>

<p>
	بالنسبة للطريقة الثانية، حتى إذا قام المبرمج بالتحقق من القيمة المرجعة، فإن المشكلة تبقى إذا كانت القيمة فارغة <code>null</code>. فماذا يفعل المبرمج في هذه الحالة؟ هل من الأفضل له معالجة هذه الأخطاء داخل التابع؟ وهل هناك طريقة أخرى للتعامل مع فشل عملية التحويل؟
</p>

<p>
	إذا كانت الإجابة لا على هذه الأسئلة، فإن أفضل خيار هو إطلاق استثناء مباشرة عند حدوث المشكلة. هذا يسهل التعامل مع الأخطاء في وقت حدوثها بدلاً من انتظار حدوث مشاكل لاحقة.
</p>

<p>
	لاحظ المثال التالي حيث ستصدر الطريقة الأولى استثناء أما الطريقة الثانية فلا تصدره:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_48" style=""><span class="typ">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">();</span><span class="pln">     </span><span class="com">// يرمي استثناء إذا لم يكن بالإمكان تحويل الوسيط</span><span class="pln">
</span><span class="typ">int</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">();</span><span class="pln">  </span><span class="com">// يعيد قيمة من نوع bool للدلالة على ما إذا كان التحويل قد نجح</span><span class="pln">

</span><span class="typ">IEnumerable</span><span class="pun">.</span><span class="typ">First</span><span class="pun">();</span><span class="pln">     </span><span class="com">// يرمي استثناء إذا كانت السلسلة فارغة</span><span class="pln">

</span><span class="typ">IEnumerable</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">();</span><span class="pln">     </span><span class="com">// يعيد null أو القيمة الافتراضية إذا كانت السلسلة فارغة</span></pre>

<p>
	يكره بعض مطوري لغة #C الاستثناءات ويعتقدون أن الطرق التي لا تطلق استثناءات هي الأفضل، لكن بالطبع لا يمكن تعميم هذا الحكم على جميع الحالات. فهناك مواقف معينة قد يكون فيها هذا الرأي صحيحًا، ولكن ليس دائمًا.
</p>

<p>
	إذا كان لدينا خيار بديل لاستبدال إطلاق استثناء في حالة معينة، وكان هذا الخيار مناسبًا وصحيحًا، فمن الأفضل استخدامه. ولتوضيح ذلك، يمكننا كتابة الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_52" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="pln">myString</span><span class="pun">,</span><span class="pln"> out myInt</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// استعمل myInt</span><span class="pln">
      </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// استعمل القيمة الافتراضية</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	بدلًا من الكود التالي الذي يطلق استثناء:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_54" style=""><span class="pln"> </span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        myInt </span><span class="pun">=</span><span class="pln"> </span><span class="typ">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myString</span><span class="pun">);</span><span class="pln">
        </span><span class="com">// استعمل myInt</span><span class="pln">
      </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">FormatException</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// استعمل القيمة الافتراضية</span><span class="pln">
      </span><span class="pun">}</span></pre>

<p>
	لا يمكن اعتبار تابع التحويل <code>TryParse</code> في المثال السابق الطريقة الأفضل فقد يكون هذا الكلام صحيحًا في بعض الحالات وقد يكون غير صحيح في حالات أخرى، لذا عليك اختيار الطريقة المناسبة حسب الحالة.
</p>

<h2 id="10">
	الخطأ 10: السماح بتراكم تحذيرات المصرّف
</h2>

<p>
	هذه المشكلة شائعة في جميع لغات البرمجة، لكنها أكثر خطورة في لغة #C لأنها تؤدي إلى تجاهل المصرف لميزة التحقق الصارم من النوع وهذا التحقق مهم في #C. والتحذيرات أو التنبيهات warning هي رسائل يصدرها المترجم ليخبرك بوجود مشاكل محتملة في الكود، لكنها لا تمنع الكود من التنفيذ. أما الأخطاء، فهي تشير إلى مشكلة واضحة يجب على المبرمج إصلاحها. الفرق هو أنه عندما يحصل الكود على تحذير، سينفذ الكود لكنه ينبهك لاحتمالية حدوث شيء غير طبيعي، بينما الأخطاء تمنع الكود من العمل نهائيًا.
</p>

<p>
	من أبسط الأمثلة على هذا النوع من الأخطاء هو نسيان حذف السطر الذي عرفت فيه متغير بعد تعديل خوارزمية ما وتوقفها عن استخدام هذا المتغير. في هذه الحالة، سيعمل البرنامج بشكل طبيعي، لكن سيصدر المترجم تحذيرًا بأن هذا المتغير غير مستخدم في الكود وغالبًا ما يتجاهل المبرمجون هذا التحذير ولا يعالجونه، كما يخفي معظم المبرمجين التحذيرات في النافذة Error List الموجودة في بيئة التطوير Visual Studio ويهتمون فقط بمعالجة الأخطاء مما يؤدي إلى تراكم هذه التحذيرات وهذا هو الخطأ بعينه. في حال تجاهل التحذيرات فإننا سنرى في القريب العاجل شيء يشبه الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4458_58" style=""><span class="kwd">class</span><span class="pln"> </span><span class="typ">Account</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

          </span><span class="typ">int</span><span class="pln"> myId</span><span class="pun">;</span><span class="pln">
          </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">;</span><span class="pln">   </span><span class="com">// يطلق المصرف تحذير هنا لكنك لم تنتبه له</span><span class="pln">

          </span><span class="com">// الباني</span><span class="pln">
          </span><span class="typ">Account</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">myId </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">;</span><span class="pln">     </span><span class="com">//  خطأ</span><span class="pln">
          </span><span class="pun">}</span><span class="pln">

      </span><span class="pun">}</span></pre>

<p>
	يوجد خطأ كبير في الكود السابق بالرغم من أن مصرف اللغة وضعه كتحذير فقط وهو تعيين قيمة المتغير <code>Id</code> للمتغير <code>myId</code> باستخدام الأمر <code>this.myId=Id</code> والذي يجب أن يكون <code>this.myId=id</code>، إذا تجاهلت التحذير ستضيع الكثير من الوقت في تتبع مثل هذا الخطأ حسب درجة تعقيد البرنامج، أما إذا عالجته من البداية فستكتشف الخطأ بوقت قصير.
</p>

<p>
	فيجب عليك كمبرمج عدم تجاهل التحذيرات التي تستغرق بضع ثوانٍ لحلها في بداية ظهورها، في حين ستحتاج مع تقدمك في البرنامج إلى ساعات لمعرفة سبب التحذيرات وحلها، تأكد اولًا بأول من أن النافذة Error List الموجودة في بيئة التطوير Visual Studio لا تحتوي أي أخطاء أو تحذيرات وعالجها على الفور.
</p>

<p>
	من المعروف أن لكل قاعدة استثناءات، ففي بعض الأحيان قد تحتاج إلى كتابة كود يصدر تحذير ولكنك ستتجاهل هذا التحذير ليتنفيذ البرنامج بالطريقة التي تريدها. في هذه الحالات النادرة، يمكنك استخدام الأمر <code>[pragma warning disable [warning id#</code> في الكود نفسه الذي يصدر التحذير ليتوقف عن تشغيل التحذير المحدد، مع إمكانية تنبيهك لأي تحذيرات جديدة إذا كانت هناك حاجة لذلك.
</p>

<h2 id="">
	الخلاصة
</h2>

<p>
	تعد لغة البرمجة #C من اللغات القوية والمرنة التي تساعد المطورين على تحسين أدائهم وإنتاجيتهم. ولكن الفهم المحدود لأساسيات اللغة سيعيق تطورك ويجعلك تكتب برامج ضعيفة تحتوي على أخطاء من الصعب معرفة سببها. نرجو أن يكون هذا المقال قد ساعدك على التعرف على التفاصيل الدقيقة في أساسيات #C وتجنب الأخطاء الشائعة والتحديات التي قد يواجهونها عند البرمجة بهذه اللغة.
</p>

<p>
	ترجمة وبتصرف للمقال<a href="https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make" rel="external nofollow"> Buggy C# Code: The 10 Most Common Mistakes in C# Programming</a> لكاتبه Patrick Ryder.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7%D8%A1%D8%A7%D8%AA-%D9%88%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r385/" rel="">الاستثناءات ومعالجة الأخطاء في لغة سي شارب #C</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r1342/" rel="">كيفية التعامل مع الأخطاء البرمجية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D8%B4%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%83%D8%AB%D8%B1-%D8%B4%D9%8A%D9%88%D8%B9%D9%8B%D8%A7-%D9%81%D9%8A-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-python-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r2429/" rel="">الأخطاء العشرة الأكثر شيوعًا في شيفرة بايثون Python البرمجية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D8%B4%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%83%D8%AB%D8%B1-%D8%B4%D9%8A%D9%88%D8%B9%D9%8B%D8%A7-%D9%81%D9%8A-%D8%B4%D9%8A%D9%81%D8%B1%D8%A9-php-r2434/" rel="">الأخطاء العشرة الأكثر شيوعًا في شيفرة PHP</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2451</guid><pubDate>Thu, 21 Nov 2024 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x644;&#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-c-r597/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_03/05.png.0d7c252a04e4fab99e10baad1b2675f9.png" /></p>
<p>
	لغة C# هي لغة برمجة أنيقة، كائنيّة التوجه Object-oriented بأنواع بيانات سليمة Type-safe تمكّن المطورين من بناء تطبيقات آمنة ومتينة تعمل على إطار العمل NET.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><span class="com">// تبدأ التعليقات وحيدة السطر بشريطين مائلين هكذا //</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>
/*
توضع التعليقات متعدّدة الأسطر بين العلامة أعلاه والعلامة أسفله
*/
</code></pre>

<p>
	هذا تعليق xml يُستخدَم لتوليد توثيق خارجي<br>
	أو لتقديم مساعدة حسب السياق في بيئة تطوير مندمجة IDE.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>/// &lt;param name="firstParam"&gt; لتوثيق الدالة Parameter الذي هو معامل firstParam هذا تعليق&lt;/param&gt;
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>/// &lt;returns&gt;معلومات عن القيمة المُرجَعة للدالة/returns&gt;
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>//public void MethodOrClassOrOtherWithParsableHelp(string firstParam) {}
</code></pre>

<p>
	يحدّد فضاءات اﻷسماء <code>Namespaces</code> التي ستستخدمها هذه الشفرة<br>
	فضاءات الأسماء أدناه هي كلّها جزء من مكتبة الأصناف Classes المعيارية في إطار العمل NET.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Framework Class Library
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.IO;
</code></pre>

<p>
	فضاء الأسماء هذا ليس مُتضمّنا في المكتبة المعيارية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>using System.Data.Entity;
</code></pre>

<p>
	لكي تتمكّن من استخدام المكتبة أعلاه فستحتاج لإضافة مرجع إلى ملف <code>dll</code> وهو ما يمكن لمدير الحزم NuGet فعلُه: <code>Install-Package EntityFramework</code><br>
	تعرّف فضاءات الأسماء مجالات لتنظيم الشفرات ضمن حزم Packages أو وِحْدات Modules لاستخدام فضاء الأسماء المُعرّف أدناه في شفرة أخرى نضيف العبارة <code>Learning.CSharp</code> إلى فضاءات الأسماء المستخدمة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>namespace Learning.CSharp
{
</code></pre>

<p>
	يجب أن يحوي كل ملف <code>cs.</code> على الأقل على صنف Class له نفس اسم الملف. يمكنك لك عدم التقيّد بهذا الشرط، إلا أنه أفضل لصحة الشفرة المصدرية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class LearnCSharp
{
</code></pre>

<p>
	<strong>صياغة أساسية:</strong> يمكنك التجاوز إلى “ميزات مثيرة للاهتمام” إن سبق لك كتابة شفرات بجافا أو سي++
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void Syntax()
{
    // للكتابة في سطر جديد Console.WriteLine استخدم
    Console.WriteLine("Hello World");
    Console.WriteLine(
        "Integer: " + 10 +
        " Double: " + 3.14 +
        " Boolean: " + true);

        // لكتابة عبارات على نفس السطر Console.Write استخدم 
        Console.Write("Hello ");
        Console.Write("World");
</code></pre>

<h2>
	<a id="__Types__Variables_64" rel=""></a>أنواع البيانات Types والمتغيّرات Variables
</h2>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<p>
	عرّف المتغيّرات على النحو التالي <code>&lt;type&gt; &lt;name&gt;</code>
</p>

<p>
	<code>Sbyte</code> - عدد صحيح (سالب أو موجب) على 8 بتات (محصور بين 128- و127)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>sbyte fooSbyte = 100;
</code></pre>

<p>
	<code>Byte</code> - عدد طبيعي (موجب فقط) على 8 بتات (محصور بين 0 و255)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>byte fooByte = 100;
</code></pre>

<p>
	<code>Short</code> - عدد صحيح أو طبيعي طوله 16 بتات<br>
	صحيح <code>short</code> محصور بين -32,768 و32,767<br>
	طبيعي <code>ushort</code> محصور بين 0 و65,535
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>short fooShort = 10000;
ushort fooUshort = 10000;
</code></pre>

<p>
	عدد صحيح <code>fooInt</code> أو طبيعي <code>fooUint</code> طوله 32 بت
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int fooInt = 1; // (-2,147,483,648 &lt;= int &lt;= 2,147,483,647)
uint fooUint = 1; // (0 &lt;= uint &lt;= 4,294,967,295)
</code></pre>

<p>
	<code>Long</code> عدد صحيح <code>fooLong</code> أو طبيعي <code>fooUlong</code> طوله 64 بت
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>long fooLong = 100000L; // (-9,223,372,036,854,775,808 &lt;= long &lt;= 9,223,372,036,854,775,807)
ulong fooUlong = 100000L; // (0 &lt;= ulong &lt;= 18,446,744,073,709,551,615)
</code></pre>

<p>
	النوع المبدئي <code>default</code> للأعداد هو <code>int</code> أو <code>uint</code> حسب طول العدد. والحرف <code>L</code> وراء العدد يشير إلى أن نوع العدد هو <code>long</code> أو <code>ulong</code>
</p>

<p>
	<code>Double</code> - فاصلة عائمة مزدوجة الدقة حسب المعيار 64-bit IEEE 754
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>double fooDouble = 123.4; // الدقة: 15-16 رقما
</code></pre>

<p>
	<code>Float</code> - فاصلة عائمة وحيدة الدقة 32-bit IEEE 754 Floating Point
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>float fooFloat = 234.5f; // الدقة: 7 أرقام
</code></pre>

<p>
	يشير الحرف <code>f</code> وراء العدد إلى أن نوع العدد هو <code>Float</code>
</p>

<p>
	<code>Decimal</code> - نوع بيانات بطول 128 بت، ودقّة أعلى من بقية أنواع البيانات ذات الفاصلة العائمة مناسب للحسابات المالية والنقدية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>decimal fooDecimal = 150.3m;
// Boolean - true &amp; false
bool fooBoolean = true; // or false
</code></pre>

<p>
	<code>Char</code> - نوع بيانات بطول 16 بت يرمز لمحرف يونيكود
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>`char fooChar = 'A';
</code></pre>

<p>
	<code>Strings</code> – على النقيض من جميع أنواع البيانات السابقة التي هي أنواع لقيم البيانات<br>
	فإن النوع <code>String</code> - سلسلة محارف - هو نوع لمرجع <code>Reference</code> بمعنى أنه يمكنه أخذ القيمة <code>null</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)";
Console.WriteLine(fooString);
</code></pre>

<p>
	يمكن الوصول إلى كل محرف من سلسلة المحارف عن طريق ترتيبه في السلسلة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>char charFromString = fooString[1]; // =&gt; 'e'
</code></pre>

<p>
	لا يمكن التعديل على سلاسل المحارف؛ التعليمة <code>fooString[1] = X</code> خاطئة مقارنة سلاسل محارف مع قيمة الخاصيّة <code>CurrentCulture</code> المعرّفة في المكتبة المعيارية لتمثيل اللغة المستخدمة في النظام، مع تجاهل حالة الأحرف <code>IgnoreCase</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase);
</code></pre>

<p>
	تهيئة سلسلة المحارف اعتمادا على <code>sprintf</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2);
</code></pre>

<h2>
	<a id="__141" rel=""></a>التاريخ والتهيئة
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>DateTime fooDate = DateTime.Now;
Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy"));
</code></pre>

<p>
	سلاسل المحارف الأصلية Verbatim String<br>
	يمكنك استخدام العلامة <code>@</code> أمام سلسلة محارف لتخليص جميع المحارف الموجودة في السلسلة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string path = "C:\\Users\\User\\Desktop";
string verbatimPath = @"C:\Users\User\Desktop";
Console.WriteLine(path == verbatimPath);  // =&gt; true
</code></pre>

<p>
	يمكنك توزيع سلسلة محارف على أكثر من سطر بالرمز <code>@</code> لتخليص العلامة <code>"</code> ضع مكانها <code>""</code> (<code>"</code> مرتين)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string bazString = @"Here's some stuff
on a new line! ""Wow!"", the masses cried";
</code></pre>

<p>
	استخدم الكلمة المفتاحية <code>const</code> لجعل المتغيّر ثابتًا غير قابل للتعديل وتُحسب القيم الثابتة أثناء تصريف البرنامج <code>compile time</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>const int HoursWorkPerWeek = 9001;
</code></pre>

<h2>
	<a id="__164" rel=""></a>بنى البيانات
</h2>

<p>
	<strong>المصفوفات</strong> - يبدأ العنصر الأول عند الترتيب <code>0</code> ويجب تحديد قياس المصفوفة عند تعريفها صيغة تعريف المصفوفة هي كالتالي:
</p>

<p style="text-align: left;">
	<code>;&lt;datatype&gt;[] &lt;var name&gt; = new &lt;datatype&gt;[&lt;array size&gt;]</code>
</p>

<p>
	المصفوفة <code>intArray</code> في المثال التالي تحوي 10 أعداد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int[] intArray = new int[10];
</code></pre>

<p>
	طريقة أخرى لتعريف مصفوفة وتهيئتها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int[] y = { 9000, 1000, 1337 };
</code></pre>

<p>
	ترتيب عناصر المصفوفة - الوصول إلى عنصر
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("intArray @ 0: " + intArray[0]);
</code></pre>

<p>
	المصفوفات قابلة للتعديل.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>intArray[1] = 1;
</code></pre>

<h2>
	<a id="_187" rel=""></a>القوائم
</h2>

<p>
	تُستخدَم القوائم أكثر من المصفوفات لما توفّره من مرونة وصيغة تعريف قائمة هي على النحو التالي:
</p>

<p style="text-align: left;">
	<code>;List&lt;datatype&gt; &lt;var name&gt; = new List&lt;datatype&gt;()</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>List&lt;int&gt; intList = new List&lt;int&gt;();
List&lt;string&gt; stringList = new List&lt;string&gt;();
List&lt;int&gt; z = new List&lt;int&gt; { 9000, 1000, 1337 }; // تحديد القيم الابتدائية لعناصر القائمة
</code></pre>

<p>
	تُستخدَم الإشارتان <code>&lt;&gt;</code> للأنواع العميمة Generics - <strong>راجع فقرة ميزات رائعة</strong>
</p>

<p>
	ليست للقوائم قيم مبدئية ويجب أولا إضافة قيمة قبل إمكانية الوصول إلى العنصر
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>intList.Add(1);
Console.WriteLine("intList @ 0: " + intList[0]);
</code></pre>

<p>
	بنى تحتية أخرى يجدر بك مراجعتها:
</p>

<p>
	قوائم الانتظار Queues/ الرصوص Stacks<br>
	القواميس Dictionaries<br>
	<code>HashSet</code><br>
	تجميعاـ القراءة فقط Read-only collections<br>
	الأزواج المُرتّبة Tuples (الإصدار 4 من .NET. فما فوق)
</p>

<h2>
	<a id="_214" rel=""></a>العوامل
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("\n→Operators");


int i1 = 1, i2 = 2; // اختصار لتعريف متغيّرات عدة في آن واحد
</code></pre>

<p>
	العمليات الحسابية واضحة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine(i1 + i2 - i1 * 3 / 7); // =&gt; 3
</code></pre>

<p>
	المقياس Modulo
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("11%3 = " + (11 % 3)); // =&gt; 2
</code></pre>

<h3>
	<a id="__230" rel=""></a>عوامل المقارنة
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("3 == 2? " + (3 == 2)); // =&gt; false
Console.WriteLine("3 != 2? " + (3 != 2)); // =&gt; true
Console.WriteLine("3 &gt; 2? " + (3 &gt; 2)); // =&gt; true
Console.WriteLine("3 &lt; 2? " + (3 &lt; 2)); // =&gt; false
Console.WriteLine("2 &lt;= 2? " + (2 &lt;= 2)); // =&gt; true
Console.WriteLine("2 &gt;= 2? " + (2 &gt;= 2)); // =&gt; true
</code></pre>

<h3>
	<a id="___Bitwise_239" rel=""></a>عوامل المقارنة البتّية <code>Bitwise</code>
</h3>

<p>
	<code>~</code> عامل التكملة الأحادي (إن كان البت يحوي 0 يحوله إلى 1، وإن كان يحوي واحد يحوّله إلى صفر)<br>
	<code>&gt;&gt;</code> إزاحة البتات إلى اليسار<br>
	<code>&lt;&lt;</code> إزاحة البتات إلى اليمين<br>
	<code>&amp;</code> عامل “و” المنطقي<br>
	<code>^</code> عامل “أو” المنطقي غير الشامل exclusive OR<br>
	<code>|</code> عامل “أو” المنطقي الشامل inclusive OR
</p>

<h3>
	<a id="_Incrementation_248" rel=""></a>التزايد Incrementation
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int i = 0;
Console.WriteLine("\n-&gt;Inc/Dec-rementation");
Console.WriteLine(i++); //Prints "0", i = 1. تزاد بعدي
Console.WriteLine(++i); //Prints "2", i = 2. تزايد قبلي
Console.WriteLine(i--); //Prints "2", i = 1. تناقص بعدي
Console.WriteLine(--i); //Prints "0", i = 0. تناقص قبلي
</code></pre>

<h2>
	<a id="__258" rel=""></a>بنى التحكّم
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("\n-&gt;Control Structures");
</code></pre>

<p>
	تتبع بنية التحكم <code>if else</code> طريقة كتابة بنى التحكم في <code>C</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int j = 10;
if (j == 10)
{
    Console.WriteLine("I get printed");
}
else if (j &gt; 10)
{
    Console.WriteLine("I don't");
}
else
{
    Console.WriteLine("I also don't");
}
</code></pre>

<h3>
	<a id="__279" rel=""></a>العوامل الثلاثية
</h3>

<p>
	بنية تحكّم <code>if else</code> بسيطة تمكن كتابتها على النحو التالي:
</p>

<p style="text-align: left;">
	<code>&lt;condition&gt; ? &lt;true&gt; : &lt;false&gt;</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int toCompare = 17;
string isTrue = toCompare == 17 ? "True" : "False";
</code></pre>

<h3>
	<a id="_While__288" rel=""></a>حلقة While التكرارية
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int fooWhile = 0;
while (fooWhile &lt; 100)
{
    //تتكرّر الحلقة مئة مرة، من القيمة 0 إلى القيمة 99
    fooWhile++;
}
</code></pre>

<p>
	حلقة <code>Do.. While</code> التكرارية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int fooDoWhile = 0;
do
{
</code></pre>

<p>
	الحلقة معدّة للتكرار مئة مرة، من القيمة 0 إلى القيمة 99
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Start iteration 100 times, fooDoWhile 0-&gt;99
if (false)
    continue; // تجاوز التكريرة الحالية

fooDoWhile++;

if (fooDoWhile == 50)
    break; // توقيف الحلقة تماما، والخروج منها
} while (fooDoWhile &lt; 100);
</code></pre>

<p>
	حلقة <code>for</code> التكرارية ذات الصيغة:
</p>

<p style="text-align: left;">
	<code>(&lt;for(&lt;start_statement&gt;; &lt;conditional&gt;; &lt;step</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>for (int fooFor = 0; fooFor &lt; 10; fooFor++)
{
    // تتكرّر الحلقة عشر مرات،  من القيمة 0 إلى القيمة 9
}
</code></pre>

<h3>
	<a id="_For_Each_323" rel=""></a>حلقة For Each
</h3>

<p>
	يمكن استخدام حلقة التكرار <code>foreach</code> للمرور عبر أي كائن <code>Object</code> يُنفّذ الصنف <code>IEnumerable</code> أو &lt;<code>IEnumerable&lt;T</code><br>
	تنفّذ جميع الأنواع التجميعية (المصفوفات، القوائم، القواميس…) في إطار العمل .Net واجهة أو أكثر من الأصناف المذكورة<br>
	(يمكن حذف <code>()ToCharArray</code> من التعليمة أدناه، لأن <code>String</code> تنفّذ الواجهة <code>IEnumerable</code>)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>foreach (char character in "Hello World".ToCharArray())
{
    // تمرّ على جميع المحارف في السلسلة
}
</code></pre>

<h3>
	<a id="_Switch_333" rel=""></a>تعليمة Switch
</h3>

<p>
	تعمل <code>Switch</code> مع أنواع البيانات <code>byte</code>, <code>short</code>, <code>char</code>, و<code>int </code>تعمل كذلك مع أنواع البيانات <code>Enum </code>(نتعرّض لها أدناه)، الصنف <code>String </code>وبضعة أصناف خاصّة تغلّف أنواع بيانات أساسية: <code>Character</code>,<code>Byte</code>,<code>Short</code>, و <code>Integer</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int month = 3;
string monthString;
switch (month)
{
    case 1:
        monthString = "January";
        break;
    case 2:
        monthString = "February";
        break;
    case 3:
        monthString = "March";
        break;
</code></pre>

<p>
	يمكن تنفيذ أكثر من إجراء في كل حالة <code>case</code>، إلا أنه لا يمكن إضافة إجراء ضمن حالة دون إضافة تعليمة توقيف break; قبل الحالة الموالية (إن أردت فعل هذا الأمر، فستحتاج لإضافة تعليمة <code>goto case x</code> بعد الإجراء)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>case 6:
case 7:
case 8:
    monthString = "Summer time!!";
        break;
    default:
        monthString = "Some other month";
        break;
    }
</code></pre>

<h2>
	<a id="______Typecasting_363" rel=""></a>التحويل بين أنواع البيانات وجبْر الأنواع Typecasting
</h2>

<h3>
	<a id="__366" rel=""></a>تحويل البيانات
</h3>

<p>
	تحويل سلسلة محارف String إلى عدد Integer<br>
	سيظهر استثناء Exception في حالة إخفاق عملية التحويل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int.Parse("123");// نحصُل على النسخة العددية من سلسلة المحارف "123"
</code></pre>

<p>
	عند استخدام الدالة <code>TryParse</code> لتحويل نوع البيانات فإن قيمة التحويل ستكون القيمة المبدئية لنوع البيانات وفي حالة الأعداد فإن القيمة المبدئية هي 0
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int tryInt;
if (int.TryParse("123", out tryInt)) // ترجع الدالة قيمة منطقية
    Console.WriteLine(tryInt);       // 123
</code></pre>

<p>
	تحويل الأعداد إلى سلاسل محارف String<br>
	يتضمّن الصنف Convert عددا من التوابع Methods لتسهيل التحويل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Convert.ToString(123);
</code></pre>

<p>
	أو
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>tryInt.ToString();
</code></pre>

<h3>
	<a id="___390" rel=""></a>جبر أنواع البيانات
</h3>

<p>
	جبر العدد العشري 15 للحصول على قيمة من النوع int<br>
	ثم جبر القيمة المُتحصَّل عليها ضمنيا لنحصُل على النوع long
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>long x = (int) 15M;
}
</code></pre>

<h2>
	<a id="_398" rel=""></a>الأصناف
</h2>

<p>
	<strong>راجع التعريفات في آخر الملف</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void Classes()
{
</code></pre>

<p>
	انظر تعريف الكائنات في آخر الملف
</p>

<p>
	استخدم الكلمة المفتاحية new لاستهلال صنف
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Bicycle trek = new Bicycle();
</code></pre>

<p>
	استدعاء توابع الكائن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>trek.SpeedUp(3); // يجب دائما المرور عبر المعدّلات والمسترجعات Setter and getter methods
trek.Cadence = 100;
</code></pre>

<p>
	يُستخدم التابع <code>ToString</code> لعرض قيمة الكائن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine("trek info: " + trek.ToString());
</code></pre>

<p>
	استهلال كائن جديد من الصنف <code>PennyFarthing</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>PennyFarthing funbike = new PennyFarthing(1, 10);
Console.WriteLine("funbike info: " + funbike.ToString());

Console.Read();
} // نهاية التابع الرئيس Main method
</code></pre>

<p>
	مَدخل الكونسول <code>Console entry</code>. التطبيقات التي تعمل عبر الطرفية يجب أن يكون لديها مدخل عبارة عن تابع رئيس
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void Main(string[] args)
{
    OtherInterestingFeatures();
}
</code></pre>

<p>
	ميزات مثيرة للاهتمام
</p>

<p>
	التوقيعات المبدئية للتوابع
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public // مجال الرؤية
static // يسمح بالاستدعاء المباشر من الصنف دون المرور بكائنات
int // نوع البيانات المُرجَعة,
MethodSignatures(
    int maxCount, // المتغيّر الأول عددي
    int count = 0, // القيمة المبدئية هي 0، تُستخدَم  إن لم يُمرَّر متغير إلى التابع 
    int another = 3,
    params string[] otherParams // يستقبل بقية المتغيّرات المُمررة إلى التابع جميعا 
    )
    {
        return -1;
    }
</code></pre>

<p>
	يمكن أن تكون أسماء التوابع متطابقة، ما دامت التوقيعات مختلفة وكل تابع لا يختلف عن آخر سوى في نوع البيانات المُرجَع ليس وحيدا
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void MethodSignatures(
    ref int maxCount, // تمرير المعاملات حسب المرجع، وليس القيمة
    out int count)
{
</code></pre>

<p>
	المعامل المُمرر في المتغيّر <code>count</code> سيحوي القيمة 15 خارج هذه الدالة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>count = 15; // معامل الخروج out يجب أن يُسنَد قبل الانتهاء من التابع
}
</code></pre>

<h2>
	<a id="___Generics_467" rel=""></a>أنواع البيانات العميمة Generics
</h2>

<p>
	الأصناف <code>TKey</code> و<code>TValue</code> يحدّدها المستخدم الذي يستدعي هذه الدالة ويحاكي هذا التابع عمل <code>SetDefault</code> في بايثون
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static TValue SetDefault&lt;TKey, TValue&gt;(
    IDictionary&lt;TKey, TValue&gt; dictionary,
    TKey key,
    TValue defaultItem)
{
    TValue result;
    if (!dictionary.TryGetValue(key, out result))
        return dictionary[key] = defaultItem;
    return result;
}
</code></pre>

<p>
	يمكنك تقييد الكائنات التي يمكن تمريرها إلى الدالة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void IterateAndPrint&lt;T&gt;(T toPrint) where T: IEnumerable&lt;int&gt;
{
</code></pre>

<p>
	بما أن الصنف <code>T</code> ينفّذ <code>IEnumerable</code> فإنه يمكننا المرور على عناصره باستخدام <code>foreach</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>foreach (var item in toPrint)
    // العنصر هو من النوع int
    Console.WriteLine(item.ToString());
}
</code></pre>

<h2>
	<a id="__yield_493" rel=""></a>الكلمة المفتاحية “yield”
</h2>

<p>
	يدلّ استخدام <code>yield</code> أن التابع الذي تظهر فيه هذه الكلمة المفتاحية لديه خاصيّة التكرار (أي أنه يمكن استخدام التابع مع الحلقة <code>foreach</code>)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static IEnumerable&lt;int&gt; YieldCounter(int limit = 10)
{
    for (var i = 0; i &lt; limit; i++)
        yield return i;
}
</code></pre>

<p>
	نستطيع استدعاء التابع أعلاه على النحو التالي
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void PrintYieldCounterToConsole()
{
    foreach (var counter in YieldCounter())
        Console.WriteLine(counter);
}
</code></pre>

<p>
	يمكن استخدام <code>yield return</code> أكثر من مرّة في نفس التابع
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static IEnumerable&lt;int&gt; ManyYieldCounter()
{
    yield return 0;
    yield return 1;
    yield return 2;
    yield return 3;
}
</code></pre>

<p>
	كما يمكنك استخدام “yield break” لتوقيف التكرار<br>
	التابع التالي يُرجِع نصف القيم الموجودة بين 0 وlimit
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static IEnumerable&lt;int&gt; YieldCounterWithBreak(int limit = 10)
{
    for (var i = 0; i &lt; limit; i++)
    {
        if (i &gt; limit/2) yield break;
        yield return i;
    }
}

public static void OtherInterestingFeatures()
{
</code></pre>

<h3>
	<a id="__535" rel=""></a>المعاملات الاختيارية
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>MethodSignatures(3, 1, 3, "Some", "Extra", "Strings");
MethodSignatures(3, another: 3); // تعيين قيمة المعامل مباشرة، مع تجاوز المعاملات الاختيارية
</code></pre>

<p>
	تمرير المعاملات بالمرجع <code>By reference</code>، والقيمة المُرجعة <code>Out parameter</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>BY REF AND OUT PARAMETERS
int maxCount = 0, count; // المعاملات المُمررة بالمرجع يجب أن تحوي قيمة
MethodSignatures(ref maxCount, out count);
</code></pre>

<h3>
	<a id="__Extension_methods_546" rel=""></a>توابع التمديد Extension methods
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int i = 3;
i.Print(); // مُعرَّفة أدناه
</code></pre>

<p>
	الأنواع التي تقبل قيمة فارغة Nullable types، مناسبة للتخاطب مع قواعد البيانات والقيم المُرجَعة وأي نوع بيانات قيمي (أي ليس صنفا) يمكن جعله يقبل قيما فارغة بكتابة <code>?</code> بعده
</p>

<p style="text-align: left;">
	<code>&lt;type&gt;? &lt;var name&gt; = &lt;value&gt;</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int? nullable = null; // اختصار لـ Nullable&lt;int&gt;
Console.WriteLine("Nullable variable: " + nullable);
bool hasValue = nullable.HasValue; // قيمة منطقية صحيحة true إن لم يكن يساوي null
</code></pre>

<p>
	علامتا الاستفهام المتلاصقتان <code>??</code> هما اختصار لتحدد قيمة مبدئية في حال كان المتغيّر فارغا نعطيه 0 قيمة مبدئية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int notNullable = nullable ?? 0; // 0
</code></pre>

<p>
	<code>?.</code> هذه العلامة عي عامل للتحقّق من القيمة الفارغة null
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>nullable?.Print(); // استخدم تابع التمديد Print() إذا كان المتغيّر nullable مختلفا عن null
</code></pre>

<p>
	المتغيّرات ضمنية النوع - يمكنك ترك المُصرّف Compiler يحدّد نوع المتغيّر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var magic = "magic is a string, at compile time, so you still get type safety";
</code></pre>

<p>
	<code>;magic = 9</code> لن تُسنَد القيمة 9 إلى المتغيّر <code>magic</code> لأنه يحوي سلسلة محارف
</p>

<h2>
	<a id="__573" rel=""></a>الأنواع العميمة
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var phonebook = new Dictionary&lt;string, string&gt;() {
    {"Sarah", "212 555 5555"} // إضافة عنوان إلى دفتر العناوين
};
</code></pre>

<p>
	استدعاء الدالة SetDefault المُعرَّفة أعلاه
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine(SetDefault&lt;string,string&gt;(phonebook, "Shaun", "No Phone")); // No Phone
</code></pre>

<p>
	يمكنك عدم تحديد <code>TKey</code> و <code>TValue</code> بما أنه يمكن استنتاجهما تلقائيا
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555
</code></pre>

<p>
	الدوال مجهولة الاسم <code>Lambda expressions</code> - تتيح كتابة شفرات على نفس السطر
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Func&lt;int, int&gt; square = (x) =&gt; x * x; // آخر عنصر من T هو القيمة المُرجعة
    Console.WriteLine(square(3)); // 9
</code></pre>

<h2>
	<a id="___593" rel=""></a>التعامل مع الأخطاء
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>try
{
    var funBike = PennyFarthing.CreateWithGears(6);
</code></pre>

<p>
	لن تُنفَّذ لأن <code>CreateWithGears</code> تتسبّب في استثناء <code>Exception</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>string some = "";
if (true) some = null;
some.ToLower(); // تتسبّب في الاستثناء NullReferenceException
}
catch (NotSupportedException)
{
    Console.WriteLine("Not so much fun now!");
}
catch (Exception ex) // التقاط جميع الاستثناءات الأخرى
{
    throw new ApplicationException("It hit the fan", ex);
    // throw; // التقاط آخر يحافظ على ركام النداء callstack
}
    // catch { } // التقاط كل شيء دون التعامل مع الاستثناءات
    finally
{
    // try أو catch تُنفّذ بعد
}
</code></pre>

<h3>
	<a id="__620" rel=""></a>إدارة الموارد
</h3>

<p>
	يمكنك إدارة الموارد المتوفّرة بسهولة حيث تنفّذ أغلب الكائنات التي تستعمل الموارد غير المستغلة (الملفات، سياق الأجهزة الطرفية، …إلخ) تُنفّذ الواجهة <code>IDisposable</code><br>
	تتولّى التعليمة <code>using</code> التخلّص من كائنات <code>IDisposable</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>using (StreamWriter writer = new StreamWriter("log.txt"))
{
    writer.WriteLine("Nothing suspicious here");
}
</code></pre>

<p>
	يُتخلَّص من جميع الموارد بعد الانتهاء من تنفيذ هذه الشفرة حتى ولو تسبّبت في استثناء
</p>

<h2>
	<a id="__632" rel=""></a>البرمجة المتوازية
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var words = new List&lt;string&gt; {"dog", "cat", "horse", "pony"};

Parallel.ForEach(words,
    new ParallelOptions() { MaxDegreeOfParallelism = 4 },
    word =&gt;
    {
        Console.WriteLine(word);
    }
);
</code></pre>

<p>
	تشغيل هذه الشفرة سينتُج عنه مُخرجات متعدّدة لأن كلّ تشعّب thread يُكمل في وقت مختلف عن الآخر. أدناه أمثلة على المُخرجات
</p>

<p style="text-align: left;">
	cat dog horse pony<br>
	dog horse pony cat
</p>

<p>
	الكائنات الديناميكية (رائعة للعمل مع لغات برمجة أخرى)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>dynamic student = new ExpandoObject();
student.FirstName = "First Name";  
</code></pre>

<p>
	لا تحتاج لتعريف صنف أولا بل إنه يمكنك إضافة توابع (يُرجع التابع أدناه سلسلة محارف ويتلقّى سلسلة محارف)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>student.Introduce = new Func&lt;string, string&gt;(
    (introduceTo) =&gt; string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo));
Console.WriteLine(student.Introduce("Beth"));
</code></pre>

<p>
	تنفّذ أغلب التجميعات <code>Collections</code> الواجهة <code>&lt;IQUERYABLE&lt;T</code> التي توفّر الكثير من التوابع المفيدة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var bikes = new List&lt;Bicycle&gt;(); // دراجات هوائية
bikes.Sort(); // يرتّب القائمة
bikes.Sort((b1, b2) =&gt; b1.Wheels.CompareTo(b2.Wheels)); // يرتّب القائمة بناءً على عدد العجلات
var result = bikes
        .Where(b =&gt; b.Wheels &gt; 3) // الترشيج والفلترة
        .Where(b =&gt; b.IsBroken &amp;&amp; b.HasTassles)
        .Select(b =&gt; b.ToString()); //

var sum = bikes.Sum(b =&gt; b.Wheels); 
</code></pre>

<p>
	يجمع عدد العجلات في كامل القائمة وينشئ قائمة من الكائنات الضمنية Implicit objects بالاعتماد على بعض خواص الدراجة الهوائية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var bikeSummaries = bikes.Select(b=&gt;new { Name = b.Name, IsAwesome = !b.IsBroken &amp;&amp; b.HasTassles });
</code></pre>

<p>
	من الصعب توضيح الأمر هنا، إلا أنك تحصُل على نوع البيانات قبل الانتهاء من التعليمات، إذ أن المصرّف يمكنه العمل ضمنا على الأنواع أعلاه
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>foreach (var bikeSummary in bikeSummaries.Where(b =&gt; b.IsAwesome))
    Console.WriteLine(bikeSummary.Name);
</code></pre>

<h3>
	<a id="__ASPARALLEL_683" rel=""></a>التوازي مع ASPARALLEL
</h3>

<p>
	نخلط عمليّات <code>LINQ</code> والعمليّات المتوازية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var threeWheelers = bikes.AsParallel().Where(b =&gt; b.Wheels == 3).Select(b =&gt; b.Name);
</code></pre>

<p>
	سيحدث الأمر بالتوازي. تُنشَأ التشعبات تلقائيا وستُقسَّم النتائج بينها<br>
	طريقة رائعة للعمل مع مجموعة بيانات ضخمة إن كانت لديك الكثير من الأنوية Cores
</p>

<h2>
	<a id="LINQ_691" rel=""></a>LINQ
</h2>

<p>
	تربط بين مخزن بيانات وكائنات من الصنف <code>&lt;IQueryable&lt;T</code><br>
	مثلا: <code>LinqToSql</code> تربط الكائنات مع قاعدة بيانات، <code>LinqToXml</code> تربط الكائنات مع مستند XML
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var db = new BikeRepository();
</code></pre>

<p>
	يؤجَّل التنفيذ، وهو أمر جيّد عند التعامل مع قواعد البيانات
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var filter = db.Bikes.Where(b =&gt; b.HasTassles); // no query run
if (42 &gt; 6) // يمكنك الاستمرار في إضافة المرشحات، حتى تلك المشروطة؛ مناسبة لميزة "البحث المتقدّم"
    filter = filter.Where(b =&gt; b.IsBroken); // no query run

    var query = filter
        .OrderBy(b =&gt; b.Wheels)
        .ThenBy(b =&gt; b.Name)
        .Select(b =&gt; b.Name); // still no query run
</code></pre>

<p>
	يعمل الاستعلام الآن، إلا أنك لا تحصُل على نتائج الاستعلام إلا عند المرور عليها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>foreach (string bike in query)
    Console.WriteLine(result);
    }
} // نهاية الصنف LearnCSharp
</code></pre>

<p>
	يمكنك إضافة أصناف أخرى في ملف <code>cs.</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static class Extensions
{
</code></pre>

<h2>
	<a id="__Extensions_720" rel=""></a>توابع الصنف Extensions
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static void Print(this object obj)
    {
        Console.WriteLine(obj.ToString());
    }
}
</code></pre>

<h3>
	<a id="__729" rel=""></a>التفويض والأحداث
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class DelegateTest
{
    public static int count = 0;
    public static int Increment()
    {
        // زيادة العدّاد ثم إرجاع النتيجة
        return ++count;
    }
</code></pre>

<p>
	التفويض <code>delegate</code> هو مرجع لتابع<br>
	لجعل مرجع على التابع <code>Increment</code> نبدأ بتعريف تفويض بنفس التوقيع أي أنه لا يأخذ أية معطيات ويُرجع عددا من النوع <code>int</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public delegate int IncrementDelegate();
</code></pre>

<p>
	يمكن أيضا استخدام حدث <code>Event</code> لتحريك التفويض<br>
	أنشئ حدثا بنوع التفويض
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static event IncrementDelegate MyEvent;

static void Main(string[] args)
{
</code></pre>

<p>
	نحيل إلى التابع <code>Increment</code> باستهلال التفويض وتمرير معطى هو التابع نفسه
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>IncrementDelegate inc = new IncrementDelegate(Increment);
Console.WriteLine(inc());  // =&gt; 1
</code></pre>

<p>
	يمكن تركيب التفويضات بالعامل <code>+</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>IncrementDelegate composedInc = inc;
composedInc += inc;
composedInc += inc;
</code></pre>

<p>
	سينفّذ التفويض <code>composedInc</code> التابع <code>Increment</code> ثلاث مرات
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine(composedInc());  // =&gt; 4
</code></pre>

<p>
	الاشتراك في الحدث باستخدام التفويض
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>MyEvent += new IncrementDelegate(Increment);
MyEvent += new IncrementDelegate(Increment);
</code></pre>

<p>
	تحريك الحدث، أي تنفيذ كل التفويضات المشترِكة في هذا الحدث
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Console.WriteLine(MyEvent());  // =&gt; 6
    }
}
</code></pre>

<h3>
	<a id="___781" rel=""></a>صيغة تعريف صنف:
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>&lt;public/private/protected/internal&gt; class &lt;class name&gt;{`
    // حقول البيانات، المشيّدات، الدوالّ.. كلّها في الداخل
    //تُستدعى الدوال بنفس طريقة استدعاء التوابع في جافا
}
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class Bicycle
{
    // حقول/متغيّرات صنف الدراجات الهوائية Bicycle
    public int Cadence // عمومي public : يمكن استدعاء من أي مكان
    {
        get //  مسترجع - نعرّف تابعا للوصول إلى قيمة خاصيّة من الكائن
        {
            return _cadence;
        }
        set // معدّل - نعرّف تابعا لتعيين قيمة خاصيّة
        {
            _cadence = value; // القيمة value هي المعطى المُمرّر إلى المعدّل
        }
    }
private int _cadence;

protected virtual int Gear // يمكن استدعاءه فقط من هذا الصنف أو الأصناف المتفرّعة منه Protected:محميّ 
    {
        get; // تُنشأ خاصيّة تلقائية بحيث لا تحتاج لإضافة حقل بيانات
        set;
    }

internal int Wheels // داخليّ Internal: يُمكن الوصول إليه من نفس الملف التنفيذي 
        {
            get;
            private set; // يمكن تغيير مجال المسترجعات والمعدّلات
        }

int _speed; // ولا يمكن الوصول إليها إلا من داخل الصنف Private كل الخاصيّات هي مبدئيا خاصّة 
        // يمكن أيضا استخدام الكلمة المفتاحية private
public string Name { get; set; }
</code></pre>

<p>
	للخاصيّات صياغة استثنائية عندما نريد خاصية متاحة للقراءة فقط بمعنى أنها تعيد فقط نتيجة عبارة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public string LongName =&gt; Name + " " + _speed + " speed"; 
</code></pre>

<p>
	النوع <code>enum</code> هو نوع بيانات قيمية يتمثّل في مجموعة من المتغيّرات ثابتة القيمة<br>
	هذا النوع هو في الواقع مجرّد ربط اسم بقيمة (عددية، إن لم يحدد نوع آخر)<br>
	أنواع البيانات الموثوقة في قيم الثوابت هي <code>byte</code>, <code>sbyte</code>, <code>short</code>, <code>ushort</code>, <code>int</code>, <code>uint</code>, <code>long</code>, و <code>ulong</code> ولا يمكن أن توجد نفس القيمة مرتين في متغيّر من النوع <code>enum</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public enum BikeBrand
{
    AIST,
    BMC,
    Electra = 42, // مباشرة enum يمكن تعيين قيمة المتغيّر في 
    Gitane // 43
}
</code></pre>

<p>
	عرّفنا هذا النوع داخل الصنف <code>Bicycle</code> لذا فهو نوع داخلي وعندما نريد استخدامه خارج الصنف فسيتوجّب أن نكتُب <code>Bicycle.Brand</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public BikeBrand Brand; 
</code></pre>

<p>
	بعد تعريف نوع <code>enum</code> يصبح بإمكاننا تعريف متغيّر من هذا النوع
</p>

<p>
	تستطيع التعليم على وجود قيم عدّة يمكن الاختيار بينها بإضافة الصنف <code>FlagsAttribute</code> قبل تعريف النوع <code>enum</code><br>
	يمكن استخدام أي صنف متفرّع عن الصنف <code>Attribute</code> لتعليم أنواع البيانات، التوابع والمعاملات…إلخ<br>
	يمكن استخدام العوامل المنطقية <code>&amp;</code> و <code>|</code> لإجراء عمليّات منطقية داخل القيمة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>[Flags]
public enum BikeAccessories
{
    None = 0,
    Bell = 1,
    MudGuards = 2, // نحتاج لتعيين القيم يدويا
    Racks = 4,
    Lights = 8,
    FullPackage = Bell | MudGuards | Racks | Lights
}
</code></pre>

<p>
	الاستخدام: <code>aBike.Accessories.HasFlag(Bicycle.BikeAccessories.Bell)</code><br>
	في الإصدارات السابقة على الإصدار الرابع من إطار العمل NET<br>
	 
</p>

<p style="text-align: left;">
	<code>(aBike.Accessories &amp; Bicycle.BikeAccessories.Bell) == Bicycle.BikeAccessories.Bell</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public BikeAccessories Accessories { get; set; }
</code></pre>

<p>
	تنتمي الخاصيّات المُعلمة بالكلمة المفتاحية <code>static</code> للصنف نفسه، وليس لكائن عكس بقية الخاصيّات<br>
	يمكن الوصول إلى هذه الخاصيّات دون الرجوع إلى كائن محدّد<br>
	 
</p>

<p style="text-align: left;">
	<code>;Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated)</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static int BicyclesCreated { get; set; }
</code></pre>

<p>
	عيّن القيم غير القابلة للتعديل أثناء التشغيل ولا يمكن إسناده إلا عند تعريفها أو داخل مشيّد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>readonly bool _hasCardsInSpokes = false; // خاصيّة خاصّة وللقراءة فقط
</code></pre>

<p>
	المشيّدات Constructors هي طريقة لإنشاء الأصناف<br>
	أدناه المشيّد المبدئي
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public Bicycle()
{
    this.Gear = 1; // يمكن الوصول إلى خاصيّات الصنف بالكلمة المفتاحية this
    Cadence = 50;  // إلا أنك لا تحتاجها في كل الحالات
    _speed = 5;
    Name = "Bontrager";
    Brand = BikeBrand.AIST;
    BicyclesCreated++;
}
</code></pre>

<p>
	هذا مشيّد مُعيّن (يحوي معطيات)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public Bicycle(int startCadence, int startSpeed, int startGear,
                       string name, bool hasCardsInSpokes, BikeBrand brand)
    : base() // أولا  base يستدعي 
    {
        Gear = startGear;
        Cadence = startCadence;
        _speed = startSpeed;
        Name = name;
        _hasCardsInSpokes = hasCardsInSpokes;
        Brand = brand;
    }
</code></pre>

<p>
	يمكن وضع المشيّدات بالتسلسل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public Bicycle(int startCadence, int startSpeed, BikeBrand brand) :
            this(startCadence, startSpeed, 0, "big wheels", true, brand)
    {
    }
</code></pre>

<h2>
	<a id="___910" rel=""></a>صيغة كتابة الدوال
</h2>

<p style="text-align: left;">
	<code>(&lt;public/private/protected&gt; &lt;return type&gt; &lt;function name&gt; &lt;args&gt;)</code>
</p>

<p>
	يمكن للأصناف أن تعيّن مسترجعات ومعدّلات لحقولها كما يمكنها تنفيذ الخاصيّات عبر دوال (وهي الطريقة المفضّلة في Csharp) ويمكن لمعاملات التابع أن تحوي قيما مبدئية، في هذه الحالة، يمكن استدعاء التوابع بدون تمرير معطيات عن هذه العوامل
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public void SpeedUp(int increment = 1)
{
    _speed += increment;
}

public void SlowDown(int decrement = 1)
{
    _speed -= decrement;
}
</code></pre>

<p>
	تعيّن الخاصيّات القيم وتسترجعها. إن كان غرضك الوصول إلى البيانات فقط دون تعديلها فالخاصيّات أنسب. يمكن أن يكون للخاصيّة مسترجع أو معدّل أو كلاهما
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>private bool _hasTassles; // متغيّر خاص
public bool HasTassles // مسترجع عام
{
    get { return _hasTassles; }
    set { _hasTassles = value; }
}
</code></pre>

<p>
	كما يمكنك تعريف خاصيّة تلقائية في سطر واحد<br>
	ستُنشئ هذه الصيغة حقلا داعما تلقائيا<br>
	يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل أو كليهما
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public bool IsBroken { get; private set; }
</code></pre>

<p>
	يمكن للخاصيّات أن تكون تلقائية التنفيذ
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public int FrameSize
{
    get;
        // يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل
        //Framesize يمكنه استدعاء معدّل Bicycle  يعني هذا أن الصنف
    private set;
}
</code></pre>

<p>
	يمكن تعريف فهرس على الكائنات<br>
	يمكنك مثلا كتابة <code>bicycle[0]</code> التي ترجع القيمة “chris” للحصول على أول راكب<br>
	أو كتابة <code>“bicycle[1] = "lisa</code> لتعيين الراكب الثاني (دراجة رباعية المقاعد!)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>private string[] passengers = { "chris", "phil", "darren", "regina" };

public string this[int i]
{
    get {
        return passengers[i];
    }

    set {
        passengers[i] = value;
    }
}
</code></pre>

<p>
	تابع لعرض قيم حقول الكائن
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public virtual string Info()
{
    return "Gear: " + Gear +
        " Cadence: " + Cadence +
        " Speed: " + _speed +
        " Name: " + Name +
        " Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") +
        "\n------------------------------\n"
        ;
}
</code></pre>

<p>
	يمكن للتوابع أن تكون ثابتة (الكلمة المفتاحية <code>static</code>). مناسبة للدوال المساعدة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static bool DidWeCreateEnoughBicycles()
{
</code></pre>

<p>
	داخل التابع الثابت لا يمكن إجراء عمليات سوى على الحقول الثابتة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>return BicyclesCreated &gt; 9000;
} 
</code></pre>

<p>
	إن كان الصنف لا يحتاج إلا إلى حقول ثابتة فربما يكون من الأفضل أن يكون الصنف نفسه ثابتا
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>} // نهاية الصنف Bicycle
</code></pre>

<p>
	<code>PennyFarthing</code> هو صنف متفرّع من الصنف <code>Bicycle</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class PennyFarthing : Bicycle
{
</code></pre>

<p>
	(يمثّل هذا الصنف تلك الدراجات الهوائية التي لديها عجلة أمامية كبيرة جدا، وليست لديها مسنّنات <code>Gears</code> لتعديل السرعة) . نستدعي مشيّد الصنف الأب
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public PennyFarthing(int startCadence, int startSpeed) :
    base(startCadence, startSpeed, 0, "PennyFarthing", true, BikeBrand.Electra)
    {
    }

    protected override int Gear
    {
        get
        {
            return 0;
        }
        set
        {
            throw new InvalidOperationException("You can't change gears on a PennyFarthing");
        }
    }

    public static PennyFarthing CreateWithGears(int gears)
    {
        var penny = new PennyFarthing(1, 1);
        // عمليا لا توجد دراجة من نوع PennyFarthing بمسنّنات
        penny.Gear = gears;
        return penny;
    }

    public override string Info()
    {
        string result = "PennyFarthing bicycle ";
        result += base.ToString(); // نستدعي التابع الأصلي الموجود في الصنف الأب
        return result;
    }
}
</code></pre>

<p>
	تحتوي الواجهات على التوقيعات فقط
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>interface IJumpable
{
    void Jump(int meters); // جميع الأعضاء في الواجهة هي مبدئيا عمومية
}

interface IBreakable
{
    bool Broken { get; } // يمكن للواجهات أن تحوي خاصيّات كما يمكنها أن تتضمّن واجهات وأحداثا
}
</code></pre>

<p>
	يمكن للأصناف أن ترث <code>Inherit</code> من صنف واحد آخر على الأكثر، إلا أنه يمكنها تنفيذ أي عدد من الواجهات ويجب أن يكون الصنف الأب الأول في لائحة الأصناف تليه الواجهات كلّها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class MountainBike : Bicycle, IJumpable, IBreakable
{
    int damage = 0;

    public void Jump(int meters)
    {
        damage += meters;
    }

    public bool Broken
    {
        get
        {
            return damage &gt; 100;
        }
    }
}
</code></pre>

<p>
	صنف للاتصال بقاعدة البيانات، نستخدمه مثالا لعمل <code>LinqToSql</code><br>
	يعمل إطار العمل EntityFramework Code First لربط الكائنات بسجلات جداول البيانات (بنفس طريقة ActiveRecord في روبي، إلا أنه ثنائي الاتجاه)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class BikeRepository : DbContext
{
    public BikeRepository()
        : base()
    {
    }

    public DbSet&lt;Bicycle&gt; Bikes { get; set; }
}
</code></pre>

<p>
	يمكن تقسيم الأصناف على ملفات <code>cs.</code> عدّة<br>
	 
</p>

<p style="text-align: left;">
	<code>A1.cs</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public partial class A
{
    public static void A1()
    {
        Console.WriteLine("Method A1 in class A");
    }
}
</code></pre>

<p style="text-align: left;">
	<code>A2.cs</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public partial class A
{
    public static void A2()
    {
        Console.WriteLine("Method A2 in class A");
    }
}
</code></pre>

<p>
	يستخدم الصنف <code>Program</code> أدناه الصنف <code>A</code> المُقسّم على ملفي <code>cs.</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Program using the partial class "A"
public class Program
{
    static void Main()
    {
        A.A1();
        A.A2();
    }
}
</code></pre>

<p>
	يمكن الإداراج في سلاسل المحارف String interpolation بكتابة <code>$</code> أمام السلسلة ثم إحاطة المتغيّر المُدرج بقوسين معكوفين <code>{ }</code>. يمكنك أيضا تجميع السلسلتين، الأصلية والمُعدّلة، بالعلامة <code>@</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class Rectangle
{
    public int Length { get; set; }
    public int Width { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Rectangle rect = new Rectangle { Length = 5, Width = 3 };
        Console.WriteLine($"The length is {rect.Length} and the width is {rect.Width}");

        string username = "User";
        Console.WriteLine(<a class="__cf_email__" data-cfemail="d9fd99" href="/cdn-cgi/l/email-protection" rel="">[email protected]</a>"C:\Users\{username}\Desktop");
    }
}
</code></pre>

<p>
	ميزات جديدة في الإصدار C# 6
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class GlassBall : IJumpable, IBreakable
{
</code></pre>

<p>
	تمهيد الخاصيّات التلقائية
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public int Damage { get; private set; } = 0;
</code></pre>

<p>
	تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public string Name { get; } = "Glass ball";
</code></pre>

<p>
	تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات في المشيّد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public string GenieName { get; }

public GlassBall(string genieName = null)
{
    GenieName = genieName;
}

    public void Jump(int meters)
    {
        if (meters &lt; 0)
</code></pre>

<p>
	العبارة <code>nameof()</code> مستحدثة وينتُج عنها التحقّق من وجود المعرّف<br>
	 
</p>

<p style="text-align: left;">
	<code>"nameof(x) == "x</code>
</p>

<p>
	تحول على سبيل المثال دون بقاء أسماء المتغيّرات القديمة في رسائل الخطأ بعد تحديثها
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>    throw new ArgumentException("Cannot jump negative amount!", nameof(meters));

    Damage += meters;
}
</code></pre>

<p>
	الخاصيّات المعرَّفة ضمن هيكل العبارة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public bool Broken
=&gt; Damage &gt; 100;
</code></pre>

<p>
	نفس الشيء بالنسبة للتوابع
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public override string ToString()
            // سلسلة محارف تُدرج ضمنها متغيّرات
            =&gt; $"{Name}. Damage taken: {Damage}";

        public string SummonGenie()
</code></pre>

<p>
	العوامل المشترطة بالقيمة الفارغة <code>null</code><br>
	ترجع العبارة <code>x?.y</code> القيمة <code>null</code> بمجرد كون <code>x</code> مساوية ل <code>null</code>، بدون تقييم <code>y</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>=&gt; GenieName?.ToUpper();
}

static class MagicService
{
    private static bool LogException(Exception ex)
    {
        /* سجّل الاستثناءات في مكان ما */
        log exception somewhere */
        return false;
    }

    public static bool CastSpell(string spell)
    {
        try
        {
            // <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> نفترض هنا أننا نستدعي واجهة تطبيقات برمجية 
            throw new MagicServiceException("Spell failed", 42);

            // نجح الاستدعاء
            return true;
        }
</code></pre>

<p>
	يلتقط استثناء في حالة إخفاق استدعاء واجهة التطبيقات، أي أن قيمة <code>Code</code> تساوي 42
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Only catch if Code is 42 i.e. spell failed
catch(MagicServiceException ex) when (ex.Code == 42)
{
    // أخفق الاستدعاء
    return false;
}
</code></pre>

<p>
	استثماءات أخرى أو الاستثناء <code>MagicServiceException</code> عندما تكون قيمة المتغير <code>Code</code> مختلفة عن 42
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>catch(Exception ex) when (LogException(ex))
{
    // لا يصل التنفيذ إلى هذه الكتلة
}
    return false;
}
</code></pre>

<p>
	لاحظ أن التقاط الاستثناء <code>MagicServiceException</code> وإعادة إطلاقه عندما يكون المتغير <code>Code</code> لا يساوي القيمة 42 أو 117 هو أمر مختلف، إذ أن كتلة <code>catch-all</code> الأخيرة لن تلتقط الاستثناء المُعاد
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public class MagicServiceException : Exception
{
    public int Code { get; }

    public MagicServiceException(string message, int code) : base(message)
    {
        Code = code;
    }
}
</code></pre>

<h3>
	<a id="_Obsolete_1244" rel=""></a>الخاصية Obsolete
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static class PragmaWarning {

[Obsolete("Use NewMethod instead", false)]
public static void ObsoleteMethod()
{
    /*شفرة برمجية قديمة هنا */
}

public static void NewMethod()
{
    /* شفرة برمجية جديدة */
}

public static void Main()
{
    ObsoleteMethod(); 
</code></pre>

<p>
	تحذير يظهر عند استخدام شفرة برمجية قديمة، ناتج عن الوسم <code>Obsolete</code> أعلاه<br>
	 
</p>

<p style="text-align: left;">
	<code>CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead'</code>
</p>

<p>
	تعطّل التعليمة التالية إظهار التحذير السابق
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>#pragma warning disable CS0618
    ObsoleteMethod(); // لا تحذير
#pragma warning restore CS0618
    ObsoleteMethod(); // CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead'
        }
    }
} // نهاية فضاء الأسماء
</code></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>using System;
</code></pre>

<p>
	ميزة في C# 6: إمكانية استخدام <code>static</code> مع <code>using</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>using static System.Math;

namespace Learning.More.CSharp
{
    class StaticUsing
    {
        static void Main()
        {
            // using مع static بدون استخدام 
            Console.WriteLine("The square root of 4 is {}.", Math.Sqrt(4));
            // using مع static باستخدام 
            Console.WriteLine("The square root of 4 is {}.", Sqrt(4));
        }
    }
}
</code></pre>

<p>
	ميزة جديدة في C# 7<br>
	ثبّت آخر إصدار من Microsoft.Net.Compilers باستخدام Nuget<br>
	ثبّت آخر إصدار من System.ValueTuple باستخدام Nuget
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>using System;
namespace Csharp7
{
</code></pre>

<p>
	الأزواج المرتبة <code>Tuples</code>، التفكيك <code>DECONSTRUCTION</code> والإلغاءات <code>Discards</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class TuplesTest
{
    public (string, string) GetName()
    {
    // Item1، Item2 .... تُسمى الحقول في الأزواج المرتبة مبدئيا بـ 
    var names1 = ("Peter", "Parker");
    Console.WriteLine(names1.Item2);  // =&gt; Parker
</code></pre>

<p>
	يمكن تخصيص أسماء الحقول<br>
	تعريف النوع الأول
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>(string FirstName, string LastName) names2 = ("Peter", "Parker");
</code></pre>

<p>
	تعريف النوع الثاني
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>var names3 = (First:"Peter", Last:"Parker");

    Console.WriteLine(names2.FirstName);  // =&gt; Peter
    Console.WriteLine(names3.Last);  // =&gt; Parker

        return names3;
}

public string GetLastName() {
var fullName = GetName();
</code></pre>

<p>
	يمكن تفكيك الأزواج المرتبة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>(string firstName, string lastName) = fullName;
</code></pre>

<p>
	يمكن إلغاء حقول من الزوج المرتب بعد تفكيكه بالعلامة _
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>Fields in a deconstructed tuple can be discarded by using _
var (_, last) = fullName;
return last;
}
</code></pre>

<p>
	يمكن تفكيك أي نوع بيانات على نفس المنوال باستخدام التابع <code>Deconstruct</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public int randomNumber = 4;
public int anotherRandomNumber = 10;

public void Deconstruct(out int randomNumber, out int anotherRandomNumber)
{
    randomNumber = this.randomNumber;
    anotherRandomNumber = this.anotherRandomNumber;
}

static void Main(string[] args)
{
    var tt = new TuplesTest();
    (int num1, int num2) = tt;
    Console.WriteLine($"num1: {num1}, num2: {num2}");  // =&gt; num1: 4, num2: 10

    Console.WriteLine(tt.GetLastName());
    }
}
</code></pre>

<h2>
	<a id="__Pattern_matching_1364" rel=""></a>مطابقة الأنماط Pattern matching
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class PatternMatchingTest
{
public static (string, int)? CreateLogMessage(object data)
{
    switch(data)
    {
    // when  ترشيح إضافي باستخدام 
        case System.Net.Http.HttpRequestException h when h.Message.Contains("404"):
        return (h.Message, 404);
    case System.Net.Http.HttpRequestException h when h.Message.Contains("400"):
        return (h.Message, 400);
    case Exception e:
         return (e.Message, 500);
    case string s:
        return (s, s.Contains("Error") ? 500 : 200);
    case null:
        return null;
    default:
        return (data.ToString(), 500);
        }
    }
}
</code></pre>

<p>
	الإحالة إلى الموارد المحلية Reference locals<br>
	تعطيك إمكانية إرجاع مرجع Reference كائن بدلا من قيمته
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class RefLocalsTest
{
</code></pre>

<p>
	لاحظ الكلمة المفتاحية ref في تعليمة الإرجاع <code>return</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>public static ref string FindItem(string[] arr, string el)
{
    for(int i=0; i&lt;arr.Length; i++)
    {
        if(arr[i] == el) {
        // إرجاع المرجع
        return ref arr[i];
        }
    }
    throw new Exception("Item not found");
}

public static void SomeMethod()
{
    string[] arr = {"this", "is", "an", "array"};

    //في كل مكان ref لاحظ 
    ref string item = ref FindItem(arr, "array");
    item = "apple";
    Console.WriteLine(arr[3]);  // =&gt; apple
    }
}
</code></pre>

<h2>
	<a id="__Local_functions_1420" rel=""></a>الدوال المحليّة Local functions
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>class LocalFunctionTest
{
    private static int _id = 0;
    public int id;
    public LocalFunctionTest()
    {
        id = generateId();
</code></pre>

<p>
	لا يمكن الوصول إلى الدالة المحلية خارج هذا المجال
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6720_7" style=""><code>int generateId()
    {
        return _id++;
    }
}

public static void AnotherMethod()
{
    var lf1 = new LocalFunctionTest();
    var lf2 = new LocalFunctionTest();
    Console.WriteLine($"{lf1.id}, {lf2.id}");  // =&gt; 0, 1

    int id = generateId();
    // خطأ
    // error CS0103: The name 'generateId' does not exist in the current context
        }
    }
}
</code></pre>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://learnxinyminutes.com/docs/csharp/" rel="external nofollow">Learn C# in Y Minutes</a>
</p>
]]></description><guid isPermaLink="false">597</guid><pubDate>Mon, 05 Mar 2018 17:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x627;&#x633;&#x62A;&#x62B;&#x646;&#x627;&#x621;&#x627;&#x62A; &#x648;&#x645;&#x639;&#x627;&#x644;&#x62C;&#x629; &#x627;&#x644;&#x623;&#x62E;&#x637;&#x627;&#x621; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AB%D9%86%D8%A7%D8%A1%D8%A7%D8%AA-%D9%88%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r385/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/learn-c-sharp-exceptions.png.c59eb0c4d84877daadf538fa10862df2.png" /></p>
<p>
	لا تخلو أيّ لغة برمجة محترمة من وسيلة لمعالجة الأخطاء. تحتوي لغة سي شارب على آليّة قويّة لمعالجة الأخطاء. تشبه هذه الآلية إلى حدّ ما تلك المستخدمة في لغة Java.
</p>

<p style="text-align: center;">
	<img alt="learn-c-sharp-exceptions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19327" data-unique="ifarkzehg" src="https://academy.hsoub.com/uploads/monthly_2016_10/learn-c-sharp-exceptions.png.59a9ef35f405add02a9a3d35bb84d021.png">
</p>

<p>
	هناك نوعان أساسيّان من الأخطاء التي قد تنتج عن البرنامج: النوع الأوّل هي أخطاء أثناء التصميم، أي أثناء كتابة الشيفرة، وهي أخطاء يمكن اكتشافها بسهولة من خلال مترجم سي شارب الذي يتعرّف عليها ويعطيك وصفًا عنها، وقد يزوّدك أيضًا ببعض المقترحات للتخلّص منها. بالنسبة للنوع الثاني من الأخطاء فهي التي تنتج أثناء تنفيذ البرنامج runtime errors. توجد الكثير من الأسباب لحدوث مثل هذه الأخطاء. فمن القسمة على صفر إلى القراءة من ملف غير موجود أو حتى استخدام متغيّر مصرّح على أنّه من نوع مرجعيّ ولكن لم تتم تهيئته بعد بمرجع إلى كائن. عند حدوث مثل هذه الأخطاء ترمي بيئة التنفيذ المشتركة CLR استثناءً exception يحتوي على معلومات بخصوص الخطأ الذي حدث، فإذا كنت مستعدًّا لالتقاط هذا الاستثناء فستنجو، وإلّا سيتوقّف برنامجك عن العمل بصورة مفاجئة.
</p>

<h2>
	التقاط استثناء من خلال عبارة try-catch
</h2>

<p>
	إذا صادفتك عبارة برمجيّة تحتوي على عمليّة حسابيّة أو على استدعاء لتابع آخر، أو أيّ شيء قد يثير الريبة في نفسك، فمن الممكن مراقبتها أثناء تنفيذ البرنامج باستخدام عبارة try-catch. تتألّف هذه العبارة من قسمين: القسم الأوّل هو قسم المراقبة <span style="font-family:courier new,courier,monospace;">try</span>، والقسم الثاني هو قسم الالتقاط <span style="font-family:courier new,courier,monospace;">catch</span>. الشكل "الأبسط" لهذه العبارة هو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_7"><span class="kwd">try</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">//عبارة برمجيّة مريبة</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> exp</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">//هنا يُلتقط الاستثناء وتتمّ معالجته</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أن يحوي قسم <span style="font-family:courier new,courier,monospace;">try</span> على عبارات برمجيّة بقدر ما ترغب. عندما يصادف البرنامج أثناء التنفيذ خطأً ما، سيتوقّف التنفيذ عند العبارة التي سبّبت الخطأ، ثم ينتقل فورًا إلى قسم الالتقاط <span style="font-family:courier new,courier,monospace;">catch</span>. لاحظ معي أنّ قسم <span style="font-family:courier new,courier,monospace;">catch</span> سيُمرَّر إليه وسيط من الصنف <span style="font-family:courier new,courier,monospace;">Exception</span>. الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> موجود ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">System</span>، وهو الصنف الأب لجميع الاستثناءات. إذ أنّ أي استثناء مهما كانت صفته (بما فيها الاستثناءات التي يمكنك أن تكتبها أنت) يجب أن ترث من هذا الصنف.
</p>

<p>
	بعد حدوث الاستثناء والانتقال إلى قسم <span style="font-family:courier new,courier,monospace;">catch</span>، سيحتوي الوسيط <span style="font-family:courier new,courier,monospace;">exp</span> على معلومات حول مكان حدوث الاستثناء وسبب حدوثه، وغيرها من المعلومات التي قد تكون مفيدة لمستخدم البرنامج. تجدر الملاحظة بأنّ البرنامج لن يدخل إلى القسم <span style="font-family:courier new,courier,monospace;">catch</span> أبدًا ما لم يحدث استثناء ضمن القسم <span style="font-family:courier new,courier,monospace;">try</span>.
</p>

<p>
	لنرى الآن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_01</span> الذي سيعرّفنا على الاستثناءات بشكل عمليّ. يحتوي هذا البرنامج البسيط على عبارة try-catch وحيدة سنعمل من خلالها على توليد خطأ بشكل مقصود أثناء التنفيذ، وسنتعلّم كيفيّة المعالجة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_9"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson16_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="kwd">try</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                result </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> exp</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The following error has occurred:"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">exp</span><span class="pun">.</span><span class="typ">Message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Good Bye!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	من الواضح أنّ هذا البرنامج يتجّه لأن يجري عمليّة قسمة على صفر في السطر 15 ضمن القسم <span style="font-family:courier new,courier,monospace;">try</span>. عند وصول البرنامج إلى السطر 15 وإجراء عمليّة القسمة هذه، سيتولّد استثناء يؤدّي إلى انتقال التنفيذ مباشرةً إلى قسم <span style="font-family:courier new,courier,monospace;">catch</span> في السطر 17. في قسم <span style="font-family:courier new,courier,monospace;">catch</span> يعرض البرنامج معلومات عن هذا الخطأ باستخدام الخاصيّة <span style="font-family:courier new,courier,monospace;">Message</span> لكائن الحدث <span style="font-family:courier new,courier,monospace;">exp</span>. في النهاية يعرض البرنامج في السطر 23 رسالة توديعيّة للمستخدم.
</p>

<p>
	نفّذ البرنامج لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9458_11"><span class="pln">The following error has occurred:
Attempted to divide by zero.
Good Bye!</span></pre>

<p>
	جرّب الآن تغيير قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">y</span> لتصبح 1 مثلًا وأعد تنفيذ البرنامج. ستلاحظ ظهور الرسالة التوديعيّة فقط على الشاشة، أي أنّه لم يحدث أي استثناء هذه المرّة. على كلّ الأحوال لا ينصح باستخدام معالجة الاستثناءات من أجل حالة القسمة على صفر في البرنامج السابق.
</p>

<p>
	<strong>ملاحظة</strong>: في الواقع يمكن الاستغناء عن الوسيط الذي يمرّر إلى قسم <span style="font-family:courier new,courier,monospace;">catch</span> بشكل كامل، وفي هذه الحالة لن يكون بإمكانك الحصول على معلومات حول الاستثناء المُلتقط. سيبدو شكل عبارة try-catch على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_13"><span class="kwd">try</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">//عبارة برمجيّة مريبة</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">catch</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">//هنا يُلتقط الاستثناء وتتمّ معالجته</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	من الممكن استخدام هذا الأسلوب إذا كنّا على يقين حول طبيعة الخطأ الذي سيحدث.
</p>

<h2>
	عبارة try-catch أكثر تطورا
</h2>

<p>
	تصادفنا في بعض الأحيان حالات يكون من الضروري معها مراقبة أكثر من عبارة برمجيّة مريبة ضمن قسم <span style="font-family:courier new,courier,monospace;">try</span>. لقد اتفقنا أنّه عند حدوث أيّ استثناء ضمن قسم <span style="font-family:courier new,courier,monospace;">try</span> سينتقل التنفيذ إلى قسم <span style="font-family:courier new,courier,monospace;">catch</span>. ولكن كيف سنميّز العبارة التي سبّبت هذا الاستثناء في قسم <span style="font-family:courier new,courier,monospace;">try</span>؟
</p>

<p>
	توجد العديد من الأصناف التي ترث من الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> والتي يُعتبر كلّ منها استثناءً مخصّصًا أكثر للمشكلة التي قد تحدث. فمثًلا كان من الممكن في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_01</span> السابق أن نستخدم الصنف <span style="font-family:courier new,courier,monospace;">DivideByZeroException</span> بدلًا من الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> في عبارة <span style="font-family:courier new,courier,monospace;">catch</span>، وذلك لأنّه يرث (بشكل غير مباشر) من الصنف <span style="font-family:courier new,courier,monospace;">Exception</span>، وسيعمل البرنامج كما هو متوقّع. ولكن في هذه الحالة لن تستطيع <span style="font-family:courier new,courier,monospace;">catch</span> التقاط سوى الاستثناءات التي تنتج عن القسمة على صفر.
</p>

<p>
	في كثير من الحالات قد تتسبّب العبارات البرمجيّة الموجودة في قسم <span style="font-family:courier new,courier,monospace;">try</span> باستثناءات متنوّعة لا توجد علاقة فيما بينها. مما يفرض علينا استخدام الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> لكي نلتقط بشكل مؤكّد أي استثناء قد يصدر عنها، أو أن تساعدنا سي شارب في هذا الخصوص! في الحقيقة الخيار الثاني هو الأفضل وهو جاهز. يمكننا في الواقع إضافة أقسام <span style="font-family:courier new,courier,monospace;">catch</span> أخرى بقدر ما نرغب بعد قسم <span style="font-family:courier new,courier,monospace;">try</span>. سيوضّح البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_02</span> هذه الفكرة من خلال فتح ملف نصي ومحاولة قراءة محتوياته. لاحظ أنّنا سنستخدم هنا نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.IO</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_15"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson16_02</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            string contents</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	            </span><span class="typ">Try</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	                using </span><span class="pun">(</span><span class="typ">StreamReader</span><span class="pln"> sr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamReader</span><span class="pun">(</span><span class="str">"myfile.txt"</span><span class="pun">))</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                    contents </span><span class="pun">=</span><span class="pln"> sr</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This file contains {0} characters."</span><span class="pun">,</span><span class="pln"> contents</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">NullReferenceException</span><span class="pln"> nullExp</span><span class="pun">)</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The file does not contain any data."</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	            </span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">FileNotFoundException</span><span class="pln"> notFoundExp</span><span class="pun">)</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"File: {0} not found!"</span><span class="pun">,</span><span class="pln"> notFoundExp</span><span class="pun">.</span><span class="typ">FileName</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	يستخدم هذا البرنامج قسميّ <span style="font-family:courier new,courier,monospace;">catch</span>. القسم الأوّل (الأسطر من 21 إلى 24) يلتقط استثناءً من النوع <span style="font-family:courier new,courier,monospace;">NullReferenceException</span> وهذا يحدث عند محاولة استدعاء تابع أو خاصيّة من متغيّر يحتوي على <span style="font-family:courier new,courier,monospace;">null</span> بدلًا من مرجع لكائن حقيقي. أمّا القسم الثاني (الأسطر من 25 إلى 28) فهو يلتقط استثناءً من النوع <span style="font-family:courier new,courier,monospace;">FileNotFoundException</span> والذي يحدث عند محاولة القراءة من ملف غير موجود. نفّذ البرنامج السابق وستحصل على الرسالة التالية في الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9458_17"><span class="pln">File: C:\\Users\Husam\documents\visual studio 2015\Projects\Lesson16_02\Lesson16_02\bin\Debug\myfile.txt not found!</span></pre>

<p>
	وهذا طبيعي تمامًا لأنّني لم أنشئ الملف<span style="font-family:courier new,courier,monospace;"> myFile.txt</span> في هذا المسار. لاحظ كيف يضيف الصنف <span style="font-family:courier new,courier,monospace;">FileNotFoundException</span> خاصيّة جديدة له وهي <span style="font-family:courier new,courier,monospace;">FileName</span> (السطر 27) من النوع <span style="font-family:courier new,courier,monospace;">string</span> التي تحوي مسار الملف مع اسمه.
</p>

<p>
	أنشئ الآن الملف <span style="font-family:courier new,courier,monospace;">myFile.txt </span>واتركه فارغًا، ثمّ ضعه ضمن نفس المجلّد الذي يحوي الملف التنفيذي للبرنامج (موجود ضمن<span style="font-family:courier new,courier,monospace;"> bin\Debug\</span>).
</p>

<p>
	أعد تنفيذ البرنامج وستحصل على الرسالة التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9458_19"><span class="pln">The file does not contain any data.</span></pre>

<p>
	السبب في ظهور هذه الرسالة هو الاستثناء <span style="font-family:courier new,courier,monospace;">NullReferenceException</span> وذلك لأنّنا حاولنا الوصول إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">Length</span> (تعطينا عدد المحارف الموجودة ضمن متغيّر نصي) من المتغيّر النصي <span style="font-family:courier new,courier,monospace;">contents</span> رغم أنّه يحتوي على <span style="font-family:courier new,courier,monospace;">null</span> (تذكّر بأنّنا تركنا الملف <span style="font-family:courier new,courier,monospace;">myFile.txt</span> فارغًا).
</p>

<p>
	اذهب إلى الملف<span style="font-family:courier new,courier,monospace;"> myFile.txt</span> الذي أنشأناه قبل قليل، واكتب بعض الكلمات ضمنه واحفظ الملف، ثمّ أعد تنفيذ البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_02</span> من جديد. يجب الآن أن تحصل على رسالة تخبرك بعدد الأحرف التي كتبتها ضمن الملف.
</p>

<p>
	<strong>ملاحظة</strong>: يجب الانتباه إلى ترتيب أقسام <span style="font-family:courier new,courier,monospace;">catch</span>. فلو كان مثلًا أوّل قسم <span style="font-family:courier new,courier,monospace;">catch</span> موجود بعد قسم <span style="font-family:courier new,courier,monospace;">try</span> يلتقط استثناءً من النوع <span style="font-family:courier new,courier,monospace;">Exception</span> فعندها لن يستطيع أي قسم لاحق التقاط أي استثناء، لأنّ جميع الاستثناءات سيلتقطها هذا القسم الأوّل. السبب في ذلك أنّ الصنف <span style="font-family:courier new,courier,monospace;">Exception</span> هو الأب العام لجميع أصناف الاستثناءات الأخرى، فيمكن له التقاطها.
</p>

<h2>
	عبارة try-catch-final
</h2>

<p>
	يمكن إضافة قسم أخير لعبارة try-catch اسمه <span style="font-family:courier new,courier,monospace;">final</span>. وكما يوحي اسمه، فهذا القسم يمكن له أن يحتوي على عبارات برمجيّة سيتمّ تنفيذها بعد أن يدخل البرنامج إلى القسم <span style="font-family:courier new,courier,monospace;">try</span> العائد له. وذلك سواءً أحدث استثناء ضمن <span style="font-family:courier new,courier,monospace;">try</span> أم لم يحدث. تكمن فائدة وجود هذا القسم، في أنّه قد نواجه أحيانًا بعض الحالات التي تتطلّب إجراء بعض المهام عندما نفرغ من قسم <span style="font-family:courier new,courier,monospace;">try</span> مثل إغلاق بعض المصادر المفتوحة، أو تحرير الذاكرة بشكل فوري وغيرها. الشرط الوحيد لاستخدام هذا القسم الاختياري هو أن يكون آخر قسم في عبارة try-catch. سنعدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_02</span> ليدعم القسم <span style="font-family:courier new,courier,monospace;">final</span>. انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_03</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_21"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson16_03</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">		</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">		</span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">			</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">			</span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">				string contents</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">		
</span><span class="lit">12</span><span class="pln">				</span><span class="kwd">try</span><span class="pln">
</span><span class="lit">13</span><span class="pln">				</span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">					using </span><span class="pun">(</span><span class="typ">StreamReader</span><span class="pln"> sr </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamReader</span><span class="pun">(</span><span class="str">"myfile.txt"</span><span class="pun">))</span><span class="pln">
</span><span class="lit">15</span><span class="pln">					</span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">						contents </span><span class="pun">=</span><span class="pln"> sr</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">17</span><span class="pln">					</span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">					</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This file contains {0} characters."</span><span class="pun">,</span><span class="pln"> contents</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">				</span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">				</span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">NullReferenceException</span><span class="pln"> nullExp</span><span class="pun">)</span><span class="pln">
</span><span class="lit">21</span><span class="pln">				</span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">					</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The file does not contain any data."</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">				</span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">				</span><span class="kwd">catch</span><span class="pun">(</span><span class="typ">FileNotFoundException</span><span class="pln"> notFoundExp</span><span class="pun">)</span><span class="pln">
</span><span class="lit">25</span><span class="pln">				</span><span class="pun">{</span><span class="pln">
</span><span class="lit">26</span><span class="pln">					</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"File: {0} not found!"</span><span class="pun">,</span><span class="pln"> notFoundExp</span><span class="pun">.</span><span class="typ">FileName</span><span class="pun">);</span><span class="pln">
</span><span class="lit">27</span><span class="pln">				</span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln">				finally
</span><span class="lit">29</span><span class="pln">				</span><span class="pun">{</span><span class="pln">
</span><span class="lit">30</span><span class="pln">					</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Good Bye!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">				</span><span class="pun">}</span><span class="pln">
</span><span class="lit">32</span><span class="pln">			</span><span class="pun">}</span><span class="pln">
</span><span class="lit">33</span><span class="pln">		</span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	سواءً كان الملف <span style="font-family:courier new,courier,monospace;">myFile.txt</span> موجودًا أم غير موجود، أو كان يحتوي على بيانات أم فارغاً، ستظهر العبارة !Good Bye على الشاشة.
</p>

<p>
	<strong>ملاحظة</strong>: من الأفضل دومًا أن تحاول عدم استخدام عبارة try-catch وأن تستخدم عبارة <span style="font-family:courier new,courier,monospace;">if</span> لاختبار الحالات التي تواجهك قبل تنفيذها. استخدم try-catch إذا كان ذلك ضروريًّا. والسبب في ذلك أنّ عمليّة معالجة الأخطاء بشكل عام تتطلّب المزيد من الموارد المخصّصة للبرنامج، مما قد يؤثّر على أداء البرنامج في حال تمّ استخدامها بشكل غير مدروس.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	عدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson16_02</span> بحيث يمكن الاستغناء عن عبارة try-catch تمامًا.
</p>

<p>
	(<strong>تلميح</strong>: ستحتاج إلى استخدام عبارتيّ <span style="font-family:courier new,courier,monospace;">if</span> في هذه الحالة).
</p>

<h3>
	تمرين 2
</h3>

<p>
	لتكن لدينا الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9458_23"><span class="pln">string input </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> t </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">input</span><span class="pun">);</span></pre>

<p>
	تطلب الشيفرة السابقة من المستخدم أن يدخل عددًا على شكل نص لتعمل على تحويله إلى قيمة عدديّة باستخدام التابع <span style="font-family:courier new,courier,monospace;">int.Parse</span>.
</p>

<p>
	المطلوب هو إضافة عبارة try-catch إلى الشيفرة السابقة لمعالجة استثناء ممكن الحدوث في حال أدخل المستخدم قيمة مثل "u" وهي لا يمكن تحويلها إلى قيمة عدديّة كما هو واضح.
</p>

<p>
	(<strong>تلميح</strong>: استخدام الاستثناء <span style="font-family:courier new,courier,monospace;">FormatException</span> الذي يُعبّر عن هذه الحالة).
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على كيفيّة معالجة الأخطاء التي تظهر أثناء تنفيذ البرنامج. في الحقيقة هذا الموضوع ذو شجون! وهناك الكثير ليقال، ولكن يكفي الآن أن تتعرّف على المبادئ الأساسيّة لالتقاط الاستثناءات، وكيفيّة معالجتها.
</p>

<p>
	يمكنك استخدام هذا الأسلوب في جميع التطبيقات التي تُنشئها باستخدام سي شارب، مثل تطبيقات الويب بأنواعها، و<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a>، وحتى تطبيقات الأجهزة الذكيّة باستخدام <a href="https://academy.hsoub.com/programming/c-sharp/%D9%85%D9%86%D8%B5%D8%A9-xamarin/" rel="">تقنيّة Xamarin</a>.
</p>
]]></description><guid isPermaLink="false">385</guid><pubDate>Mon, 10 Oct 2016 07:34:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x62A;&#x639;&#x627;&#x628;&#x64A;&#x631; Lambda &#x648;&#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645;&#x627;&#x62A; Linq &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-lambda-%D9%88%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-linq-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r381/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/learn-c-sharp-lambda-linq.png.32158369524301c6bc3eb9570e0c167c.png" /></p>

<p>
	تعتبر تقنيّة Linq من التقنيّات الجديدة نسبيًّا في سي شارب ولغات دوت نت عمومًا. تسمح هذه التقنيّة بإجراء عمليّات استعلام معقّدة لاستخلاص البيانات بشكل سلس وسهل بسبب شكلها المألوف كما سنرى لاحقًا في هذا الدرس.
</p>

<p style="text-align: center;">
	<img alt="learn-c-sharp-lambda-linq.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19250" data-unique="qrsqgyhyd" src="https://academy.hsoub.com/uploads/monthly_2016_10/learn-c-sharp-lambda-linq.png.fbd3348d36adda24f02adb3f3529e643.png"></p>

<p>
	لتقنيّة Linq أشكال متعدّدة:
</p>

<ul>
<li>
		<strong>Linq to Objects</strong>: للتعامل مع البيانات الموجودة في ذاكرة البرنامج.
	</li>
	<li>
		<strong>Linq To XML</strong>: للتعامل مع البيانات النصيّة الموجودة بتنسيق XML.
	</li>
	<li>
		<strong>Linq To SQL</strong>: وهي تقنيّة خاصّة بالحصول على البيانات من خادم SQL Server. في الحقيقة تمّ التخلّي عن هذه التقنيّة رغم حداثتها، وذلك لصالح تقنيّة أحدث وأكثر تطوّرًا وهي Entity Framework.
	</li>
</ul>
<p>
	كما يتحدّث هذا الدرس عن <strong>تعابير Lambda</strong> وهي من المزايا المفيدة والتي تسهّل عمل المبرمجين إلى حدٍّ كبير. ستناول في هذا الدرس الشكل الأوّل من Linq، وهو استخدام Linq مع الكائنات Objects. ولكن قبل ذلك لنتحدّث قليلًا عن تعابير Lambda.
</p>

<h2>
	تعابير Lambda
</h2>

<p>
	تستطيع تخيّل تعابير Lambda على أنّها دوال functions صغيرة ليس لها اسم، تعمل على إجراء عمليّات حسابيّة بسيطة، ومن الممكن أن ترجع نتيجة. في الواقع يمكن للنوّاب Delegates أن تغلّف تعابير Lambda ضمن شروط محدّدة. سنتناول مثالًا بسيطًا يوضّح كيفيّة التعامل معها. انظر إلى الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_8">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	delegate </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Square</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">

	</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">Square</span><span class="pln"> square </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> square</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	صرّحنا في الشيفرة السابقة عن النائب <span style="font-family:courier new,courier,monospace;">Square</span> الذي يتطلّب وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع قيمة من نفس النوع. يُفترض بهذا النائب بأن يُغلّف التوابع التي تعمل على إيجاد مربّع عدد صحيح. إذا نظرت الآن إلى التابع <span style="font-family:courier new,courier,monospace;">Main</span> ستجد أنّنا في السطر الأوّل منه نصرّح عن المتغيّر <span style="font-family:courier new,courier,monospace;">square</span> من نوع النائب <span style="font-family:courier new,courier,monospace;">Square</span>، حيث نُسند إليه ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_10">
<span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> x</span></pre>

<p>
	التعبير السابق هو تعبير Lambda بسبب وجود السهم<span style="font-family:courier new,courier,monospace;"> &lt;=</span> ضمنه. فهم هذا التعبير بسيط، فهو يطلب وسيطًا وحيدًا (x) على يسار السهم، ويضرب قيمة هذا الوسيط بنفسها: <span style="font-family:courier new,courier,monospace;">x * x</span> على يمين السهم، سيُرجع هذا التعبير قيمة <span style="font-family:courier new,courier,monospace;">x</span> مضروبةً بنفسها. ولكن الملفت في الأمر أنّنا قد أسندنا هذا التعبير إلى متغيّر من نوع النائب <span style="font-family:courier new,courier,monospace;">Square</span>. السبب في ذلك أنّ تعبير Lambda السابق يتوافق مع النائب <span style="font-family:courier new,courier,monospace;">Square</span> في أنّه يحتاج إلى وسيط وحيد من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع قيمة من نفس النوع. ولكنّنا لم نوضّح في تعبير Lambda نوع الوسيط أو نوع القيمة المُعادة! لا مشكلة في ذلك، فسيتم استخلاص النوع من الوسيط المُمرّر وذلك بشكل تلقائي.
</p>

<p>
	كمثال آخر على استخدام تعبير Lambda يمكن كتابة تعبير يتطلّب وسيطين ولكن لا يُرجع أي قيمة. انظر إلى الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_12">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SumAndPrinting</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">);</span><span class="pln">

	</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">SumAndPrinting</span><span class="pln"> sumAndPrnt </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">);</span><span class="pln">
		sumAndPrnt</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	النائب <span style="font-family:courier new,courier,monospace;">SumAndPrinting</span> يقبل الآن وسيطين من النوع <span style="font-family:courier new,courier,monospace;">int</span> لكنّه لا يُرجع أي قيمة (<span style="font-family:courier new,courier,monospace;">void</span>). انظر إلى تعبير Lambda كيف أصبح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_14">
<span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">)</span></pre>

<p>
	لاحظ كيف أنّ الوسائط الموجودة بين قوسين تفصل بينها فواصل عاديّة دون تحديد الأنواع. كما يمكنك أن تلاحظ أيضًا بأنّ هذا التعبير مهمّته جمع قيمتي الوسيطين والطبع إلى الشاشة دون إرجاع أيّ قيمة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكننا الاستغناء عن القوسين في تعبير Lambda، إذا أردنا تمرير وسيط واحد فقط. مثل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_16">
<span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> x</span></pre>

<h2>
	استعلاماتLinq
</h2>

<p>
	للاستفادة من Linq يجب إضافة نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.Linq</span> باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">using</span>. أفضل وسيلة لفهم Linq هي من خلال مثال تطبيقي بسيط، في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson15_01</span> سنستخدم الصنف <span style="font-family:courier new,courier,monospace;">Student</span> الذي استخدمناه في درس سابق ولكن سنجري فيه بعض التعديلات البسيطة، حيث أصبحنا نفصل اسم الطالب <span style="font-family:courier new,courier,monospace;">FirstName</span> عن كنيته <span style="font-family:courier new,courier,monospace;">LastName</span>، بالإضافة إلى إضافة حقل جديد اسمه <span style="font-family:courier new,courier,monospace;">Id</span> من النوع <span style="font-family:courier new,courier,monospace;">int</span>، والذي يُعبّر عن رقم الطالب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_18">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سننشئ 10 كائنات من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> ونخزّنها ضمن مجموعة عموميّة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;Student </span>ثم نُجري على هذه المجموعة بعض "الحيل" باستخدام Linq. الهدف من هذا البرنامج هو إجراء عمليّة تصفية على هؤلاء الطلّاب بحيث نحصل على الطلّاب الذين تكون درجاتهم أكبر تمامًا من 60. سيحتوي البرنامج <span style="font-family:courier new,courier,monospace;">Lesson15_01</span> على أفكار جديدة ولكن مفيدة فكن مستعدًّا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_20">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	namespace </span><span class="typ">Lesson15_01</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;</span><span class="pln"> studentsList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Ahmad"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Morad"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">80</span><span class="pun">},</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Husam"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sayed"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">75</span><span class="pun">},</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Nour"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hasan"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">65</span><span class="pun">},</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bssel"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Shamma"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">30</span><span class="pun">},</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Ahmad"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Khatib"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">90</span><span class="pun">},</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Maryam"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Burhan"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">95</span><span class="pun">},</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sarah"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Burhan"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">},</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mansour"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Khalid"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">50</span><span class="pun">},</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Omran"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Barrak"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">45</span><span class="pun">},</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	                </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hasan"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Anis"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">56</span><span class="pun">},</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">32</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Full List:"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"----------"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	            </span><span class="typ">PrintList</span><span class="pun">(</span><span class="pln">studentsList</span><span class="pun">);</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	            </span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;</span><span class="pln"> students </span><span class="pun">=</span><span class="pln"> from student in studentsList
</span><span class="lit">39</span><span class="pln">	                                            where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">60</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	                                            select student</span><span class="pun">;</span><span class="pln">
</span><span class="lit">41</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"After applying Linq:"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"----------"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	            </span><span class="typ">PrintList</span><span class="pun">(</span><span class="pln">students</span><span class="pun">);</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	
</span><span class="lit">48</span><span class="pln">	        </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">PrintList</span><span class="pun">(</span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;</span><span class="pln"> students</span><span class="pun">)</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0,-5}{1,-15}{2,-15}{3,-10}"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Id"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First Name"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Last Name"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mark"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">51</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	            foreach </span><span class="pun">(</span><span class="typ">Student</span><span class="pln"> s in students</span><span class="pun">)</span><span class="pln">
</span><span class="lit">53</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">54</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0,-5}{1,-15}{2,-15}{3,-10}"</span><span class="pun">,</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">,</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">Mark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">55</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">57</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج السابق لتحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="19249" href="https://academy.hsoub.com/uploads/monthly_2016_10/57f63d7946a4d_fig01(1).png.0296f8d18a9507a5e6a9a5ef334b3e8f.png" rel="external"><img alt="fig01 (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="19249" data-unique="5kwue6guq" src="https://academy.hsoub.com/uploads/monthly_2016_10/57f63d7971e9b_fig01(1).thumb.png.e7c074d25990b818d9ac00fdb0c205b0.png"></a>
</p>

<p>
	لاحظ كيف استثنى البرنامج في القائمة الثانية الطلاب الذين تقل درجاتهم عن 60 أو تساويها. قارن بين القائمتين واكتشف العناصر المستثناة.
</p>

<p>
	يبدأ البرنامج في التابع <span style="font-family:courier new,courier,monospace;">Main</span> بإنشاء 10 كائنات من النوع <span style="font-family:courier new,courier,monospace;">Student</span> تمثّل بيانات عشرة طلّاب وإسناد هذه الكائنات فورًا إلى المجموعة القائمة <span style="font-family:courier new,courier,monospace;">studentsList</span> بشكل مختصر (الأسطر من 19 إلى 31). الملفت هنا هو طريقة إنشاء كل من هذه الكائنات. انظر إلى السطر 21 مثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_22">
<span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Ahmad"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Morad"</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">80</span><span class="pun">}</span></pre>

<p>
	هذا شكل مختصر لإنشاء كائن من النوع <span style="font-family:courier new,courier,monospace;">Student</span> حيث استخدمنا حاضنة {} بعد اسم الصنف <span style="font-family:courier new,courier,monospace;">Student</span> مباشرةً وكتبنا أسماء الخصائص التي نريد تهيئتها ضمن هذه الحاضنة. بالنسبة لبانيّة الصنف <span style="font-family:courier new,courier,monospace;">Student</span> فستُستدعى بكلّ تأكيد. يعتبر هذا الشكل من الإنشاء والإسناد المباشر للخصائص مفيدًا للغاية (أستخدمه بكثرة في برامجي الخاصّة) حيث يقلّل من أسطر الشيفرة البرمجيّة إلى حدٍّ كبير.
</p>

<p>
	سيطبع البرنامج بعد ذلك القائمة التي أنشأناها قبل قليل من باب التوضيح، وذلك من خلال استدعاء التابع الساكن <span style="font-family:courier new,courier,monospace;">PrintList</span> (السطر 35) بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_24">
<span class="typ">PrintList</span><span class="pun">(</span><span class="pln">studentsList</span><span class="pun">);</span></pre>

<p>
	مرّرنا لهذا التابع القائمة الكاملة <span style="font-family:courier new,courier,monospace;">studentsList</span>. التصريح عن التابع الساكن موجود في الأسطر بين 48 و 56 وسنتكلّم عنه بعد قليل.
</p>

<p>
	يحتوي السطر 38 على عبارة برمجيّة تستخدم استعلام Linq:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_30">
<span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;</span><span class="pln"> students </span><span class="pun">=</span><span class="pln"> from student in studentsList
where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">60</span><span class="pln">
select student</span><span class="pun">;</span></pre>

<p>
	يقع استعلام Linq على يمين عامل الإسناد (=)، وفي الحقيقة إذا كان لديك اطّلاع على لغة SQL فسيكون هذا الاستعلام مألوفًا بالنسبة إليك. لنركّز الآن على هذا الاستعلام فحسب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_32">
<span class="pln">from student in studentsList
where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">60</span><span class="pln">
select student</span></pre>

<p>
	يبدأ الاستعلام بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">from</span> يتبعه اسم متغيّر جديد يمكنك تسميّته بأيّ اسم ترغبه. اخترت الاسم <span style="font-family:courier new,courier,monospace;">student</span> لأنّني وجدتّه معبّرًا. بعد اسم المتغيّر الجديد نجد الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">in</span> وبعدها اسم المجموعة التي نريد تطبيق الاستعلام عليها. إذًا أصبح بإمكاننا قراءة السطر الأوّل من الاستعلام على الشكل التالي:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			"من أجل كل عنصر student موجود ضمن المجموعة studentsList".
		</p>
	</div>
</blockquote>

<p>
	يبدأ السطر الثاني بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">where</span> وهي اختياريّة ومن الممكن عدم كتابتها، وهي تسمح بكتابة شرط من ممكن تطبيقه على عناصر المجموعة <span style="font-family:courier new,courier,monospace;">studentsList</span>. بالنسبة لمثالنا هذا، اخترت تطبيق الشرط:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_35">
<span class="pln">where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">60</span></pre>

<p>
	أي أنّني أريد أن تكون درجة كل طالب (<span style="font-family:courier new,courier,monospace;">student</span>) أكبر تمامًا من 60.
</p>

<p>
	أمّا السطر الثالث<span style="font-family:courier new,courier,monospace;"> select student</span> فهو يخبر Linq عن شكل البيانات التي نريد الحصول عليها بنتيجة تنفيذ الاستعلام. في مثالنا هذا نريد الحصول على مجموعة كل عنصر من عناصرها هو كائن من النوع <span style="font-family:courier new,courier,monospace;">Student</span>.
</p>

<p>
	بنتيجة تنفيذ الاستعلام السابق سيحتوي المتغيّر <span style="font-family:courier new,courier,monospace;">students</span> على مرجع لكائن مجموعة يحقّق الواجهة<span style="font-family:courier new,courier,monospace;"> &lt;IEnumerable&lt;Student </span>ولا يهمّك في الحقيقة ما هو النوع الفعليّ لهذه المجموعة.
</p>

<p>
	يمكن لاستعلام Linq أن يُنتج مرجعًا لكائن مجموعة يحقّق الواجهة <span style="font-family:courier new,courier,monospace;">&lt;IQueryable&lt;Student </span>ولكنّ الحديث عن هذا الموضوع هو خارج مجال الدرس.
</p>

<p>
	في الواقع يمكن استخدام شروط أكثر تعقيدًا كأن نرغب بالحصول على جميع الطلّاب الذين تتراوح درجاتهم بين 60 و90 ضمنًا على سبيل المثال، وذلك باستخدام العامل<span style="font-family:courier new,courier,monospace;"> &amp;&amp; </span>بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_37">
<span class="pln">from student in studentsList
where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">90</span><span class="pln">
select student</span></pre>

<p>
	كما من الممكن أنّ نرتّب البيانات حسب رقم الطالب <span style="font-family:courier new,courier,monospace;">id</span>، أو بحسب اسمه <span style="font-family:courier new,courier,monospace;">FirstName</span> أو كنيته <span style="font-family:courier new,courier,monospace;">LastName</span> أو بمزيج منها، وذلك باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">orderby</span> الخاصّة بـ Linq:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_39">
<span class="pln">from student in studentsList
where student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">90</span><span class="pln">
orderby student</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> student</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln">
select student</span></pre>

<p>
	سيقوم الاستعلام السابق بترتيب العناصر التي توافق الشرط الموجود في القسم <span style="font-family:courier new,courier,monospace;">where</span> حسب الاسم ثمّ حسب الكنيّة. توجد في الحقيقة الكثير من المزايا القويّة التي تتمتّع بها استعلامات Linq والتي لا يتّسع هذا الدرس لذكرها.
</p>

<p>
	بالنسبة للتابع <span style="font-family:courier new,courier,monospace;">PrintList</span> (الأسطر من 50 حتى 58) فيقتصر دوره على طباعة جدول للقائمة التي نمرّرها كوسيط إليه. لاحظ أنّ الوسيط الوحيد الذي يقبله يحقّق الواجهة<span style="font-family:courier new,courier,monospace;"> &lt;IEnumerable&lt;Student</span> لذلك فيمكننا تمرير أي وسيط إليه يحمل مرجعًا إلى كائن من أيّ صنف يحقّق هذه الواجهة بما فيه بالطبع الصنف<span style="font-family:courier new,courier,monospace;"> &lt;List&lt;Student</span>. الأمر الوحيد الجديد في هذا التابع هو استخدامه لتنسيق مختلف في إظهار البيانات بشكل جدوليّ. انظر السطر 52. ستجد النص التنسيقي: "{0,-5}{1,-15}{2,-15}{3,-10}" يسمح هذا النص التنسيقي بعرض البيانات بشكل جدوليّ أنيق على الشاشة، حيث يسمح التنسيق التالي {0, -5} بعرض الوسيط ذو الموقع 0 (من التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>) ضمن حقل عرضه 5 فراغات بحيث تكون المحاذاة نحو اليسار. أمّا التنسيق {1, -15} فيسمح بعرض الوسيط ذو الموقع 1 ضمن حقل عرضه 15 فراغ بحيث تكون المحاذاة نحو اليسار أيضًا. بإزالة إشارة السالب (-) من التنسيقين السابقين ستصبح المحاذاة نحو اليمين.
</p>

<p>
	هل تريد المزيد من الإثارة؟ أضف السطر التالي إلى السطر 43 من البرنامج السابق (أي بعد العبارة التي تستخدم استعلام Linq):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_41">
<span class="kwd">double</span><span class="pln"> average </span><span class="pun">=</span><span class="pln"> students</span><span class="pun">.</span><span class="typ">Average</span><span class="pun">(</span><span class="pln">s </span><span class="pun">=&gt;</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">Mark</span><span class="pun">);</span></pre>

<p>
	تستخدم هذه العبارة التابع <span style="font-family:courier new,courier,monospace;">Average</span> من المتغيّر <span style="font-family:courier new,courier,monospace;">students</span> الذي يحتوي على قائمة الطلّاب بعد التصفيّة كما نعلم. وكما يُوحي اسمه يعمل هذا التابع على حساب معدّل الطلاب (كائنات <span style="font-family:courier new,courier,monospace;">Student</span>) الموجودين ضمن <span style="font-family:courier new,courier,monospace;">students</span>. ولكن كيف سيعرف التابع <span style="font-family:courier new,courier,monospace;">Average</span> الحقل الذي سيتمّ بموجبه حساب المعدّل؟ يتمثّل الحل في استخدام تعبير Lambda يتطلّب وسيطًا واحدًا (الوسيط s) الذي سيمثّل كائن <span style="font-family:courier new,courier,monospace;">Student</span>، ويُرجع قيمة الخاصيّة <span style="font-family:courier new,courier,monospace;">Mark</span> له:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_43">
<span class="pln">s </span><span class="pun">=&gt;</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">Mark</span></pre>

<p>
	سيستخدم التابع هذا التعبير للمرور على جميع العناصر الموجودة ضمن المجموعة <span style="font-family:courier new,courier,monospace;">students</span> ليحصل على درجة كلّ منها باستخدام تعبير Lambda السابق ثمّ يحسب المعدّل، ليعمل البرنامج على إسناده إلى المتغيّر <span style="font-family:courier new,courier,monospace;">average</span> وهو من النوع <span style="font-family:courier new,courier,monospace;">double</span> كما هو واضح. بعد تنفيذ العبارة السابقة وعلى فرض أنّ نسخة البرنامج <span style="font-family:courier new,courier,monospace;">Lesson15_01</span> الأساسيّة هي التي استُخدمت، ستكون قيمة <span style="font-family:courier new,courier,monospace;">average</span> تساوي 77.5، ويمثّل هذا الرقم معدّل الطلاب الذين تكون درجاتهم أكبر تمامًا من 60.
</p>

<p>
	قد يبدو كلّ ما قدّمناه جميلًا وممتعًا، لكنّك لن تستمتع بشكل فعليّ بهذه المزايا الرائعة التي توفّرها Linq و تعابير Lambda ما لم تستخدمها في برامجك الخاصّة. أستخدم مثل هذه المزايا في برامجي التي أطوّرها، ولن تتصوّر مدى سعادتي عندما أستخلص بيانات من قاعدة بيانات أو من خدمة ويب web service قد تحتوي على المئات أو الآلاف من البيانات الخام، ثمّ أُطبّق عليها وصفات Linq السحريّة فأحصل على ما أريده بكتابة عبارة برمجيّة واحدة فقط!
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	أجرِ تعديلًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson15_01</span> بحيث نحصل على جميع الطلّاب الذين تكون درجاتهم أقل تمامًا من 50.
</p>

<h4>
	تمرين 2
</h4>

<p>
	أجرِ تعديلًا آخرًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson15_01</span> بحيث نحصل على جميع الطلّاب الذين يكون الحرف الأوّل من اسمهم هو "A".
</p>

<p>
	(<strong>تلميح</strong>: أحد الحلول المقترحة هو استخدام التابع <span style="font-family:courier new,courier,monospace;">StartWith</span> من الخاصيّة النصية <span style="font-family:courier new,courier,monospace;">FirstName</span> للكائن <span style="font-family:courier new,courier,monospace;">student</span> أي على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7294_45">
<span class="pln">student</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">.</span><span class="typ">StartsWith</span><span class="pun">(</span><span class="str">"A"</span><span class="pun">)</span></pre>

<p>
	وذلك بعد الكلمة <span style="font-family:courier new,courier,monospace;">where</span> في استعلام Linq ).
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على تعابير Lambda واستعلامات Linq. حيث صمّمنا عدّة برامج توضّح هاتين التقنيّتين المهمّتين في البرمجة باستخدام سي شارب. ستصادف كلًّا منهما كثيرًا في حياتك البرمجيّة، وستكون سعيدًا باستخدامها نظرًا للاختصار الكبير الذي ستحصل عليه في الشيفرة البرمجيّة، هذا فضلًا عن الأداء عالي المستوى الذي لن تستطيع مجاراته باستخدامك للشيفرة التقليديّة.
</p>
]]></description><guid isPermaLink="false">381</guid><pubDate>Fri, 07 Oct 2016 07:20:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x62D;&#x62F;&#x627;&#x62B; Events &#x648;&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639;&#x647;&#x627; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%A7%D8%AB-events-%D9%88%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r376/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_09/learn-csharp-events.png.3435391c36d4f1accabc15f38172428c.png" /></p>
<p>
	عندما تعمل على حاسوبك الشخصي، أو حتى على هاتفك الذكيّ، أو ربّما ساعتك الذكيّة. فأنت تستخدم الأحداث آلاف المرّات. الحدث هو وسيلة جميلة للتعبير عن أمر طارئ حدث لكائن برمجيّ. قد يكون هذا الأمر الطارئ عبارة عن نقرة زر فأرة، أو عن لمسة على شاشة جهازك الذكي. أو ضغطة مفتاح من لوحة المفاتيح الخاصّة بي وأنا أكتب هذا المقال، أو أن يكون أمرًا طارئًا يُعبّر عن حالة داخليّة ضمن نظام التشغيل. باختصار، هناك عدد كبير جدًّا من المصادر المختلفة أو المحتملة للأحداث.
</p>

<p style="text-align: center;">
	<img alt="learn-csharp-events.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19014" data-unique="6arbrxu23" src="https://academy.hsoub.com/uploads/monthly_2016_09/learn-csharp-events.png.944541095d8f2fec526dc25324105ca1.png">
</p>

<h2>
	العلاقة بين الأحداث Events والنوّاب Delegates
</h2>

<p>
	تعتمد الأحداث بشكل كليّ على <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%86%D9%88%D8%A7%D8%A8-delegates-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r366/" rel="">النوّاب</a>. وفي الحقيقة هي وسيلة لتهذيبها! لنستعير الصنف <span style="font-family:courier new,courier,monospace;">Car</span> من البرنامج <span style="font-family:courier new,courier,monospace;">Lesson13_02</span> من الدرس السابق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_10"><span class="lit">1</span><span class="pln">	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">3</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">4</span><span class="pln">
</span><span class="lit">5</span><span class="pln">		</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> speedNotificationHandler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">RegisterWithSpeedNotification</span><span class="pun">(</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> handler</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">		</span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">			</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">=</span><span class="pln"> handler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">		</span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
</span><span class="lit">16</span><span class="pln">		</span><span class="pun">{</span><span class="pln">
</span><span class="lit">17</span><span class="pln">			</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">			</span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="lit">19</span><span class="pln">		</span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> maxSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">22</span><span class="pln">		</span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">			</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> currentSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">24</span><span class="pln">			</span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> maxSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">25</span><span class="pln">		</span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">
</span><span class="lit">27</span><span class="pln">		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Accelerate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
</span><span class="lit">28</span><span class="pln">		</span><span class="pun">{</span><span class="pln">
</span><span class="lit">29</span><span class="pln">			</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> delta</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">
</span><span class="lit">31</span><span class="pln">			</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">32</span><span class="pln">			</span><span class="pun">{</span><span class="pln">
</span><span class="lit">33</span><span class="pln">				</span><span class="kwd">if</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">34</span><span class="pln">				</span><span class="pun">{</span><span class="pln">
</span><span class="lit">35</span><span class="pln">					string msg </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"You exceed the maximum speed! (Current = {0}, Max = {1})"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">36</span><span class="pln">												</span><span class="typ">CurrentSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">);</span><span class="pln">
</span><span class="lit">37</span><span class="pln">
</span><span class="lit">38</span><span class="pln">					speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
</span><span class="lit">39</span><span class="pln">				</span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">			</span><span class="pun">}</span><span class="pln">
</span><span class="lit">41</span><span class="pln">		</span><span class="pun">}</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	كنت قد طلبت منك في التمرين الداعم رقم 2 من الدرس السابق أن تجري تعديلًا على الصنف <span style="font-family:courier new,courier,monospace;">Car</span> بحيث تستغني عن التابع <span style="font-family:courier new,courier,monospace;">RegisterWithSpeedNotification</span>، ولمّحت بأن تجعل الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> ذي محدّد وصول <span style="font-family:courier new,courier,monospace;">public</span>. بعد إجراء هذا التعديل سيصبح الصنف <span style="font-family:courier new,courier,monospace;">Car</span> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_13"><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">);</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> speedNotificationHandler</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
		</span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> maxSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentSpeed</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> currentSpeed</span><span class="pun">;</span><span class="pln">
		</span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> maxSpeed</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Accelerate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> delta</span><span class="pun">;</span><span class="pln">
      
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">)</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
			</span><span class="pun">{</span><span class="pln">
				string msg </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"You exceed the maximum speed! (Current = {0}, Max = {1})"</span><span class="pun">,</span><span class="pln">
											</span><span class="typ">CurrentSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">);</span><span class="pln">

				speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سيعمل هذا الصنف بشكل ممتاز، حيث من الممكن أن نُسند نائبًا للحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> من خارج الصنف <span style="font-family:courier new,courier,monospace;">Car</span> بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_15"><span class="typ">Car</span><span class="pln"> car </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">.</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">);</span></pre>

<p>
	المشكلة هنا أنّ الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> أصبح مكشوفًا تمامًا، حتى أنّه من الممكن استدعاء التابع الذي يغلّفه هذا النائب، من خارج الصنف <span style="font-family:courier new,courier,monospace;">Car</span>، وهذا يعدّ خرقًا لمبدأ مهم في البرمجة كائنيّة التوجّه ألا وهو التغليف Encapsulation. لا ينبغي أن يتمكّن أيّ أحدٍ من استدعاء التابع الذي يغلّفه الحقل السابق إلّا من داخل الصنف <span style="font-family:courier new,courier,monospace;">Car</span> حصرًا، لأنّ النائب المُسند لذلك الحقل يُعبّر عن حالة داخليّة ضمن الصنف <span style="font-family:courier new,courier,monospace;">Car</span> وهي تجاوز السرعة القصوى.
</p>

<p>
	توفّر لنا سي شارب حلًا عمليًّا وأنيقًا لهذه المشكلة تتمثّل في استخدام الأحداث. بالنسبة للصنف <span style="font-family:courier new,courier,monospace;">Car</span> السابق (بعد التعديل) يكفيك أن تَسِم الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">event</span> ليتحوّل إلى حدث لا يمكن استدعاؤه إلّا من داخل الصنف <span style="font-family:courier new,courier,monospace;">Car</span>. لكن سيكون هناك اختلاف صغير في طريقة إسناد النوّاب إلى هذا الحقل. يحتوي البرنامج <span style="font-family:courier new,courier,monospace;">Lesson14_01</span> على النسخة الجديدة للصنف Car مع تعديل بسيط ضمن التابع <span style="font-family:courier new,courier,monospace;">Main</span> لندعم استخدام الأحداث:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_17"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson14_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> event </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> speedNotificationHandler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> maxSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> currentSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> maxSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Accelerate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> delta</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	
</span><span class="lit">30</span><span class="pln">	            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	                </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	                    string msg </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"You exceed the maximum speed! (Current = {0}, Max = {1})"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	                        </span><span class="typ">CurrentSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">);</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	                    speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">41</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">42</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	            </span><span class="typ">Car</span><span class="pln"> car </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="lit">48</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	            car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">+=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">.</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">);</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	
</span><span class="lit">51</span><span class="pln">	            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">53</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Increasing speed by 30"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">54</span><span class="pln">	                car</span><span class="pun">.</span><span class="typ">Accelerate</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="lit">55</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">57</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">)</span><span class="pln">
</span><span class="lit">59</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">60</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">61</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">62</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">63</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	انظر كيف وضعنا الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">event</span> بعد كلمة <span style="font-family:courier new,courier,monospace;">public</span> في التصريح عن الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> في السطر 9. كما أرجو أن تلاحظ أيضًا التعديل الذي طرأ في السطر 49 على كيفيّة إسناد النائب الجديد إلى الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_19"><span class="pln">car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">+=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">.</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">);</span></pre>

<p>
	لاحظ كيف استخدمنا العامل (=+) بدلًا من العامل (=). في الحقيقة سيؤدي استخدام العامل (=) في هذه الحالة إلى حدوث خطأ أثناء ترجمة البرنامج.
</p>

<p>
	ولكن ماهي الفائدة من العامل (=+)؟ لهذا العمل فائدة كبيرة، فمن خلاله يمكن تسجيل عدّة نوّاب (وبالتالي عدّة توابع) ضمن الحدث <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> بنفس الوقت. مما يعني أنّ عبارة مثل تلك الموجودة في السطر 37:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_21"><span class="pln">speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span></pre>

<p>
	ستؤدّي إلى استدعاء أي نائب (وبالتالي أي تابع) مسجّل في الحدث <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> بشكل متسلسل يراعي الترتيب الذي سُجّلت ضمنه هذه النوّاب ضمن الحدث <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> باستخدام العامل =+. نسمّي التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span> اصطلاحًا بمعالج الحدث.
</p>

<p>
	الآن سنذهب أبعد من ذلك ونجري تغييرًا على عبارة التسجيل في الحدث في السطر 49 لتصبح على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_23"><span class="pln">car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">+=</span><span class="pln"> </span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">;</span></pre>

<p>
	لاحظ هنا أنّنا قد أزلنا التعبير الذي ينشئ كائن من النائب <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span>، ووضعنا بدلًا من ذلك اسم التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span> مباشرةً بعد العامل (=+). في الحقيقة إنّ مترجم سي شارب ذكيّ كفاية ليعرف أنّه ينبغي عليه أن يُنشئ كائنًا جديدًا من النائب <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span> بشكل تلقائيّ يغلّف التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span>. إذا نفّذت البرنامج ستحصل على نفس الخرج المتوقّع.
</p>

<p>
	<strong>ملاحظة</strong>: تتمتّع النوّاب أيضًا بميّزة التسجيل المتعدّد باستخدام العامل =+. ولكن هذه الميّزة تُستخدم مع الأحداث بشكل أكبر.
</p>

<h2>
	التوابع مجهولة الاسم Anonymous Methods
</h2>

<p>
	التوابع مجهولة الاسم هي من المزايا التي تسمح باختصار الشيفرة إلى حدٍّ كبير. فمن اسمها، يظهر أنَّه لا يوجد لمثل هذه التوابع اسم، وإنّما جسم فقط يحوي الشيفرة المطلوب تنفيذها. كمثال بسيط على التوابع مجهولة الاسم سنجري تعديلًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson14_01</span> السابق ليستخدم تابعًا عديم الاسم بدلًا من التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span>. سيكون هذا التعديل في السطر 49 ليصبح على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_25"><span class="pln">car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">+=</span><span class="pln"> delegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	لاحظ هنا أنّنا قد استخدمنا الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">delegate</span> بعد العامل =+ بعد ذلك الوسائط التي يقبلها هذا التابع ثم جسم التابع المحاط بالحاضنة. الشيء الوحيد الناقص هو اسم التابع. من الواضح أنّ تعريف هذا التابع عديم الاسم يجب أن يتطابق مع تعريف النائب الذي صُرّح الحدث <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> بناءً عليه. الآن يمكن التخلّص من التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span>. انظر إلى البرنامج <span style="font-family:courier new,courier,monospace;">Lesson14_02</span> الكامل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_27"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson14_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">8</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> event </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> speedNotificationHandler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> maxSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> currentSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> maxSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Accelerate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> delta</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	                </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	                    string msg </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"You exceed the maximum speed! (Current = {0}, Max = {1})"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	                        </span><span class="typ">CurrentSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">);</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	
</span><span class="lit">37</span><span class="pln">	                    speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">41</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">42</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	            </span><span class="typ">Car</span><span class="pln"> car </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="lit">48</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	            car</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">+=</span><span class="pln"> delegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">)</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">51</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	            </span><span class="pun">};</span><span class="pln">
</span><span class="lit">53</span><span class="pln">	
</span><span class="lit">54</span><span class="pln">	            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">55</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Increasing speed by 30"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">57</span><span class="pln">	                car</span><span class="pun">.</span><span class="typ">Accelerate</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">59</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">60</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">61</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: يوجد نائب جاهز موجود ضمن مكتبة FCL اسمه <span style="font-family:courier new,courier,monospace;">EventHandler</span> وظيفته توفير الدعم للأحداث الجديدة التي نعرّفها، بحيث لا نضطّر إلى التصريح عن نائب جديد في كلّ مرّة نريد فيها التصريح عن حدث جديد. يغلّف النائب <span style="font-family:courier new,courier,monospace;">EventHandler</span> أي تابع يتطلّب وسيطين الأوّل من النوع <span style="font-family:courier new,courier,monospace;">object</span> والذي يمثّل الكائن الذي أصدر الحدث، والثاني من النوع <span style="font-family:courier new,courier,monospace;">EventArgs</span> وهو كائن يحتوي على بعض المعلومات الإضافيّة عن الحدث.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	ليكن لدينا الصنف التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3664_29"><span class="kwd">class</span><span class="pln"> </span><span class="typ">Counter</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentValue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Increase</span><span class="pun">()</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		currentValue</span><span class="pun">++;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Decrease</span><span class="pun">()</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		currentValue</span><span class="pun">--;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أجرِ تعديلًا على هذا الصنف بحيث تصرّح عن الحدث <span style="font-family:courier new,courier,monospace;">Notification</span> الذي يُفعَّل عندما تصبح قيمة الحقل <span style="font-family:courier new,courier,monospace;">currentValue</span> من مضاعفات العدد 5 فقط.
</p>

<p>
	(<strong>تلميح</strong>: الأعداد السالبة ليست من مضاعفات 5. والعدد 5 هو مضاعف لنفسه).
</p>

<h3>
	تمرين 2
</h3>

<p>
	أجرِ تعديلًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson14_02</span> السابق لتستغني عن النائب <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span> تمامًا، بحيث تستخدم النائب الجاهز <span style="font-family:courier new,courier,monospace;">EventHandler</span> عوضًا عنه.
</p>

<p>
	(<strong>تلميح</strong>: سيتطلّب الأمر تعديل الوسائط الممرّرة إلى معالج الحدث لتتطابق مع الوسائط التي يحتاجها النائب <span style="font-family:courier new,courier,monospace;">EventHandler</span>)
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على الأحداث Events. تلك التقنيّة المهمّة التي تعتمد عليها <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a> desktop applications بشكل أساسيّ، فضلًا عن باقي أنواع التطبيقات مثل تطبيقات الويب، وتطبيقات الأجهزة المحمولة، وأي نوع من أنواع التطبيقات التي تتطلّب التفاعل الداخلي مع نظام التشغيل أو الخارجيّ مع المستخدم.
</p>
]]></description><guid isPermaLink="false">376</guid><pubDate>Thu, 08 Sep 2016 08:46:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x646;&#x648;&#x627;&#x628; (Delegates) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%86%D9%88%D8%A7%D8%A8-delegates-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r366/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_07/learn-csharp-delegates.png.c34799e433a6427b1b80400f7d96d32b.png" /></p>
<p>
	يُعتبر مفهوم النوّاب من المفاهيم الأساسيّة في سي شارب، وستستخدمه بشكل أو بآخر في أيّ برنامج حقيقي مكتوب بهذه اللغة. سنتحدّث في هذا الدرس عن هذا الموضوع المهمّ، وسنتعرّض في درس لاحق إلى مفهوم مهم آخر مرتبط به، ألا وهو مفهوم الأحداث Events.
</p>

<p style="text-align: center;">
	<img alt="learn-csharp-delegates.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18472" data-unique="zhy2s2yxt" src="https://academy.hsoub.com/uploads/monthly_2016_07/learn-csharp-delegates.png.1083b247a214118fb737c7bae671f333.png">
</p>

<p>
	في جميع البرامج التي صادفناها في هذه السلسلة كنّا نعمل على استدعاء توابع وخصائص من كائنات ننشئها من الأصناف المختلفة. في البرمجة العمليّة، يحتاج الكائن في الكثير من الأحيان إلى وسيلة يفعل فيها العكس. أي يحتاج الكائن إلى أسلوب يستطيع من خلاله استدعاء تابع ما لا ينتمي إليه وذلك من تابع أو خاصيّة موجودة داخل الكائن. تُسمّى هذه الظاهرة بالردود callbacks، وهي تقنيّة مهمّة جدًّا مستخدمة حتى في أنظمة التشغيل على نحو واسع.
</p>

<p>
	ربما قد تتساءل لماذا يحتاج الكائن لأن يستخدم مثل هذه التقنيّة (الردود). الجواب على ذلك بسيط، فقد يحتاج الكائن إلى التعبير عن حالته الداخليّة، أو عن أمر طارئ قد حدث له، ففي <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a> desktop applications مثلًا، يُعتبر أيّ زر موجود على نافذة البرنامج عبارة عن كائن. فعندما ينقر مستخدم البرنامج هذا الزر، فمن الطبيعي أن يبلّغنا الزر عن "حدث" النقر عليه. فكيف يفعل ذلك؟ يفعل ذلك ببساطة عن الطريق الردود التي نسمّيها في سي شارب بالنوّاب (ستعرف سبب التسمية بعد قليل).
</p>

<h2>
	التصريح عن نائب
</h2>

<p>
	يمكنك اعتبار النائب كصنف مستقل بحد ذاته، مع أنّ التصريح عنه يختلف عن التصريح عن الأصناف. تُصرّح الشيفرة التالية عن النائب <span style="font-family:courier new,courier,monospace;">SumDelegate</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_7"><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">SumDelegate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">);</span></pre>

<p>
	النوّاب -وعلى سبيل التبسيط- عبارة عن مغلّفات للتوابع. فالنائب <span style="font-family:courier new,courier,monospace;">SumDelegate</span> السابق يمكنه أن يغلّف أو يشير إلى أيّ تابع آخر بشرط أن يقبل وسيطين من نوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع قيمة من نوع <span style="font-family:courier new,courier,monospace;">int</span> أيضًا (لاحظ الشيفرة السابقة). فإذا أزلنا الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">delegate</span> من الشيفرة السابقة، سيبدو الأمر "كما لو أنّنا" نصرّح عن التابع <span style="font-family:courier new,courier,monospace;">SumDelegate</span> الذي يقبل وسيطين من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span>، وهو بمحدّد وصول public.
</p>

<p>
	لفهم الموضوع بشكل أفضل دعنا نستخدم النائب السابق في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson13_01</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_17"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson13_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">SumDelegate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">);</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	            </span><span class="typ">SumDelegate</span><span class="pln"> handler </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">SumDelegate</span><span class="pun">(</span><span class="typ">Sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">12</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> handler</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Sum</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">)</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لاحظ أولًا أنّنا وضعنا التصريح عن النائب <span style="font-family:courier new,courier,monospace;">SumDelegate</span> في السطر 5 خارج أي صنف، مع أنّه كان ممكنًا أن نصرّح عنه ضمن الصنف <span style="font-family:courier new,courier,monospace;">Program</span>. صرّحنا في الأسطر من 18 إلى 21 عن تابع ساكن <span style="font-family:courier new,courier,monospace;">static</span> ضمن الصنف <span style="font-family:courier new,courier,monospace;">Program</span> اسمه <span style="font-family:courier new,courier,monospace;">Sum</span> يقبل وسيطين من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span> أيضًا. العمليّة التي يقوم بها هذا التابع بسيطة، فهو يجمع قيمتي الوسيطين الممرّرين إليه ويُرجع الناتج بسطرٍ واحد.
</p>

<p>
	انظر الآن إلى السطر 11 ضمن التابع <span style="font-family:courier new,courier,monospace;">Main</span>. ستلاحظ أنّنا نصرّح عن المتغيّر <span style="font-family:courier new,courier,monospace;">handler</span> من النوع (النائب) <span style="font-family:courier new,courier,monospace;">SumDelegate</span>، ونُسند إليه كائنًا من نفس النوع باستخدام التعبير<span style="font-family:courier new,courier,monospace;"> (new SumDelegate(Sum</span> حيث مرّرنا إلى بانيته الوسيط <span style="font-family:courier new,courier,monospace;">Sum</span>. ولكن أليس الوسيط <span style="font-family:courier new,courier,monospace;">Sum</span> هو نفسه اسم التابع الساكن المصرّح عنه ضمن الصنف <span style="font-family:courier new,courier,monospace;">Main</span>!
</p>

<p>
	في الواقع تتطلّب بانية النائب <span style="font-family:courier new,courier,monospace;">SumDelegate</span> (على اعتباره صنفًا) وسيطًا عبارة عن تابع يقبل وسيطين من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويرُجع قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span>، أي بشكل مماثل لتصريح النائب <span style="font-family:courier new,courier,monospace;">SumDelegate</span> في السطر 5.
</p>

<p>
	انظر إلى العبارة البرمجيّة التالية في السطر 13:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_15"><span class="kwd">int</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> handler</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span></pre>

<p>
	أصبح بإمكاننا الآن أن نستدعي النائب <span style="font-family:courier new,courier,monospace;">handler</span> بوسيطين من النوع <span style="font-family:courier new,courier,monospace;">int</span>، وسيُرجع بالتأكيد قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span> أيضًا. إذًا أصبح <span style="font-family:courier new,courier,monospace;">handler</span> "ينوب" عن التابع <span style="font-family:courier new,courier,monospace;">Sum</span> في عمليّة الاستدعاء، رغم أنّه في حقيقة الأمر سيستدعي التابع <span style="font-family:courier new,courier,monospace;">Sum</span> ولكن من وراء الكواليس!
</p>

<p>
	يمكن باستخدام هذه التقنيّة وبإجراء بعض التعديلات الطفيفة (كما سنرى في الأحداث Events)، أن ينوب <span style="font-family:courier new,courier,monospace;">handler</span> عن أكثر من تابع بنفس الوقت بشرط أن يقبل كلّ منها وسيطين من نوع <span style="font-family:courier new,courier,monospace;">int</span> ويُرجع كلّ منها قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span>.
</p>

<h2>
	استخدام النواب بشكل عملي
</h2>

<p>
	لنتناول برنامجًا يوضّح استخدام النوّاب بشكل عمليّ أكثر. انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson13_02</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_13"><span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson13_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> delegate </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">8</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">private</span><span class="pln"> </span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> speedNotificationHandler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">RegisterWithSpeedNotification</span><span class="pun">(</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pln"> handler</span><span class="pun">)</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">=</span><span class="pln"> handler</span><span class="pun">;</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> maxSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> currentSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> currentSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="typ">MaxSpeed</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> maxSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">30</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Accelerate</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> delta</span><span class="pun">)</span><span class="pln">
</span><span class="lit">32</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	            </span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> delta</span><span class="pun">;</span><span class="pln">
</span><span class="lit">34</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">CurrentSpeed</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">)</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	                </span><span class="kwd">if</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">speedNotificationHandler </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	                    string msg </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"You exceed the maximum speed! (Current = {0}, Max = {1})"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	                        </span><span class="typ">CurrentSpeed</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaxSpeed</span><span class="pun">);</span><span class="pln">
</span><span class="lit">41</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	                    speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">
</span><span class="lit">48</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">50</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">51</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	            </span><span class="typ">Car</span><span class="pln"> car </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">(</span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="lit">53</span><span class="pln">
</span><span class="lit">54</span><span class="pln">	            car</span><span class="pun">.</span><span class="typ">RegisterWithSpeedNotification</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">.</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">));</span><span class="pln">
</span><span class="lit">55</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	            </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">57</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Increasing speed by 30"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">59</span><span class="pln">	                car</span><span class="pun">.</span><span class="typ">Accelerate</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="lit">60</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">61</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">62</span><span class="pln">
</span><span class="lit">63</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">(</span><span class="pln">string message</span><span class="pun">)</span><span class="pln">
</span><span class="lit">64</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">65</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">message</span><span class="pun">);</span><span class="pln">
</span><span class="lit">66</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">67</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">68</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	نفّذ هذا البرنامج لتحصل في الخرج على ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3138_9"><span class="pln">Increasing speed by 30
Increasing speed by 30
Increasing speed by 30
Increasing speed by 30
You exceed the maximum speed! (Current = 120, Max = 100)

Increasing speed by 30
You exceed the maximum speed! (Current = 150, Max = 100)</span></pre>

<p>
	خذ نفسًا عميقًا، وجهّز كوبًا من الشاي (شرابي المفضّل) لندخل في تفاصيل البرنامج.
</p>

<p>
	ينقسم هذا البرنامج إلى صنفين: الصنف <span style="font-family:courier new,courier,monospace;">Car</span> (من السطر 5 حتى السطر 46) والصنف <span style="font-family:courier new,courier,monospace;">Program</span> (من السطر 48 حتى السطر 67).
</p>

<p>
	يمثّل الصنف <span style="font-family:courier new,courier,monospace;">Car</span> القالب العام لسيّارة، ويحتوي على خاصيّتين <span style="font-family:courier new,courier,monospace;">CurrentSpeed</span> و <span style="font-family:courier new,courier,monospace;">MaxSpeed</span> وتعبّران عن السرعة الحالية والسرعة القصوى على الترتيب. كما يحتوي على بانيتين، إحداهما عديمة الوسائط، والثانية ذات وسيطين من نوع <span style="font-family:courier new,courier,monospace;">int</span> لسهولة الإنشاء والإسناد للخصائص. يضم الصنف <span style="font-family:courier new,courier,monospace;">Car</span> أيضًا النائب <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span> (السطر 7). تذكّر أنّه من الممكن أن تكون النوّاب ضمن الأصناف. يمكن لهذا النائب أن يغلّف أي تابع يقبل وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">string</span> ولا يرجع أي قيمة (void). نعرّف أيضًا ضمن الصنف <span style="font-family:courier new,courier,monospace;">Car</span> الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> (السطر 9) من النوع <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span> وذو محدّد وصول <span style="font-family:courier new,courier,monospace;">private</span>، وأخيرًا يحتوي الصنف <span style="font-family:courier new,courier,monospace;">Car</span> على التابعين <span style="font-family:courier new,courier,monospace;">Accelerate</span> الذي يعبّر عن إكساب السيّارة المزيد من السرعة، وهو يتطلّب وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">int</span> ويمثّل مقدار الزيادة في السرعة. والتابع <span style="font-family:courier new,courier,monospace;">RegisterWithSpeedNotification</span> الذي يتطلّب وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span>. وظيفة هذا التابع هو استقبال وسيط من النوع (النائب) <span style="font-family:courier new,courier,monospace;">SpeedNotificatoinDelegate</span> وإسناده إلى الحقل الخاص <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span>. سيغلّف النائب الممرّر لهذا التابع تابعًا آخر يقبل وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">string</span> ولا يُرجع أي قيمة (void).
</p>

<p>
	يحتوي الصنف <span style="font-family:courier new,courier,monospace;">Program</span> على تابعين: الأوّل هو <span style="font-family:courier new,courier,monospace;">Main</span> (من السطر 50 حتى السطر 61) وهو غنيّ عن التعريف. والثاني هو <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span> (من السطر 63 حتى السطر 66) الذي يحتاج إلى وسيط نصي واحد، ولا يرجع شيء (void)، وهو يحتوي على عبارة برمجيّة وحيدة وظيفتها عرض قيمة الوسيط النصيّ <span style="font-family:courier new,courier,monospace;">msg</span> على الشّاشة.
</p>

<p>
	يبدأ البرنامج في التابع <span style="font-family:courier new,courier,monospace;">Main</span> بالتصريح عن المتغيّر car وإسناد كائن جديد إليه من النوع <span style="font-family:courier new,courier,monospace;">Car</span>، حيث نمرّر 100 كسرعة قصوى، والقيمة 0 كسرعة حاليّة إلى بانية الصنف <span style="font-family:courier new,courier,monospace;">Car</span>. بعد ذلك سيعمل البرنامج على إنشاء كائن نائب يغلّف التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span> من خلال التعبير:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_11"><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">.</span><span class="typ">SpeedNotificatoinDelegate</span><span class="pun">(</span><span class="typ">OnExceedMaxSpeedHandler</span><span class="pun">)</span></pre>

<p>
	سيمرَّر هذا الكائن الجديد إلى التابع <span style="font-family:courier new,courier,monospace;">RegisterWithSpeedNotification</span> كما هو واضح من السطر 54.
</p>

<p>
	يدخل البرنامج بعد ذلك في حلقة <span style="font-family:courier new,courier,monospace;">for</span> (الأسطر من 56 حتى 60) التي ستتكرّر 5 مرّات، وبعد أن يتم استدعاء التابع <span style="font-family:courier new,courier,monospace;">Accelerate</span> أربعة مرّات (السطر 59)، تصبح عندها السرعة الحالية تساوي 120 وهي أكبر من السرعة القصوى، لذلك يُستدعى التابع الذي يغلّفه النائب <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> (السطر 42) بالشكل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3138_19"><span class="pln">speedNotificationHandler</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span></pre>

<p>
	والذي هو في حالتنا التابع <span style="font-family:courier new,courier,monospace;">OnExceedMaxSpeedHandler</span> ليمرّر إليه رسالة نصيّة ضمن المتغيّر <span style="font-family:courier new,courier,monospace;">msg</span> توضّح بأنّه قد تمّ تجاوز السرعة القصوى المحدّدة. وستتكرّر نفس العمليّة من أجل الدورة الخامسة والأخيرة للحلقة for.
</p>

<p>
	لاحظ الاختبار الذي أجريناه في السطر 37 من التابع <span style="font-family:courier new,courier,monospace;">Accelerate</span>. يتأكّد هذا السطر من أنّ الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> ليس فارغًا (يحوي null). لأنّه إذا كان يحوي null فلا ينبغي تنفيذ عبارة الاستدعاء في السطر 42.
</p>

<p>
	أنصح بأن تستخدم تطبيق Visual Studio من أجل هذا البرنامج، حيث يمكن أن تستفيد من المنقّح Debugger الخاص به لتنفيذ البرنامج خطوة بخطوة (استخدم المفتاح F11 لتنفيذ البرنامج بشكل خُطَويّ) لفهم أفضل له.
</p>

<p>
	<strong>ملاحظة</strong>: أيّ حقل مصرّح عنه ضمن صنف ما ويكون من نوع مرجعيّ reference type تكون القيمة الافتراضيّة له هي null في حال لم نُسند إليه أي قيمة عند التصريح عنه. وتعني null أنّ هذا الحقل لا يحتوي على مرجع لأيّ كائن. ويسري نفس الأمر على المتغيّرات المحليّة التي نصرّح عنها ضمن التوابع والتي تكون أيضًا من أنواع مرجعيّة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكن لأي نائب أن يغلّف توابع عاديّة أو توابع ساكنة static.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	أجرِ تعديلًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson13_02</span> بحيث يستخدم البرنامج النائب <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> لإرسال تنبيه إلى التابع الذي يُغلّفه هذا النائب، في حال وصلت السرعة الحالية إلى منتصف السرعة القصوى أو تجاوزتها (التنبيه يجب أن يصدر لمرّة واحدة).
</p>

<p>
	(<strong>تلميح</strong>: ستحتاج إلى التصريح عن حقل خاص ضمن الصنف <span style="font-family:courier new,courier,monospace;">Car</span> من نوع <span style="font-family:courier new,courier,monospace;">bool</span> مثلًا لكي يعرف البرنامج أنّه قد أصدر التنبيه الخاص بالوصول إلى منتصف السرعة القصوى، لكيلا يعيد إصدار مثل هذا التنبيه مرّة أخرى).
</p>

<h3>
	تمرين 2
</h3>

<p>
	أجرِ تعديلًا آخرًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson13_02</span> بحيث تستغني فيه عن استخدام التابع <span style="font-family:courier new,courier,monospace;">RegisterWithSpeedNotification</span>. دون التغيير في أسلوب عمل البرنامج.
</p>

<p>
	(<strong>تلميح</strong>: ستحتاج إلى جعل الحقل <span style="font-family:courier new,courier,monospace;">speedNotificationHandler</span> ذو محدّد وصول <span style="font-family:courier new,courier,monospace;">public</span> بدلًا من <span style="font-family:courier new,courier,monospace;">private</span>، ثم تتعامل مع هذا الحقل مباشرةً من الصنف <span style="font-family:courier new,courier,monospace;">Main</span>).
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على مفهوم جديد لكنّه أساسيّ وهو النوّاب Delegates. حيث اكتشفنا كيف أنّ النوّاب هي وسائل لتحقيق مبدأ الردود callbacks المهم في عالم البرمجة، والمستخدم على نطاق واسع في أنظمة التشغيل في تبادل الرسائل بين الكائنات المختلفة. تعلّمنا كيف يُغلّف النائب تابعًا يوافق معايير معيّنة تكون محدّدة عند التصريح عن النائب. في الحقيقة تُعتبر النوّاب الركن الأساسيّ للأحداث Events، ذلك المفهوم المهم في البرمجة كائنيّة التوجّه، والذي سنتحدّث عنه في الدرس التالي.
</p>
]]></description><guid isPermaLink="false">366</guid><pubDate>Tue, 12 Jul 2016 10:02:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x646;&#x649; Structures &#x648;&#x627;&#x644;&#x645;&#x639;&#x62F;&#x648;&#x62F;&#x627;&#x62A; Enums &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A8%D9%86%D9%89-structures-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%AF%D9%88%D8%AF%D8%A7%D8%AA-enums-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r395/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_12/csharp-structures-enums.png.bcb1f8a6dc62c75528c1bcc360929af6.png" /></p>

<p>
	تشبه البنية structure الصنف class إلى حدٍّ كبير باستثناء أنّها تُعتبر نوع قيمة value type وليس نوعًا مرجعيًّا كما هو الحال بالنسبة للأصناف. أمّا بالنسبة للمعدودة enum فهي تقنيّة تسمح لنا بتعيين مجموعة من الثوابت الرقميّة التي يمكن تسميّتها، وينحصر دورها في تنظيم البرنامج وجعل الشيفرة أكثر قابليّة للفهم والتعديل.
</p>

<h2>
	البنى Structures
</h2>

<p>
	تستطيع اعتبار البنية على أنّها نسخة مخفّفة من الصنف class. يكمن الفرق الأساسي بينهما في أنّ البنية هي نوع قيمة كما ذكرنا، فعند إنشاء بنية سيتم حجز المكان المخصّص لها في المكدّس stack وليس في الكومة heap كما هو الحال مع الأنواع المرجعيّة reference types.
</p>

<p>
	ستُنشئ الشيفرة التالية بنية اسمها Student على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_7">
<span class="kwd">struct</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">public</span><span class="pln"> override string </span><span class="typ">ToString</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} ({2})"</span><span class="pun">,</span><span class="typ">FirstName</span><span class="pun">,</span><span class="typ">LastName</span><span class="pun">,</span><span class="typ">Mark</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ مدى الشبه بينها وبين الأصناف. الآن إذا أردنا استخدام هذه البنية في الشيفرة يمكننا ذلك من خلال العبارة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_9">
<span class="typ">Student</span><span class="pln"> student </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pun">();</span><span class="pln">
</span></pre>

<p>
	علينا أن نتذكّر دائمًا أنّ الكائن الذي يقوم العامل new بإنشائه سيكون في المكدّس stack.
</p>

<p>
	يمكننا أن نتابع ونستخدم المتغيّر student من نوع البنية Student كما كنّا نفعل من قبل مع متغيّرات الأصناف:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6859_7">
<span class="pln">student</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Maher"</span><span class="pun">;</span><span class="pln">
student</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Rajab"</span><span class="pun">;</span><span class="pln">
student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">student</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span></pre>

<p>
	بعد تنفيذ الشيفرة السابقة ستحصل على الخرج:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_14">
<span class="typ">Maher</span><span class="pln"> </span><span class="typ">Rajab</span><span class="pln"> </span><span class="pun">(</span><span class="lit">100</span><span class="pun">)</span><span class="pln">
</span></pre>

<p>
	توجد الكثير من البنى المهمّة والمفيدة. فمثلًا هناك البنية DateTime التي تسمح لنا بالتعامل مع الزمن والتاريخ، وهي بنية مهمّة للغاية. انظر إلى البرنامج Lesson17_01 الذي يوضّح بعض المزايا التي توفّرها.
</p>

<p>
	<br>
	 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_18">
<span class="lit">1</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Globalization</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">Lesson17_01</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            </span><span class="typ">DateTime</span><span class="pln"> myBirthDate </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="lit">1979</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">);</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	
</span><span class="lit">12</span><span class="pln">	            </span><span class="com">//display birth date in simple form:</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"dd/MM/yyyy"</span><span class="pun">));</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	
</span><span class="lit">15</span><span class="pln">	            </span><span class="com">//display birth date in more elegent way:</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"D"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">InvariantCulture</span><span class="pun">));</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	
</span><span class="lit">18</span><span class="pln">	            </span><span class="com">//add time info:</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            myBirthDate </span><span class="pun">=</span><span class="pln"> myBirthDate</span><span class="pun">.</span><span class="typ">AddHours</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            myBirthDate </span><span class="pun">=</span><span class="pln"> myBirthDate</span><span class="pun">.</span><span class="typ">AddMinutes</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	
</span><span class="lit">22</span><span class="pln">	            </span><span class="com">//display completed birth date info:</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"dddd, dd MMMM yyyy - hh:mm:ss tt"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">InvariantCulture</span><span class="pun">));</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	بعد تنفيذ البرنامج السابق ستحصل على الخرج التالي:
</p>

<p style="text-align: center;">
	<img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20069" data-unique="hoswcj66a" src="https://academy.hsoub.com/uploads/monthly_2016_12/fig01.png.dc1b3a24520b03241acdb0fe44b0c70e.png" style=""></p>

<p>
	أنشأنا في السطر 10 كائنًا جديدًا من البنية DateTime حيث مرّرنا ثلاثة وسائط للبانية هي على الترتيب من اليسار إلى اليمين: العام والشهر واليوم (الميلادي). في الحقيقة تمتلك بانية البنية DateTime اثنا عشرة شكلًا مختلفًا، نستطيع من خلال بعض هذه الأشكال ضبط الوقت أيضًا.
</p>

<p>
	يؤدّي الاستدعاء في السطر 13:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_20">
<span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"dd/MM/yyyy"</span><span class="pun">)</span><span class="pln">
</span></pre>

<p>
	إلى الحصول على تمثيل نصّي مختصر من التاريخ الذي مرّرناه إلى البانية قبل قليل. حيث ترمز dd إلى اليوم، و MM (حرف كبير) إلى الشهر، وyyyy إلى العام، ويمكنك بالتأكيد تغيير هذا الترتيب إذا أحببت (انظر إلى السطر الأوّل من الخرج في الشكل السابق).
</p>

<p>
	أمّا الاستدعاء في السطر 16:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_22">
<span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"D"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">InvariantCulture</span><span class="pun">)</span><span class="pln">
</span></pre>

<p>
	فيؤدّي إلى الحصول على نفس التاريخ ولكن بشكل أنيق. حيث سنحصل على القيم الكتابيّة للتاريخ (انظر السطر الثاني من الخرج في الشكل السابق). ولكن لاحظ أنّنا نمرّر إلى التابع ToString وسيطين: الأوّل هو النص التنسيقي "D" الذي يُخبر التابع ToString أنّنا نريد التنسيق على شكل تاريخ ولكن بصورة تفصيليّة أنيقة، أمّا الوسيط الثاني CultureInfo.InvariantCulture فهو يُرجع كائن من النوع CultureInfo. الهدف منه هو اعتماد الإعدادات الإقليميّة العالميّة في تنسيق التاريخ. وسبب ذلك أنّ كل بلد أو ثقافة culture لها أسلوب معيّن في تنسيق التاريخ (وكذلك الأمر بالنسبة للأرقام والعملات). لقد اخترت التنسيق العالميّ InvariantCulture لأنّني لا أريد من البرنامج استخدام الإعدادات الإقليميّة الخاصّة بنظام التشغيل في حاسوبي الشخصي الذي يعمل عليه البرنامج، لأنّ الخرج سيظهر مشوّهًا نتيجة لذلك. يكمن السبب في أنّ نافذة موجّه الأوامر console window لا تدعم اللغة العربية بشكل افتراضيّ، لذلك آثرت استخدام الإعدادات العالميّة (تشبه إلى حدٍّ كبير الإعدادات الخاصّة بالولايات المتحدّة).
</p>

<p>
	أخيرًا الاستدعاء في السطر 23:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_26">
<span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">myBirthDate</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">(</span><span class="str">"dddd, dd MMMM yyyy - hh:mm:ss tt"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">InvariantCulture</span><span class="pun">));</span></pre>

<p>
	سيؤدّي هذا الاستدعاء إلى الحصول على النص الذي يظهر في السطر الثالث من الخرج، وهو مزيج بين التاريخ والوقت. لاحظ أنّنا قد أسبقنا هذا الاستدعاء باستدعاءين في السطرين 19 و20 للتابعين AddHours وAddMinutes على الترتيب. أتصوّر أنّ وظيفتهما واضحة، وهي إضافة قيمة ساعات ودقائق محدّدة إلى المتغيّر myBirthDate، مع الانتباه إلى أنّ كل منهما ستُرجع كائن DateTime جديد يمثّل التعديل الذي حصل. أي أنّ المتغيّر myBirthDate الأصلي لن يُمس في كلتا الحالتين. إلّا أنّنا أعدنا إسناد القيم المُعادة إلى المتغيّر myBirthDate لتجنّب إنشاء متغيّرات جديدة كما هو واضح من السطرين 19 و20. بقي أن أخبرك ما يلي:
</p>

<ul>
<li>
		ترمز dddd إلى اليوم ولكن بصيغة كتابيّة.
	</li>
	<li>
		ترمز dd إلى اليوم ولكن بصيغة رقميّة.
	</li>
	<li>
		ترمز MMMM إلى الشهر ولكن بصيغة كتابيّة.
	</li>
	<li>
		ترمز yyyy إلى العام بصيغة رقميّة.
	</li>
	<li>
		ترمز hh إلى الساعات.
	</li>
	<li>
		ترمز mm (أحرف صغيرة) إلى الدقائق.
	</li>
	<li>
		ترمز ss إلى الثواني.
	</li>
	<li>
		ترمز tt إلى AM أو PM.
	</li>
</ul>
<p>
	<strong>ملاحظة</strong>
</p>

<p>
	هناك العديد من التوابع الأخرى التي لم نتناولها بالنسبة للبنية DateTime. كما أنّ هناك بنية أخرى اسمها TimeSpan متعلّقة بالبنية DateTime ويمكن من خلالها تمثيل فترة زمنيّة بدلًا من تاريخ محدّد.
</p>

<p>
	<strong>ملاحظة</strong>
</p>

<p>
	توجد خاصيّة ضمن البنية DateTime مفيدة كثيرًا وهي الخاصيّة Now. تُرجع هذه الخاصيّة التوقيت الحالي الذي يمثّل التاريخ والوقت الحاليين من ساعة الحاسوب. طريقة استخدامها بسيطة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_29">
<span class="typ">DateTime</span><span class="pln"> current </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">Now</span><span class="pun">;</span><span class="pln">
</span></pre>

<h2>
	المعدودات Enums
</h2>

<p>
	المعدودة هي نوع قيمة value type خاص يسمح لنا بتعيين مجموعة من الثوابت الرقميّة ذات تسميّة. انظر مثلًا إلى تصريح المعدودة BorderSide التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_31">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">enum</span><span class="pln"> </span><span class="typ">BorderSide</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Left</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Right</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Top</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bottom</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span></pre>

<p>
	يمكن لهذا التصريح أن يوضع ضمن صنف ما، أو خارج أيّ صنف. عندها من الممكن استخدام هذه المعدودة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_33">
<span class="typ">BorderSide</span><span class="pln"> topSide </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BorderSide</span><span class="pun">.</span><span class="typ">Top</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	في الحقيقة إنّ لكلّ ثابت من ثوابت المعدودة (مثل Left أو Right أو غيرها) قيمة رقميّة ضمنيّة. تأخذ هذه الثوابت القيم الرقميّة الافتراضيّة 0، 1، 2، ... الخ بنفس الترتيب الذي تكون فيه هذه الثوابت ضمن تصريح المعدودة. فمثلًا في المعدودة BorderSide السابقة، يأخذ الثابت Left القيمة 0، والثابت Rigth القيمة 1، وهكذا. كما ويمكننا أيضًا أن نسند لثوابت المعدودة قيمًا رقميّة مباشرةً أثناء التصريح عنها. انظر إلى المعدودة BorderSide بشكلها المعدّل:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_35">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">enum</span><span class="pln"> </span><span class="typ">BorderSide</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Left</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Right</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Top</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bottom</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span></pre>

<p>
	أي ليس من الضروري أن تكون القيم الرقميّة متسلسلة أو تبدأ من الصفر. المهم فقط أن تكون صحيحة (بدون فاصلة عشريّة).
</p>

<p>
	يمكن الحصول على القيمة الرقميّة المُسندة إلى أيّ ثابت ضمن المعدودة بالشكل البسيط التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_37">
<span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pun">)</span><span class="typ">BorderSide</span><span class="pun">.</span><span class="typ">Left</span><span class="pun">;</span><span class="pln">
</span></pre>

<p>
	بعد تنفيذ العبارة السابقة ستصبح قيمة المتغيّر i تساوي 1.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	عرّف متغيّرين من البنية DateTime، سمّ الأوّل first وأسند إليه التاريخ 01/01/2016، وسمّ الثاني second وأسند إليه التاريخ 13/05/2016. وبعد ذلك نفّذ العبارة التالية وحاول تفسير الخرج:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_40">
<span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">second </span><span class="pun">-</span><span class="pln"> first</span><span class="pun">);</span><span class="pln">
</span></pre>

<h2>
	تمرين 2
</h2>

<p>
	أنشئ برنامجًا يستخدم معدودةً اسمها LevelEnum تحتوي على الثوابت: Weak، Middle، Good، VeryGood. أضف هذه المعدودة إلى الصنف Student التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3195_44">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">

</span><span class="pun">{</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

	</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	ثمّ أضف لنفس الصنف السابق الخاصيّة Level من نوع المعدودة LevelEnum، حيث تُعبّر هذه الخاصيّة عن مستوى الطالب Student.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على البنى Structures والمعدودات Enums وكيفيّة استخدامهما. ستصادف في برامجك المستقبليّة هاتين التقنيّتين بشكل متكرّر. فإمّا أن تنشئهما بنفسك أو أن تفرض عليك أصناف دوت نت أو غيرها استخدامهما. تُعتبر البنى خفيفة، حيث أنّها سريعة في الإنشاء والمعالجة أكثر من الأصناف، كونها تتوضّح في مكدّس البرنامج كما أسلفنا. وتُعتبر المعدودات أداةً رائعة لتنظيم برامجك في حال كانت تتطلّب تعريف ثوابت عدديّة ضمن مجموعات منطقيّة.
</p>
]]></description><guid isPermaLink="false">395</guid><pubDate>Sun, 03 Jul 2016 23:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r358/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-read-write-text-files.png.f916c5e25bded87cae9a68bec6f1b235.png" /></p>

<p>
	يمكن القراءة والكتابة من وإلى الملفات النصيّة في سي شارب بعدّة طرق. سنتناول أسلوبًا بسيطًا وذلك من خلال الصنفين <span style="font-family:courier new,courier,monospace;">StreamWriter</span> و <span style="font-family:courier new,courier,monospace;">StreamReader</span>.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18151" data-unique="6j5ef5nya" src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-read-write-text-files.png.965c3dd14233dd1bd8d4f5c89b938cd7.png" alt="learn-csharp-read-write-text-files.png"></p>

<p>
	يسمح الصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span> بالكتابة فقط، أمّا الصنف <span style="font-family:courier new,courier,monospace;">StreamReader</span> فهو يسمح بالقراءة فقط. كما يمكن استخدام كلا الصنفين في نفس البرنامج. وكلّ منهما موجود ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.IO</span>.
</p>

<p>
	يرث الصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span> من الصنف <span style="font-family:courier new,courier,monospace;">TextWriter</span> في حين يرث الصنف <span style="font-family:courier new,courier,monospace;">StreamReader</span> من الصنف <span style="font-family:courier new,courier,monospace;">TextReader</span>.
</p>

<h2>
	الكتابة إلى ملف نصي
</h2>

<p>
	سنعمل في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_01</span> على إنشاء الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> وكتابة بعض الأسطر ضمنه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1502_7">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson12_01</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            string</span><span class="pun">[]</span><span class="pln"> lines </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"First Line"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second Line"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third Line"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	            </span><span class="typ">StreamWriter</span><span class="pln"> fileWriter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamWriter</span><span class="pun">(</span><span class="str">"data.txt"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	            foreach </span><span class="pun">(</span><span class="pln">string line in lines</span><span class="pun">)</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                fileWriter</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">line</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            fileWriter</span><span class="pun">.</span><span class="typ">Close</span><span class="pun">();</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	صرّحنا في السطر 10 عن المصفوفة <span style="font-family:courier new,courier,monospace;">lines</span> التي عناصرها نصوص، لاحظ أنّنا استخدمنا الطريقة المختصرة لإنشاء كائن مصفوفة وإسناد العناصر الموجودة ضمن الحاضنة {} إلى عناصره مباشرةً.
</p>

<p>
	نصرّح في السطر 12 عن المتغيّر <span style="font-family:courier new,courier,monospace;">fileWriter</span> حيث نسند إليه كائن من الصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span>. عند إنشاء هذا الكائن، مرّرنا اسم الملف "<span style="font-family:courier new,courier,monospace;">data.txt</span>" إلى بانية الصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span>. في الحقيقة تخضع هذه البانية إلى زيادة التحميل overloading، حيث تمتلك ثمانية أشكال مختلفة اخترنا أبسطها، وهو مسار واسم الملف المراد إنشاؤه. وبما أنّنا مرّرنا الاسم فقط دون المسار، فسيتم إنشاء هذا الملف في نفس المجلّد الموجود ضمنه الملف التنفيذي للبرنامج.
</p>

<p>
	بعد ذلك نستخدم التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> من المتغيّر <span style="font-family:courier new,courier,monospace;">fileWriter</span> لكتابة عناصر المصفوفة <span style="font-family:courier new,courier,monospace;">lines</span> على أسطر منفصلة ضمن الملف <span style="font-family:courier new,courier,monospace;">data.txt</span>. العبارة البرمجيّة في السطر 19 ضرورية لإغلاق الملف باستدعاء التابع <span style="font-family:courier new,courier,monospace;">Close</span> وتحرير المصدر الذي يحجزه في نظام التشغيل. جرّب تنفيذ البرنامج، لن تحصل على شيء على الشاشة، ولكن إذا فتحت الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> (ستجده غالبًا ضمن bin\debug ضمن مجلّد المشروع) ستجد الأسطر الثلاثة موجودةً ضمنه.
</p>

<p>
	<strong>ملاحظة</strong>: يوجد شكل آخر لبانية الصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span> يقبل بالإضافة إلى اسم الملف ومساره قيمة منطقيّة (من نوع bool) تُدعى <span style="font-family:courier new,courier,monospace;">append</span>. إذا مرّرت <span style="font-family:courier new,courier,monospace;">true</span> مكانها فسيعمل البرنامج إلى الإضافة إلى محتويات الملف <span style="font-family:courier new,courier,monospace;">data.txt</span>، أمّا إذا مرّرت <span style="font-family:courier new,courier,monospace;">false</span> فسيعمل على الكتابة عليه. أمّا إذا أهملت هذا الشكل تمامًا كما هو الحال في مثالنا فسيعمل البرنامج على الكتابة على الملف، أي استبدال محتوياته، في كلّ مرّة ننفّذ فيها البرنامج.
</p>

<p>
	في الحقيقة ليس هذا هو الاستخدام الأمثل للصنف <span style="font-family:courier new,courier,monospace;">StreamWriter</span> والسبب في ذلك أنّ مصادر نظام التشغيل محدودة، حيث يؤدّي التعامل مع الملفات إلى حجز بعض من هذه المصادر، لذلك ينبغي تحرير هذه المصادر فورًا عندما تنتفي الحاجة إليها. قد يبدو أنّنا قد فعلنا ذلك باستخدام التابع Close وهذا صحيح تمامًا، ولكن ليس بالسرعة القصوى الممكنة! هناك أسلوب آخر يسمح بتحرير المصادر بشكل أكثر فعاليّة وسرعة باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">using</span>. سأعدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_01</span> ليستخدم هذا الأسلوب الجديد. انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_02</span> بعد التعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1502_9">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson12_02</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            string</span><span class="pun">[]</span><span class="pln"> lines </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"First Line"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second Line"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third Line"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	            using </span><span class="pun">(</span><span class="typ">StreamWriter</span><span class="pln"> fileWriter </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamWriter</span><span class="pun">(</span><span class="str">"data.txt"</span><span class="pun">))</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	                foreach </span><span class="pun">(</span><span class="pln">string line in lines</span><span class="pun">)</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                    fileWriter</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">line</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لاحظ السطر 12 كيف وضعنا عبارة التصريح عن المتغيّر <span style="font-family:courier new,courier,monospace;">fileWriter</span> والإسناد إليه ضمن عبارة <span style="font-family:courier new,courier,monospace;">using</span>. في الواقع لن يكون المتغيّر <span style="font-family:courier new,courier,monospace;">fileWriter</span> مرئيًّا خارج حاضنة <span style="font-family:courier new,courier,monospace;">using</span> (من السطر 13 حتى السطر 18)، وبمجرّد وصول تنفيذ البرنامج إلى السطر 19 سيتم إغلاق الملف فورًا وتحرير المصدر الذي يحجزه. يظهر من البرنامج السابق أنّنا لم نعد نحتاج إلى استخدام التابع <span style="font-family:courier new,courier,monospace;">Close</span>.
</p>

<h2>
	القراءة من ملف نصي
</h2>

<p>
	سنستخدم الصنف <span style="font-family:courier new,courier,monospace;">StreamReader</span> لهذا الغرض. سيعمل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_03</span> على قراءة محتويات الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> السابق وعرضها على الشاشة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1502_11">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="pln">IO</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson12_03</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            using </span><span class="pun">(</span><span class="typ">StreamReader</span><span class="pln"> fileReader </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StreamReader</span><span class="pun">(</span><span class="str">"data.txt"</span><span class="pun">))</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	                </span><span class="kwd">while</span><span class="pun">(!</span><span class="pln">fileReader</span><span class="pun">.</span><span class="typ">EndOfStream</span><span class="pun">)</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	                    string line </span><span class="pun">=</span><span class="pln"> fileReader</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">line</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	تخضع بانية الصنف <span style="font-family:courier new,courier,monospace;">StringReader</span> أيضًا لزيادة التحميل، حيث تمتلك 11 شكلًا مختلفًا تسمح للمبرمج بالتحكّم الكامل بكيفيّة القراءة من الملف. أبسط هذه الأشكال هو الشكل الذي استخدمناه في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_03</span> حيث سنمرّر لهذه البانية اسم الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> الذي أنشأناه في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson12_02</span> السابق. استخدمنا في هذا البرنامج أيضًا العبارة <span style="font-family:courier new,courier,monospace;">using</span> (من السطر 10 حتى السطر 17) لتحرير المصدر الذي يحجزه الملف عند الانتهاء من القراءة. ننشئ كائن من الصنف <span style="font-family:courier new,courier,monospace;">StreamReader</span> ونسنده إلى المتغيّر <span style="font-family:courier new,courier,monospace;">fileReader</span> ضمن عبارة <span style="font-family:courier new,courier,monospace;">using</span> في السطر 10. ثمّ نستخدم حلقة <span style="font-family:courier new,courier,monospace;">while</span> لقراءة محتويات الملف، وذلك لأنّنا من الناحية النظريّة لا نعلم بالتحديد كم سطرًا يحوي الملف. لاحظ شرط استمرار حلقة <span style="font-family:courier new,courier,monospace;">while</span> حيث تُرجع الخاصيّة <span style="font-family:courier new,courier,monospace;">EndOfStream</span> للمتغيّر <span style="font-family:courier new,courier,monospace;">fileReader</span> القيمة <span style="font-family:courier new,courier,monospace;">true</span> إذا وصلنا إلى نهاية الملف أثناء عمليّة القراءة، وإلّا فإنّها تُرجع <span style="font-family:courier new,courier,monospace;">false</span>. إذًا، في حال لم نصل بعد إلى نهاية الملف ستُرجع الخاصيّة القيمة <span style="font-family:courier new,courier,monospace;">EndOfStream</span> القيمة <span style="font-family:courier new,courier,monospace;">false</span> وبسبب وجود عامل النفي المنطقي (!) قبل هذه الخاصيّة مباشرةً، ستكون القيمة النهائيّة لهذا التعبير هو <span style="font-family:courier new,courier,monospace;">true</span> مما يسمح لحلقة <span style="font-family:courier new,courier,monospace;">while</span> بالاستمرار. أمّا عند الوصول إلى نهاية الملف سيحدث العكس تماماً مما يجعل شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">false</span> وينتهي تنفيذ الحلقة.
</p>

<p>
	نقرأ في السطر 14 سطرًا من الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> ونسنده إلى المتغيّر النصي <span style="font-family:courier new,courier,monospace;">line</span> في كل دورة، ثمّ نطبع محتويات هذا المتغيّر إلى الشاشة في السطر 15. استخدمنا في عمليّة قراءة سطر من الملف <span style="font-family:courier new,courier,monospace;">data.txt</span> التابع <span style="font-family:courier new,courier,monospace;">ReadLine</span> من المتغيّر <span style="font-family:courier new,courier,monospace;">fileReader</span> الذي يعمل على قراءة سطر واحد في كلّ مرّة من الملف <span style="font-family:courier new,courier,monospace;">data.txt</span>.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	اكتب برنامجًا يطلب من المستخدم إدخال خمس جُمل، ثم يعمل على تخزين هذه الجُمل على اعتبار أنّ كل جملة يُدخلها المستخدم تمثّل سطرًا نصيًّا. تخزّن كل جملة مع رقم سطرها بحيث يفصل بينهما محرف الجدولة (\t).
</p>

<h3>
	تمرين 2
</h3>

<p>
	استفد من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1502_13">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في كتابة برنامج يطلب من المستخدم إدخال بيانات خمسة طلّاب (اسم الطالب <span style="font-family:courier new,courier,monospace;">Name</span>، والدرجة <span style="font-family:courier new,courier,monospace;">Mark</span>) مستخدمًا المجموعة العموميّة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;Student</span> في تخزين بيانات هؤلاء الطلّاب (ستحتاج إلى استخدام نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.Collections.Generic</span> في بداية البرنامج). بعد الانتهاء من الإدخال، يجب على البرنامج حفظ بيانات هؤلاء الطلّاب ضمن الملف <span style="font-family:courier new,courier,monospace;">students.txt</span> على شكل جدول بسيط، بحيث تصبح محتويات الملف مشابهة للشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1502_15">
<span class="pln">Amjad		50
Mohammad	80
Mazen		90
Nour		88
Anwar		40</span></pre>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على المبادئ الأساسيّة في التعامل مع الملفات النصيّة. حيث تعلّمنا كيفيّة القراءة من الملف النصيّ وكيفيّة الكتابة إليه. وتعلّمنا أساليب مهمّة عند فتح الملف للقراءة أو الكتابة تتمثّل في استخدام العبارة <span style="font-family:courier new,courier,monospace;">using</span> لكي نحرّر المصدر الذي يحجزه الملف فور الانتهاء من التعامل معه.
</p>
]]></description><guid isPermaLink="false">358</guid><pubDate>Sat, 25 Jun 2016 10:37:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r354/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-strings.png.33cc31a983541cff64543a9f8047a32b.png" /></p>

<p>
	يُعتبر التعامل مع النصوص من المواضيع المهمّة التي يحتاجها أيّ مبرمج. توفّر سي شارب أساليب متقدّمة للتعامل مع النصوص، سنتحدّث في هذا الدرس عن بعض هذه الأساليب. حيث سنتعلّم كيفيّة البحث عن نص محدّد ضمن نص آخر، واستبدال نص بآخر، واستخلاص جزء محدّد من نص، وضمّ النصوص.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="17904" data-unique="efr0v067t" src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-strings.png.8215b85bba9cb676001f4a8b141d8071.png" alt="learn-csharp-strings.png"></p>

<p>
	النص في سي شارب هو سلسلة من المحارف <span style="font-family:courier new,courier,monospace;">char</span> الواقعة بين علامتي الاقتباس المزدوج " ". لقد تعاملنا في العديد من المرّات مع النصوص في الدروس السابقة، وتعلّمنا كيف أنّ النوع <span style="font-family:courier new,courier,monospace;">string</span> هو الذي يمثّل أي نص في سي شارب.
</p>

<h2>
	البحث والاستبدال ضمن نص
</h2>

<h3>
	البحث ضمن نص
</h3>

<p>
	للمحارف في أيّ نص ترتيب رقمي يبدأ من الصفر ويسمى الدليل index. إذا أردنا أن نبحث عن نص محدّد ضمن نص آخر فيمكن ذلك باستخدام التابع <span style="font-family:courier new,courier,monospace;">IndexOf</span> الذي نستدعيه من النص المراد البحث ضمنه، ونمرّر إليه النص المراد البحث عنه، فيُرجع دليل أوّل محرف للنص المطابق في حال وجوده وإلّا فيرجع 1-. كمثال على ذلك انظر الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_7">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> pos </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">IndexOf</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">);</span></pre>

<p>
	بعد تنفيذ الشيفرة السابقة سيحمل المتغيّر <span style="font-family:courier new,courier,monospace;">pos</span> القيمة 10 والتي تمثّل دليل الحرف M ضمن النص <span style="font-family:courier new,courier,monospace;">text</span>. ربما تكون قد لاحظت أنّ النص Mohammad موجود في النص <span style="font-family:courier new,courier,monospace;">text</span> مرّتين، فأيّ دليل أعاد التابع <span style="font-family:courier new,courier,monospace;">IndexOf</span>؟
</p>

<p>
	تجري عملية البحث باستخدام التابع <span style="font-family:courier new,courier,monospace;">IndexOf</span> حسب ترتيب إدخال المحارف في النص <span style="font-family:courier new,courier,monospace;">text</span>، لذلك فأوّل كلمة Mohammad مطابقة يصادفها تُنهي عمليّة البحث. ففي مثالنا السابق حدثت المطابقة عند كلمة Mohammad الموجودة بعد "My friend".
</p>

<p>
	أمّا إذا استخدمنا كلمة غير موجودة فسنحصل على القيمة 1- كما أسلفنا. انظر الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_9">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> pos </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">IndexOf</span><span class="pun">(</span><span class="str">"Amjad"</span><span class="pun">);</span></pre>

<p>
	سيحمل المتغيّر <span style="font-family:courier new,courier,monospace;">pos</span> القيمة 1- لأنّ النص الذي نبحث عنه غير موجود في النص <span style="font-family:courier new,courier,monospace;">text</span>.
</p>

<p>
	يخضع التابع <span style="font-family:courier new,courier,monospace;">IndexOf</span> في الواقع لزيادة التحميل، حيث أنّ هناك 9 أشكال مختلفة له. تؤمّن هذه الأشكال المزيد من مزايا البحث، حيث يمكننا مثلًا البحث عن نص ضمن جزء محدّد من النص الموجود في <span style="font-family:courier new,courier,monospace;">text</span>، أو ابتداءً من دليل محدّد حتى آخر النص، وهكذا.
</p>

<p>
	هناك تابع آخر يسمح لنا بأن نبحث بشكل معكوس، وهو التابع <span style="font-family:courier new,courier,monospace;">LastIndexOf</span> لفهم عمله بشكل جيّد سأعيد كتابة الشيفرة السابقة ولكن باستخدام التابع <span style="font-family:courier new,courier,monospace;">LastIndexOf</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_11">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> pos </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">LastIndexOf</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">);</span></pre>

<p>
	بعد التنفيذ سيحمل المتغيّر <span style="font-family:courier new,courier,monospace;">pos</span> القيمة 35، وذلك لأنّ المطابقة حدثت هذه المرّة مع كلمة Mohammad الثانية (تأتي قبل كلمة likes). حيث تمثّل القيمة 35 دليل الحرف M لهذه الكلمة بالنسبة للنص <span style="font-family:courier new,courier,monospace;">text</span>.
</p>

<h3>
	ملاحظة
</h3>

<p>
	يمكنك أن تستخدم التابع <span style="font-family:courier new,courier,monospace;">ToUpper</span> من أي متغيّر نصي والذي يعيد حالة الأحرف الطباعية الكبيرة للنص الموجود ضمن المتغيّر النصي دون أن يؤثّر ذلك على محتوى النص الأساسي ضمن المتغيّر. ونفس الأمر ينطبق على التابع <span style="font-family:courier new,courier,monospace;">ToLower</span> والذي يعيد الحالة الطباعية الصغيرة. يفيد كل من التابعين السابقين أحيانًا في البحث إذا أردنا عدم التمييز بين الأحرف الطباعية الكبيرة والصغيرة عند عملية المطابقة بين الكلمات. انظر لكيفيّة استخدام هذين التابعين:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_467_13">
<span class="kwd">string</span><span class="pln"> text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello!"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">string</span><span class="pln"> upper </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">ToUpper</span><span class="pun">();</span><span class="pln"> </span><span class="com">//upper will contains "HELLO!"</span><span class="pln">
</span><span class="kwd">string</span><span class="pln"> lower </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">ToLower</span><span class="pun">();</span><span class="pln"> </span><span class="com">//lower will contains "hello!"</span></pre>

<p>
	مع الانتباه إلى أنّ قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">text</span> تبقى كما هي.
</p>

<h3>
	الاستبدال ضمن نص
</h3>

<p>
	بالنسبة للاستبدال فالأمر يسير أيضًا، حيث يمكن استخدام التابع <span style="font-family:courier new,courier,monospace;">Replace</span> لهذا الغرض. يُستدعى هذا التابع من النص الذي نريد إجراء عمليّة الاستبدال ضمنه، حيث يتطلّب هذا التابع وسيطين: الأوّل <span style="font-family:courier new,courier,monospace;">oldValue</span> والذي يمثّل القيمة النصيّة المراد استبدالها، والوسيط الثاني <span style="font-family:courier new,courier,monospace;">newValue</span> الذي يمثّل القيمة النصيّة الجديدة. يُرجع هذا التابع قيمة نصيّة تمثّل النص الجديد بعد إجراء عمليّة الاستبدال ضمنه، أي أنّ النص الأساسي يبقى دون تغيير. انظر الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_15">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">
string newText </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">Replace</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Amjad"</span><span class="pun">);</span></pre>

<p>
	بعد التنفيذ سيحمل المتغيّر <span style="font-family:courier new,courier,monospace;">newText</span> القيمة النصيّة التالية:
</p>

<pre class="ipsCode" id="ips_uid_467_17">
"My friend Amjad is a developer, Amjad likes C#."</pre>

<p>
	وسيبقى النص الأصلي <span style="font-family:courier new,courier,monospace;">text</span> على حاله دون تغيير.
</p>

<h2>
	استخلاص النصوص وضمها
</h2>

<h3>
	استخلاص النصوص
</h3>

<p>
	يمكننا استخلاص جزء من نص باستخدام التابع <span style="font-family:courier new,courier,monospace;">SubString</span> والذي يعني نصًّا فرعيًّا أو جزئيًّا. لهذا التابع شكلان. يسمح الشكل الأوّل باستخلاص نص جزئي ابتداءً من دليل محدّد حتى آخر النص. أمّا الشكل الثاني فيسمح أيضًا باستخلاص نص جزئي ابتداءً من دليل محدّد ولكن بطول محدّد أيضًا. للتمييز بين هاتين الحالتين لنكتب بعض الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_19">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">

string text1 </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">Substring</span><span class="pun">(</span><span class="lit">24</span><span class="pun">);</span></pre>

<p>
	بعد التنفيذ سيحتوي المتغيّر <span style="font-family:courier new,courier,monospace;">text1</span> على النص: ".#developer, Mohammad likes C". أمّا إذا استخدمنا الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_21">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My friend Mohammad is a developer, Mohammad likes C#."</span><span class="pun">;</span><span class="pln">

string text1 </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">Substring</span><span class="pun">(</span><span class="lit">24</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">);</span></pre>

<p>
	فسيحتوي المتغيّر <span style="font-family:courier new,courier,monospace;">text1</span> على النص: "developer" فقط. والسبب في ذلك أنّنا بدأنا عمليّة الاستخلاص من الدليل 24 (دليل الحرف d) وبطول 9 محارف فقط مما يعني استخلاص الكلمة developer فحسب.
</p>

<h3>
	ضم النصوص
</h3>

<p>
	يمكن ضمّ النصوص اعتبارًا من نصوص أصغر باستخدام عامل الضم + حيث أنّ استخدامه بسيط. انظر الشيفرة البسيطة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_23">
<span class="pln">string text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"My name is "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"Husam"</span><span class="pun">;</span></pre>

<p>
	بعد تنفيذ هذه العبارة سيحتوي المتغيّر text على النص:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_467_25">
<span class="pln">"My name is Husam"</span></pre>

<p>
	هناك أمرٌ بسيط لكنّه مهم جرى وراء الكواليس! لقد أنشأ مترجم سي شارب كائنًا نصيًّا جديدًا ليستوعب النص الجديد، ثم وضع مرجعًا لهذا الكائن ضمن المتغيّر <span style="font-family:courier new,courier,monospace;">text</span>. قد لا يبدو الأمر مقلقًا في حالة مثالنا البسيط هذا، ولكن تخيّل معي ماذا سيحدث في برنامج يتطلّب ضمّ مئات من النصوص مع بعضها (وهذا أمر وارد جدًّا)؟
</p>

<p>
	ستحدث بالتأكيد مشاكل في الأداة، وستغص الذاكرة بمئات الكائنات النصيّة التي لا لزوم لها، والتي تنتظر دورها في التنظيف من قبل جامع النفايات GC الذي يعمل على تحرير ذاكرة تطبيقات دون نت من الكائنات غير المستخدمة في البرنامج.
</p>

<p>
	الحل الأمثل في هذه الحالة هو تجنّب استخدام عامل الضم (+)، واستخدام الصنف <span style="font-family:courier new,courier,monospace;">StringBuilder</span> الموجود ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.Text</span> الذي يحل هذه المشكلة بكفاءة عالية. لنستعرض البرنامج <span style="font-family:courier new,courier,monospace;">Lesson11_01</span> لهذا الغرض:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_27">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson11_01</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            </span><span class="typ">StringBuilder</span><span class="pln"> sb </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">();</span><span class="pln">
</span><span class="lit">11</span><span class="pln">	            string</span><span class="pun">[]</span><span class="pln"> arrText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	                                </span><span class="str">"C# is a powerful language."</span><span class="pun">,</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	                                </span><span class="str">"It contains advanced features."</span><span class="pun">,</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	                                </span><span class="str">"It makes programming tasks more easier."</span><span class="pun">,</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	                                </span><span class="str">"C# is the main programming language in .NET world."</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                                </span><span class="pun">};</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	            foreach</span><span class="pun">(</span><span class="pln">string text in arrText</span><span class="pun">)</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	                sb</span><span class="pun">.</span><span class="typ">Append</span><span class="pun">(</span><span class="pln">text</span><span class="pun">);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">sb</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	أنشأنا المتغيّر <span style="font-family:courier new,courier,monospace;">sb</span> من النوع <span style="font-family:courier new,courier,monospace;">StringBuilder</span> وأسندنا إليه كائنًا من هذا النوع في السطر 10. بعد ذلك أنشأنا المصفوفة <span style="font-family:courier new,courier,monospace;">arrText</span> بطريقة مختصرة في السطر 11. ثمّ استخدمنا حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> للمرور على جميع عناصر المصفوفة <span style="font-family:courier new,courier,monospace;">arrText</span> وإضافتها واحدًا تلو الآخر إلى المتغيّر <span style="font-family:courier new,courier,monospace;">sb</span> من خلال التابع <span style="font-family:courier new,courier,monospace;">Append</span> الذي يتطلّب وسيطًا نصيًّا واحدًا (السطر 20). أخيرًا يعمل التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> في السطر 23 على طباعة المحتوى النصيّ الناتج من ضمّ جميع النصوص التي أضفناها باستخدام التابع <span style="font-family:courier new,courier,monospace;">Append</span> وذلك من خلال استدعاء التابع <span style="font-family:courier new,courier,monospace;">ToString</span> من المتغيّر sb، ستلاحظ بعد تنفيذ البرنامج أنّ النص المعروض سيكون مضمومًا كما لو استخدمنا عامل الضم (+) على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_467_29">
<span class="pln">C# is a powerful language.It contains advanced features.It makes programming tasks more easier.C# is the main programming language in .NET world.</span></pre>

<p>
	كان من الممكن استخدام تابع آخر من المتغيّر <span style="font-family:courier new,courier,monospace;">sb</span> في السطر 20 وهو التابع <span style="font-family:courier new,courier,monospace;">AppendLine</span>. يشبه هذا التابع <span style="font-family:courier new,courier,monospace;">Append</span> تمامًا باستثناء أنّه يضيف محرف سطر جديد <span style="font-family:courier new,courier,monospace;">n\</span> تلقائيًّا إلى كلّ نص جديد تتم إضافته.
</p>

<h3>
	ملاحظة
</h3>

<p>
	استخدمنا في السطر 11 أسلوبًا مختصرًا في إنشاء المصفوفات. يمكن استخدام هذا الأسلوب عندما تكون عناصر المصفوفة معروفة ومحدّدة. للأسلوب المختصر الشكل التالي بالنسبة للمصفوفات النصيّة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_467_31">
<span class="pln">string</span><span class="pun">[]</span><span class="pln"> arrText </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Text_1"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Text_2"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Text_3"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">…</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="str">"Text_n"</span><span class="pun">};</span></pre>

<p>
	ويمكن بالطبع استخدام هذا الأسلوب المختصر مع أيّ نوع مصفوفة آخر.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	ليكن لدينا النص التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_467_33">
<span class="pln">"black cat and white dog are friends. black cat always brings food to dog, and white dog thanks it."</span></pre>

<p>
	المطلوب كتابة برنامج يحسب عدد الكلمات black وعدد الكلمات dog الموجودة في النص. ثمّ يستبدل كل كلمة white في النص بكلمة brown ويعرض النص المعدّل على الشاشة.
</p>

<h3>
	تمرين 2
</h3>

<p>
	هذا التمرين هو تحدٍّ من نوع آخر!
</p>

<p>
	اكتب برنامجًا يطلب من المستخدم نص كيفيّ. ثم أعدّ تقريرًا يتضمّن إحصائيّات حول عدد كل كلمة أدخلها المستخدم، واعرض هذا التقرير على الشاشة.
</p>

<p>
	(<strong>تلميح</strong>: ربما تحتاج إلى شكل مختلف للتابع <span style="font-family:courier new,courier,monospace;">IndexOf</span> يتطلّب وسيطين: الأوّل هو النص المراد البحث عنه، والثاني هو دليل المحرف الذي سيبدأ البحث اعتبارًا منه. في أمثلتنا السابقة كنّا نبحث افتراضيًّا من المحرف ذو الدليل 0).
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على الخطوات الأساسيّة في التعامل مع النصوص. حيث تعلّمنا كيف نبحث عن نص محدّد ضمن نص آخر وذلك بأسلوبين مختلفين، بالإضافة إلى إجراء عمليّات استبدال داخل نص. كما تعلّمنا كيف نستخلص جزءًا محدّدًا من نص، وكيف نضمّ النصوص باستخدام الصنف <span style="font-family:courier new,courier,monospace;">StringBuilder</span>. يُعتبر العمل مع النصوص أساسيًّا ومهمًّا لكلّ مبرمج وخصوصًا في مثل هذه الأيّام، فالبيانات التي يتمّ تبادلها بين التطبيقات المختلفة عبر شبكة الإنترنت تكون على شكل نصوص. سنتناول في الدرس القادم كيفيّة التعامل مع الملفات النصيّة من خلال القراءة والكتابة منها وإليها.
</p>
]]></description><guid isPermaLink="false">354</guid><pubDate>Sat, 18 Jun 2016 12:21:39 +0000</pubDate></item><item><title>&#x627;&#x644;&#x648;&#x627;&#x62C;&#x647;&#x627;&#x62A; (Interfaces) &#x648;&#x627;&#x644;&#x645;&#x62C;&#x645;&#x648;&#x639;&#x627;&#x62A; (Collections) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-interfaces-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-collections-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r348/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-interfaces-collections.png.22b1fdabd1f312b80da70b42f4356bb0.png" /></p>

<p>
	يتحدّث هذا الدرس عن موضوعين مهمّين في سي شارب ألا وهما الواجهات Interfaces والمجموعات Collections. تُعتبر المجموعات collections من المزايا القويّة والمهمّة في سي شارب، وهي وسيلة لتخزين العناصر ضمن بنية قابلة للتوسّع تلقائيًّا وسهلة التعامل. إذًا فهي تشبه المصفوفات، باستثناء أنّ المصفوفات ذات حجم ثابت وهي تبقى كذلك منذ لحظة إنشائها، أمّا المجموعات فهي على النقيض من ذلك، فهي بنية قابلة للتوسّع بقدر ما نرغب. بالإضافة إلى أنّ للمجموعات أشكال عديدة مفيدة جدًّا، فهناك المكدّس stack والرتل queue والقاموس dictionary وغيرها من البنى المهمّة.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="17643" data-unique="bsl9tjt7a" src="https://academy.hsoub.com/uploads/monthly_2016_06/learn-csharp-interfaces-collections.png.8f2db14d4d6b5ee89be17f729901dacd.png" alt="learn-csharp-interfaces-collections.png"></p>

<p>
	سنتناول في هذا الدرس المجموعات العاديّة، والمجموعات العموميّة generics collections. سنبدأ هذا الدرس بالحديث المختصر عن الواجهات، وهي تشبه الأصناف ولكن بصورة مجرّدة، حيث تصف سمات عامّة ينبغي أن تتحلّى بها الأصناف التي تحقّقها.
</p>

<h2>
	كلمة عن الواجهات
</h2>

<p>
	ليست فكرة الواجهات Interfaces محصورةً بسي شارب، فهي موجودة أيضًا في لغات برمجة أخرى مثل جافا Java. تشبه الواجهة Interface الصنف Class بشكل كبير، فهي تضم خصائص وتوابع، ولكن كتصاريح فقط، بدون شيفرة تحوي عبارات برمجيّة، وبدون محدّدات وصول. كما لا تحتوي على حقول fields ولا على بواني. تستطيع القول أنّ الواجهة تعرّف الهيكل العام بشكل مجرّد فحسب. يمكن الاستفادة من الواجهة عندما نحقّقها implement. فعندما يرث صنف ما من واجهة، فيجب عليه أن يعيد التصريح عن جميع الخصائص والتوابع الموجودة ضمن هذه الواجهة ولكن مع تزويدها بحواضن تحوي الشيفرة المطلوب تنفيذها.
</p>

<p>
	فكأنّ الواجهة تحقّق مبدأ التعدديّة الشكليّة بشكل ممتاز، فهي تصرّح عن تابع أو خاصيّة، وتترك للصنف الذي يحقّقها (يرث منها) حريّة التعبير عن هذا التابع أو هذه الخاصيّة بالشكل الملائم.
</p>

<p>
	تُستخدم الواجهات على نحو واسع جدًّا في سي شارب، وتتبع تسميتها لنفس أسلوب تسمية الأصناف، مع الاصطلاح على أن يكون الحرف الأوّل من اسم أيّ واجهة هو الحرف الطباعي الكبير I وهو الحرف الأوّل من كلمة Interface. في الحقيقة لقد حلّت الواجهات مشكلة الوراثة المتعدّدة (الوراثة من أكثر من صنف بنفس الوقت) والتي كانت تتمتّع بها لغة C++ فقط. الآن أصبح بإمكان أي صنف أن يرث من صنف آخر واحد فقط، بالإضافة إلى تحقيقه لأي عدد يرغبه من الواجهات.
</p>

<p>
	يُصرّح عن الواجهة بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">interface</span>. انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson10_1</span> الذي يوضّح استخدام الواجهات.
</p>

<p>
	هل تذكر الأصناف <span style="font-family:courier new,courier,monospace;">Animal</span> و <span style="font-family:courier new,courier,monospace;">Bird</span> و <span style="font-family:courier new,courier,monospace;">Frog</span> و <span style="font-family:courier new,courier,monospace;">Fish</span>؟ لقد استعرت الصنفين <span style="font-family:courier new,courier,monospace;">Animal</span> و <span style="font-family:courier new,courier,monospace;">Frog</span> لتوضيح فكرة استخدام الواجهات، تذكّر أنّ الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> كان يرث من الصنف <span style="font-family:courier new,courier,monospace;">Animal</span>. في الحقيقة لقد استفدت من فكرة أنّ الكائنات الحيّة تتنفّس <span style="font-family:courier new,courier,monospace;">Breathing</span>. لذلك أنشئت واجهة اسمها <span style="font-family:courier new,courier,monospace;">IBreathing</span> لتعبّر عن عمليّة التنفّس، وبما أنّ الضفدع <span style="font-family:courier new,courier,monospace;">Frog</span> هو كائن حيّ، فمن الطبيعي أن يحقّق هذه الواجهة. تحتوي الواجهة <span style="font-family:courier new,courier,monospace;">IBreathing</span> على تابع وحيد اسمه <span style="font-family:courier new,courier,monospace;">TakeBreath</span> (السطر 9) يقبل وسيطًا واحدًا من النوع <span style="font-family:courier new,courier,monospace;">double</span> يُعبّر عن كميّة الأكسجين التي سيحصل عليها الكائن الحيّ عند التنفّس، كما يُرجع هذا التابع قيمة من النوع double أيضًا تمثّل كميّة الأكسجين التي بقيت بعد عمليّة التنفّس.
</p>

<p>
	يرث الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> هذه الواجهة في السطر 20، ويحقّقها من خلال إعادة تعريف التابع <span style="font-family:courier new,courier,monospace;">TakeBreath</span> في الأسطر من 27 حتى 30 حيث يُعبّر عن عمليّة التنفّس بالشكل الذي يناسبه (سيستهلك في مثالنا هذا 20% من كميّة الأكسجين التي يحصل عليها). في الحقيقة يمكن استخدام الواجهة <span style="font-family:courier new,courier,monospace;">IBreathing</span> مع أيّ "كائن حيّ" بصرف النظر عن كونه يرث من الصنف <span style="font-family:courier new,courier,monospace;">Animal</span> (الذي يمثّل الصنف الحيواني) أو من الصنف <span style="font-family:courier new,courier,monospace;">Mammal</span> (الثديّيات) مثلًا أو غيره، وذلك لأنّ جميع الكائنات الحيّة تشترك معًا بخاصيّة التنفّس، وهنا تمكن قوّة الواجهات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_8">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">	namespace </span><span class="typ">Lesson10_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	        interface </span><span class="typ">IBreathing</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	            </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">TakeBreath</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> oxygen_amount</span><span class="pun">);</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	        </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	            </span><span class="kwd">public</span><span class="pln"> virtual </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Animal: Move General Method"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	        </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Frog</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Animal</span><span class="pun">,</span><span class="pln">  </span><span class="typ">IBreathing</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	            </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Frog - Move: jumping 20 cm"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">TakeBreath</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> oxygen_amount</span><span class="pun">)</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">29</span><span class="pln">	                </span><span class="kwd">return</span><span class="pln"> oxygen_amount </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.8</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	
</span><span class="lit">32</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">33</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">36</span><span class="pln">	            </span><span class="kwd">double</span><span class="pln"> oxygent_to_breath </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="lit">37</span><span class="pln">
</span><span class="lit">38</span><span class="pln">	            </span><span class="typ">IBreathing</span><span class="pln"> frog </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Frog</span><span class="pun">();</span><span class="pln">
</span><span class="lit">39</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Oxygen amount before breath: {0}"</span><span class="pun">,</span><span class="pln"> oxygent_to_breath</span><span class="pun">);</span><span class="pln">
</span><span class="lit">41</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Oxygen amount after breath: {0}"</span><span class="pun">,</span><span class="pln"> frog</span><span class="pun">.</span><span class="typ">TakeBreath</span><span class="pun">(</span><span class="pln">oxygent_to_breath</span><span class="pun">));</span><span class="pln">
</span><span class="lit">42</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">43</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	هناك أمر آخر جدير بالملاحظة. انظر إلى السطر 38 ستجد أنّنا قد صرّحنا عن المتغيّر <span style="font-family:courier new,courier,monospace;">frog</span> من النوع <span style="font-family:courier new,courier,monospace;">IBreathing</span> ثمّ أسندنا إليه مرجعًا لكائن من النوع <span style="font-family:courier new,courier,monospace;">Frog</span>، وهذا أمر صحيح تمامًا وشائع جدًّا لأنّ الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> يرث من الواجهة <span style="font-family:courier new,courier,monospace;">IBreathing</span>.
</p>

<p>
	عند تنفيذ البرنامج ستحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1163_10">
<span class="pln">Oxygen amount before breath: 10
Oxygen amount after breath: 8</span></pre>

<h2>
	المجموعات في سي شارب
</h2>

<h3>
	المجموعات العادية
</h3>

<p>
	توجد الأصناف المعبّرة عن هذه المجموعات ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.Collection</span>. تلعب نطاقات الأسماء دورًا تنظيميًّا للأصناف، وسنتحدّث عنها بشكل أكبر في درس لاحق. من أبرز المجموعات في نطاق الاسم هذا هو الصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span>. يحقّق الصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span> كلّ من الواجهات <span style="font-family:courier new,courier,monospace;">IList</span> و <span style="font-family:courier new,courier,monospace;">ICollection</span> و <span style="font-family:courier new,courier,monospace;">IEnumerable</span> و <span style="font-family:courier new,courier,monospace;">ICloneable</span>. جميع هذه الواجهات تقع في مكتبة FCL في إطار عمل دوت نت، حيث تعرّف هذه الواجهات العمليّات الأساسيّة التي ينبغي أن يتمتّع بها الصنف <span style="font-family:courier new,courier,monospace;">ArrayList</span>.
</p>

<p>
	تسمح الكائنات من هذه المجموعة بإضافة أي نوع من العناصر لها، حيث من الممكن أن نضيف عناصر من النوع <span style="font-family:courier new,courier,monospace;">object</span>. يمكن إضافة العناصر إلى هذه المجموعة باستخدام التابع <span style="font-family:courier new,courier,monospace;">Add</span> الذي يقبل وسيطًا من النوع <span style="font-family:courier new,courier,monospace;">object</span>. أي أنّنا فعليًّا نستطيع أن نضيف عناصر من أنواع مختلفة لنفس المجموعة. أيّ عنصر تتمّ إضافته سيوضع آخر المجموعة التي هي ذات حجم مرن، فمن الممكن إضافة أي عدد نرغبه من العناصر. أمّا إذا أردنا إضافة عنصر إلى مكان محدّد ضمن القائمة، فعلينا استخدام التابع <span style="font-family:courier new,courier,monospace;">Insert</span> الذي يحتاج إلى وسيطين، الأوّل هو الدليل المراد إدراج العنصر الجديد ضمنه، والثاني هو العنصر نفسه.
</p>

<p>
	انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson10_02</span> البسيط التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_12">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson10_02</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	            </span><span class="typ">ArrayList</span><span class="pln"> values </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">();</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	            values</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"My "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	            values</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"age: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	            values</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="lit">36</span><span class="pun">);</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            foreach</span><span class="pun">(</span><span class="pln">object item in values</span><span class="pun">)</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">22</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	استطعنا الحصول على عناصر هذه المجموعة باستخدام حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>. ولكن إذا أردنا الوصول إلى عنصر محدّد فحسب، ولنقل أنّه العنصر الثالث (القيمة 36) في مثالنا السابق، فيمكن ذلك من خلال الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_14">
<span class="pln">values</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span></pre>

<p>
	تذكّر دومًا أنّ دليل العنصر الأوّل هو 0. في الواقع ستكون القيمة التي سنحصل عليها من <span style="font-family:courier new,courier,monospace;">[values[2</span> هي قيمة من نوع <span style="font-family:courier new,courier,monospace;">object</span> رغم أنّها في حقيقة الأمر تحوي القيمة 36 وهي قيمة من نوع <span style="font-family:courier new,courier,monospace;">int</span> بطبيعة الحال. السبب في ذلك منطقيّ وهو أنّنا عندما أضفنا القيمة 36 إلى المجموعة كان ذلك باستخدام التابع <span style="font-family:courier new,courier,monospace;">Add</span> الذي يقبل وسيطًا من النوع <span style="font-family:courier new,courier,monospace;">object</span>. إذا أردنا الاستفادة من القيمة الفعليّة المخزّنة ضمن <span style="font-family:courier new,courier,monospace;">[values[2</span> فعلينا هنا أن نستخدم عامل التحويل (<span style="font-family:courier new,courier,monospace;">int</span>) على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_16">
<span class="kwd">int</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> values</span><span class="pun">[</span><span class="lit">2</span><span class="pun">];</span></pre>

<p>
	<strong>ملاحظة</strong>: عند تمرير القيمة 36 في المثال السابق إلى التابع <span style="font-family:courier new,courier,monospace;">Add</span> الذي يتوقّع وسيط من نوع <span style="font-family:courier new,courier,monospace;">object</span> تحدث ظاهرة نسميها التعليب boxing. حيث تُعلَّب القيمة 36 ليصبح بالإمكان تمريرها مكان وسيط يتطلّب النوع <span style="font-family:courier new,courier,monospace;">object</span> (يبقى هذا الأمر صحيحًا من أجل أي قيمة value type). أمّا عندما نريد استرجاع القيمة الفعليّة فإنّنا نقوم بعمليّة معاكسة تدعى بإلغاء التعليب unboxing باستخدام عامل التحويل بين الأنواع كما فعلنا بالعبارة البرمجيّة الأخيرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_18">
<span class="kwd">int</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> values</span><span class="pun">[</span><span class="lit">2</span><span class="pun">];</span></pre>

<p>
	هناك العديد من المجموعات الأخرى الموجودة ضمن نطاق الاسم<span style="font-family:courier new,courier,monospace;"> System.Collection</span>، ولكن لن أتحدّث عنها هنا. في الحقيقة إذا أردت نصيحتي حاول ألّا تستخدم المجموعات العاديّة أبدًا! يكمن السبب في ذلك في الفقرة التالية عندما نتحدّث عن المجموعات العموميّة generic collection، حيث سنطّلع على مجموعات تشبه إلى حدٍّ بعيد المجموعات العاديّة الموجودة هنا، ولكنّها عمليّة وأكثر أمانًا.
</p>

<h3>
	المجموعات العمومية
</h3>

<p>
	تشبه المجموعات العموميّة generic collections من حيث المبدأ المجموعات العاديّة باستثناء أنّها أكثر أمنًا وأفضل أداءً. حيث ينبغي تعيين نوع العناصر التي ستتعامل معها المجموعة عند التصريح عنها، فتتعامل المجموعة في هذه الحالة مع نوع مُحدّد. من أشهر المجموعات العموميّة هي المجموعة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;T</span> وهي تعبّر عن القائمة <span style="font-family:courier new,courier,monospace;">list</span>. قد يبدو الشكل السابق غريبًا قليلًا، ولكنّه في الحقيقة بسيط. استبدل الحرف T بأيّ نوع (صنف) ترغبه وستقبل المجموعة نتيجة لذلك أن يكون عناصرها من هذا النوع. تقع المجموعات العموميّة في نطاق الاسم <span style="font-family:courier new,courier,monospace;">System.Collections.Generic</span>.
</p>

<p>
	سنعدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_02</span> من الدرس السابق الذي كان يسمح بإدخال أسماء ودرجات خمسة طلاب فقط، ويخزّنها على شكل كائنات <span style="font-family:courier new,courier,monospace;">Student</span> ضمن مصفوفة من النوع <span style="font-family:courier new,courier,monospace;">[]Student</span> وذلك لإيجاد مجموع الدرجات والمعدّل. سنجعل هذا البرنامج يستخدم المجموعة العموميّة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;Student</span> (مجموعة يمكن لعناصرها تخزين مراجع لكائنات من النوع <span style="font-family:courier new,courier,monospace;">Student</span>)، سننشئ البرنامج <span style="font-family:courier new,courier,monospace;">Lesson10_03</span> لهذا الغرض.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_20">
<span class="lit">1</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">	using </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">	namespace </span><span class="typ">Lesson10_03</span><span class="pln">
</span><span class="lit">5</span><span class="pln">	</span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="lit">7</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">9</span><span class="pln">	        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">10</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">	    </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">13</span><span class="pln">	    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">	        </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">15</span><span class="pln">	        </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">	            </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;</span><span class="pln"> listStudents </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Student</span><span class="pun">&gt;();</span><span class="pln">
</span><span class="lit">17</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">	            bool continueCondition </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="lit">19</span><span class="pln">	            </span><span class="kwd">int</span><span class="pln"> counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">20</span><span class="pln">	            string response</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">            
</span><span class="lit">22</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Input Students Marks"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"====================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">
</span><span class="lit">25</span><span class="pln">	            </span><span class="com">//input loop.</span><span class="pln">
</span><span class="lit">26</span><span class="pln">	            </span><span class="kwd">while</span><span class="pun">(</span><span class="pln">continueCondition</span><span class="pun">)</span><span class="pln">
</span><span class="lit">27</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">28</span><span class="pln">	                </span><span class="typ">Student</span><span class="pln"> student </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pun">();</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th name: "</span><span class="pun">,</span><span class="pln"> counter </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">	                student</span><span class="pun">.</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">32</span><span class="pln">
</span><span class="lit">33</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th mark: "</span><span class="pun">,</span><span class="pln"> counter </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">34</span><span class="pln">	                string tmpMark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">35</span><span class="pln">	                student</span><span class="pun">.</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">tmpMark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">	                listStudents</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="pln">student</span><span class="pun">);</span><span class="pln">
</span><span class="lit">38</span><span class="pln">
</span><span class="lit">39</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">40</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Add another student? (y/n) : "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">41</span><span class="pln">	                response </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">42</span><span class="pln">                
</span><span class="lit">43</span><span class="pln">	                </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">response</span><span class="pun">==</span><span class="str">"n"</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> response </span><span class="pun">==</span><span class="pln"> </span><span class="str">"N"</span><span class="pun">)</span><span class="pln">
</span><span class="lit">44</span><span class="pln">	                </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">	                    continueCondition </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="lit">46</span><span class="pln">	                </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">	
</span><span class="lit">48</span><span class="pln">	                counter</span><span class="pun">++;</span><span class="pln">
</span><span class="lit">49</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">50</span><span class="pln">            
</span><span class="lit">51</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">52</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Students Marks Table"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">53</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"===================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">54</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"No\tName\tMark"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">55</span><span class="pln">
</span><span class="lit">56</span><span class="pln">	            </span><span class="com">//calculating sum and display output loop.</span><span class="pln">
</span><span class="lit">57</span><span class="pln">	            </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> listStudents</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">58</span><span class="pln">	            </span><span class="pun">{</span><span class="pln">
</span><span class="lit">59</span><span class="pln">	                sum </span><span class="pun">+=</span><span class="pln"> listStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Mark</span><span class="pun">;</span><span class="pln">
</span><span class="lit">60</span><span class="pln">	                </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0}\t{1}\t{2}"</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> listStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">,</span><span class="pln"> listStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Mark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">61</span><span class="pln">	            </span><span class="pun">}</span><span class="pln">
</span><span class="lit">62</span><span class="pln">
</span><span class="lit">63</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"-------------------"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">64</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Sum\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">65</span><span class="pln">	            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Average\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">listStudents</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">);</span><span class="pln">
</span><span class="lit">66</span><span class="pln">	        </span><span class="pun">}</span><span class="pln">
</span><span class="lit">67</span><span class="pln">	    </span><span class="pun">}</span><span class="pln">
</span><span class="lit">68</span><span class="pln">	</span><span class="pun">}</span></pre>

<p>
	لقد أجرينا هنا بعض التحسينات. بدأنا البرنامج في السطر 16 بالتصريح عن المتغيّر <span style="font-family:courier new,courier,monospace;">listStudents</span> من النوع <span style="font-family:courier new,courier,monospace;">&lt;List&lt;Student </span>وإنشاء كائن من هذا النوع وإسناده لهذا المتغيّر. تقبل المجموعة العموميّة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;Student</span> بتخزين كائنات من النوع <span style="font-family:courier new,courier,monospace;">Student</span> ضمنها. لاحظ أنّنا لم نحدّد عدد الكائنات مسبقًا (مع أنّه يمكن ذلك بهدف تحسين الأداء لا غير). وضعنا حلقة <span style="font-family:courier new,courier,monospace;">while</span> في السطر 26 بدلًا من حلقة for القديمة وذلك لأنّنا لا نعرف على وجه التحديد عدد الطلّاب الذين يرغب المستخدم بإدخال بياناتهم. لاحظ شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">continueCondition</span> الذي يحمل القيمة <span style="font-family:courier new,courier,monospace;">true</span> بشكل افتراضيّ.
</p>

<p>
	أصبح البرنامج غير مقيّدٍ بعدد محدّد من الطلاب، فبعد إدخال بيانات كل طالب، سيعرض البرنامج رسالة يخيّر فيها المستخدم في إضافة المزيد أم التوقّف (السطر 40) فإذا اختار المستخدم التوقّف بإدخاله النص "N" أو "n" عندها سيسند البرنامج القيمة <span style="font-family:courier new,courier,monospace;">false</span> للمتغيّر <span style="font-family:courier new,courier,monospace;">continueCondition</span> مما يؤدّي إلى الخروج من حلقة <span style="font-family:courier new,courier,monospace;">while</span> عند بدء الدورة التالية. تنحصر وظيفة المتغيّر <span style="font-family:courier new,courier,monospace;">counter</span> الذي صرّحنا عنه في السطر 19 في إظهار ترتيب الطالب الحالي على الشاشة.
</p>

<p>
	نستخدم الخاصيّة <span style="font-family:courier new,courier,monospace;">Count</span> للمجموعة <span style="font-family:courier new,courier,monospace;">listStudents</span> لمعرفة عدد العناصر الفعليّة المخزّنة ضمنها (تذكّر الخاصيّة <span style="font-family:courier new,courier,monospace;">Length</span> المماثلة لها في المصفوفات).
</p>

<p>
	بعد تنفيذ البرنامج وإدخال بيانات ستة طلّاب، ستحصل على شكل شبيه بما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17642" href="https://academy.hsoub.com/uploads/monthly_2016_06/fig01.png.07f1a55d4844e50c23e27e0b7c36085d.png" rel="external"><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17642" data-unique="5mfm5t9pn" src="https://academy.hsoub.com/uploads/monthly_2016_06/fig01.thumb.png.7e9fbcdc5e4847286454f2821d566f38.png"></a>
</p>

<p>
	يوجد تابع اسمه <span style="font-family:courier new,courier,monospace;">RemoveAt</span> ضمن هذه المجموعة يسمح بإزالة عنصر من القائمة، حيث نمرّر لهذا التابع دليل index العنصر المراد إزالته (دليل العنصر الأوّل هو 0) ليعمل هذا التابع على إزالته وإعادة تعيين أدلّة جميع العناصر بعد إزالة العنصر المطلوب. انظر الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_22">
<span class="typ">List</span><span class="pun">&lt;</span><span class="pln">string</span><span class="pun">&gt;</span><span class="pln"> listStrings </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="pln">string</span><span class="pun">&gt;();</span><span class="pln">

listStrings</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"Bird"</span><span class="pun">);</span><span class="pln">
listStrings</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"Fish"</span><span class="pun">);</span><span class="pln">
listStrings</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"Frog"</span><span class="pun">);</span><span class="pln">

listStrings</span><span class="pun">.</span><span class="typ">RemoveAt</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	أنشأنا في الشيفرة السابقة مجموعة من النوع <span style="font-family:courier new,courier,monospace;">&lt;List&lt;string</span> (عناصرها من النوع <span style="font-family:courier new,courier,monospace;">string</span>)، ثمّ أضفنا إليها ثلاثة عناصر. يؤدّي استدعاء التابع <span style="font-family:courier new,courier,monospace;">(RemoveAt(1</span> إلى إزالة العنصر ذو الدليل 1 من هذه المجموعة، أي أنّ العنصر ذو القيمة Fish سيُزال من هذه القائمة.
</p>

<p>
	يوجد تابع مشابه لهذا التابع اسمه <span style="font-family:courier new,courier,monospace;">Remove</span> يتطلّب أن تمرّر إليه مرجعًا لكائن موجود في هذه المجموعة لتتم إزالته. فإذا كان النوع العمومي لهذه المجموعة عبارة عن نوع قيمة مثل <span style="font-family:courier new,courier,monospace;">&lt;List&lt;int </span>أو <span style="font-family:courier new,courier,monospace;">&lt;List&lt;double</span> فعندها يكفي تمرير القيمة المراد إزالتها للتابع <span style="font-family:courier new,courier,monospace;">Remove</span> فحسب. علمًا أنّ هذا التابع يزيل أوّل نتيجة تطابق يصادفها في هذه المجموعة.
</p>

<p>
	يوجد أيضًا التابع <span style="font-family:courier new,courier,monospace;">Reverse</span> الذي يعمل على عكس ترتيب العناصر الموجودة في المجموعة، حيث يصبح العنصر الأوّل هو الأخير، والعنصر الأخير هو الأوّل. كما يوجد التابع <span style="font-family:courier new,courier,monospace;">Sort</span> الذي يعمل على ترتيب العناصر ضمن المجموعة وفق الترتيب الافتراضي (بالنسبة للأنواع المضمّنة) أو وفق ترتيب كيفيّ يمكن للمبرمج أن يختاره.
</p>

<p>
	وهناك تابع مفيد آخر وهو <span style="font-family:courier new,courier,monospace;">BinarySearch</span> الذي يجري خوارزمية البحث الشهيرة على عناصر المجموعة، حيث نمرّر إليه القيمة المراد البحث عنها (أو مرجع الكائن الذي نريد البحث عنه) ويُرجع هذا التابع دليل العنصر ضمن المجموعة في حال وجده. مع الانتباه إلى أنّ هذا الدليل يمثّل دليل العنصر ضمن المجموعة على اعتبارها مرتّبة. إذ أنّه يقوم بترتيبها بشكل داخليّ قبل أن يجري عملية البحث. إذا أردت الحصول على نتائج منطقيّة، فاعمل على ترتيب مجموعتك باستخدام التابع <span style="font-family:courier new,courier,monospace;">Sort</span> قبل استدعاء <span style="font-family:courier new,courier,monospace;">BinarySearch</span>.
</p>

<p>
	يمكننا الوصول إلى عنصر محدّد ضمن مجموعة عموميّة بنفس الأسلوب التي تحدّثنا عنه في المجموعات العاديّة، مع ملاحظة أنّنا لن نحتاج إلى عامل التحويل بين الأنواع، وبالتالي التخلّص من عمليتيّ التعليب boxing وإلغاء التعليب unboxing. كما يمكن الاستفادة أيضًا من التابع <span style="font-family:courier new,courier,monospace;">Insert</span> للإدراج ضمن موقع مُحدّد، والذي تحدّثنا عنه أيضًا في المجموعات العاديّة.
</p>

<p>
	توجد توابع أخرى مفيدة ضمن المجموعة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;T</span> ولكنّنا لن نستطيع الخوض فيها قبل أن نتحدّث عن النوّاب delegates في درس لاحق.
</p>

<p>
	<strong>ملاحظة</strong>: توجد طريقة سريعة وفعّالة لإنشاء مجموعة <span style="font-family:courier new,courier,monospace;">&lt;List&lt;T</span> وإسناد عناصر إليها مباشرةً في حال كان عدد العناصر محدّد ومعروف سلفًا. فإذا أردنا إنشاء مجموعة من النوع <span style="font-family:courier new,courier,monospace;">&lt;List&lt;int</span> تحوي العناصر 1، 2، 5، 10 يمكنك كتابة العبارة التالية لهذا الغرض:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1163_24">
<span class="typ">List</span><span class="pun">&lt;</span><span class="kwd">int</span><span class="pun">&gt;</span><span class="pln"> listNumbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="kwd">int</span><span class="pun">&gt;()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">};</span></pre>

<p>
	تنشئ هذه العبارة مجموعة من النوع <span style="font-family:courier new,courier,monospace;">&lt;List&lt;int</span> وتضيف إليها العناصر 10 و5 و2 و1 ثمّ تسند هذه المجموعة إلى المتغيّر <span style="font-family:courier new,courier,monospace;">listNumbers</span>.
</p>

<h2>
	تمارين داعمة
</h2>

<h3>
	تمرين 1
</h3>

<p>
	اكتب برنامجًا يطلب من المستخدم إدخال خمس قيم نصيّة، ويخزّنها ضمن مجموعة من النوع <span style="font-family:courier new,courier,monospace;">&lt;List&lt;string</span>. ثمّ استخدم التابع <span style="font-family:courier new,courier,monospace;">Reverse</span> لعكس ترتيب العناصر ضمن هذه المجموعة، ثمّ اطبع النتائج على الشاشة.
</p>

<h3>
	تمرين 2
</h3>

<p>
	اكتب برنامجًا يطلب من المستخدم إدخال قيم عدديّة من النوع <span style="font-family:courier new,courier,monospace;">double</span> بقدر ما يريد، وبعد أن يفرغ من الإدخال، احسب المتوسّط الحسابي (المعدّل) لهذه الأعداد، ورتّبها باستخدام التابع <span style="font-family:courier new,courier,monospace;">Sort</span>، ثم اطبعها على الشاشة، مع المتوسّط الحسابي لها.
</p>

<p>
	(<strong>تلميح</strong>: استفد من البرنامج <span style="font-family:courier new,courier,monospace;">Lesson10_03</span> لسؤال المستخدم هل يريد إضافة عدد جديد أم لا)
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرّفنا في هذا الدرس على الواجهات Interfaces والمجموعات Collections. من النادر أن يخلو أيّ برنامج فعليّ من استخدام المجموعات أو الواجهات، وفي الحقيقة هناك العديد من بنى المجموعات المفيدة التي لم نتناولها في هذا الدرس. سنحاول أن نتوسّع في المزايا القويّة والرّائعة للمجموعات في سلسلة قادمة.
</p>
]]></description><guid isPermaLink="false">348</guid><pubDate>Thu, 09 Jun 2016 13:19:59 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; (Arrays) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-arrays-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r341/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-arrays.png.3735ec3197262441fc8c5ff0c660d2fc.png" /></p>
<p dir="rtl">
	تعتبر المصفوفات من بنى المعطيات المهمّة في أيّ لغة برمجة. سيفترض هذا الدرس أنّه لديك خبرة مسبقة عن مفهوم المصفوفة. المصفوفات في سي شارب هي عبارة عن نوع مرجعيّ reference type، وهي ترث من الصنف الأب <span style="font-family:courier new,courier,monospace;">System.Array</span>. تقدّم لنا سي شارب المصفوفات بأسلوب مبسّط وواضح.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="learn-csharp-arrays.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16780" data-unique="l36hghpyq" src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-arrays.png.640198b0b5e8bcb3eeaba8b585e2ef68.png">
</p>

<p dir="rtl">
	فلتعريف مصفوفة يمكنها استيعاب 10 عناصر من النوع int مثلًا يكفي أن نكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9443_8"><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> arrIntegers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">[</span><span class="lit">10</span><span class="pun">];</span></pre>

<p dir="rtl">
	للعبارة السابقة في الواقع وظيفتان: الأولى هي التصريح عن المتغيّر <span style="font-family:courier new,courier,monospace;">arrIntegers</span> على أنّه مصفوفة عناصرها من النوع <span style="font-family:courier new,courier,monospace;">int</span> وذلك عن طريق كتابة <span style="font-family:courier new,courier,monospace;">[]int</span> أوّل العبارة. والثانية هي إنشاء كائن المصفوفة وحجز 10 أماكن في الذاكرة بحيث يستطيع كلّ مكان منها استيعاب قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span> وذلك عن طريق التعبير<span style="font-family:courier new,courier,monospace;"> [new int[10</span> ومن ثمّ إسناد المرجع لهذا الكائن إلى المتغير <span style="font-family:courier new,courier,monospace;">arrIntegers</span>. ويمكن كما نعلم أن نجري هذه العمليّة على شكل عبارتين منفصلتين.
</p>

<p dir="rtl">
	يمكننا إنشاء أيّ نوع من المصفوفات نرغبه. فيمكننا إنشاء مصفوفات عناصرها نصوص <span style="font-family:courier new,courier,monospace;">[]string</span>، ومصفوفات عناصرها أعداد ذوات فاصلة عائمة مثل<span style="font-family:courier new,courier,monospace;"> []float</span>، وحتى يمكننا إنشاء مصفوفات عناصرها كائنات من أصناف ننشئها نحن بأنفسنا. فمثلًا إذا أنشأنا الصنف <span style="font-family:courier new,courier,monospace;">Car</span> فيمكننا إنشاء مصفوفة من العناصر التي يقبل كل عنصر منها أن يخزّن مرجع لكائن من الصنف <span style="font-family:courier new,courier,monospace;">Car</span> وذلك على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9443_10"><span class="typ">Car</span><span class="pun">[]</span><span class="pln"> arrCars </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">[</span><span class="lit">5</span><span class="pun">];</span></pre>

<p dir="rtl">
	تُنشئ العبارة السابقة المصفوفة <span style="font-family:courier new,courier,monospace;">arrCars</span> والتي تحوي 5 عناصر يمكنها تخزين مراجع لكائنات من الصنف <span style="font-family:courier new,courier,monospace;">Car</span>.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 dir="rtl">
	استخدام المصفوفات مع أنواع مضمنة
</h2>

<p dir="rtl">
	لكلّ عنصر في مصفوفة دليل index، ويُعبّر عن ترتيب هذا العنصر ضمن المصفوفة. يبدأ ترقيم الأدلّة في أيّ مصفوفة بالصفر. أي أنّ دليل العنصر الأوّل هو الصفر. فالمصفوفة <span style="font-family:courier new,courier,monospace;">arrCars</span> التي صرّحنا عنها قبل قليل تحتوي على خمسة عناصر، دليل العنصر الأوّل هو 0، أمّا دليل العنصر الأخير فهو 4 كما هو واضح.
</p>

<p dir="rtl">
	يمكن المرور على عناصر أيّ مصفوفة باستخدام الدليل. فمثلًا يمكننا الوصول إلى العنصر الثاني في المصفوفة <span style="font-family:courier new,courier,monospace;">arrCars</span> عن طريق كتابة <span style="font-family:courier new,courier,monospace;">[arrCars[1</span>.
</p>

<p dir="rtl">
	يطلب البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_01</span> التالي من المستخدم إدخال درجات 5 طلاب في إحدى المواد الدراسيّة ومن ثمّ يحسب معدّل هؤلاء الطلبة في هذه المادّة، على افتراض أنّ الدرجة العظمى هي 100. ومن ثمّ يطبع المعدّل مع أسماء الطلاب ودرجاتهم على الشاشة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9443_12"><span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson09_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> arrMarks </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">[</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              string</span><span class="pun">[]</span><span class="pln"> arrNames </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> string</span><span class="pun">[</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
</span><span class="lit">11</span><span class="pln">              </span><span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln"> 
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Input Students Marks"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"====================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              </span><span class="com">//input loop.</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> arrMarks</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th name: "</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  arrNames</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">21</span><span class="pln">
</span><span class="lit">22</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th mark: "</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">                  string tmpMark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">24</span><span class="pln">                  arrMarks</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">tmpMark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">27</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">30</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Students Marks Table"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"===================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">32</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"No\tName\tMark"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">33</span><span class="pln">             
</span><span class="lit">34</span><span class="pln">              </span><span class="com">//calculating sum and display output loop.</span><span class="pln">
</span><span class="lit">35</span><span class="pln">              </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> arrMarks</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">36</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">37</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> arrMarks</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
</span><span class="lit">38</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0}\t{1}\t{2}"</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> arrNames</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> arrMarks</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
</span><span class="lit">39</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">  
</span><span class="lit">41</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"-------------------"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Sum\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Average\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">/(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">arrMarks</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">);</span><span class="pln">
</span><span class="lit">44</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">45</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">46</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">  </span><span class="pun">}</span></pre>

<p>
	يبدأ البرنامج السابق بالتصريح عن المصفوفتين <span style="font-family:courier new,courier,monospace;">arrMarks</span> لتخزين علامات الطلّاب و <span style="font-family:courier new,courier,monospace;">arrNames</span> لتخزين أسمائهم. كما يصرّح عن المتغيّر <span style="font-family:courier new,courier,monospace;">sum</span> لتخزين مجموع الدرجات. يعرض البرنامج عبارتين توضيحيّتين في السطرين 13 و 14، ثمّ تبدأ حلقة for في السطر 17 بجمع أسماء ودرجات الطلّاب في هذه المادّة. لاحظ كيف أنّنا وضعنا شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">i &lt; arrMarks.Length </span>(السطر 17). تعطينا الخاصيّة <span style="font-family:courier new,courier,monospace;">Length</span> للمصفوفة <span style="font-family:courier new,courier,monospace;">arrMarks</span> عدد العناصر ضمن هذه المصفوفة (عددها 5 في مثالنا). سيضمن ذلك تنفيذ حلقة <span style="font-family:courier new,courier,monospace;">for</span> لخمسة مرّات فقط. نبدأ اعتبارًا من السطر 29 بالتجهيز لعرض النتائج، حيث سنظهرها على شكل جدول يضم ثلاثة أعمدة الرقم المتسلسل للطالب <span style="font-family:courier new,courier,monospace;">No</span> والاسم <span style="font-family:courier new,courier,monospace;">Name</span> والدرجة <span style="font-family:courier new,courier,monospace;">Mark</span>. يطبع السطر 32 ترويسة هذا الجدول من خلال النص "No\tName\tMark" نستخدم المحرف t\ في النص السابق لترك مسافة جدولة tab تفصل بين كل عمودين. يدخل البرنامج بعد ذلك إلى حلقة إظهار النتائج اعتبارًا من السطر 35. لاحظ النص التنسيقيّ "{0}\t{1}\t{2}" في السطر 38، وظيفته أيضًا ترك مسافة جدولة بين كل عمودين. بعد الانتهاء من الحلقة نُظهر المجموع <span style="font-family:courier new,courier,monospace;">Sum</span> والمعدّل <span style="font-family:courier new,courier,monospace;">Average</span> بقسمة المجموع <span style="font-family:courier new,courier,monospace;">Sum</span> على عدد الطلاب.
</p>

<p>
	أمر أخير تجدر ملاحظته، في السطر 43 عند حساب المعدّل استخدمنا التعبير التالي: <span style="font-family:courier new,courier,monospace;">sum/(double)arrMarks.Length</span>، ويعود سبب وجود عامل التحويل (double) أمام <span style="font-family:courier new,courier,monospace;">arrMarks.Length</span> إلى جعل القسمة تجري بين قيمة من نوع <span style="font-family:courier new,courier,monospace;">int</span> (قيمة <span style="font-family:courier new,courier,monospace;">sum</span>) وقيمة من نوع <span style="font-family:courier new,courier,monospace;">double</span> لكي يصبح الناتج من نوع <span style="font-family:courier new,courier,monospace;">double</span>. لأنّه بدون عامل التحويل هذا، ستجري عمليّة القسمة بين قيمتين من نوع <span style="font-family:courier new,courier,monospace;">int</span> (الخاصيّة <span style="font-family:courier new,courier,monospace;">Length</span> هي من نوع <span style="font-family:courier new,courier,monospace;">int</span>) وبالتالي سيكون الناتج من نوع <span style="font-family:courier new,courier,monospace;">int</span> وتُهمل أي أجزاء عشريّة وهذا أمر غير مرغوب. لقد نفّذت البرنامج وقمت بتزويده ببعض البيانات، وحصلت عل الخرج التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16779" href="https://academy.hsoub.com/uploads/monthly_2016_05/fig01.png.3d66689ff8cca477ae29ba73263ae9b1.png" rel="" data-fileext="png"><img alt="fig01.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16779" data-unique="7v8ckhl4b" src="https://academy.hsoub.com/uploads/monthly_2016_05/fig01.thumb.png.2065e1d6746d2b0557d51d196e92247e.png"></a>
</p>

<h2 dir="rtl">
	استخدام المصفوفات مع أنواع من إنشاءنا
</h2>

<p dir="rtl">
	لا تختلف طريقة التعامل مع المصفوفات عناصرها من أنواع مضمّنة مع مصفوفات عناصرها من أصناف موجودة في مكتبة FCL أو حتى من أصناف ننشئها نحن، باستثناء أمرٍ مهمٍ واحد سنتعرّض له.
</p>

<p dir="rtl">
	سننشئ لهذا الغرض صنف جديد اسمه <span style="font-family:courier new,courier,monospace;">Student</span>، يحتوي هذا الصنف على خاصّتين: الاسم <span style="font-family:courier new,courier,monospace;">Name</span> والدرجة <span style="font-family:courier new,courier,monospace;">Mark</span>. سنصرّح بعد ذلك عن المتغيّر <span style="font-family:courier new,courier,monospace;">arrStudents</span> ليكون مصفوفة من النوع <span style="font-family:courier new,courier,monospace;">[]Student</span>. سيسلك هذا البرنامج نفس سلوك البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_01 </span>تمامًا، أي سيطلب درجات خمسة طلاب ليعرضهم ويحسب مجموع درجاتهم ومعدّلهم. انظر البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_02</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9443_15"><span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson09_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Student</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> </span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">9</span><span class="pln">       </span><span class="pun">}</span><span class="pln">
</span><span class="lit">10</span><span class="pln">
</span><span class="lit">11</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">12</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">14</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">              </span><span class="typ">Student</span><span class="pun">[]</span><span class="pln"> arrStudents </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pun">[</span><span class="lit">5</span><span class="pun">];</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              </span><span class="kwd">int</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Input Students Marks"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"====================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              </span><span class="com">//input loop.</span><span class="pln">
</span><span class="lit">22</span><span class="pln">              </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> arrStudents</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">24</span><span class="pln">                  arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Student</span><span class="pun">();</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th name: "</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">27</span><span class="pln">                  arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">28</span><span class="pln">
</span><span class="lit">29</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input student {0} th mark: "</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">30</span><span class="pln">                  string tmpMark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">31</span><span class="pln">                  arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Mark</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">tmpMark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">32</span><span class="pln">
</span><span class="lit">33</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">34</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">35</span><span class="pln">
</span><span class="lit">36</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">37</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Students Marks Table"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">38</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"===================="</span><span class="pun">);</span><span class="pln">
</span><span class="lit">39</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"No\tName\tMark"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">40</span><span class="pln">
</span><span class="lit">41</span><span class="pln">              </span><span class="com">//calculating sum and display output loop.</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> arrStudents</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">44</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Mark</span><span class="pun">;</span><span class="pln">
</span><span class="lit">45</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0}\t{1}\t{2}"</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">,</span><span class="pln"> arrStudents</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="typ">Mark</span><span class="pun">);</span><span class="pln">
</span><span class="lit">46</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">
</span><span class="lit">48</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"-------------------"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">49</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Sum\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">50</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Average\t\t{0}"</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">arrStudents</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">);</span><span class="pln">
</span><span class="lit">51</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">52</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">53</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">54</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	كلّ من البرنامجين <span style="font-family:courier new,courier,monospace;">Lesson09_01</span> و <span style="font-family:courier new,courier,monospace;">Lesson09_02</span> متشابهان من حيث الخرج. ولكن يتعامل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_02</span> مع المصفوفة <span style="font-family:courier new,courier,monospace;">arrStudents</span> التي عناصرها من النوع <span style="font-family:courier new,courier,monospace;">Student</span>. الصنف <span style="font-family:courier new,courier,monospace;">Student</span> مصرّح عنه في الأسطر من 5 إلى 9. والمصفوفة <span style="font-family:courier new,courier,monospace;">arrStudents</span> مصرّح عنها في السطر 15. يُعتبر السطر 24 مهمًا جدًا وفيه يتم إنشاء كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> وإسناده إلى كل عنصر من عناصر المصفوفة <span style="font-family:courier new,courier,monospace;">arrStudents</span> في كل دورة من دورات حلقة <span style="font-family:courier new,courier,monospace;">for</span>. إذا حاولت إزالة عبارة إنشاء الكائن من الصنف <span style="font-family:courier new,courier,monospace;">Student</span> في السطر 24 فسيعمل البرنامج ولكنّه سيتوقّف عن التنفيذ ويصدر خطأ عندما يصل التنفيذ إلى السطر 27. لأنّه عندما نصرّح عن مصفوفة عناصرها من أنواع ليست مضمّنة، فنحن في الحقيقة نصرّح عن متغيّرات فقط دون إنشاء كائنات ضمن هذه العناصر (المتغيّرات). وبالتالي لا يحق لنا الوصول إلى أعضاء كائن غير مُنشَأ أصلًا، فالتعبير <span style="font-family:courier new,courier,monospace;">arrStudents.Name</span> سيولّد خطأً مالم يكن هناك كائن فعلي ضمن العنصر <span style="font-family:courier new,courier,monospace;">[arrStudents[i</span> (أي عنصر المصفوفة ذو الدليل <span style="font-family:courier new,courier,monospace;">i</span>).
</p>

<h2 dir="rtl">
	حلقة foreach التكرارية
</h2>

<p dir="rtl">
	حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> من الحلقات التكراريّة المفيدة والتي تتسم بأسلوب عمل أقرب إلى المألوف. يمكن استخدام حلقة <span style="font-family:courier new,courier,monospace;">foreach</span> على المصفوفات والمجموعات كما سنرى لاحقًا. طريقة استخدام <span style="font-family:courier new,courier,monospace;">foreach</span> بسيطة سنتناولها من خلال البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_03</span> التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9443_17"><span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson09_03</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pun">[]</span><span class="pln"> arrNumbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">[</span><span class="lit">10</span><span class="pun">];</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              </span><span class="typ">Random</span><span class="pln"> random </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Random</span><span class="pun">();</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">              </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> arrNumbers</span><span class="pun">.</span><span class="typ">Length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">                  arrNumbers</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">.</span><span class="typ">Next</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="lit">15</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              foreach</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> n in arrNumbers</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">                  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	<span style="line-height: 2em;"><strong>ملاحظة</strong>: </span>البرنامج السابق بسيط، حيث يصرّح عن المصفوفة <span style="font-family:courier new,courier,monospace;">arrNumbers</span> بعشرة عناصر، ويعمل على تعبئة عناصرها بقيم عشوائيّة يحصل عليها من كائن من النوع <span style="font-family:courier new,courier,monospace;">Random</span>. صرّحنا عن المتغيّر <span style="font-family:courier new,courier,monospace;">random</span> وأسندنا إليه مرجع لكائن من الصنف <span style="font-family:courier new,courier,monospace;">Random</span> وذلك في السطر 10. في حلقة <span style="font-family:courier new,courier,monospace;">for</span> (الأسطر من 12 إلى 15) قمنا بتوليد أرقام عشوائيّة عن الطريق التابع <span style="font-family:courier new,courier,monospace;">(Next(100 </span>من الكائن <span style="font-family:courier new,courier,monospace;">random</span> والذي يولّد أرقامًا عشوائيّة صحيحة غير سالبة أقل من 100. بعد ذلك سنطبع هذه الأرقام العشوائيّة على الشاشة عن طريق حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>. مبدأ هذه الحلقة بسيط، منطق عملها يتلخّص على النحو التالي: "من أجل كل عنصر<span style="font-family:courier new,courier,monospace;"> n</span> موجود ضمن المصفوفة <span style="font-family:courier new,courier,monospace;">arrNumbers</span> نفّذ الشيفرة الموجودة في حاضنة <span style="font-family:courier new,courier,monospace;">foreach</span>". في مثالنا هذا تحتوي الحاضنة على عبارة برمجيّة واحدة (السطر 19).
</p>

<p dir="rtl">
	في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_03</span> السابق المتغيّر <span style="font-family:courier new,courier,monospace;">n</span> المصرّح عنه في السطر 17 والذي سيحمل قيمة مختلفة من عناصر المصفوفة <span style="font-family:courier new,courier,monospace;">arrNumbers</span> في كل دورة للحلقة، هو متغيّر للقراءة فقط read-only لا يمكن تغيير قيمته ضمن حاضنة <span style="font-family:courier new,courier,monospace;">foreach</span>.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	اكتب برنامجًا يعرّف مصفوفة من نوع <span style="font-family:courier new,courier,monospace;">int</span> بعشرة عناصر. ثم يطلب من المستخدم إدخال قيم لهذه العناصر. بعد ذلك يعمل البرنامج على ترتيب عناصر هذه المصفوفة تصاعديًّا.
</p>

<p dir="rtl">
	<strong>تلميح</strong>: تمتلك سي شارب أساليب جاهزة وسريعة لمثل عمليّات الترتيب هذه، ولكنّنا نريد في هذا المثال التدرُّب على الحلقات والمصفوفات.
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	عدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson09_02</span> السابق لكي يسمح للمستخدم بإدخال بيانات عدد كيفي من الطلّاب.
</p>

<p dir="rtl">
	<strong>تلميح</strong>: ستحتاج لأن تطلب من المستخدم إدخال عدد الطلاب المراد إدخال بياناتهم أولًا، ومن ثمّ تصرّح عن المصفوفة <span style="font-family:courier new,courier,monospace;">arrStudents</span> بالعدد المطلوب.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تعرّفنا في هذا الدرس على المصفوفات وطرق استخدامها. توجد في الحقيقة مزايا أخرى تتمتّع بها المصفوفات مثل إمكانيّة نسخ مصفوفة إلى مصفوفة أخرى، وغيرها من المزايا الأخرى التي سنتناولها في الدروس والسلاسل القادمة. كما تعرّفنا أيضًا على الحلقة التكراريّة <span style="font-family:courier new,courier,monospace;">foreach</span> التي يُعتبر أسلوب عملها مألوفًا، وهي مفيدة جدًا عند استخدامها مع المجموعات كما سنرى لاحقًا.
</p>
]]></description><guid isPermaLink="false">341</guid><pubDate>Fri, 27 May 2016 18:49:00 +0000</pubDate></item><item><title>&#x62A;&#x637;&#x628;&#x64A;&#x642; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x644;&#x62B;</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB-r338/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.png.ce0e06bcf7c1f54159470f1f5a14e72a.png" /></p>

<p dir="rtl">
	تحدثنا في الدرسين السابقين عن <a href="https://academy.hsoub.com/programming/c-sharp/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r330/" rel="">المبادئ الأوليّة لتطبيق مفاهيم البرمجة الكائنيّة التوجّه في سي شارب</a>. سننهي في هذا الدرس تطبيق هذه المبادئ، حيث سنتناول موضوع الوراثة Inheritance والتعدديّة الشكليّة Polymorphism، كما سنتعرّف على محدّد الوصول protected الذي يُستخدم في الوراثة.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16713" data-unique="kag75d6hc" src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.png.42c1f83c6b1e46778ada8157be7f8879.png" alt="learn-csharp-oop.png.png"></p>

<h2 dir="rtl">
	الوراثة Inheritance
</h2>

<p dir="rtl">
	سبق وأن قدّمنا للوراثة، واتفقنا على أنّها من أهمّ المفاهيم التي يمكن أن تدعمها لغات البرمجة كائنيّة التوجّه. في الحقيقة يرث أيّ صنف موجود في إطار عمل دوت نت أو أيّ صنف تنشئه بنفسك بشكل مباشر أو غير مباشر من الصنف Object حتى ولو لم نخبر مترجم سي شارب بذلك، حيث سيعمل المترجم على الوراثة منه بشكل ضمنيّ. هذا الصنف ذو دلالة عامّة، وهو غير مفيد كثيرًا كاستخدام بحدّ ذاته. يحتوي الصنف Object على عدد قليل من التوابع كأعضاء ضمنه مثل <span style="font-family:courier new,courier,monospace;">Equals</span> و <span style="font-family:courier new,courier,monospace;">GetHashCode</span> و <span style="font-family:courier new,courier,monospace;">GetType</span> و <span style="font-family:courier new,courier,monospace;">ToString</span>. التابع الأكثر استخدامًا هو التابع <span style="font-family:courier new,courier,monospace;">ToString</span>، وهو يُستخدَم عادةً للحصول على التمثيل النصيّ لأيّ كائن.
</p>

<p dir="rtl">
	لكي نفهم الوراثة بشكل عمليّ لا بدّ لنا من مثال تمهيديّ. سننشئ لهذا الغرض صنف أب سأسمّيه <span style="font-family:courier new,courier,monospace;">Father</span>. سيكون هذا الصنف هو الأساس الذي نرث منه. لهذا الصنف الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_10">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
</span><span class="pun">{</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Father</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Father: In Constructor"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">MyMethod</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Father: In MyMethod"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	يحتوي هذا الصنف على التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الذي يحوي الكلمة <span style="font-family:courier new,courier,monospace;">void</span> قبل اسم التابع مباشرةً. تعني هذه الكلمة أنّ التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> لن يُرجع أي قيمة للشيفرة التي استدعته. كما يحتوي الصنف <span style="font-family:courier new,courier,monospace;">Father</span> على البانية عديمة الوسائط <span style="font-family:courier new,courier,monospace;">Father</span>. وضعت عبارتي <span style="font-family:courier new,courier,monospace;">Writeline</span> في كلّ تابع من باب التوضيح. الآن سنعرّف صنفًا جديدًا لنسمّه <span style="font-family:courier new,courier,monospace;">Child</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">Father</span> على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_12">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Child</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
</span><span class="pun">{</span><span class="pln">

</span><span class="pun">}</span></pre>

<p dir="rtl">
	قد يبدو الصنف <span style="font-family:courier new,courier,monospace;">Child</span> فارغًا إلّا أنّه ليس كذلك. لاحظ من السطر الأوّل لتصريح هذا الصنف كيف وضعنا النقطتان الرأسيّتان (:) ومن ثمّ اسم الصنف <span style="font-family:courier new,courier,monospace;">Father</span>. يخبر ذلك مترجم سي شارب أنّنا نريد من الصنف <span style="font-family:courier new,courier,monospace;">Child</span> أن يرث من الصنف <span style="font-family:courier new,courier,monospace;">Father</span>. في الحقيقة جميع الأعضاء المعرّفة ضمن الصنف <span style="font-family:courier new,courier,monospace;">Father</span> ستصبح موجودة تلقائيًّا ضمن الصنف <span style="font-family:courier new,courier,monospace;">Child</span>، بل ويمكن إضافة المزيد من الأعضاء إلى الصنف <span style="font-family:courier new,courier,monospace;">Child</span> بحسب الحاجة.
</p>

<p dir="rtl">
	أنشئ مشروعًا جديدًا وسمّه <span style="font-family:courier new,courier,monospace;">Lesson08_01</span>، ضع الصنفين السابقين بجوار الصنف <span style="font-family:courier new,courier,monospace;">Program</span> ضمن فضاء الاسم <span style="font-family:courier new,courier,monospace;">Lesson08_01 </span>ثم اكتب الشيفرة التالية ضمن التابع <span style="font-family:courier new,courier,monospace;">Main</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_14">
<span class="typ">Child</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">();</span><span class="pln">

c</span><span class="pun">.</span><span class="typ">MyMethod</span><span class="pun">();</span></pre>

<p dir="rtl">
	نفّذ البرنامج لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_22">
<span class="pln">Father: In Constructor
Father: In MyMethod</span></pre>

<p dir="rtl">
	من الواضح أنّ التنفيذ سيدخل إلى بانية الصنف <span style="font-family:courier new,courier,monospace;">Father</span> (تذكّر أنّ البانية هي أوّل تابع يُستدعى عند إنشاء الكائن) وإلى التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> وكلاهما موجودان ضمن الصنف الأب <span style="font-family:courier new,courier,monospace;">Father</span>.
</p>

<p dir="rtl">
	لنضيف بعض التعديلات على الصنف <span style="font-family:courier new,courier,monospace;">Child</span>. عدّل الصنف <span style="font-family:courier new,courier,monospace;">Child</span> ليصبح كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_18">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Child</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
</span><span class="pun">{</span><span class="pln">

  </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Child: In Constructor"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لاحظ أنّنا قد أضفنا بانية عديمة الوسائط للصنف <span style="font-family:courier new,courier,monospace;">Child</span> وبداخلها التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> لطباعة جملة توضيحيّة. أعد تنفيذ البرنامج السابق لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_20">
<span class="pln">Father: In Constructor
Child: In Constructor
Father: In MyMethod</span></pre>

<p>
	الخرج السابق منطقيّ تمامًا. عند إنشاء كائن من الصنف <span style="font-family:courier new,courier,monospace;">Child</span> باستخدام العبارة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_24">
<span class="typ">Child</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">();</span></pre>

<p dir="rtl">
	فإنّ بانية الصنف <span style="font-family:courier new,courier,monospace;">Child</span> سُتستدعى نتيجة لذلك، وبما أنّ الصنف <span style="font-family:courier new,courier,monospace;">Child</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">Father</span> لذلك فإنّ بانية الصنف <span style="font-family:courier new,courier,monospace;">Father</span> هي من ستُنفّذ أولًا ومن ثمّ بانية الصنف <span style="font-family:courier new,courier,monospace;">Child</span>. أمّا عند استدعاء التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> من الكائن الموجود ضمن المتغيّر <span style="font-family:courier new,courier,monospace;">c</span> فسنحصل على رسالة الخرج الثالثة كما هو متوقّع.
</p>

<p dir="rtl">
	لنجرّب الآن شيئًا آخر. ماذا لو أردنا استبدال محتوى التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> بمحتوى خاص بالابن، بمعنى آخر نريد "تجاوز" تعريف التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود في الصنف الأب <span style="font-family:courier new,courier,monospace;">Father</span> إلى تعريف آخر للتابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> ولكنّه خاص بالصنف <span style="font-family:courier new,courier,monospace;">Child</span>. أضف التابع التالي إلى الصنف <span style="font-family:courier new,courier,monospace;">Child</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_26">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">MyMethod</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Child: In MyMethod"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لاحظ وجود الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">new</span> بعد مُحدّد الوصول <span style="font-family:courier new,courier,monospace;">public</span>. وظيفة هذه الكلمة في هذا المكان هي إخفاء التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود في الصنف <span style="font-family:courier new,courier,monospace;">Father</span> واستبداله بالتابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود في الصنف <span style="font-family:courier new,courier,monospace;">Child</span>.
</p>

<p dir="rtl">
	الآن بعد تنفيذ البرنامج ستحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_28">
<span class="pln">Father: In Constructor
Child: In Constructor
Child: In MyMethod</span></pre>

<p dir="rtl">
	تمّ المطلوب، لقد أُخفي التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود ضمن الصنف الأب <span style="font-family:courier new,courier,monospace;">Father</span> لصالح التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود ضمن الصنف الابن <span style="font-family:courier new,courier,monospace;">Child</span>. يجب أن يبدو البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_01 </span>بعد التعديلات الأخيرة شبيهًا بما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_30">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson08_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Father</span><span class="pun">()</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Father: In Constructor"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">MyMethod</span><span class="pun">()</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Father: In MyMethod"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">16</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Child</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Father</span><span class="pln">
</span><span class="lit">19</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">()</span><span class="pln">
</span><span class="lit">21</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Child: In Constructor"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">MyMethod</span><span class="pun">()</span><span class="pln">
</span><span class="lit">26</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Child: In MyMethod"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">30</span><span class="pln">
</span><span class="lit">31</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">32</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">33</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">34</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">35</span><span class="pln">              </span><span class="typ">Child</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Child</span><span class="pun">();</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">              c</span><span class="pun">.</span><span class="typ">MyMethod</span><span class="pun">();</span><span class="pln">
</span><span class="lit">38</span><span class="pln">
</span><span class="lit">39</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">41</span><span class="pln">  </span><span class="pun">}</span></pre>

<h2 dir="rtl">
	محدد الوصول protected
</h2>

<p dir="rtl">
	يُستخدم محدّد الوصول <span style="font-family:courier new,courier,monospace;">protected</span> في الوراثة. فعندما نُعرّف أحد أعضاء الصنف الأب باستخدام <span style="font-family:courier new,courier,monospace;">protected</span> فهذا يعني أنّه لا يمكن الوصول إليه مطلقًا إلّا من خلال أعضاء الصنف الأب نفسه، أو من خلال أعضاء الصنف الابن (أو الأحفاد).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_32">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">    namespace </span><span class="typ">Lesson08_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">    </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">protected</span><span class="pln"> string manufacturer</span><span class="pun">;</span><span class="pln">
</span><span class="lit">8</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Car</span><span class="pun">()</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">11</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">manufacturer </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Car"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Manufacturer</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              </span><span class="typ">Get</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">18</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">manufacturer</span><span class="pun">;</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">
</span><span class="lit">23</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Toyota</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Car</span><span class="pln">
</span><span class="lit">24</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Toyota</span><span class="pun">()</span><span class="pln">
</span><span class="lit">26</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">manufacturer </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Toyota"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">28</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">30</span><span class="pln">
</span><span class="lit">31</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">32</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">33</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">34</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">35</span><span class="pln">              </span><span class="typ">Toyota</span><span class="pln"> toyota </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Toyota</span><span class="pun">();</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">toyota</span><span class="pun">.</span><span class="typ">Manufacturer</span><span class="pun">);</span><span class="pln">
</span><span class="lit">38</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	عند تنفيذ البرنامج ستحصل على الكلمة Toyota في الخرج. السبب في ذلك أنّ بانية الصنف Toyota تصل إلى الحقل <span style="font-family:courier new,courier,monospace;">manufacturer</span> في السطر 27، رغم أنّه مصرّح عنه في الصنف الأب <span style="font-family:courier new,courier,monospace;">Car</span>، وذلك لأنّه ذو محدّد وصول <span style="font-family:courier new,courier,monospace;">protected</span>. من الواضح أنّ الأعضاء المصرّح عنها باستخدام محدّد الوصول <span style="font-family:courier new,courier,monospace;">private</span> في الأصناف الآباء تبقى مرئيّةً فقط ضمن أعضاء الصنف الأب فحسب.
</p>

<h2 dir="rtl">
	التعددية الشكلية Polymorphism
</h2>

<p dir="rtl">
	سبق وأن تحدّثنا عن التعدديّة الشكليّة، وكيف أنّها مفهوم أساسيّ في البرمجة كائنيّة التوجّه. يتمحور مفهوم التعدديّة الشكليّة حول أنّه يحق للصنف الابن إعادة صياغة تابع (أو خاصيّة) موجود في صنف أب بصورةٍ تناسبه أكثر. لقد طبّقنا هذا المفهوم قبل قليل وذلك عندما "تجاوز" التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> في الصنف الابن <span style="font-family:courier new,courier,monospace;">Child</span>، التابع <span style="font-family:courier new,courier,monospace;">MyMethod</span> الموجود في الصنف الأب <span style="font-family:courier new,courier,monospace;">Father</span>، فأصبح التابع الموجود في الابن يُعبّر عن نفسه بشكل أكثر تخصّصًا. ولكن هذه ليست هي الطريقة المثلى لتنفيذ فكرة التعدديّة الشكلية، تزوّدنا سي شارب في الواقع بأسلوب أفضل بكثير لتحقيق هذا المفهوم. هل تذكر مثال الضفدع Frog والسمكة Fish والطائر Bird وسلوكيّة الانتقال Move التي يرثونها من الصنف <span style="font-family:courier new,courier,monospace;">Animal</span>؟
</p>

<p dir="rtl">
	تناولنا هذا المثال البسيط في درس سابق. وقد ذكرنا أنّ الصنف <span style="font-family:courier new,courier,monospace;">Animal</span> هو الصنف الأب للأصناف <span style="font-family:courier new,courier,monospace;">Frog</span> و <span style="font-family:courier new,courier,monospace;">Fish</span> و <span style="font-family:courier new,courier,monospace;">Bird</span> وهو يحتوي على التابع <span style="font-family:courier new,courier,monospace;">Move</span> الذي يُعبّر عن سلوكيّة الانتقال. وبما أنّ كلًّا من الأصناف الأبناء الثلاثة تُعبّر بشكل مختلف عن عمليّة الانتقال، لذلك فنحن أمام التعدديّة الشكليّة. يحتوي البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_03</span> على صنف أب <span style="font-family:courier new,courier,monospace;">Animal</span> يحوي تابعًا وحيدًا اسمه <span style="font-family:courier new,courier,monospace;">Moveـ</span> موسوم بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">virtual</span> التي تجعل منه تابعًا ظاهريًّا يسمح للتوابع الأخرى بتجاوزه. بالإضافة إلى وجود ثلاثة أصناف أبناء للصنف <span style="font-family:courier new,courier,monospace;">Animal</span> وهي <span style="font-family:courier new,courier,monospace;">Frog</span> و <span style="font-family:courier new,courier,monospace;">Fish</span> و <span style="font-family:courier new,courier,monospace;">Bird</span>. يحتوي كل صنف من الأصناف الأبناء على التابع <span style="font-family:courier new,courier,monospace;">Move</span> مع وسم خاص هو override. تسمح هذه الكلمة للتابع في الصنف الابن أن "يتجاوز" تعريف نفس التابع في الصنف الأب (موسوم بالكلمة virtual). أعني بكلمة "تجاوز" إعادة تعريف التابع بالشكل الذي يناسب الصنف الابن. فعند الحديث عن الانتقال، فالذي يناسب الضفدع <span style="font-family:courier new,courier,monospace;">Frog</span> هو القفز، والذي يناسب السمكة <span style="font-family:courier new,courier,monospace;">Fish</span> هو السباحة، والذي يناسب الطائر <span style="font-family:courier new,courier,monospace;">Bird</span> بالطبع هو الطيران. وبالمناسبة فإنّ التابع <span style="font-family:georgia,serif;">ToString</span> الموجود في الصنف Object هو تابع ظاهريّ (موسوم بالكلمة virtual) ليسمح لأي صنف آخر بتجاوزه.
</p>

<p dir="rtl">
	إليك الآن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_03</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_34">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson08_03</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> virtual </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Animal: Move General Method"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">12</span><span class="pln">
</span><span class="lit">13</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Frog</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln">
</span><span class="lit">14</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">16</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Frog - Move: jumping 20 cm"</span><span class="pun">);</span><span class="pln"> 
</span><span class="lit">18</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Bird</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln">
</span><span class="lit">22</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">25</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Brid - Move: flying 10 m"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">26</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">27</span><span class="pln">
</span><span class="lit">28</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Fish</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Animal</span><span class="pln">
</span><span class="lit">31</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">32</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="lit">33</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">34</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Fish - Move: swimming 1 m"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">35</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">36</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">37</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">38</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">39</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">40</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">41</span><span class="pln">              </span><span class="typ">Frog</span><span class="pln"> frog </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Frog</span><span class="pun">();</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              </span><span class="typ">Fish</span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Fish</span><span class="pun">();</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="typ">Bird</span><span class="pln"> bird </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Bird</span><span class="pun">();</span><span class="pln">
</span><span class="lit">44</span><span class="pln">
</span><span class="lit">45</span><span class="pln">              frog</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">();</span><span class="pln">
</span><span class="lit">46</span><span class="pln">              fish</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">();</span><span class="pln">
</span><span class="lit">47</span><span class="pln">              bird</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">();</span><span class="pln">
</span><span class="lit">48</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">49</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">50</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	نفّذ البرنامج السابق لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_36">
<span class="pln">Frog - Move: jumping 20 cm
Fish - Move: swimming 1 m
Brid - Move: flying 10 m</span></pre>

<p dir="rtl">
	لاحظ كيف يُعبّر كلّ كائن من الأصناف الأبناء عن التابع <span style="font-family:courier new,courier,monospace;">Move</span> بالشكل الذي يناسبه. وواضح أنّ التابع <span style="font-family:courier new,courier,monospace;">Move</span> الموجود في الصنف الأب <span style="font-family:courier new,courier,monospace;">Animal</span> لا يُستدعى مطلقًا. ولكن في بعض الحالات قد نرغب أن يُستدعى التابع المُتجاوَز الموجود في الصنف الأب لإنجاز بعض المهام ومن ثمّ نتابع العمل ضمن التابع المُتجاوِز. يمكننا ذلك ببساطة من خلال استخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">base</span> التي تُشير إلى الصنف الأب الذي يرث منه الابن. لاستدعاء التابع <span style="font-family:courier new,courier,monospace;">Move</span> الموجود في الصنف الأب <span style="font-family:courier new,courier,monospace;">Animal</span> وذلك من خلال التابع <span style="font-family:courier new,courier,monospace;">Move</span> الموجود في الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> أضف العبارة التالية بعد السطر 16 مباشرةً قبل أي عبارة أخرى، ليصبح هذا التابع على الشكل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_38">
<span class="kwd">public</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    base</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">();</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Frog - Move: jumping 20 cm"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	أعد تنفيذ البرنامج لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_40">
<span class="pln">Animal: Move General Method
Frog - Move: jumping 20 cm
Fish - Move: swimming 1 m
Brid - Move: flying 10 m</span></pre>

<p dir="rtl">
	انظر كيف استُدعي التابع <span style="font-family:courier new,courier,monospace;">Move</span> الموجود في الصنف الأب <span style="font-family:courier new,courier,monospace;">Animal</span> ومن ثمّ استُدعي التابع <span style="font-family:courier new,courier,monospace;">Move</span> الموجود في الصنف الابن <span style="font-family:courier new,courier,monospace;">Frog</span>.
</p>

<h2 dir="rtl">
	التحويل بين الأنواع
</h2>

<p dir="rtl">
	سنتناول في هذه الفقرة سلوكًا قد يبدو غريبًا بعض الشيء، ولكنّه مهم وأساسيّ وسيصادفك في معظم البرامج التي تكتبها باستخدام سي شارب. أعد البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_03</span> إلى حالته الأصلية (أي أزل العبارة <span style="font-family:courier new,courier,monospace;">()base.Move</span>). امسح محتويات التابع <span style="font-family:courier new,courier,monospace;">Main</span> واستبدلها بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_42">
<span class="typ">Animal</span><span class="pln"> animal </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Frog</span><span class="pun">();</span><span class="pln">
animal</span><span class="pun">.</span><span class="typ">Move</span><span class="pun">();</span></pre>

<p dir="rtl">
	العبارة الأولى غريبة قليلًا أليس كذلك؟ في الحقيقة الوضع طبيعي تمامًا، فبما أنّ الصنف <span style="font-family:courier new,courier,monospace;">Animal</span> هو صنف أب للصنف <span style="font-family:courier new,courier,monospace;">Frog</span> لذلك فيستطيع أيّ متغيّر مصرّح عنه على أنّه من النوع <span style="font-family:courier new,courier,monospace;">Animal</span> (في مثالنا هذا هو المتغيّر animal) أن يخزّن مرجع إلى كائن من الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> (تذكّر أنّ التعبير <span style="font-family:courier new,courier,monospace;">()new Frog</span> يولّد مرجع لكائن من الصنف <span style="font-family:courier new,courier,monospace;">Frog</span>). نفّذ البرنامج الآن لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_44">
<span class="pln">Frog - Move: jumping 20 cm</span></pre>

<p dir="rtl">
	يبدو أنّ برنامجنا ذكيّ كفاية لكي يعرف أنّ الكائن الذي يشير إليه المتغيّر <span style="font-family:courier new,courier,monospace;">animal</span> هو كائن من الصنف <span style="font-family:courier new,courier,monospace;">Frog</span>. في الحقيقة يحصل هنا تحويل ضمني بين الكائنات، ولكن إذا فعلنا العكس، أي أسندنا مرجع لكائن من الصنف <span style="font-family:courier new,courier,monospace;">Animal</span> إلى متغيّر من النوع <span style="font-family:courier new,courier,monospace;">Frog</span> فسنحصل على خطأ أثناء ترجمة البرنامج. امسح محتويات التابع <span style="font-family:courier new,courier,monospace;">Main</span> واستبدلها بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_46">
<span class="typ">Animal</span><span class="pln"> animal </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Frog</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Frog</span><span class="pln"> frog </span><span class="pun">=</span><span class="pln"> animal</span><span class="pun">;</span></pre>

<p dir="rtl">
	نحاول في السطر الثاني أن نُسند المتغيّر <span style="font-family:courier new,courier,monospace;">animal</span> من النوع <span style="font-family:courier new,courier,monospace;">Animal</span> إلى المتغيّر <span style="font-family:courier new,courier,monospace;">frog</span> من النوع <span style="font-family:courier new,courier,monospace;">Frog</span>، فنحصل على الخطأ التالي عند محاولة تنفيذ البرنامج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8913_48">
<span class="pln">Cannot implicitly convert type 'Lesson08_03.Animal' to 'Lesson08_03.Frog'. An explicit conversion exists (are you missing a cast?)</span></pre>

<p dir="rtl">
	يخبرنا هذا الخطأ أنّه لا يمكن التحويل بشكل ضمنيّ من النوع <span style="font-family:courier new,courier,monospace;">Animal</span> إلى النوع <span style="font-family:courier new,courier,monospace;">Frog</span> ويقترح علينا استخدام عامل التحويل بين الأنواع casting (هل تذكره؟). رغم أنّ المتغيّر <span style="font-family:courier new,courier,monospace;">animal</span> يحمل مرجع إل كائن من الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> في حقيقة الأمر (انظر السطر الأوّل من الشيفرة السابقة) إلّا أنّنا عند محاولتنا إسناد المتغيّر <span style="font-family:courier new,courier,monospace;">animal</span> إلى المتغيّر <span style="font-family:courier new,courier,monospace;">frog</span> حصلنا على خطأ. السبب في ذلك هو أنّه لا يحدث تحويل ضمنيّ بين الأنواع implicit conversion وإنّما يتطلّب الأمر إجراء تحويل صريح باستخدام عامل التحويل بين الأنواع. إذا استبدلت السطر الثاني من الشيفرة السابقة بالسطر التالي، ستكون الأمور على ما يرام:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_50">
<span class="typ">Frog</span><span class="pln"> frog </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Frog</span><span class="pun">)</span><span class="pln">animal</span><span class="pun">;</span></pre>

<p dir="rtl">
	لاحظ كيف وضعنا عامل التحويل (<span style="font-family:courier new,courier,monospace;">Frog</span>) أمام المتغيّر <span style="font-family:courier new,courier,monospace;">animal</span>. سيضمن ذلك حدوث التحويل المطلوب دون أيّ مشاكل.
</p>

<p dir="rtl">
	لكي تريح نفسك من التفكير متى يحدث التحويل الضمنيّ ومتى يجب استخدام التحويل الصريح، تذكّر منّي القاعدة التالية: "في حياتنا اليوميّة، كثيرًا ما يحتوي الأب ابنه، ولكنّ العكس ليس صحيحًا".
</p>

<p dir="rtl">
	أعلم أنّ لهذه القاعدة شواذ في واقعنا، ولكنّها في البرمجة لا تخيب! فالمتغيّر من النوع الأب يستطيع استقبال أي مرجع لكائن من صنف ابن، ولكنّ العكس ليس صحيح ما لم نستخدم التحويل الصريح بين الأنواع.
</p>

<p dir="rtl">
	تحدث ظاهرة التحويل بين الأنواع بالنسبة للأنواع المضمّنة built-in أيضًا. فهناك تحويلات تحدث ضمنيًّا، وأخرى تحدث بتدخّل من المبرمج باستخدام عامل التحويل بين الأنواع، ولكن مع فرق جوهريّ. ففي هذه الحالة ليس بالضرورة أن يكون بين الأنواع التي تجري عمليّة التحويل فيما بينها أي علاقة وراثة. فمثلًا يمكن التحويل ضمنيًّا بين متغيّر من النوع <span style="font-family:courier new,courier,monospace;">int</span> إلى آخر من النوع <span style="font-family:courier new,courier,monospace;">double</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_52">
<span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> i</span><span class="pun">;</span></pre>

<p dir="rtl">
	أمّا إذا حاولنا فعل العكس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_54">
<span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> d</span><span class="pun">;</span></pre>

<p dir="rtl">
	فسنحصل على نفس الخطأ السابق الذي يخبرنا بوجوب استخدام التحويل الصريح بين الأنواع. يمكن حل هذه المشكلة ببساطة باستخدام عامل التحويل (<span style="font-family:courier new,courier,monospace;">int</span>) ووضعه أمام المتغيّر <span style="font-family:courier new,courier,monospace;">d</span> في السطر الثاني:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8913_56">
<span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">d</span><span class="pun">;</span></pre>

<p dir="rtl">
	نخبر المترجم هنا أنّنا نريد التحويل فعليًّا من <span style="font-family:courier new,courier,monospace;">double</span> إلى <span style="font-family:courier new,courier,monospace;">int</span>. ستحتاج إلى مثل هذه التقنيّة دومًا إذا كانت عمليّة التحويل ستؤدّي إلى ضياع في البيانات. فالتحويل من <span style="font-family:courier new,courier,monospace;">double</span> إلى <span style="font-family:courier new,courier,monospace;">int</span> سيؤدّي إلى ضياع القيمة على يمين الفاصلة العشريّة لأنّ المتغيّرات من النوع <span style="font-family:courier new,courier,monospace;">int</span> لا تقبلها. وكذلك الأمر عند التحويل من <span style="font-family:courier new,courier,monospace;">float</span> إلى <span style="font-family:courier new,courier,monospace;">double</span> لأنّ المتغيّرات من النوع <span style="font-family:courier new,courier,monospace;">float</span> ذات دقّة أقل من المتغيّرات من النوع <span style="font-family:courier new,courier,monospace;">double</span>، وهكذا.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	عدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_03</span> ليعمل كل صنف من الأصناف <span style="font-family:courier new,courier,monospace;">Frog</span> و <span style="font-family:courier new,courier,monospace;">Bird</span> و <span style="font-family:courier new,courier,monospace;">Fish</span> على تجاوز التابع <span style="font-family:courier new,courier,monospace;">ToString</span> (الموجود في الصنف الأب Object). بحيث عند استدعاء التابع <span style="font-family:courier new,courier,monospace;">ToString</span> من كائن من الصنف <span style="font-family:courier new,courier,monospace;">Frog</span> نحصل على النص "I am Frog"، وهكذا بالنسبة للصنفين الباقيين كلّ حسب اسمه.
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	<a name="_GoBack" rel="external"></a> استفد من البرنامج <span style="font-family:courier new,courier,monospace;">Lesson08_02</span> في إنشاء صنف جديد اسمه <span style="font-family:courier new,courier,monospace;">Corolla</span> يرث من الصنف <span style="font-family:courier new,courier,monospace;">Toyota</span>. وأضف إلى الصنف الجديد الخاصيّة <span style="font-family:courier new,courier,monospace;">ProductionYear</span> من النوع <span style="font-family:courier new,courier,monospace;">int</span>. بعد ذلك أنشئ كائنًا من الصنف <span style="font-family:courier new,courier,monospace;">Corolla</span> وحاول إسناد قيم لهذه الخاصيّة، وقرائتها منها.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تعرّفنا في هذا الدرس على كيفيّة تطبيق الوراثة في سي شارب، كما تعرّفنا على مبادئ التعدديّة الشكليّة Polymorphism وأهميّتها وكيفيّة استثمارها في هذه اللغة. وتعاملنا أيضًا مع التحويل بين الأنواع ورأينا كيف يمكن لمتغيّر من صنف أب أن يحمل مراجع لكائنات من أصناف أبناء. تُستَخدم هذه الأساليب على نحو واسع جدًّا في مكتبة الأصناف الأساسيّة، وستحتاجها في العديد من التطبيقات التي تُنشئها.
</p>
]]></description><guid isPermaLink="false">338</guid><pubDate>Tue, 24 May 2016 18:40:42 +0000</pubDate></item><item><title>&#x62A;&#x637;&#x628;&#x64A;&#x642; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C  - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r335/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.f1939b7b8c0f9c7f273da17ec491440f.png" /></p>

<p dir="rtl">
	<a name="__DdeLink__2286_2138472789" rel="external"></a> تحدثنا في الدرس السابق عن <a href="https://academy.hsoub.com/programming/c-sharp/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r330/" rel="">المبادئ الأوليّة لتطبيق مفاهيم البرمجة كائنيّة التوجّه في سي شارب</a>، حيث تعلّمنا كيفيّة إنشاء الأصناف وأعضائها، وإنشاء الكائنات من الأصناف والتعامل معها.
</p>

<p dir="rtl">
	سنتابع في هذا الدرس الحديث عن تطبيق مبادئ البرمجة كائنيّة التوجّه في سي شارب حيث سنتناول مُحدّد الوصول <span style="font-family:courier new,courier,monospace;">private</span> (تناولنا محدّد الوصول <span style="font-family:courier new,courier,monospace;">public</span> في الدرس السابق). وسنتحدّث أيضًا عن الخصائص Properties كنوع جديد من أعضاء الصنف، والفرق بينها وبين حقول البيانات Data Fields. وسنختم هذا الدرس بالحديث عن الأعضاء الساكنة Static Members في الصنف.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16639" data-unique="rsfxips71" src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.46e656d2c9232bbe0b3b7b4e696e6d7b.png" alt="learn-csharp-oop.png"></p>

<h2 dir="rtl">
	الخصائص Properties
</h2>

<p dir="rtl">
	للخصائص ولحقول البيانات المعنى المنطقيّ نفسه في البرمجة كائنيّة التوجّه، إلّا أنّ سي شارب تميّز بينهما من الناحية العمليّة. للخصائص في سي شارب مرونة أكبر، حيث من الممكن تنفيذ عبارات برمجيّة عند إسناد قيمة إلى خاصيّة أو حتى عند القراءة منها. كما من الممكن أن نجعل إحدى الخواص قابلة للقراءة فقط أو حتى قابلة للكتابة فقط (ولو أنّه أمر نادر الحدوث). لفهم هذه المزايا بشكل جيّد سأستعير البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_02</span> من الدرس السابق، وأجري عليه بعض التعديلات لإدخال مفهوم الخصائص.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3296_7">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson07_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">7</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">private</span><span class="pln"> string firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">private</span><span class="pln"> string lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="kwd">get</span><span class="pln">
</span><span class="lit">15</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="kwd">set</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName </span><span class="pun">=</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln"> 
</span><span class="lit">24</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">26</span><span class="pln">              </span><span class="kwd">get</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">28</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">30</span><span class="pln">              </span><span class="kwd">set</span><span class="pln">
</span><span class="lit">31</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">32</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">lastName </span><span class="pun">=</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
</span><span class="lit">33</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">35</span><span class="pln">  
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pln">
</span><span class="lit">38</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">39</span><span class="pln">              </span><span class="kwd">get</span><span class="pln">
</span><span class="lit">40</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">41</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="kwd">set</span><span class="pln">
</span><span class="lit">44</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">salary </span><span class="pun">=</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
</span><span class="lit">46</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">48</span><span class="pln">
</span><span class="lit">49</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">50</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">51</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">52</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">53</span><span class="pln">
</span><span class="lit">54</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">55</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">56</span><span class="pln">
</span><span class="lit">57</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">58</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">59</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">60</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">61</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">62</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">63</span><span class="pln">
</span><span class="lit">64</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">65</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">66</span><span class="pln">
</span><span class="lit">67</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">68</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">69</span><span class="pln">
</span><span class="lit">70</span><span class="pln">
</span><span class="lit">71</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">72</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">73</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">74</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">75</span><span class="pln">              </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">76</span><span class="pln">
</span><span class="lit">77</span><span class="pln">              employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="lit">78</span><span class="pln">              employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Saleh"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">);</span><span class="pln">
</span><span class="lit">79</span><span class="pln">
</span><span class="lit">80</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">81</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">82</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">83</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">84</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	عند تنفيذ البرنامج <span style="font-family:courier new,courier,monospace;">Lesson07_01</span> سنحصل على نفس الخرج الذي حصلنا عليه في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_02</span>. لقد أجرينا في الحقيقة بعض التعديلات التي تبدو للوهلة الأولى أنّها ليست ذات مغزى. لقد استبدلنا محدّد الوصول للحقول في الأسطر من 8 حتى 10 ليصبح <span style="font-family:courier new,courier,monospace;">private</span> بدلًا من <span style="font-family:courier new,courier,monospace;">public</span> (كما كان الوضع في البرنامج<span style="font-family:courier new,courier,monospace;"> Lesson06_02</span>). يفيد مُحدّد الوصول هذا في جعل الحقل خاصًّا بالصنف ولا يمكن الوصول إليه من خارج الكائن المُنشَأ من هذا الصنف، وبالتالي لا يمكن لأحد أن يُعدّل عليه إلّا التوابع الموجودة ضمن نفس الصنف حصرًا. الأمر الآخر أنّنا قد جعلنا أسماء الحقول تبدأ بحرف طباعي صغير وذلك لتمييزها عن الخصائص التي ستأتي بعدها والتي تحمل نفس الاسم ولكن بحرف طباعي كبير.
</p>

<p dir="rtl">
	يبدأ التصريح عن الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> في السطر 12 ويمتدّ حتى السطر 22. للخصائص في سي شارب فوائد عظيمة سنختبرها بالتدريج في هذا الدرس وفي الدروس اللّاحقة. لاحظ وجود النوع <span style="font-family:courier new,courier,monospace;">string</span> قبل اسم الخاصيّة في السطر 12، يُشير ذلك إلى أنّ هذه الخاصيّة تقبل وتعطي قيمًا نصيّة فحسب. في الحقيقة يمكن استبدال <span style="font-family:courier new,courier,monospace;">string</span> بأيّ نوع نحتاجه. من الواضح أنّ التصريح عن الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> يتألّف من قسمين: قسم القراءة <span style="font-family:courier new,courier,monospace;">get</span> (بين السطرين 14 و 17) وقسم الإسناد <span style="font-family:courier new,courier,monospace;">set</span> (بين السطرين 18 و 21). في الواقع لا تتعدّى الخاصيّة كونها وسيلة للوصول إلى الحقول الخاصّة private fields الموجودة ضمن الكائن سواءً بالقراءة أو الإسناد، ولكن مع إمكانيّة معالجة القيم سواءً قبل إسنادها إلى هذه الحقول أو بعد القراءة منها. عندما نحاول إسناد قيمة إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> ستُنفّذ العبارات البرمجيّة الموجودة في قسم set، وهي عبارة برمجيّة واحدة فقط في مثالنا هذا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6949_10">
<span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName </span><span class="pun">=</span><span class="pln"> value</span><span class="pun">;</span></pre>

<p dir="rtl">
	الكلمة <span style="font-family:courier new,courier,monospace;">value</span> هي كلمة محجوزة تحتوي على القيمة المُسندة إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span>. العبارة السابقة واضحة للغاية فهي تعمل على إسناد القيمة المخزّنة ضمن <span style="font-family:courier new,courier,monospace;">value</span> إلى الحقل <span style="font-family:courier new,courier,monospace;">firstName</span>. لاحظ كيف يمكننا الوصول إلى هذا الحقل من الكلمة <span style="font-family:courier new,courier,monospace;">this</span>، كما ويمكننا إغفالها. نستطيع الوصول إلى الحقل <span style="font-family:courier new,courier,monospace;">firstName</span> رغم أنّه ذو محدّد وصول <span style="font-family:courier new,courier,monospace;">private</span> لأنّنا نصل إليه من تابع يقع في نفس الصنف.
</p>

<p dir="rtl">
	أمّا عندما نحاول قراءة الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> فسيتمّ تنفيذ العبارات البرمجيّة الموجودة ضمن القسم <span style="font-family:courier new,courier,monospace;">get</span>. في هذا المثال يحتوي القسم <span style="font-family:courier new,courier,monospace;">get</span> على عبارة برمجيّة واحدة وهي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6949_12">
<span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName</span><span class="pun">;</span></pre>

<p dir="rtl">
	حيث تعمل على إرجاع القيمة المخزّنة ضمن الحقل <span style="font-family:courier new,courier,monospace;">firstName</span> إلى الشيفرة التي طلبت قراءة الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span>. يطبّق نفس الأمر تمامًا على الخاصيّتين <span style="font-family:courier new,courier,monospace;">LastName</span> و <span style="font-family:courier new,courier,monospace;">Salary</span>.
</p>

<h2 dir="rtl">
	الخصائص المطبقة تلقائيا
</h2>

<p dir="rtl">
	يبدو البرنامج السابق طويلًا بلا مبرّر، فنحن لم نقم بأيّ عمل ضمن الخصائص سوى الإسناد أو القراءة. إذا كان الأمر كذلك في برامجك الحقيقيّة فيمكنك الاستغناء عن هذا الشكل من الخصائص واللجوء إلى شكل أكثر حداثةً وعصريّة، والذي يتمثّل بالخصائص المطبّقة تلقائيًّا auto implemented properties. انظر الشكل العام لها فيما يتعلّق بالخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6949_14">
<span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">get</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">set</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	لم تعد العبارات البرمجيّة في قسميّ <span style="font-family:courier new,courier,monospace;">get</span> و <span style="font-family:courier new,courier,monospace;">set</span> موجودة. ينحصر دور هذه الخاصيّة في شكلها الحالي في تخزين القيم ضمن الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> والقراءة منها فقط. ولكن يأتي السؤال هنا، أين ستخزّن الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span> قيمها، فأنا لا أرى حقلًا للتخزين!
</p>

<p dir="rtl">
	يعمل المترجم في هذه الحالة على إنشاء حقل خاص غير مُشاهد في شيفرة MSIL وظيفته الاحتفاظ بقيمة الخاصيّة <span style="font-family:courier new,courier,monospace;">FirstName</span>. وهنا قد يجول بخاطرك سؤال آخر: لماذا كلّ هذا التعقيد، لماذا لا نستخدم الحقول كما كنّا نفعل في الدرس السابق وحسب؟
</p>

<p dir="rtl">
	الإجابة بسيطة على هذا التساؤل المشروع. فنحن نستخدم الخصائص بهذا الشكل لغايات تصميميّة فحسب. فكلّما كنت بحاجة لأن تُضيف خاصيّة لأحد الأصناف يمكن الوصول إليها من خارجه فافعل ذلك عن طريق الخصائص (وليس الحقول) ولن تندم، وإن بدا ذلك يتطلّب المزيد من العمل.
</p>

<p dir="rtl">
	سنطبّق هذه الخصائص الفريدة على برنامجنا المعدّل <span style="font-family:courier new,courier,monospace;">Lesson07_02 </span>بحيث تستغني تمامًا عن الحقول <span style="font-family:courier new,courier,monospace;">firstName</span> و <span style="font-family:courier new,courier,monospace;">lastName</span> و <span style="font-family:courier new,courier,monospace;">salary</span>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6949_16">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson07_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">7</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">15</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">21</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">22</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">24</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">
</span><span class="lit">27</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">28</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">31</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">32</span><span class="pln">
</span><span class="lit">33</span><span class="pln">
</span><span class="lit">34</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">35</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">36</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">37</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">38</span><span class="pln">              </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">39</span><span class="pln">
</span><span class="lit">40</span><span class="pln">              employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="lit">41</span><span class="pln">              employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Saleh"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">);</span><span class="pln">
</span><span class="lit">42</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">44</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">45</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">46</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">47</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	أصبح هذا البرنامج الآن يُشبه البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_02</span> من الدرس السابق إلى حدّ كبير، باستثناء أنّنا نستخدم هنا الخصائص بدلًا من الحقول. لاحظ فقط أنّه يمكننا كتابة التصريح عن أيّ خاصيّة على نفس السطر مثل الأسطر 8 و 9 و 10.
</p>

<h2 dir="rtl">
	الخصائص ذات إمكانية القراءة فقط
</h2>

<p dir="rtl">
	هل تذكُر التمرين الداعم الأوّل من الدرس السابق؟
</p>

<p dir="rtl">
	كان يطلب ذلك التمرين إضافة تابع جديد اسمه <span style="font-family:courier new,courier,monospace;">GetSalaryAfterTax</span> للحصول على قيمة الراتب بعد خصم الضريبة. واتفقنا وقتها أن تكون هذه الضريبة 2%. سنضيف خاصيّةً لتقوم بهذه المهمّة بدلًا من هذا التابع، ولكنّنا سنجعلها للقراءة فقط read only. أي لا يمكن إسناد أي قيم لها.
</p>

<p dir="rtl">
	ستكون الخاصيّة <span style="font-family:courier new,courier,monospace;">SalaryAfterTax</span> الجديدة على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6949_18">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">SalaryAfterTax</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">get</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0.98</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	من الواضح أنّه قد أزلنا القسم <span style="font-family:courier new,courier,monospace;">set</span> المسؤول عن الإسناد من تصريح الخاصيّة <span style="font-family:courier new,courier,monospace;">SalaryAfterTax</span> وبذلك تتحوّل للقراءة فقط. يحتوي القسم get على عمليّة حسابيّة بسيطة تطبّق عملية حسم الضريبة على الراتب Salary.
</p>

<p dir="rtl">
	سنجري تعديلًا طفيفًا على التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> لكي يُرفق قيمة الراتب بعد حسم الضريبة ضمن النصّ المنسّق الذي يرجعه. سنحصل في النتيجة على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson07_03</span> المعدّل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3296_9">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson07_03</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">7</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">get</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">SalaryAfterTax</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="kwd">get</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">15</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0.98</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">17</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">         
</span><span class="lit">19</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} \n Salary: {2:N0} \n Salary after tax: {3:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">22</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">SalaryAfterTax</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">
</span><span class="lit">24</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">
</span><span class="lit">27</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">28</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">31</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">32</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">33</span><span class="pln">
</span><span class="lit">34</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">35</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">38</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">39</span><span class="pln">
</span><span class="lit">40</span><span class="pln">
</span><span class="lit">41</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">42</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">43</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">44</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">45</span><span class="pln">              </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">46</span><span class="pln">
</span><span class="lit">47</span><span class="pln">              employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="lit">48</span><span class="pln">              employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Saleh"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">);</span><span class="pln">
</span><span class="lit">49</span><span class="pln">
</span><span class="lit">50</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">51</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">52</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">53</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">54</span><span class="pln">  </span><span class="pun">}</span></pre>

<p>
	<span style="line-height: 2em;">أضفت الخاصيّة <span style="font-family:courier new,courier,monospace;">SalaryAfterTax</span> (الأسطر من 11 حتى 17). وأجريت تعديلًا طفيفًا ضمن التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> في السطر 21 حيث أضفت المحرف n\ والذي يُستخدم ضمن النص للإشارة إلى وجوب الانتقال إلى سطر جديد لأغراض تنسيقية فقط، كما أضفت مكانًا في النصّ التنسيقيّ {3:N0} لإدراج قيمة الراتب بعد خصم الضريبة <span style="font-family:courier new,courier,monospace;">this.SalaryAfterTax</span>، وهذا كلّ ما في الأمر.</span>
</p>

<p dir="rtl">
	إذا حاولت في هذا البرنامج أن تُسند أيّ قيمة إلى الخاصيّة <span style="font-family:courier new,courier,monospace;">SalaryAfterTax</span> ستحصل على خطأ يفيد أنّها للقراءة فقط read only.
</p>

<h2 dir="rtl">
	الأعضاء الساكنة Static Members
</h2>

<p dir="rtl">
	<a name="_GoBack" rel="external"></a> هي أعضاء يمكن استدعاؤها مباشرةً من الصنف الذي صُرّحت ضمنه، وليس من كائن مُنشَأ من هذا الصنف. يمكن أن نجعل أيّ عضو ساكن وذلك بوسمه بالكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">static</span>. يوضّح البرنامج <span style="font-family:courier new,courier,monospace;">Lesson07_04</span> استخدام التوابع الساكنة. لاحظ وجود الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">static</span> بعد محّدد الوصول <span style="font-family:courier new,courier,monospace;">public</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3296_11">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson07_04</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Addition</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Minus</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Division</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="lit">20</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="kwd">NaN</span><span class="pun">;</span><span class="pln">
</span><span class="lit">22</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="kwd">else</span><span class="pln">
</span><span class="lit">24</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">25</span><span class="pln">                  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">26</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">27</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln"> 
</span><span class="lit">29</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Multiplication</span><span class="pun">(</span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
</span><span class="lit">30</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">31</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">32</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">33</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">
</span><span class="lit">35</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">36</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">37</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">38</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">39</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="lit">40</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="lit">41</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> addition </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pun">.</span><span class="typ">Addition</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> minus </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pun">.</span><span class="typ">Minus</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">44</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> multiplication </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pun">.</span><span class="typ">Multiplication</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">45</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> division </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pun">.</span><span class="typ">Division</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">46</span><span class="pln">
</span><span class="lit">47</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} + {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> addition</span><span class="pun">);</span><span class="pln">
</span><span class="lit">48</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} - {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> minus</span><span class="pun">);</span><span class="pln">
</span><span class="lit">49</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} * {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> multiplication</span><span class="pun">);</span><span class="pln">
</span><span class="lit">50</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} / {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> division</span><span class="pun">);</span><span class="pln">
</span><span class="lit">51</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">52</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">53</span><span class="pln">  </span><span class="pun">}</span></pre>

<p>
	<span style="line-height: 2em;">نفّذ البرنامج السابق لتحصل على الخرج التالي:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3296_13">
<span class="lit">5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">9</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">14</span><span class="pln">
</span><span class="lit">5</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">9</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">4</span><span class="pln">
</span><span class="lit">5</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">9</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">45</span><span class="pln">
</span><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">9</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.555555555555556</span></pre>

<p>
	أنشأنا الصنف <span style="font-family:courier new,courier,monospace;">Calculator</span> الذي يحتوي على التوابع الساكنة <span style="font-family:courier new,courier,monospace;">Addition</span> و <span style="font-family:courier new,courier,monospace;">Minus</span> و <span style="font-family:courier new,courier,monospace;">Multiplication</span> و <span style="font-family:courier new,courier,monospace;">Division</span>. إذا انتقلنا إلى التابع <span style="font-family:courier new,courier,monospace;">Main</span> (الذي هو بالمناسبة تابع ساكن بسبب وجود الكلمة <span style="font-family:courier new,courier,monospace;">static</span>) انظر إلى السطر 42 كيف استدعينا التابع <span style="font-family:courier new,courier,monospace;">Addition</span> من الصنف <span style="font-family:courier new,courier,monospace;">Calculator</span> مباشرةً بدون إنشاء أي كائن من هذا الصنف. سنكرّر نفس العمليّة من أجل التوابع <span style="font-family:courier new,courier,monospace;">Minus</span> و <span style="font-family:courier new,courier,monospace;">Multiplication</span> و <span style="font-family:courier new,courier,monospace;">Division</span>.
</p>

<p dir="rtl">
	أمرٌ أخير. انظر إلى محتوى التابع الساكن <span style="font-family:courier new,courier,monospace;">Division</span>، ستجد أنّنا نختبر قيمة <span style="font-family:courier new,courier,monospace;">y</span> فيما إذا كانت تساوي الصفر أم لا. فإذا كانت قيمة <span style="font-family:courier new,courier,monospace;">y </span>تساوي الصفر فإنّه لا يجوز القسمة على صفر. لذلك فنرجع <span style="font-family:courier new,courier,monospace;">double.NaN</span> وهو عبارة عن ثابت يُعبّر عن عدم وجود قيمة عدديّة. وهذا أمر طبيعي لأنّ القسمة على صفر لن تعطينا عدد. إذا استبدلت قيمة <span style="font-family:courier new,courier,monospace;">y</span> في السطر 40 من البرنامج السابق بالقيمة 0 سنحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3296_15">
<span class="pln">5 + 0 = 5
5 - 0 = 5
5 * 0 = 0
5 / 0 = NaN</span></pre>

<p dir="rtl">
	لاحظ السطر الأخير من البرنامج كيف يبدو منطقيًّا تمامًا.
</p>

<p dir="rtl">
	يمكننا تعميم نفس المفهوم السابق بالنسبة للخصائص والحقول ضمن الصنف بجعلها ساكنة وذلك بإضافة الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">static</span> بعد محدّد الوصول مباشرةً.
</p>

<p dir="rtl">
	بقي أن نشير إلى أنّه من غير الممكن استخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">this</span> ضمن أي عضو ساكن والسبب كما أعتقد واضح. يُشير <span style="font-family:courier new,courier,monospace;">this</span> إلى الكائن الذي يحدث من ضمنه الاستدعاء. ولكن في الأعضاء الساكنة فإنّنا نجري الاستدعاءات للتوابع أو الخصائص من الصنف المصرّحة ضمنه مباشرةً، لذلك فاستخدام <span style="font-family:courier new,courier,monospace;">this</span> لن يكون له أيّ معنى.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	أجرِ تعديلًا على البرنامج <span style="font-family:courier new,courier,monospace;">Lesson07_03</span> بحيث يُضيف الخاصيّة <span style="font-family:courier new,courier,monospace;">Tel</span> (قابلة للقراءة وللكتابة) التي تمثّل رقم الهاتف للموظّف <span style="font-family:courier new,courier,monospace;">Employee</span>، ثمّ أجرِ التعديل المناسب على التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> لكي يعرض قيمة هذه الخاصيّة على سطر منفصل كما يفعل مع بقيّة الخصائص.
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	أنشئ صنفًا سمّه <span style="font-family:courier new,courier,monospace;">StaticDemo</span> بحيث يحتوي على خاصيّة ساكنة اسمها <span style="font-family:courier new,courier,monospace;">Counter</span> من النوع <span style="font-family:courier new,courier,monospace;">int</span>. عند كل إنشاء لكائن من هذا الصنف يجب زيادة قيمة هذه الخاصيّة بمقدار 1 وبشكل تلقائيّ.
</p>

<p dir="rtl">
	(<strong>تلميح</strong>: يمكنك كتابة العبارة البرمجيّة المسؤولة عن زيادة قيمة الخاصيّة <span style="font-family:courier new,courier,monospace;">Counter</span> ضمن بانيّة الصنف <span style="font-family:courier new,courier,monospace;">StaticDemo</span> التي ليس لها وسائط.)
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تعرّفنا في هذا الدرس على كيفيّة التعامل مع الخصائص، والتي تمثّل أسلوبًا أكثر تطوّرًا من الحقول لتشكّل مزايا الصنف. كما اتفقنا أنّه ينبغي على الحقول أن تكون داخليّة بالنسبة للصنف باستخدام محدّد الوصول <span style="font-family:courier new,courier,monospace;">private</span>، وتعرّفنا أيضًا على الأعضاء الساكنة static members وكيفيّة التعامل معها.
</p>
]]></description><guid isPermaLink="false">335</guid><pubDate>Sat, 21 May 2016 19:01:00 +0000</pubDate></item><item><title>&#x62A;&#x637;&#x628;&#x64A;&#x642; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r330/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop-part1.png.acca6cb362408686d570e88e0b05baeb.png" /></p>

<p dir="rtl">
	سنتحدّث في هذا الدرس عن كيفيّة تطبيق <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r328/" rel="">مبادئ البرمجة كائنيّة التوجّه في سي شارب</a> وذلك من خلال إنشاء واستخدام الأصناف والكائنات في هذه اللغة.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16264" data-unique="3snfu06eb" src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop-part1.png.06b9ac6859dcadcc8099d513ce34b1f5.png" alt="learn-csharp-oop-part1.png"></p>

<p dir="rtl">
	يمكن التصريح عن صنف في سي شارب باستخدام الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">class</span> يليها اسم الصنف وهو يتبع لنفس قواعد التسمية للمتغيّرات، علمًا أنّه يفضّل أن يكون الحرف الأوّل من اسم الصنف حرفًا طباعيًّا كبيرًا. انظر إلى الشكل التالي حيث نرى الصنف البسيط <span style="font-family:courier new,courier,monospace;">Employee</span> والذي يُعبّر عن موظّف في إحدى الشركات:
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16263" href="https://academy.hsoub.com/uploads/monthly_2016_05/emp_class.png.bd903ede679df5b0a649affa8e0af877.png" rel="external"><img alt="emp_class.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16263" data-unique="v2qs49pkf" src="https://academy.hsoub.com/uploads/monthly_2016_05/emp_class.thumb.png.649145615969ccf20b583fd329a3049a.png"></a>
</p>

<p dir="rtl">
	يحتوي هذا الصنف على ثلاثة حقول بيانات data fields  هي:
</p>

<ul dir="rtl">
<li>
		الاسم <span style="font-family:courier new,courier,monospace;">FirstName</span>
	</li>
	<li>
		الكنية <span style="font-family:courier new,courier,monospace;">LastName</span>
	</li>
	<li>
		الراتب <span style="font-family:courier new,courier,monospace;">Salary</span>
	</li>
</ul>
<p dir="rtl">
	تستطيع اعتبارها حاليًّا أنّها تمثّل خصائص للصنف <span style="font-family:courier new,courier,monospace;">Employee</span>، كما يحتوي هذا الصنف على تابع وحيد اسمه <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> الهدف منه هو الحصول على تمثيل نصيّ لكلّ كائن ننشئه من هذا الصنف كما سنرى بعد قليل، يشبه التابع إلى حدٍّ كبير الدّالة function في لغات البرمجة الأخرى. لا يتطلّب هذا التابع أيّ وسائط في حين أنّه يُرجع قيمة نصيّة من النوع <span style="font-family:georgia,serif;">string</span>. هذه الحقول بالإضافة إلى التابع السابق تُعتبر أعضاء ضمن الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> كما ذكرنا ذلك مسبقًا. تقع أعضاء أيّ صنف ضمن حاضنتيه.
</p>

<p dir="rtl">
	لاحظ الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">public</span> والموجودة قبل كلّ تصريح لحقل أو تابع ضمن الصنف <span style="font-family:courier new,courier,monospace;">Employee</span>. هذه الكلمة عبارة عن مُحدّد وصول access modifier.
</p>

<p dir="rtl">
	تتحكّم محدّدات الوصول بقابلية الوصول إلى أعضاء الصنف من خارجه، سنتعامل مع نوعين آخرين من محدّدات الوصول وهما <span style="font-family:courier new,courier,monospace;">private</span> و <span style="font-family:courier new,courier,monospace;">protected</span>.
</p>

<p dir="rtl">
	يكفي أن تعلم الآن أنّ أي عضو في الصنف يمتلك محدّد وصول <span style="font-family:courier new,courier,monospace;">public</span> يمكن الوصول إليه سواءً من داخل الصنف (أو بشكل أدق من داخل الكائن) أو من خارجه. كما من المفيد أن نعلم أنّه من الممكن استخدام محدّدات الوصول مع الأصناف أيضًا كما سنرى في درس لاحق.
</p>

<p dir="rtl">
	إذا أردنا إنشاء كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> فعلينا التصريح عن متغيّر مناسب من النوع <span style="font-family:courier new,courier,monospace;">Employee</span> وذلك على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9712_9">
<span class="pln">Employee empObject;</span></pre>

<p dir="rtl">
	صرّحنا عن المتغيّر <span style="font-family:courier new,courier,monospace;">empObject</span> على أنّه من النوع <span style="font-family:courier new,courier,monospace;">Employee</span>. لاحظ التشابه في التصريح عن المتغيّرات بين أنواع موجودة ضمن سي شارب وبين أنواع ننشئها بأنفسنا.
</p>

<p dir="rtl">
	التصريح السابق غير كافي لإنشاء الكائن. لإنشاء كائن من النوع <span style="font-family:courier new,courier,monospace;">Employee</span> علينا استخدام العامل <span style="font-family:courier new,courier,monospace;">new</span> الذي يعمل على إنشاء كائن من أيّ صنف نرغبه ويعمل على إعادة المرجع (العنوان) لذلك الكائن في الذاكرة. استخدام العامل <span style="font-family:courier new,courier,monospace;">new</span> سهل حيث يمكننا كتابة ما يلي بعد عبارة التصريح السابقة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9712_11">
<span class="pln">empObject = new Employee();</span></pre>

<p dir="rtl">
	يقوم العامل <span style="font-family:courier new,courier,monospace;">new</span> بإنشاء كائن جديد من الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> ثمّ يُسند مرجع (عنوان) هذا الكائن ضمن المتغيّر <span style="font-family:courier new,courier,monospace;">empObject</span>. لاحظ القوسين الموجودين بعد اسم الصنف <span style="font-family:courier new,courier,monospace;">Employee</span>. في الحقيقة يُعبّر هذين القوسين عن استدعاء لبانية constructor الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> عند إنشاء الكائن. ولكن أين هذه البانية؟ هذا ما سنراه بعد قليل. يمكن الآن الوصول إلى الحقول والتوابع الموجودة ضمن الكائن عن طريق كتابة المتغيّر الذي يحوي العنوان إلى الكائن (أي المتغيّر <span style="font-family:courier new,courier,monospace;">empObject</span>) ثم نضع نقطة وبعدها اسم الحقل أو التابع الذي نريد الوصول إليه. في العبارة التالية سنسند القيمة "Mohammad" إلى الحقل <span style="font-family:courier new,courier,monospace;">FirstName</span> من الكائن <span style="font-family:courier new,courier,monospace;">empObject</span> (الكائن الذي يشير إليه <span style="font-family:courier new,courier,monospace;">empObject</span>):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9712_13">
<span class="pln">empObject.FirstName = "Mohammad";</span></pre>

<p dir="rtl">
	حان الآن وقت التنفيذ العمليّ. انظر إلى البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01</span> الذي يوضّح كيفية إنشاء الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> وكيفيّة إنشاء كائنين منه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_7">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">   
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson06_01</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">7</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln"> 
</span><span class="lit">15</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">22</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">25</span><span class="pln">              </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">26</span><span class="pln">
</span><span class="lit">27</span><span class="pln">              employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">();</span><span class="pln">
</span><span class="lit">28</span><span class="pln">              employee1</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mohammad"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              employee1</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">              employee1</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln">
</span><span class="lit">31</span><span class="pln">
</span><span class="lit">32</span><span class="pln">              employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">();</span><span class="pln">
</span><span class="lit">33</span><span class="pln">              employee2</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Saleh"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">34</span><span class="pln">              employee2</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">;</span><span class="pln">
</span><span class="lit">35</span><span class="pln">              employee2</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">;</span><span class="pln">
</span><span class="lit">36</span><span class="pln">
</span><span class="lit">37</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">38</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">39</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">40</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">41</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	<span style="line-height: 2em;">عند تنفيذ البرنامج سنحصل على الخرج التالي</span><span style="line-height: 2em;">:</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4774_9">
<span class="pln">First Employee: Mohammad Mansoor - Salary: 1,000.00
Second Employee: Saleh Mahmoud - Salary: 2,500.00</span></pre>

<p dir="rtl">
	نلاحظ من النظرة الأولى للبرنامج السابق أنّه لدينا صنفان ضمن نطاق الاسم <span style="font-family:courier new,courier,monospace;">Lesson06_01 </span>وهما <span style="font-family:courier new,courier,monospace;">Employee</span> و <span style="font-family:courier new,courier,monospace;">Program</span>.
</p>

<p dir="rtl">
	يقع التصريح عن الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> في الأسطر بين 6 و 19 ويحتوي هذا الصنف كما رأينا قبل قليل على أربعة أعضاء وهي عبارة عن ثلاثة حقول <span style="font-family:courier new,courier,monospace;">FirstName</span> و <span style="font-family:courier new,courier,monospace;">LastName</span> و <span style="font-family:courier new,courier,monospace;">Salary</span> بالإضافة إلى التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> الموجود بين السطرين 12 و18. تنحصر وظيفة هذا التابع في الحصول على التمثيل النصيّ لأيّ كائن ننشئه من الصنف <span style="font-family:courier new,courier,monospace;">Employee</span>.
</p>

<p dir="rtl">
	يحتوي التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> على أسلوب جميل لتنسيق النصوص يشبه ذلك الأسلوب الذي كنّا نستخدمه مع التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>. يحتوي الصنف <span style="font-family:courier new,courier,monospace;">string</span> على تابع اسمه <span style="font-family:courier new,courier,monospace;">Format</span> يقبل عدّة وسائط (السطر 14) أولها نصّ تنسيقي، أمّا الوسائط التالية فهي القيم التي ستجد لها أمكنةً ضمن النص التنسيقي، كما كنّا نستخدم التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> بالضبط. يُرجع التابع <span style="font-family:courier new,courier,monospace;">Format</span> نصًّا منسّقًا بحسب القيم الممرّرة له. الشيء الوحيد المختلف هو كيفيّة تنسيق قيمة الراتب <span style="font-family:courier new,courier,monospace;">Salary</span> باستخدام مُحدّد التنسيق <span style="font-family:courier new,courier,monospace;">:N0</span> الموجود ضمن {2:N0}. يخبر هذا المحدّد التابع <span style="font-family:courier new,courier,monospace;">Format</span> أنّ القيمة التي ستوضع في هذا المكان (وهي قيمة <span style="font-family:courier new,courier,monospace;">Salary</span>) يجب أن تُنسّق على شكل رقم ذي فاصلة آلاف وبدون فاصلة عشريّة. يفيد مثل هذا التنسيق في الحصول على أرقام منسّقة بشكل محترف تُعبّر عن الراتب الذي يحصل عليه الموظّف وهي تبدو مثل 1,000 أو 2,500. جرّب استخدام التنسيق {2:N1} و {2:N2} ولاحظ الفرق.
</p>

<p dir="rtl">
	لاحظ أنّني قد استخدمت الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">this</span> متبوعةً بنقطة قبل اسم كل حقل. في الحقيقة تُشير هذه الكلمة إلى الكائن الحالي الذي يتمّ منه استدعاء التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> كما سنرى ذلك بعد قليل. أمّا لإرجاع القيمة النصيّة من التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span> فإنّنا ببساطة نستخدم الكلمة المحجوزة <span style="font-family:courier new,courier,monospace;">return</span> ونضع بعدها القيمة المراد إرجاعها.
</p>

<p dir="rtl">
	الصنف <span style="font-family:courier new,courier,monospace;">Program</span> المصرّح عنه في الأسطر بين 21 و 40 هو الصنف الذي تعاملنا معه في جميع البرامج التي كتبناها حتى الآن. يحتوي هذا الصنف على التابع <span style="font-family:courier new,courier,monospace;">Main</span> الذي يمثّل نقطة الدخول للبرنامج كما نعلم.
</p>

<p dir="rtl">
	يبدأ التابع <span style="font-family:courier new,courier,monospace;">Main</span> بالتصريح عن متغيرين من النوع <span style="font-family:courier new,courier,monospace;">Employee</span> وهما <span style="font-family:courier new,courier,monospace;">employee1</span> و <span style="font-family:courier new,courier,monospace;">employee2</span> ثمّ ينشئ كائنًا من النوع <span style="font-family:courier new,courier,monospace;">Employee</span> باستخدام العامل <span style="font-family:courier new,courier,monospace;">new</span> (السطر 27) ويسنده إلى المتغيّر <span style="font-family:courier new,courier,monospace;">employee1</span>. بعد ذلك يمكن استخدام أيّ حقل أو تابع معرّف ضمن الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> عن طريق المتغيّر <span style="font-family:courier new,courier,monospace;">employee1</span> بشرط أن يكون له محدّد وصول <span style="font-family:courier new,courier,monospace;">public</span> كما هو واضح في الأسطر من 28 حتى 30. يتكرّر نفس الأمر بالنسبة للمتغيّر <span style="font-family:courier new,courier,monospace;">employee2</span> الذي سيحمل كائنًا مختلفًا عن الكائن الموجود ضمن <span style="font-family:courier new,courier,monospace;">employee1</span>.
</p>

<p dir="rtl">
	أخيرًا وفي السطرين 37 و38 يتم طباعة التمثيل النصيّ لكلّ من الكائنين باستخدام التابع <span style="font-family:courier new,courier,monospace;">DisplayInfo</span>. تجدر الإشارة إلى أنّه عند وصول تنفيذ البرنامج إلى السطر 37 وإلى الاستدعاء<span style="font-family:courier new,courier,monospace;"> ()employee1.DisplayInfo</span> تحديدًا سيؤدّي ذلك إلى انتقال التنفيذ إلى السطر 14 ضمن هذا التابع لتنفيذ التعليمات البرمجيّة ضمنه ومن ثمّ الحصول على التمثيل النصيّ للكائن <span style="font-family:courier new,courier,monospace;">employee1</span> وإرجاعه إلى السطر 37 مرّة أخرى ليعمل البرنامج على تمرير هذه القيمة النصيّة للتابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> ومن ثمّ العرض على الشاشة، وبالطبع يتكرّر نفس الأمر تمامًا بالنسبة للكائن ضمن <span style="font-family:courier new,courier,monospace;">employee2</span> في السطر 38.
</p>

<p dir="rtl">
	إذا كنت تستخدم Visual Studio 2015 بأيّ إصدار فأنصحك أن تنفّذ هذا البرنامج بشكل خُطَوي لكي تتعرّف على آلية عمل هذا البرنامج بشمل عمليّ. اضغط على المفتاح <strong>F11</strong> (أو من القائمة <strong>Debug &gt; Step Into</strong>) لتنفيذ البرنامج باستخدام منقّح الأخطاء debugger. ستلاحظ ظهور مستطيل أصفر يُشير إلى مكان التنفيذ الحالي، وكلما ضغطت المفتاح <strong>F11</strong> سينتقل تنفيذ البرنامج إلى العبارة البرمجيّة التالية خطوة بخطوة.
</p>

<h2 dir="rtl">
	البانية constructor ضمن الصنف
</h2>

<p dir="rtl">
	البانية constructor هي تابع من نوع خاص يجب أن تكون موجودة ضمن أيّ صنف في سي شارب. في حال تمّ إغفالها سيعمل المترجم على توليد واحدة افتراضيّة من أجلنا.
</p>

<p dir="rtl">
	في الحقيقة وظيفة البانية هي بناء الكائن وحجز مكان مناسب له في الذاكرة، حيث يتم استدعاء البانية عند إنشاء الكائن باستخدام العامل <span style="font-family:courier new,courier,monospace;">new</span>. لا يمكن للبواني إرجاع قيمة مخصّصة كما نفعل مع التوابع الأخرى عادةً، في الحقيقة هي تُرجع كائنًا من الصنف الموجودة ضمنه. ولكن يمكن أن تقبل وسائط نمرّرها إليها. استبدل الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> التالي بذلك الموجود ضمن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_24">
<span class="lit">1</span><span class="pln">   </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">2</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">3</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Hello, I'm in Employee's constructor!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">15</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">      </span><span class="pun">}</span></pre>

<p dir="rtl">
	لقد أضفنا في هذه النسخة البانية <span style="font-family:courier new,courier,monospace;">()Employee</span> للصنف <span style="font-family:courier new,courier,monospace;">Employee</span>.
</p>

<p dir="rtl">
	نفّذ البرنامج لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4774_22">
<span class="pln">*** Hello, I'm in Employee's constructor! ***
*** Hello, I'm in Employee's constructor! ***

First Employee: Mohammad Mansoor - Salary: 1,000
Second Employee: Saleh Mahmoud - Salary: 2,500</span></pre>

<p dir="rtl">
	لاحظ أنّ العبارة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4774_20">
<span class="pln">*** Hello, I'm in Employee's constructor! ***</span></pre>

<p dir="rtl">
	قد ظهرت مرّتين في الخرج، وذلك بسبب أنّنا أنشأنا كائنين حيث تُنفّذ هذه البانية من أجل كلّ عملية إنشاء. ولكن السؤال المطروح هنا، ماذا سنستفيد من هذه البانية؟
</p>

<p dir="rtl">
	تُستخدم البواني عمومًا عندما نريد تهيئة الكائن ببعض القيم الضرورية لجعل حالته مستقرّة وذلك أثناء إنشائه وقبل محاولة الوصول إليه من أيّ مصدر خارجيّ. انظر الآن إلى الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> المعدّل الذي يحوي بانية تقوم ببعض الأعمال المفيدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_18">
<span class="lit">1</span><span class="pln">   </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">2</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">3</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">17</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">
</span><span class="lit">22</span><span class="pln">   </span><span class="pun">}</span></pre>

<p dir="rtl">
	تتطلّب البانية هذه المرّة ثلاثة وسائط، تمثّل قيمًا سيتمّ إسنادها إلى الحقول. هذه الوسائط هي: <span style="font-family:courier new,courier,monospace;">firstName</span> و <span style="font-family:courier new,courier,monospace;">lastName</span> و <span style="font-family:courier new,courier,monospace;">salary</span> (لاحظ أنّ اسم كلّ منها يبدأ بحرف طباعي صغير لتمييزها عن حقول الصنف).
</p>

<p dir="rtl">
	إذا استبدلت هذا الصنف الجديد بالصنف القديم الموجود ضمن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01</span> وحاولت تنفيذ البرنامج فستحصل على خطأ. السبب في ذلك بسيط، وهو أنّ العبارتين في السطرين 27 و 32 من البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01 </span>تحاولان إنشاء كائنين من الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> عن طريق بانية لا تتطلّب أيّة وسائط وهذا ما لا يتوفّر في الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> الجديد. فعندما يلاحظ مترجم سي شارب وجود بانية واحدة على الأقل بصرف النظر عن عدد الوسائط التي تتطلّبها فإنّه يمتنع عن توليد بانية افتراضية بشكل تلقائي مثلما كان يفعل من قبل. يوجد حلّ سريع لهذه المشكلة يتمثّل في توفير بانية لا تحتاج لأيّة وسائط كما كان الوضع السابق. انظر إلى النسخة الأخيرة للصنف <span style="font-family:courier new,courier,monospace;">Employee</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_15">
<span class="lit">1</span><span class="pln">   </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">2</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">3</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">4</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">5</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">6</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">15</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">16</span><span class="pln">            
</span><span class="lit">17</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">19</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">21</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">   </span><span class="pun">}</span></pre>

<p dir="rtl">
	بعد اعتماد هذا الصنف ضمن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01</span>، سيعمل البرنامج الآن بشكل طبيعي ويظهر الخرج كما هو متوقّع. ولكن تأمّل معي هذا الصنف قليلًا، ألا تلاحظ وجود بانيتين له؟ هذا أمر طبيعي ووارد جدًّا في سي شارب حيث يمكن كتابة أكثر من تابع بنفس الاسم طالما اختلف عدد أو أنواع الوسائط الممرّرة لكلّ منهما. نسمي هذه الميزة بزيادة التحميل overloading للتوابع. فعند وجود استدعاء للتابع المزاد تحميله يتمّ اختيار الشكل المناسب بناءً على عدد وأنواع الوسائط الممرّرة.
</p>

<p dir="rtl">
	لاحظ أنّ البانية عديمة الوسائط فارغة ولا بأس في ذلك. ولكنّ السؤال هنا كيف يمكن الاستفادة من البانية ذات الوسائط الثلاثة. الأمر بسيط، استبدل محتويات التابع <span style="font-family:courier new,courier,monospace;">Main</span> في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_01</span> بالشيفرة البسيطة المكافئة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_13">
<span class="lit">1</span><span class="pln">   </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Saleh"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">);</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">   </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">7</span><span class="pln">   </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span></pre>

<p dir="rtl">
	انظر كم أصبحت الشيفرة نظيفة وقصيرة ومريحة للعين.
</p>

<p dir="rtl">
	إليك الآن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_02 </span>كاملًا بعد التعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4774_11">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson06_02</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Employee</span><span class="pln">
</span><span class="lit">7</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">9</span><span class="pln">           </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> </span><span class="typ">Salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">      </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="pln">string firstName</span><span class="pun">,</span><span class="pln"> string lastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> salary</span><span class="pun">)</span><span class="pln">
</span><span class="lit">13</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> firstName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">15</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> lastName</span><span class="pun">;</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> salary</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">()</span><span class="pln">
</span><span class="lit">20</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             
</span><span class="lit">22</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">DisplayInfo</span><span class="pun">()</span><span class="pln">
</span><span class="lit">25</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">26</span><span class="pln">              string result </span><span class="pun">=</span><span class="pln"> string</span><span class="pun">.</span><span class="typ">Format</span><span class="pun">(</span><span class="str">"{0} {1} - Salary: {2:N0}"</span><span class="pun">,</span><span class="pln">
</span><span class="lit">27</span><span class="pln">                  </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="typ">Salary</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">30</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">31</span><span class="pln">
</span><span class="lit">32</span><span class="pln">       
</span><span class="lit">33</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">
</span><span class="lit">35</span><span class="pln">
</span><span class="lit">36</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">37</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">38</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">39</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">40</span><span class="pln">              </span><span class="typ">Employee</span><span class="pln"> employee1</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">41</span><span class="pln">
</span><span class="lit">42</span><span class="pln">              employee1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Mohammad"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mansoor"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="lit">43</span><span class="pln">              employee2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Employee</span><span class="pun">(</span><span class="str">"Saleh"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Mahmoud"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">);</span><span class="pln">
</span><span class="lit">44</span><span class="pln">
</span><span class="lit">45</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"First Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee1</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">46</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Second Employee: {0}"</span><span class="pun">,</span><span class="pln"> employee2</span><span class="pun">.</span><span class="typ">DisplayInfo</span><span class="pun">());</span><span class="pln">
</span><span class="lit">47</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">48</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">49</span><span class="pln">  </span><span class="pun">}</span></pre>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	أضف تابعًا جديدًا إلى الصنف <span style="font-family:courier new,courier,monospace;">Employee</span> الموجود في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson06_02</span> السابق وسمّه <span style="font-family:courier new,courier,monospace;">GetSalaryAfterTax</span>. وظيفة هذا التابع هي الحصول على قيمة الراتب للموظّف بعد تطبيق الضريبة Tax عليه. اعتبر نسبة الضريبة 2%.
</p>

<p dir="rtl">
	<strong>تلميح</strong>: اضرب قيمة الراتب <span style="font-family:courier new,courier,monospace;">Salary</span> بالعدد 0.98 للحصول على قيمة الراتب بعد خصم الضريبة. فإذا كان الراتب 1500 مثلًا، يجب أن يُرجع التابع <span style="font-family:courier new,courier,monospace;">GetSalaryAfterTax</span> القيمة 1470.
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	أنشئ صنفًا جديدًا سمّه <span style="font-family:courier new,courier,monospace;">MyRectangle</span> والذي يُعبّر عن مستطيل في المستوي، بحيث يحتوي على الحقلين <span style="font-family:courier new,courier,monospace;">Width</span> و <span style="font-family:courier new,courier,monospace;">Height</span> (من النوع <span style="font-family:courier new,courier,monospace;">double</span> لكلّ منهما)، بالإضافة إلى التابع <span style="font-family:courier new,courier,monospace;">GetArea</span> لحساب مساحة المستطيل. ثمّ اكتب برنامجًا بسيطًا يوضّح استخدام هذا الصنف من خلال إنشاء كائنين منه.
</p>

<p dir="rtl">
	احسب مساحة كل مستطيل (كائن) واعرض النتيجة على الشاشة.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تعلّمنا في هذا الدرس أساسيّات إنشاء الأصناف والكائنات، وكيفية التعامل مع الحقول والتوابع والبواني الموجودة ضمن الصنف. كما أخذنا لمحة سريعة حول محدّدات الوصول وكيفية التعامل مع محدّد الوصول <span style="font-family:courier new,courier,monospace;">public</span>، علمًا أنّنا ستوضّح كيفيّة التعامل مع باقي المحدّدات في الدرس التالي الذي سنتحدّث فيه عن المزيد حول هذا الموضوع المهم والأساسي لتطوير التطبيقات باستخدام سي شارب.
</p>
]]></description><guid isPermaLink="false">330</guid><pubDate>Thu, 12 May 2016 09:54:45 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; (Object Oriented Programming) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r328/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.dbe94de51f339d8183ad6d538c882b14.png" /></p>

<p dir="rtl" style="text-align: center;">
	<img alt="learn-csharp-oop.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16260" data-unique="hn4n1sjbu" src="https://academy.hsoub.com/uploads/monthly_2016_05/learn-csharp-oop.png.8f30d1426f17357e08c307c759d754a8.png"></p>

<h2 dir="rtl">
	مقدمة إلى المفهوم الكائني
</h2>

<p dir="rtl">
	تُعتبر لغة سي شارب لغة برمجة كائنيّة صرفة pure object oriented programming language فكلّ ما تشاهده أمامك في سي شارب عبارة عن كائن.
</p>

<p dir="rtl">
	سيكون هذا الدّرس نظريًّا بعض الشيء ولكن فهمه بالشكل الصحيح يُعدّ أمرًا حيويًّا للبرمجة باستخدام سي شارب. ولنكن واقعيين، فإنّ هذا الدرس يُعتبر مدخلًا مبسّطًا للغاية إلى هذا الموضوع المهم والضخم ولا يمكن اعتباره بأيّ حال من الأحوال مرجعًا للبرمجة كائنيّة التوجّه. ستحصل -بعد قراءتك لهذا الدرس- على المعرفة الضروريّة للتمييز بين الأصناف classes والكائنات objects وفهم العلاقة بينهما. بالإضافة إلى فهم المبادئ الأوليّة للوراثة والتغليف.
</p>

<p dir="rtl">
	لكي نفهم ما هو الصنف وما هو الكائن اسمع منّي هذه القصّة: نتبع نحن البشر إلى ما يسمّى بالصنف الإنساني. يُعرّف هذا الصنف المزايا التي يجب أن يتمتّع بها كلّ إنسان. فمثلًا لكلّ إنسان اسم وطول ووزن ولون عينان وبصمة إبهام مميّزة تميّزه عن أيّ إنسان آخر. يُعرّف الصنف class الإنسانيّ هذه الصفات السابقة، بحيث أنّ كلّ كائن object إنسانيّ من هذا الصنف تكون له مثل هذه الصفات ولكنّ مع مجموعة خاصّة من القيم لها. فمثلًا الكائن من الصنف الإنساني هو إنسان قد يكون اسمه سعيد وطوله 180 سم ولون عينيه أسود وله بصمة إبهام مميّزة، وهذا الإنسان يختلف عن كائن إنسانيّ آخر، اسمه عمّار وطوله 175 سم ولون عينيه بنيّ وله أيضًا بصمة إبهام مميّزة خاصّة به، وهكذا. ندعو الصفات السابقة بالخصائص Properties، فالصنف Class يعرّف الخصائص، أمّا الكائن Object فيتمتّع بهذه الخصائص ولكن مع مجموعة قيم لها تميّزه عن كائنٍ آخر.
</p>

<p dir="rtl">
	أمر آخر، يُعرّف الصنف الإنساني أيضًا سلوكيّات أو إجراءات معيّنة خاصّة للكائنات التي تعود للصنف الإنسانيّ. فهناك مثلًا سلوكيّات المشي والجري والضحك. وفي الغالب أنّ كل كائن يُعبّر عن هذه السلوكيّات بشكل يراعي خصوصيّته. فلكلّ منّا أسلوب مختلف في الضحك. كما يمتلك كلّ منّا أسلوب مختلف في المشي والجري، فقد تميّز إنسانًا لا ترى وجهه من خلال مشيته فقط وهذا أمر واردٌ جدًّا. مثل هذه السلوكيّات Methods نصطلح عليها في البرمجة بالتوابع. فالصنف الإنسانيّ يُعرّف وجود مثل هذه السلوكيّات ولكلّ كائن إنسانيّ الحريّة في التعبير عن هذه السلوكيّات بالشكل الذي يرغبه.
</p>

<p dir="rtl">
	التابع في البرمجة يضم تعليمات برمجية يجري تنفيذها عند استدعائه. يعالج ويتعامل هذا التابع عادةً مع الخصائص والتوابع الأخرى الموجودة ضمن نفس الكائن. نسمي التوابع والخصائص بأعضاء الصنف class members وهناك أعضاء أخرى سنتناولها في الدروس التالية.
</p>

<h2 dir="rtl">
	المبادئ العامة للمفهوم كائني التوجه
</h2>

<p dir="rtl">
	هناك المئات من المقالات والكتب التي تتحدّث عن المفهوم الكائنيّ من منظورات مختلفة، وهناك أساليب متعدّدة تسمح بتحليل المسألة المطروحة وتصميمها وفق أسلوب كائنيّ أو ما يُعرف بالتصميم والتحليل كائنيّ التوجّه OOAD. ولكن يكفيك أن تعرف الآن أنّ هناك مبدآن أساسيّان ينبغي أن تتمتّع بها أيّ لغة برمجة تدعم المفهوم كائنيّ التوجّه وهما: التغليف Encapsulation والوراثة Inheritance. وهناك مفهوم مهم آخر يستند إلى الوراثة وهو التعدّديّة الشكلية Polymorphism.
</p>

<h3 dir="rtl">
	التغليف Encapsulation
</h3>

<p dir="rtl">
	وهو مبدأ جوهري في البرمجة كائنيّة التوجّه، وهو أحد أسباب ظهور هذا المفهوم. يُقرّر هذا المبدأ أنّه ليس من المفترض أن نطّلع على آلية العمل الداخلية للكائن. ما يهمنا هو استخدام الكائن وتحقيق الغرض المطلوب بصرف النظر عن التفاصيل الداخليّة له. تأمّل المثال البسيط التالي:
</p>

<p dir="rtl">
	عندما نقود السيّارة ونريد زيادة سرعتها فإنّنا بكلّ بساطة نضغط على مدوسة الوقود. لا أعتقد أنّ أحدًا يهتمّ بالآلية الميكانيكيّة التي تقف وراء الضغط على مدوسة الوقود. فالمطلوب هو زيادة سرعة السيّارة فحسب دون الاهتمام بالتفاصيل الداخليّة. فالسيّارة تُغلّف encapsulate التفاصيل الميكانيكيّة الداخليّة التي تقف وراء زيادة سرعة السيّارة. السيّارة في هذا المثال هو كائن Object. وعمليّة زيادة السرعة هي سلوكيّة (تابع) Method من كائن السيّارة.
</p>

<p dir="rtl">
	هناك مثال آخر كثيرًا ما نراه أثناء تجوّلنا في الشوارع ومحطّات القطار وصالات الانتظار، وهو آلات تحضير المشروبات الساخنة. نقف أمام الآلة نُدخل النقود ثمّ نضغط على زرّ محدّد لنحصل على المشروب الساخن الذي نرغب به. لا نهتمّ عادةً بالتفاصيل الداخليّة التي تحدث ضمن الآلة عندما نضغط أحد الأزرار للحصول على كوب من القهوة. فالآلة هنا تُعتبر كائنًا، وعمليّة الحصول على كوب من القهوة هي سلوكيّة Method من هذا الكائن. فهذه الآلة تعمل على تغليف encapsulate التفاصيل الداخليّة لعمليّة التحضير، فكلّ ما نفعله هو ضغط الزر ومن ثمّ نحصل على الناتج المطلوب. فإذا ما أُجري تعديل في الآلة بحيث تتغيّر طريقة تحضير مشروب ساخن لجعله أفضل وأكثر لذّة، فإنّ ذلك لن يؤثّر مطلقًا على أسلوب التعامل مع الآلة للحصول على نفس المشروب، ولن نلاحظ هذا التعديل إلّا بعد تذوّقنا للمشروب وملاحظة الفرق في المذاق.
</p>

<h3 dir="rtl">
	الوراثة Inheritance
</h3>

<p dir="rtl">
	تُعتبر الوراثة من أهم أشكال إعادة الاستخدام للمكوّنات البرمجيّة، حيث يعمل الصنف الجديد على الاستفادة من المكوّنات الموجودة مسبقًا ضمن الصنف الذي "يرث" منه ويجري عليها بعض التعديلات التي تناسبه على نحو مخصّص. فبدلًا من إنشاء صنف جديد من الصفر، يمكننا إنشاء صنف يعتمد على صنف آخر ويستفيد من خصائصه وسلوكيّاته (توابعه) الموجودة مسبقًا ثمّ يكيّفها أو يضيف عليها. نسمّي الصنف الأساسي الذي نرث منه بالصنف الأب. أمّا الصنف الذي يقوم بعمليّة الوراثة فنسمّيه بالصنف الابن أو بالصنف المشتق.
</p>

<p dir="rtl">
	لتثبيت الفكرة لنتناول المثال التالي. في المدارس هناك ثلاثة أنواع أساسيّة من الأشخاص المتواجدين فيها: الطلاب والمدرّسون والإداريّون. يمكننا بناء صنف عام يُمثّل أي شخص يعمل في المدرسة وليكن SchoolMember يحتوي هذا الصنف على خصائص مثل: الاسم والكنية واسم الأب واسم الأم وتاريخ الميلاد ورقم الهاتف.
</p>

<p dir="rtl">
	يمكننا البناء على هذا الصنف عندما نريد إنشاء أصناف أكثر "تخصّصًا" منه. مثل الصنف الذي يُعبّر عن الطلاب Student والصنف الذي يُعبّر عن المدرّسين Teacher، والصنف المُعبّر عن الإداريين Staff. يرث كلّ صنف منها من الصنف الأب SchoolMember فيصبح لكلّ منها نفس الخصائص الموجودة ضمن الصنف SchoolMember بشكل تلقائيّ.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="school.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16258" data-unique="ft448mnun" src="https://academy.hsoub.com/uploads/monthly_2016_05/school.png.b234e0314d3cd330f19aaadc4f6a5fa0.png"></p>

<p dir="rtl">
	من الواضح أنّ الصنف Student مخصّص أكثر من الصنف SchoolMember فهو يحتوي بالإضافة إلى الخصائص الموجودة في SchoolMember خصائص فريدة خاصّة به. فمثلًا من الممكن أن يحتوي على الخاصيّة التي تعبّر عن الصفّ الحالي Grade وعن السلوك العام Behavior للطالب، أمّا صنف المدرّس Teacher فمن الممكن أن يحتوي (بالإضافة إلى الخصائص الموجودة ضمن SchoolMember) على خاصيّة Course التي تُعبّر عن المقرّر الذي يدرّسه (رياضيّات، فيزياء ...الخ) والخاصيّة WeeklyHours التي تعبّر عن عدد الساعات التدريسيّة الأسبوعيّة المكلّف بها. وينطبق نفس المفهوم تمامًا على الصنف Staff الذي يعبّر عن الموظّفين الإداريين في المدرسة.
</p>

<p dir="rtl">
	فالوراثة تنتقل بنا من الشكل الأكثر عموميّةً SchoolMember إلى الشكل الأكثر تخصيصًا مثل Student. وفي الحقيقة كان من الممكن أن نتابع عمليّة الوراثة اعتبارًا من الصنف Staff فهناك قسم التوجيّه وهناك أمانة السر والإدارة وغيرها، وكلّ منها يمكن أن يرث من الصنف Staff.
</p>

<h3 dir="rtl">
	التعددية الشكلية Polymorphism
</h3>

<p dir="rtl">
	بفرض أنّنا نريد بناء برنامج يحاكي الحركة الانتقاليّة لعدّة أنواع من الحيوانات لدراسة حيويّة.
</p>

<p dir="rtl">
	كلّ من أصناف السمكة Fish والطائر Bird والضفدع Frog ترث من الصنف Animal الذي يمثّل أيّ حيوان.
</p>

<p dir="rtl">
	بفرض أنّ الصنف Animal يحتوي على سلوكيّة (تابع) اسمها Move (تُعبّر عن الانتقال)، فكما نعلم أنّ هذه السلوكيّة ستصبح وبشكل تلقائي موجودة ضمن أيّ صنف يرث من الصنف Animal، وهنا تكمن التعدديّة الشكليّة. فكل صنف من الأصناف Fish وBird وFrog يُعبّر عن عملية الانتقال Move بشكل مختلف. فالسمكة ربما تنتقل عن طريق السباحة مترًا واحدًا عند استدعاء التابع Move. أمّأ الطائر Bird فمن الممكن أي يطير مسافة 10 متر عند كل استدعاء للتابع Move، وأخيرًا فإنّه من الممكن للضفدع أن يقفز مسافة 20 سنتيمتر كلّما استدعي التابع Move. فالتابع Move المعرّف ضمن الصنف Animal يمكن التعبير عنه بأشكال متعدّدة ضمن الأصناف الأبناء Fish وBird وFrog كلٌّ بحسب حاجته.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="animal.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16259" data-unique="sudhok915" src="https://academy.hsoub.com/uploads/monthly_2016_05/animal.png.c1267d52c65dad2ffdb9fd72ce96d3ce.png"></p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	<a name="_GoBack" rel="external"></a> تعرّفنا في هذا الدرس على المفهوم العام للبرمجة كائنيّة التوجّه وتعاملنا مع التغليف حيث لا تهمّنا التفاصيل الداخلية لآلية العمل. والوراثة التي تتعلّق بمفهوم إعادة الاستخدام والانتقال من العام (الأب) إلى المخصّص (الابن). بالإضافة إلى التعدديّة الشكليّة التي تسمح لنا بإكساب سلوكيّات مخصّصة للأصناف الأبناء تنسجم مع طبيعتها. سنتناول في الدروس التالية هذه المفاهيم بشكل تطبيقي في سي شارب.
</p>
]]></description><guid isPermaLink="false">328</guid><pubDate>Mon, 09 May 2016 09:17:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x643;&#x631;&#x627;&#x631;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r320/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-loops-for-while.png.eec03dbecc2d6817152df3cd762a36ef.png" /></p>

<p dir="rtl">
	تُعتبر الحلقات التكراريّة من البنى المهمّة في لغات البرمجة، حيث نستطيع من خلالها تنفيذ عبارة أو عدّة عبارات برمجيّة لعدد من المرّات. تدعم سي شارب مثل باقي لغات البرمجة نوعين من الحلقات التكراريّة من حيث عدد التكرار، فهناك الحلقات ذات العدد المحدّد من المرّات (حلقة <span style="font-family:courier new,courier,monospace;">for</span>) والتي نعلم فيها عدد مرّات التكرار بشكل مسبق، والحلقات ذات العدد غير المحدّد من المرّات (حلقة <span style="font-family:courier new,courier,monospace;">do-while</span> وحلقة <span style="font-family:courier new,courier,monospace;">while</span>) التي يكون فيها عدد مرّات التكرار غير مُحدّدًا.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15847" data-unique="jwr0sqt2i" src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-loops-for-while.png.7be6d87c2f48d7a0da8a3bc1e42c30cf.png" alt="learn-csharp-loops-for-while.png"></p>

<h2 dir="rtl">
	حلقة for التكرارية
</h2>

<p dir="rtl">
	يمكن من خلال هذه الحلقة تكرار تنفيذ عبارة برمجيّة أو أكثر عددًا محدّدًا من المرّات، ولهذه الحلقة الشكل العام التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_7">
<span class="pln">for ([init_counter]; [loop_condition]; [counter_expression])
{
    statement1;
    statement2;
    ...
}</span></pre>

<p dir="rtl">
	القسم <span style="font-family:courier new,courier,monospace;">[init_counter]</span> هو قسم التهيئة الذي يتمّ من خلاله تهيئة متغيّر الحلقة بقيمة ابتدائيّة (وغالبًا ما يتمّ التصريح عنه في هذا القسم أيضًا)، يسمّى متغيّر الحلقة أيضًا بعدّاد الحلقة loop counter، أمّا القسم <span style="font-family:courier new,courier,monospace;">[loop_condition] </span>فيمثّل شرط التكرار أو الاستمرار للحلقة، فهو تعبير مقارنة يعطي true أو false بحيث تستمرّ الحلقة بالتكرار طالما كان هذا الشرط محقّقًا (يعطي true). القسم الأخير <span style="font-family:courier new,courier,monospace;">[counter_expression]</span> ويتمّ فيه عادةً إجراء عملية حسابية على متغيّر الحلقة وغالبًا ما تكون هذه العمليّة هي زيادة متغيّر الحلقة بمقدار واحد. انظر الشيفرة البسيطة التالية التي تعمل على تنفيذ العبارة التي تحوي التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> ثلاث مرّات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6465_9">
<span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"i = {0}"</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p dir="rtl">
	عند تنفيذ الشيفرة السابقة ستحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_11">
<span class="pln">i = 0
i = 1
i = 2</span></pre>

<p dir="rtl">
	لاحظ أنّنا صرّحنا عن المتغيّر <span style="font-family:courier new,courier,monospace;">i </span>من النوع <span style="font-family:courier new,courier,monospace;">int</span> وأسندنا إليها القيمة 0 في قسم التهيئة، وبالنسبة لشرط الاستمرار للحلقة <span style="font-family:courier new,courier,monospace;">i &lt; 3 </span>فمن الواضح أنّ الحلقة ستستمرّ بالتكرار طالما كانت قيمة i أصغر تمامًا من 3. أمّا بالنسبة للقسم الأخير فنعمل على زيادة قيمة متغيّر الحلقة i بمقدار 1 في كلّ دورة عن طريق عامل الزيادة اللاحق<span style="font-family:courier new,courier,monospace;"> ++i</span>.
</p>

<p dir="rtl">
	آلية عمل هذه الحلقة بسيطة:
</p>

<ol dir="rtl">
<li>
		عندما يصل تنفيذ البرنامج إلى حلقة <span style="font-family:courier new,courier,monospace;">for</span> يتمّ التصريح عن المتغيّر <span style="font-family:courier new,courier,monospace;">i </span>وإسناد القيمة 0 إليه.
	</li>
	<li>
		يختبر البرنامج شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">i &lt; 3 </span>فإذا كان <span style="font-family:courier new,courier,monospace;">true</span> يبدأ بتنفيذ العبارات البرمجيّة الموجودة ضمن حاضنة <span style="font-family:courier new,courier,monospace;">for</span>. وإلّا يخرج فورًا من الحلقة.
	</li>
	<li>
		بعد الانتهاء من تنفيذ العبارات ضمن حاضنة <span style="font-family:courier new,courier,monospace;">for</span>، ينتقل البرنامج إلى التعبير <span style="font-family:courier new,courier,monospace;">++i </span>ليزيد قيمة<span style="font-family:courier new,courier,monospace;"> i</span> بمقدار 1.
	</li>
	<li>
		تتكرّر نفس الخطوتين 2 و 3.
	</li>
</ol>
<p dir="rtl">
	سيتكرّر في هذا المثال البسيط تنفيذ العبارة الموجودة في الحاضنة ثلاث مرّات لأنّ العدّ يبدأ من الصفر (قيمة i الابتدائيّة تساوي الصفر).
</p>

<p dir="rtl">
	لنتناول الآن برنامجًا عمليًّا وظيفته إيجاد مجموع سلسلة من الأعداد المتتالية. أنشئ برنامجًا جديدًا اسمه<span style="font-family:courier new,courier,monospace;"> Lesson04_1</span> ثمّ استبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">Program.cs </span>بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7761_8">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson04_1</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pln"> n</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              string str_n</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This Program calculates the series: sum = 1 + 2 + 3 + ... + n"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input 'n' please: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              str_n </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              n </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> n</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"sum = {0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	يعمل البرنامج السابق على جمع الأعداد من 1 حتى القيمة المدخلة <span style="font-family:courier new,courier,monospace;">n</span>. أي سيحسب برنامجنا مجموع السلسلة: <strong>1 + 2 + 3 + … + n</strong>. لاحظ القيمة الابتدائيّة للمتغيّر <span style="font-family:courier new,courier,monospace;">i</span> (تساوي 1) وشرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">i &lt;= n </span>في السطر 18. تذكّر أنّ العبارة الموجودة في السطر 20 تُكافئ العبارة <span style="font-family:courier new,courier,monospace;">sum = sum + i</span>.
</p>

<p dir="rtl">
	نفّذ البرنامج وجرّب إدخال قيم مختلفة للمتغيّر<span style="font-family:courier new,courier,monospace;"> n</span> لتحصل على المجاميع الموافقة.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: المتغيّر <span style="font-family:courier new,courier,monospace;">i </span>في البرنامج السابق مرئي فقط ضمن الحلقة التكراريّة ولا وجود له خارجها، يعرف هذا بمجال الرؤية للمتغيّر variable scope. ستؤدّي محاولة الوصول للمتغيّر i خارج الحلقة إلى خطأ أثناء بناء البرنامج.
</p>

<p dir="rtl">
	سنكتب الآن برنامجًا آخرًا لحساب مجموع السلسلة: <strong>2 + 4 + 6 + 8 + … + n</strong>. لن يختلف البرنامج في هذا المثال عن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson04_1 </span>باستثناء أنّنا سنجمع الأعداد الزوجية فقط. إليك البرنامج كما سيبدو:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6465_15">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson04_2</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pln"> n</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              string str_n</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This Program calculates the series: sum = 2 + 4 + 6 + ... + n"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input 'n' please: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              str_n </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              n </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="kwd">for</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> n</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln"> 
</span><span class="lit">23</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"sum = {0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">26</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	لاحظ كيف نزيد قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">i</span> في كلّ تكرار للحلقة <span style="font-family:courier new,courier,monospace;">for</span> بمقدار 2 باستخدام التعبير <span style="font-family:courier new,courier,monospace;">i += 2 </span>(السطر 18)، وبالتالي نتفادى جمع الأعداد الفردية (لاحظ أنّ قيمة<span style="font-family:courier new,courier,monospace;"> i</span> بدأت من الصفر). فيما عدا ذلك يبدو هذا البرنامج مطابقًا لبنية البرنامج <span style="font-family:courier new,courier,monospace;">Lesson04_1</span>.
</p>

<h2 dir="rtl">
	حلقة while التكرارية
</h2>

<p dir="rtl">
	لهذه الحلقة التكراريّة الشكل العام التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_17">
<span class="pln">while (loop_condition)
{
    statement1;
    statement2;
    ...
}</span></pre>

<p dir="rtl">
	ستتكرّر العبارات البرمجيّة الموجودة ضمن حاضنة <span style="font-family:courier new,courier,monospace;">while</span> طالما كان الشرط <span style="font-family:courier new,courier,monospace;">loop_condition</span> محقّقًا (أي <span style="font-family:courier new,courier,monospace;">true</span>) وبمجرّد أن يصبح الشرط <span style="font-family:courier new,courier,monospace;">loop_condition</span> غير محقّق تتوقّف الحلقة عن التكرار.
</p>

<p dir="rtl">
	سنعدّل البرنامج <span style="font-family:courier new,courier,monospace;">Lesson04_1</span> السابق لكي يسمح باستخدام الحلقة <span style="font-family:courier new,courier,monospace;">while</span>. أنشئ مشروعًا جديدًا وسمّه <span style="font-family:courier new,courier,monospace;">Lesson04_3</span> ثم استبدل محتويات <span style="font-family:courier new,courier,monospace;">Program.cs </span>بما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6465_19">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson04_3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pln"> n</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              string str_n</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln"> 
</span><span class="lit">12</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This Program calculates the series: sum = 1 + 2 + 3 + ... + n"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input 'n' please: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              str_n </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              n </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">&lt;=</span><span class="pln"> n</span><span class="pun">)</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln">
</span><span class="lit">22</span><span class="pln">                  i</span><span class="pun">++;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">
</span><span class="lit">25</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"sum = {0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">26</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">27</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	صرّحنا عن المتغيّر<span style="font-family:courier new,courier,monospace;"> i </span>وأسندنا له القيمة 1 في السطر 9 والذي سيمثّل متغيّر حلقة <span style="font-family:courier new,courier,monospace;">while</span>. استبدلنا حلقة <span style="font-family:courier new,courier,monospace;">for</span> بحلقة <span style="font-family:courier new,courier,monospace;">while</span> في السطر 18 مع ملاحظة أنّ شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">i &lt;= 5</span> بقي دون تعديل. لاحظ العبارة المهمّة في السطر 22 والتي تحوي التعبير<span style="font-family:courier new,courier,monospace;"> ++i</span> الذي سيزيد قيمة i بمقدار واحد في كلّ دورة. إنّ إغفال هذه العبارة سيؤدّي إلى الدخول في حلقة لا نهائيّة، لأنّ شرط الاستمرار في هذه الحالة لن يعطي <span style="font-family:courier new,courier,monospace;">false</span> أبدًا لأنّ قيمة i لن تتغيّر.
</p>

<p>
	<span style="line-height: 2em;">نفّذ البرنامج وأدخل قيم مختلفة للمتغيّر n لاختبار البرنامج. جرّب الآن إدخال القيمة 0 للمتغيّر n ستحصل في الخرج على المجموع <span style="font-family:courier new,courier,monospace;">sum = 0</span> وهذا منطقيّ. إذ أنّنا نخبر البرنامج بأنّنا لا نريد جمع أي عدد. سبب الحصول على هذا الخرج في الواقع هو أنّ البرنامج أثناء التنفيذ لن يدخل إلى حلقة <span style="font-family:courier new,courier,monospace;">while</span> مطلقًا لأنّ شرط الاستمرار <span style="font-family:courier new,courier,monospace;">i &lt;= n </span>سيكون غير محقّقًا منذ البداية (تذكّر أنّ قيمة<span style="font-family:courier new,courier,monospace;"> i</span> الابتدائيّة هي 1).</span>
</p>

<h2 dir="rtl">
	حلقة do-while التكرارية
</h2>

<p dir="rtl">
	لهذه الحلقة الشكل العام التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_21">
<span class="pln">do
{
    statement1;
    statement2;
    ...
}

while (loop_condition)</span></pre>

<p dir="rtl">
	وهي تشبه الحلقة <span style="font-family:courier new,courier,monospace;">while</span> باستثناء أنّ شرط استمرار الحلقة <span style="font-family:courier new,courier,monospace;">loop_condition</span> يجري اختباره في نهايتها وليس في بدايتها كما هو الحال مع حلقة <span style="font-family:courier new,courier,monospace;">while</span>. قد لا يبدو هذا الأمر مهمًّا في البداية ولكنّه في الحقيقة عكس ذلك تمامًا. لفهم الفرق أنشئ مشروعًا جديدًا وسمّه <span style="font-family:courier new,courier,monospace;">Lesson04_04 </span>ثمّ استبدل الشيفرة الموجودة في<span style="font-family:courier new,courier,monospace;"> Program.cs</span> بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6465_23">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">Lesson04_4</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pln"> n</span><span class="pun">,</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              string str_n</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"This Program calculates the series: sum = 1 + 2 + 3 + ... + n"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input 'n' please: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              str_n </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">
</span><span class="lit">16</span><span class="pln">              n </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              </span><span class="typ">Do</span><span class="pln">
</span><span class="lit">19</span><span class="pln">              </span><span class="pun">{</span><span class="pln">
</span><span class="lit">20</span><span class="pln">                  sum </span><span class="pun">+=</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="lit">21</span><span class="pln"> 
</span><span class="lit">22</span><span class="pln">                  i</span><span class="pun">++;</span><span class="pln">
</span><span class="lit">23</span><span class="pln">              </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">              </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">&lt;=</span><span class="pln"> n</span><span class="pun">);</span><span class="pln">
</span><span class="lit">25</span><span class="pln"> 
</span><span class="lit">26</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"sum = {0}"</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">);</span><span class="pln">
</span><span class="lit">27</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">  </span><span class="pun">}</span></pre>

<p dir="rtl">
	لا يختلف هذا البرنامج عن سابقيه في حساب مجموع السلسلة <strong>1 + 2 + 3 + … + n</strong>، نفّذ البرنامج وأدخل القيمة 0 للمتغيّر <span style="font-family:courier new,courier,monospace;">n</span> ستحصل في الخرج على المجموع <span style="font-family:courier new,courier,monospace;">sum = 1</span> وهذا خطأ بالطبع!
</p>

<p dir="rtl">
	السبب في ذلك أنّ اختبار شرط الاستمرار في حلقة <span style="font-family:courier new,courier,monospace;">do-while</span> يجري بعد انتهاء الحلقة من تنفيذ أوّل دورة لها، حيث تؤدّي هذه الدورة إلى جعل قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">sum</span> تساوي 1 وقيمة <span style="font-family:courier new,courier,monospace;">i</span> تساوي 2، وبعد ذلك يأتي اختبار الشرط <span style="font-family:courier new,courier,monospace;">i &lt;= n </span>والذي سيعطي <span style="font-family:courier new,courier,monospace;">false</span> بالطبع وتتوقف الحلقة عن التكرار ولكن بعد فوات الأوان.
</p>

<p dir="rtl">
	في حلقة <span style="font-family:courier new,courier,monospace;">while</span> (وحتى في حلقة <span style="font-family:courier new,courier,monospace;">for</span>) لم نواجه هذه المشكلة لأنّ شرط استمرارها يجري اختباره في بداية الحلقة وقبل تنفيذ أي دورة تكراريّة.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	اكتب برنامجًا يطبع الأعداد من 1 حتى 100 على الشاشة باستثناء الأعداد من مضاعفات العدد 5 أي على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_25">
<span class="pln">1, 2, 3, 4, 6, 7, 8, 9, 11, … , 14, 16, …</span></pre>

<p dir="rtl">
	<strong>تلميح</strong>: ستحتاج في هذا التمرين إلى استخدام <a href="https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r315/" rel="">بنية if</a> ضمن حلقة <span style="font-family:courier new,courier,monospace;">for</span> واختبار قيمة التعبير المنطقي<span style="font-family:courier new,courier,monospace;"> i % 5 == 0 </span>على افتراض أنّ <span style="font-family:courier new,courier,monospace;">i </span>هو عدّاد الحلقة.
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	اكتب برنامجًا يطلب من المستخدم إدخال عدد صحيح موجب ثمّ يوجد مضروب هذا عدد (قيمة العاملي له). فإذا أدخل عددًا سالبًا يجب على البرنامج أن ينبّه المستخدم على ذلك ويُنهي التنفيذ.
</p>

<p dir="rtl">
	تلميح: تذكّر أنّ مضروب عدد يُعبّر عن الجداءات للقيم المتناقصة لهذا العدد فمثلًا لإيجاد مضروب 5 (!5) نكتب:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6465_29">
<span class="pln">5! = 5 * 4 * 3 * 2 * 1</span></pre>

<p dir="rtl">
	تذكّر أيضًا أنّ<span style="font-family:courier new,courier,monospace;"> !1 =1</span> و <span style="font-family:courier new,courier,monospace;">!0 = 1</span>.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تحدثنا في هذا الدرس عن الحلقات التكراريّة بأنواعها المختلفة. تدعم سي شارب عدة حلقات تكراريّة تُعتبر حلقة for من أهمّها. في الحقيقة توجد حلقة تكراريّة أخرى لم نتحدّث عنها في هذا الدرس، وهي حلقة <span style="font-family:courier new,courier,monospace;">foreach</span>، وهي حلقة مفيدة جدًّا أجلّت الحديث عنها إلى أن نتعرّف على المجموعات <span style="font-family:courier new,courier,monospace;">Collections</span> بأنواعها ونتعلّم التعامل معها.
</p>
]]></description><guid isPermaLink="false">320</guid><pubDate>Sat, 30 Apr 2016 21:24:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x639;&#x628;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D8%B9%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r315/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-if-else-switch.png.e3acb58628b040e32080c5434e98e72b.png" /></p>

<p dir="rtl">
	تعتبر العبارات الشرطية في البرنامج من الأمور الأساسيّة في البرمجة كما هو معلوم. تمتلك لغة سي شارب نوعين من العبارات الشرطية وهما: بنية<span style="font-family:courier new,courier,monospace;"> if-else </span>وبنية <span style="font-family:courier new,courier,monospace;">switch-case</span>.
</p>

<p dir="rtl" style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15432" data-unique="ti8snhygh" src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-if-else-switch.png.7f7e5a7abc94d839962dbcae56dfc274.png" alt="learn-csharp-if-else-switch.png"></p>

<h2 dir="rtl">
	العبارة الشرطية if-else
</h2>

<p dir="rtl">
	وهي بنية مألوفة في معظم لغات البرمجة، تشبه هذه البنية في تشكيلها تلك الموجودة في لغات أخرى مثل ++C و Java. تمتلك هذه البنية ثلاثة أشكال سنتحدّث عنها تباعًا.
</p>

<h3 dir="rtl">
	الشكل الأول لبنية if
</h3>

<p dir="rtl">
	الشكل الأبسط لبنية<span style="font-family:courier new,courier,monospace;"> if</span>  هي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_8">
<span class="pln">if ([condition])
{
    statement1;
    statement2;
    ...
}</span></pre>

<p dir="rtl">
	إذا كان تقييم evaluate الشرط [condition] يعطينا true (أي تحقّق الشرط) عندها ستُفّذ العبارات البرمجيّة الموجودة ضمن الحاضنة {}، وإلّا (أي لم يتحقّق الشرط) فلن يُنفّذ أيّ منها. أنشئ مشروعًا جديدًا سمّه <span style="font-family:courier new,courier,monospace;">Lesson03_1 </span>واستبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">Program.cs</span> بالبرنامج البسيط التالي الذي يعمل على مقارنة القيمة المدخلة من المستخدم مع العدد 5 ويُظهر الخرج المناسب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2467_10">
<span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln"> 
</span><span class="lit">3</span><span class="pln">  namespace </span><span class="typ">Lesson03_1</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             string str_x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input a number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is greater than 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Goodbye!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	جرّب تنفيذ هذا البرنامج باستخدام <span style="font-family:courier new,courier,monospace;">Ctrl+F5</span> (أو من القائمة <strong>Debug &gt; Start Without Debugging</strong>). سيطلب منك البرنامج إدخال قيمة عدديّة، أدخل العدد 6، سيعرض البرنامج الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_12">
<span class="pln">The value 6 is greater than 5

Goodbye!</span></pre>

<p dir="rtl">
	أعد تنفيذ البرنامج وأدخل هذه المرّة القيمة 3 لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_14">
<span class="pln">Goodbye!</span></pre>

<p dir="rtl">
	لاحظ بأنّ خرج البرنامج قد اختلف باختلاف القيم المدخلة، أي أنّ هناك اختلاف في العبارات البرمجيّة التي تمّ تنفيذها في كلّ مرّة. يعود سبب ذلك إلى البنية <span style="font-family:courier new,courier,monospace;">if </span>الموجودة بين السطرين 17 و 20. يختبر الشرط الموجود بعد كلمة <span style="font-family:courier new,courier,monospace;">if</span> في السطر 17 فيما إذا كانت قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">x</span> أكبر تمامًا من 5. فإذا كانت نتيجة تقييم التعبير <span style="font-family:courier new,courier,monospace;">x &gt; 5</span> تساوي <span style="font-family:courier new,courier,monospace;">true</span> فهذا يعني أنّ الشرط قد تحقّق وبالتالي تنفّذ جميع العبارات البرمجيّة الموجودة في الحاضنة (بين السطرين 18 و 20). أمّا إذا كانت نتيجة تقييم التعبير <span style="font-family:courier new,courier,monospace;">x &gt; 5</span> تساوي <span style="font-family:courier new,courier,monospace;">false</span> فعندها سيتجاوز تنفيذ البرنامج البنية <span style="font-family:courier new,courier,monospace;">if </span>إلى العبارات التي تأتي بعد السطر 20.
</p>

<h3 dir="rtl">
	الشكل الثاني لبنية if
</h3>

<p dir="rtl">
	هذا الشكل للعبارة الشرطية<span style="font-family:courier new,courier,monospace;"> if </span>مفيد أيضًا، ويُستخدم عندما نريد الاختيار بين مجموعتين من العبارات البرمجيّة، والشكل العام له:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_16">
<span class="pln">if ([condition])
{
    statement1;
    statement2;
    ...
}
else
{
    Statement3;
    Statement4;
    ...
}</span></pre>

<p dir="rtl">
	لقد أضفنا القسم <span style="font-family:courier new,courier,monospace;">else</span> مع حاضنته. المنطق هنا بسيط يمكننا قراءته بالشكل التالي:
</p>

<p dir="rtl">
	<strong>"إذا تحقق الشرط [condition] عندها تنفّذ الحاضنة الموجودة بعد<span style="font-family:courier new,courier,monospace;"> if </span>مباشرةً، وإلّا يتم تنفيذ الحاضنة الموجودة بعد <span style="font-family:courier new,courier,monospace;">else</span> مباشرةً"</strong>
</p>

<p dir="rtl">
	لكي نتعرّف على كيفيّة التعامل مع هذا الشكل، أنشئ مشروعًا جديدًا سمّه<span style="font-family:courier new,courier,monospace;"> Lesson03_2 </span>وانسخ الشيفرة التالية إلى الملف<span style="font-family:courier new,courier,monospace;"> Program.cs</span>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2467_18">
<span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">  namespace </span><span class="typ">Lesson03_2</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             string str_x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input a number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is greater than 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             </span><span class="kwd">else</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is smaller than or equals 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">
</span><span class="lit">26</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Goodbye!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">27</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">28</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln"> </span><span class="pun">}</span></pre>

<p dir="rtl">
	<span style="line-height: 2em;">هذا البرنامج مطابق للبرنامج الذي رأيناه قبل قليل باستثناء القسم <span style="font-family:courier new,courier,monospace;">else</span> مع حاضنته. يسلك هذا البرنامج نفس السلوك الذي يسلكه البرنامج السابق باستثناء أنّه لو أدخل المستخدم قيمة مثل 3 سيعمل البرنامج على طباعة الخرج التالي:</span>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_20">
<span class="pln">The value 3 is smaller than or equals 5

Goodbye!</span></pre>

<p dir="rtl">
	لاحظ أنّ البرنامج<span style="font-family:courier new,courier,monospace;"> Lesson03_1</span> كان يطبع العبارة !Goodbye فقط عند إدخال القيمة 3. السبب في ظهور الخرج الجديد هو وجود القسم <span style="font-family:courier new,courier,monospace;">else</span> في بنية <span style="font-family:courier new,courier,monospace;">if</span> السابقة، فعندما يُقيّم الشرط <span style="font-family:courier new,courier,monospace;">x &gt; 5</span> في السطر 17 وتكون نتيجة تقييمه <span style="font-family:courier new,courier,monospace;">false</span> سينتقل البرنامج فورًا إلى تنفيذ العبارات البرمجيّة الموجودة ضمن حاضنة <span style="font-family:courier new,courier,monospace;">else</span> وهذا هو سبب ظهور هذا الخرج.
</p>

<p dir="rtl">
	العيب الوحيد في هذا البرنامج أنّه لا يستطيع التمييز بين الحالة التي تكون فيها القيمة المدخلة تساوي 5 وبين الحالة التي تكون فيها أصغر تمامًا من 5، ففي كلّ من هاتين الحالتين يعرض البرنامج نفس الخرج عن طريق تنفيذ العبارة الموجودة في السطر 23.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: في حال كانت أيّة حاضنة تحوي عبارة برمجيّة واحد فقط، فعندها يمكن عدم استخدام قوسي الحاضنة {} مع أنّني أفضّل استخدامهما لجعل البرنامج أكثر وضوحًا.
</p>

<h3 dir="rtl">
	الشكل الثالث لبنية if
</h3>

<p dir="rtl">
	وهو الشكل الأكثر شمولًا وفيه نستخدم القسم <span style="font-family:courier new,courier,monospace;">else if</span> على الصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_22">
<span class="pln">if ([condition])
{
    statement1;
    statement2;
    ...
}
else if ([condition1])
{
    Statement3;
    Statement4;
    ...
}
else if ([condition2])
{
    Statement3;
    Statement4;
    ...
}
...
else
{
    Statement3;
    Statement4;
    ...
}</span></pre>

<p dir="rtl">
	يمكننا قراءة المنطق هنا على الشكل التالي:
</p>

<p dir="rtl">
	<strong>"إذا تحقّق الشرط [condition] عندها تنفّذ الحاضنة الموجودة بعد <span style="font-family:courier new,courier,monospace;">if </span>مباشرةً، وإلّا إذا (<span style="font-family:courier new,courier,monospace;">else if</span>) تحقّق الشرط [condition1] يتم تنفيذ الحاضنة الموجودة بعد<span style="font-family:courier new,courier,monospace;"> else if</span> الأولى مباشرةً، وإلّا إذا تحقّق الشرط [condition2] يتم تنفيذ الحاضنة الموجودة بعد <span style="font-family:courier new,courier,monospace;">else if</span> الثانية مباشرةً، وإلّا (<span style="font-family:courier new,courier,monospace;">else</span>) يتم تنفيذ الحاضنة الموجودة بعد <span style="font-family:courier new,courier,monospace;">else</span> مباشرةً"</strong>
</p>

<p dir="rtl">
	نلاحظ أنّه يمكننا استخدام أقسام<span style="font-family:courier new,courier,monospace;"> else if</span> بقدر ما نريد، ولكن يمكن استخدام قسم <span style="font-family:courier new,courier,monospace;">else</span> وحيد. ونلاحظ أيضًا أنّه بالنتيجة ستنفّذ مجموعة واحدة فقط ضمن حاضنة ما. وواضح أيضًا أنّ أقسام<span style="font-family:courier new,courier,monospace;"> else if</span> و <span style="font-family:courier new,courier,monospace;">else</span> هي أقسام اختياريّة ووجودها غير مرتبط ببعضها، ولكن إذا حوت بنية <span style="font-family:courier new,courier,monospace;">if</span> قسم<span style="font-family:courier new,courier,monospace;"> else if </span>فيجب أي يكون القسم <span style="font-family:courier new,courier,monospace;">else</span> (في حال وجوده) هو القسم الأخير.
</p>

<p dir="rtl">
	لكي نثبّت هذا المفهوم بشكل جيّد انظر البرنامج<span style="font-family:courier new,courier,monospace;"> Lesson03_3 </span>التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2467_24">
<span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">  namespace </span><span class="typ">Lesson03_3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             string str_x</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input a number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln">
</span><span class="lit">18</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">19</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is greater than 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x </span><span class="pun">==</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">23</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is equals 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln">             </span><span class="kwd">else</span><span class="pln">
</span><span class="lit">26</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">27</span><span class="pln">                 </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"The value {0} is smaller than 5"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">29</span><span class="pln">
</span><span class="lit">30</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Goodbye!"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">32</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">33</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	<span style="line-height: 2em;">يشبه هذا البرنامج سابقيه إلى حدٍّ بعيد، فهو يقارن القيمة المدخلة مع العدد 5 ويعرض رسالة مناسبة نتيجة عملية المقارنة. الشيء الجديد هنا هو التمييز بين الحالة التي تكون فيها القيمة المدخلة تساوي العدد 5 والحالة التي تكون فيها أصغر من العدد 5. قمنا بذلك من خلال إضافة القسم<span style="font-family:courier new,courier,monospace;"> else if</span> جديد يختبر حالة المساواة مع العدد 5. الآن أصبح منطق البرنامج كالتالي: </span>
</p>

<p>
	<span style="line-height: 2em;">"إذا كانت القيمة المدخلة أكبر تمامًا من 5 (السطر 17) عندها تُنفّذ العبارة الموجودة في السطر 19، وإلّا إذا كانت القيمة المدخلة تساوي 5 (السطر 21) عندها تُنفّذ العبارة الموجودة في السطر 23، وإلّا ستكون القيمة المدخلة أصغر من 5 حتمًا، وتُنفَّذ العبارة الموجودة في السطر 27."</span>
</p>

<h2 dir="rtl">
	العبارة الشرطية switch-case
</h2>

<p dir="rtl">
	تفيد هذه البنية في الاختيار من بين عدّة حالات منفصلة. لهذه البنية الشكل العام التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2467_31">
<span class="pln">switch(expression)
{
    case [A]:
        [statements]
        break;

    case [B]:
        [statements]
        break;

    ...

    [default:]
        [statements]
        break;
}</span></pre>

<p dir="rtl">
	القسم الأخير <span style="font-family:courier new,courier,monospace;">default</span> هو قسم اختياري، كما يجب أن يكون هناك قسم <span style="font-family:courier new,courier,monospace;">case</span> واحد على الأقل. إليك الآن البرنامج <span style="font-family:courier new,courier,monospace;">Lesson03_4</span> لفهم كيفيّة استخدام هذه البنية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2467_28">
<span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">  namespace </span><span class="typ">Lesson03_4</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             string str_x</span><span class="pun">,</span><span class="pln"> str_y</span><span class="pun">,</span><span class="pln"> operation</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input first number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">14</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input second number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">             str_y </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">17</span><span class="pln"> 
</span><span class="lit">18</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Choose operation (+, -, *, /): "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">             operation </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             y </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">            
</span><span class="lit">24</span><span class="pln">             </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">operation</span><span class="pun">)</span><span class="pln">
</span><span class="lit">25</span><span class="pln">             </span><span class="pun">{</span><span class="pln">
</span><span class="lit">26</span><span class="pln">                 </span><span class="kwd">case</span><span class="pln"> </span><span class="str">"+"</span><span class="pun">:</span><span class="pln">
</span><span class="lit">27</span><span class="pln">                     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} + {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">                     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="lit">29</span><span class="pln">                 </span><span class="kwd">case</span><span class="pln"> </span><span class="str">"-"</span><span class="pun">:</span><span class="pln">
</span><span class="lit">30</span><span class="pln">                     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} - {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">                     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="lit">32</span><span class="pln">                 </span><span class="kwd">case</span><span class="pln"> </span><span class="str">"*"</span><span class="pun">:</span><span class="pln">
</span><span class="lit">33</span><span class="pln">                     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} * {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">34</span><span class="pln">                     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="lit">35</span><span class="pln">                 </span><span class="kwd">case</span><span class="pln"> </span><span class="str">"/"</span><span class="pun">:</span><span class="pln">
</span><span class="lit">36</span><span class="pln">                     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} / {1} = {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">37</span><span class="pln">                     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="lit">38</span><span class="pln">                 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
</span><span class="lit">39</span><span class="pln">                     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Unsupported operation."</span><span class="pun">);</span><span class="pln">
</span><span class="lit">40</span><span class="pln">                     </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
</span><span class="lit">41</span><span class="pln">             </span><span class="pun">}</span><span class="pln">
</span><span class="lit">42</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">43</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">44</span><span class="pln"> </span><span class="pun">}</span></pre>

<p dir="rtl">
	<span style="line-height: 2em;">البرنامج السابق عبارة عن برنامج آلة حاسبة بسيطة تدعم العمليات الحسابية الأربع: الجمع والطرح والضرب والقسمة. يطلب البرنامج من المستخدم إدخال قيمتين عدديّتين، بعد ذلك يطلب اختيار العمليّة الحسابيّة المراد إجراؤها على هاتين القيمتين (+ ، - ، * ، /) وتخزين العمليّة المختارة ضمن المتغيّر النصّي <span style="font-family:courier new,courier,monospace;">operation</span> وذلك في السطر 19. تعمل البنية <span style="font-family:courier new,courier,monospace;">switch</span> في السطر 24 على مقارنة قيمة المتغيّر النصيّ <span style="font-family:courier new,courier,monospace;">operation</span> مع القيم الموجودة في أقسام <span style="font-family:courier new,courier,monospace;">case</span> (الأسطر 26 و 29 و 32 و 35) فإذا طابقت القيمة الموجودة في <span style="font-family:courier new,courier,monospace;">operation</span> إحدى تلك القيم، فإنّ العبارات البرمجيّة الموجودة ضمن هذا القسم سيتمّ تنفيذها. أمّا إذا لم يحدث مثل هذا التطابق، فستنفّذ العبارات البرمجيّة الموجودة في القسم الاختياري <span style="font-family:courier new,courier,monospace;">default</span> والتي ستخبر المستخدم (في هذا المثال) بأنّ العمليّة الحسابيّة التي يرغبها لا يدعمها البرنامج.</span>
</p>

<p dir="rtl">
	نستفيد من القسم <span style="font-family:courier new,courier,monospace;">default</span> في تنفيذ عبارات برمجيّة في حال لم يحدث التطابق مع أيّ قسم <span style="font-family:courier new,courier,monospace;">case</span> سابق. كما نلاحظ أنّ العبارة <span style="font-family:courier new,courier,monospace;">break</span> الموجودة في كلّ قسم من أقسام <span style="font-family:courier new,courier,monospace;">case</span> بالإضافة إلى قسم <span style="font-family:courier new,courier,monospace;">default</span> هي عبارة ضرورية وتؤدّي إلى انتقال تنفيذ البرنامج إلى خارج بنية <span style="font-family:courier new,courier,monospace;">switch</span> أي إلى السطر 42.
</p>

<p dir="rtl">
	جرّب تنفيذ البرنامج وإدخال قيم متنوّعة بالإضافة إلى تجريب العمليات الحسابيّة الأربع. جرّب إدخال عامل باقي القسمة مثلًا (%) وانظر كيف سيجيب البرنامج بالرسالة <strong>Unsupported operation</strong>.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	في البرنامج <span style="font-family:courier new,courier,monospace;">Lesson03_4</span> السابق إذا أدخل المستخدم القيمة 0 للعدد الثاني، ثم اختار عمليّة القسمة ( / ) سيؤدّي ذلك إلى القسمة على صفر، وهذا يسبّب خطًأ أثناء التنفيذ <strong>runtime error</strong> يؤدّي إلى رمي استثناء وتوقّف البرنامج عن العمل. أجرِ تعديلًا على البرنامج ليأخذ هذا الأمر بالحسبان.
</p>

<p dir="rtl">
	<a name="_GoBack" rel="external"></a> (تلميح: أضف شرط <span style="font-family:courier new,courier,monospace;">if</span> ضمن قسم <span style="font-family:courier new,courier,monospace;">case</span> الموافق للعمليّة ( / ) لاختبار قيمة المتغيّر<span style="font-family:courier new,courier,monospace;"> y</span> فيما إذا كانت تساوي الصفر أم لا).
</p>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	اكتب برنامجًا يطلب من المستخدم إدخال درجة الحرارة الحاليّة. فإذا كانت درجة الحرارة أقل من 4 مئوية يعرض البرنامج الرسالة "Very Cold". أمّا إذا كانت درجة الحرارة بين 4 وأقل من 10 مئويّة يعرض الرسالة "Cold". وفي حال كانت درجة الحرارة بين 10 وأقل من 30 مئويّة يعرض الرسالة "Normal". أمّا إذا كانت درجة الحرارة 30 فما فوق فيعرض البرنامج الرسالة "Hot".
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	تعلّمنا في هذا الدرس مبادئ التعامل مع العبارات الشرطية والحاجة الماسّة إليها في اتخاذ القرارات المناسبة في البرنامج. تعرّفنا على العبارة الشرطية <span style="font-family:courier new,courier,monospace;">if-else </span>وأشكالها المفيدة، كما تعرّفنا أيضًا على بنية الاختيار <span style="font-family:courier new,courier,monospace;">swicth-case</span>. في مجال البرمجة من غير الممكن في الواقع أن يخلو أيّ برنامج فعليّ من وجود عبارة شرطية <span style="font-family:courier new,courier,monospace;">if </span>واحدة على الأقل.
</p>
]]></description><guid isPermaLink="false">315</guid><pubDate>Sat, 23 Apr 2016 09:32:43 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; (variables) &#x648;&#x627;&#x644;&#x639;&#x648;&#x627;&#x645;&#x644; (operators) &#x641;&#x64A; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-variables-%D9%88%D8%A7%D9%84%D8%B9%D9%88%D8%A7%D9%85%D9%84-operators-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r314/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-variables-operators.png.30b2f14fad1a579f2dff633bff65931e.png" /></p>
<p dir="rtl" style="text-align: center;">
	<img alt="learn-csharp-variables-operators.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15421" data-unique="mx5drvolb" src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-variables-operators.png.2ab4d738b803aa18769beb0fa2bac082.png">
</p>

<h2 dir="rtl">
	المتغيرات Variables
</h2>

<p dir="rtl">
	سبق وأن ذكرنا في الدرس الأوّل أنّه يوجد <a href="https://academy.hsoub.com/programming/c-sharp/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r312/" rel="">نمطان أساسيّان لأنواع المتغيّرات في سي شارب</a>، وهما: أنواع قيمة value types وأنواع مرجعيّة reference types.
</p>

<p dir="rtl">
	تشتمل أنواع القيمة على الأنواع المُدمجة built-in في اللغة مثل <span style="font-family:courier new,courier,monospace;">int</span> و <span style="font-family:courier new,courier,monospace;">float</span> و <span style="font-family:courier new,courier,monospace;">decimal</span> و <span style="font-family:courier new,courier,monospace;">double</span> و <span style="font-family:courier new,courier,monospace;">bool</span> وجميع الأنواع المُعرّفة كبنية <span style="font-family:courier new,courier,monospace;">struct</span>. سنتحدّث عن البنى في درس لاحق.
</p>

<p dir="rtl">
	في حين تشتمل الأنواع المرجعيّة على أيّ نوع آخر وهذا يشتمل على عدد لا يحصى من الأنواع، فيكفيك أن تعرف مثلًا أنّ جميع الأنواع الموجودة في مكتبة FCL هي أنواع مرجعيّة، بالإضافة إلى أنّ أي نوع جديد (على شكل صنف <span style="font-family:courier new,courier,monospace;">class</span>) ينشئه المستخدم يُعتبر نوعًا مرجعيًّا. ومن المفيد أن تعلم أنّ النوع المُضمّن <span style="font-family:courier new,courier,monospace;">string</span> هو نوع مرجعيّ أيضًا.
</p>

<p dir="rtl">
	يكمن الفرق الأساسي بين أنواع القيمة والأنواع المرجعيّة في مكان وطريقة تخزين قيم المتغيّرات المصرّح عنها بواسطتها. فعند التصريح عن متغيّر من نوع قيمة، تُخزّن أي قيمة يتمّ إسنادها إليه ضمن المتغيّر نفسه أو بمعنى أدق تُخزّن في ذاكرة المُكدّس Stack Memory، أمّا المتغيّر المصرّح عنه على أنّه نوع مرجعيّ فالّذي يُخزّن ضمنه هو العنوان إلى موقع في الذاكرة. هذا الموقع موجود ضمن ما يُسمّى بذاكرة الكَوْمَة Heap Memory. انظر إلى الشكل التوضيحي التالي.
</p>

<p dir="rtl" style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15140" href="https://academy.hsoub.com/uploads/monthly_2016_04/value-types-ref-types.png.af1dda4631ddaee7113e999323de82e9.png" rel="" data-fileext="png"><img alt="value-types-ref-types.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15140" data-unique="1z8g7lm6f" src="https://academy.hsoub.com/uploads/monthly_2016_04/value-types-ref-types.thumb.png.07a447e8e4b2dc47327b3ecd702e1f34.png"></a>
</p>

<p dir="rtl">
	حيث صرّحنا عن المتغيّر <span style="font-family:courier new,courier,monospace;">x</span> من النوع <span style="font-family:courier new,courier,monospace;">int</span> وخزّنّا القيمة 5 ضمنه. وبما أنّ <span style="font-family:courier new,courier,monospace;">int</span> هو نوع قيمة، لذلك سيكون المتغيّر مع القيمة المخزّنة فيه ضمن المكدّس Stack.
</p>

<p dir="rtl">
	أمّا بالنسبة للمتغيّر<span style="font-family:courier new,courier,monospace;"> s </span>فهو من النوع <span style="font-family:courier new,courier,monospace;">string</span> وقد أسندنا إليه النص "!Hello" وبما أنّ النوع <span style="font-family:courier new,courier,monospace;">string</span> هو نوع مرجعيّ كما أسلفنا لذلك فالقيمة التي ستكون مخزّنة ضمن المتغيّر <span style="font-family:courier new,courier,monospace;">s</span> في الحقيقة ليست النص "!Hello" إنّما العنوان address الذي يُشير إلى موقع ضمن الكومة Heap موجود ضمنه النص "!Hello"، وهذا بالمناسبة ليس سلوكًا تنفرد به سي شارب، بل هو موجود في لغات أخرى مثل ++C و C.
</p>

<p dir="rtl">
	سنتوسّع في هذا الموضوع قليلًا عندما نتحدّث عن الأصناف والكائنات لاحقًا في هذه السلسلة.
</p>

<p dir="rtl">
	يمكن استخدام أيّ مزيج من الحروف والأرقام عند تسمية المتغيّرات، بشرط أن يكون أوّل محرف في اسم المتغيّر حرفًا وليس رقمًا. كما لا يجوز أن يحتوي اسم المتغيّر على فراغات ولا يجوز أيضًا أن يكون مماثلًا لكلمة محجوزة في سي شارب مثل new أو class أو غيرها، ولا يجوز أن يحتوي على رموزًا خاصّة مثل &amp; و$ و#، ولكن يُعتبر الرمز (_) underscore حرفًا ويجوز الابتداء به.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 dir="rtl">
	الأنواع المضمنة ومجالاتها
</h2>

<p dir="rtl">
	الأنواع المُضمّنة هي الأنواع الموجودة ضمنًا في لغة سي شارب وفي إطار عمل دوت نت عمومًا. سنستعرض في الجدول التالي هذه الأنواع. لاحظ أنّ عمود "الاسم" يحتوي على أسماء الأنواع المستخدمة في سي شارب، في حين يحتوي العمود الذي يليه مباشرةً على اسم نفس النوع ولكن ضمن منصّة دوت نت. في الحقيقة يمكننا استخدام أي تسمية نرغبها ولكنّ الأسهل والأفضل هي في استخدام أسماء الأنواع في سي شارب. يعود سبب وجود أسماء أنواع مختلفة في إطار عمل دوت نت هو أنّه بإمكان أي لغة برمجة ضمن منصة دوت نت استخدام نفس هذه الأنواع ضمنها.
</p>

<center>
	<table border="1" cellpadding="7" cellspacing="0" dir="rtl">
		<tbody>
			<tr>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الاسم</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>النوع الموافق في منصّة دوت نت</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>القيم التي يقبلها</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الحجم في الذاكرة</strong>
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						1
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						bool
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Boolean
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						true أو false
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						2
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						sbyte
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.SByte
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من128- حتى 127
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						8 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						3
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						byte
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Byte
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 0 حتى 255
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						8 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						4
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						short
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Int16
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 32,768- حتى 32,767
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						16 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						5
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						ushort
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.UInt16
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 0 حتى 65,535
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						16 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						6
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						int
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Int32
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 2,147,483,648-
					</p>

					<p style="text-align: center;">
						حتى 2,147,483,647
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						32 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						7
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						uint
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.UInt32
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 0 حتى 4,294,967,295
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						32 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						8
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						long
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Int64
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 9,223,372,036,854,775,808-
					</p>

					<p style="text-align: center;">
						حتى 9,223,372,036,854,775,807
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						64 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						9
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						ulong
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.UInt64
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 0 حتى 18,446,744,073,709,551,615
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						64 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						10
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						char
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Char
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من U+0000 حتى U+ffff
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						16 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						11
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						float
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Single
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من 3.4*1038- حتى +3.4*1038
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						32 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						12
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						double
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Double
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						من ±5.0*10-324 حتى ±1.7*10308
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						64 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						13
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						decimal
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Decimal
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p dir="ltr" style="text-align: center;">
						(-7.9*1028 to 7.9*1028)/(100 to 28)
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p dir="ltr" style="text-align: center;">
						128 bits
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						14
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						string
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.String
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						حسب حدود الذاكرة
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						15
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						object
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						System.Object
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						يمكن تخزين بيانات من أيّ نوع
					</p>

					<p style="text-align: center;">
						ضمن المتغيّرات من النوع object
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
		</tbody>
	</table>
</center>

<p>
	 
</p>

<ul dir="rtl">
	<li>
		الأنواع من 2 حتى 9 هي أنواع صحيحة لا تقبل أعدادًا ذات فاصلة عشريّة. أما الأنواع من 11 حتى 13 فهي أنواع تقبل أعداد ذات فاصلة عشريّة وتختلف فيما بينها في مجالات الأعداد التي تقبلها ودقّة تلك الأعداد بالنسبة لعدد الخانات على يمين الفاصلة العشريّة.
	</li>
	<li>
		النوع <span style="font-family:courier new,courier,monospace;">char</span> مخصّص للمتغيّرات التي تسمح بتخزين محرف character واحد فقط، وهو نوع يدعم ترميز Unicode، يُعتبر أي محرف موضوع ضمن علامتي اقتباس مفردتين مثل 'a' من نوع <span style="font-family:courier new,courier,monospace;">char</span>. في الحقيقة أنّ النوع <span style="font-family:courier new,courier,monospace;">string</span> يُعبّر عن سلسلة من المحارف من نوع <span style="font-family:courier new,courier,monospace;">char</span>.
	</li>
	<li>
		النوع <span style="font-family:courier new,courier,monospace;">object</span> هو الأب العام لجميع الأنواع في إطار العمل دوت نت ومنه تنحدر جميع الأنواع الأخرى مهما كانت، سنصادفه في هذه السلسلة مرّةً أخرى.
	</li>
</ul>

<h2 dir="rtl">
	العوامل Operators
</h2>

<p dir="rtl">
	تدعم سي شارب نوعين من العوامل بشكل أساسيّ: عوامل أحاديّة unary operators وعوامل ثنائيّة binary operators. سنتحدّث في هذا الدرس عن أكثر العوامل استخدامًا في سي شارب.
</p>

<h3 dir="rtl">
	العوامل الأحادية
</h3>

<p dir="rtl">
	لهذه العوامل أسبقيّة أعلى في الحساب من العوامل الثنائيّة، وهي تشمل العديد من العوامل يلخّص الجدول التالي أهمّها، انظر إلى الأمثلة العمليّة التي ستأتي بعد الجدول لمعرفة كيفيّة استخدامها:
</p>

<center>
	<table border="1" cellpadding="7" cellspacing="0" dir="rtl">
		<tbody>
			<tr>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>العامل</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الوصف</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الاستخدام</strong>
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						!
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل النفي المنطقي
					</p>

					<p style="text-align: center;">
						وهو عامل يُطبّق على القيم المنطقيّة من النوع bool.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">x!</span>
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						~
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل المتمّم الثنائي bitwise complement
					</p>

					<p style="text-align: center;">
						وهو عبارة عن عامل نفي ولكن على مستوى البتّات bits.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">x~</span>
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						++
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						لهذا العامل شكلان يعمل كلّ منها على زيادة قيمة متغيّر عددي
					</p>

					<p style="text-align: center;">
						بمقدار 1، ويختلفان فقط في توقيت هذه الزيادة.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">x++</span> عامل زيادة بادئ.
					</p>

					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">++x</span> عامل زيادة لاحق.
					</p>
				</td>
			</tr>
			<tr>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						--
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						لهذا العامل شكلان أيضًا، يعمل كلّ منها على إنقاص قيمة متغيّر
					</p>

					<p style="text-align: center;">
						عددي بمقدار 1، ويختلفان فقط في توقيت هذا الإنقاص.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">x--</span> عامل إنقاص بادئ.
					</p>

					<p style="text-align: center;">
						<span style="font-family:courier new,courier,monospace;">--x</span> عامل إنقاص لاحق.
					</p>
				</td>
			</tr>
			<tr>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						(T)
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						وهو عامل التحويل بين الأنواع casting.
					</p>

					<p style="text-align: center;">
						وهو عامل مهم جدًّا سنصادفه مرارًا في هذه السلسلة.
					</p>

					<p style="text-align: center;">
						يمكن استبدال الحرف T باسم أيّ نوع يخطر على بالك
					</p>

					<p style="text-align: center;">
						مثل int وdouble وstring وغيرها.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						<a name="_GoBack1" rel=""></a>طريقة استخدامه هو في وضع النوع المراد التحويل إليه
					</p>

					<p style="text-align: center;">
						بين قوسين ونضعها جميعًا قبل القيمة التي نريد تحويلها
					</p>

					<p style="text-align: center;">
						مثل <span style="font-family:courier new,courier,monospace;">(int(x</span> لتحويل قيمة <span style="font-family:courier new,courier,monospace;">x</span> إلى قيمة من النوع <span style="font-family:courier new,courier,monospace;">int</span>.
					</p>
				</td>
			</tr>
		</tbody>
	</table>
</center>

<h3 dir="rtl">
	فهم عاملي الزيادة والإنقاص
</h3>

<p dir="rtl">
	شغّل برنامج Visual Studio 2015 Community وأنشئ مشروعًا جديدًا من النوع Console Application سمّه <span style="font-family:courier new,courier,monospace;">UnaryOperatorsTest1</span> ثم استبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">Program.cs</span> بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_36"><span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  namespace </span><span class="typ">UnaryOperatorsTest</span><span class="pln">
</span><span class="lit">5</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             </span><span class="kwd">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Using of pre-increment operator (++i):"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Current value of i is {0}, and after applying ++i, the value of i becomes {1}"</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">,</span><span class="pln"> </span><span class="pun">++</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> string</span><span class="pun">(</span><span class="str">'-'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">));</span><span class="pln">
</span><span class="lit">15</span><span class="pln"> 
</span><span class="lit">16</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="lit">18</span><span class="pln">
</span><span class="lit">19</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Using of post-increment operator (i++):"</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Current value of i is {0}, and after applying i++, the value of i becomes {1}"</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">++);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">            </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> string</span><span class="pun">(</span><span class="str">'-'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">40</span><span class="pun">));</span><span class="pln">
</span><span class="lit">22</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">23</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام <span style="font-family:courier new,courier,monospace;">Ctrl+F5</span> (أو من القائمة <strong>Debug &gt; Start Without Debugging</strong>) ستحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_38"><span class="pln">sing of pre-increment operator (++i):
Current value of i is 1, and after applying ++i, the value of i becomes 2
----------------------------------------

Using of post-increment operator (i++):
Current value of i is 1, and after applying i++, the value of i becomes 1
----------------------------------------</span></pre>

<p dir="rtl">
	يوضّح هذا البرنامج البسيط استخدام عامل الزيادة البادئ وعامل الزيادة اللاحق. يبدأ البرنامج بالتصريح عن المتغيّر <span style="font-family:courier new,courier,monospace;">i </span>من النوع <span style="font-family:courier new,courier,monospace;">int</span> وإسناد القيمة 1 إليه. تعمل العبارة في السطر 13 على إظهار قيمتين، الأولى هي القيمة الحاليّة للمتغيّر<span style="font-family:courier new,courier,monospace;"> i</span> وتساوي 1، والقيمة الثانيّة هي قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">i</span><span style="font-family:courier new,courier,monospace;"> </span>مضافًا إليها 1 باستخدام عامل الزيادة البادئ<span style="font-family:courier new,courier,monospace;"> ++i</span> أي هي القيمة 2، إذًا يقوم هذا العامل بزيادة قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">i</span> بمقدار 1 قبل تمرير القيمة النهائيّة إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> لذلك نحصل على الخرج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_40"><span class="pln">Current value of i is 1, and after applying ++i, the value of i becomes 2</span></pre>

<p dir="rtl">
	ولكن على النقيض من ذلك، نلاحظ أنّ العبارة الموجودة في السطر 20 تعمل على إظهار قيمتين أيضًا، الأولى هي القيمة الحالية للمتغيّر <span style="font-family:courier new,courier,monospace;">i </span>وتساوي 1 (أعدنا إسناد القيمة 1 للمتغيّر <span style="font-family:courier new,courier,monospace;">i</span> في السطر 17)، والقيمة الثانيّة هي قيمة المتغيّر <span style="font-family:courier new,courier,monospace;">i</span> مضافًا إليها 1 باستخدام الزيادة اللاحق <span style="font-family:courier new,courier,monospace;">i++</span> ولكن لن تمرَّر القيمة 2 هذه المرّة إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>. والسبب في ذلك أنّ البرنامج سيعمل على تمرير قيمة <span style="font-family:courier new,courier,monospace;">i</span> الأصلية (القيمة 1) ثمّ يطبّق بعد ذلك عامل الزيادة اللاحق. وهذا هو سبب الحصول على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_42"><span class="pln">Current value of i is 1, and after applying i++, the value of i becomes 1</span></pre>

<p dir="rtl">
	لعلّ هذا السلوك يُسبّب بعض الإرباك للمبرمجين الجدد في سي شارب، وعلى أيّة حال أنصح بتجنّب تمرير القيمة إلى التوابع عمومًا بهذا الأسلوب. إذا احتجت لزيادة (أو إنقاص) قيمة متغيّر ما قبل تمرير لأحد التوابع فاعمل على ذلك ضمن سطر منفصل قبل استدعاء هذا التابع وأرح نفسك. في الحقيقة يُطبّق نفس المفهوم السابق بالنسبة لعامليّ الإنقاص البادئ والإنقاص اللاحق.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: انظر إلى طريقة التنسيق الجديدة التي استخدمتها في السطر 13:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_44"><span class="pln">Console.WriteLine("Current value of i is {0}, and after applying ++i, the value of i becomes {1}", i, ++i);</span></pre>

<p dir="rtl">
	مرّرت إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> ثلاثة وسائط: الأوّل هو النص التنسيقي وقد حُجز ضمنه مكانين مخصّصين لقيمتين سأمرّرهما لاحقًا لهذا التابع، هذان المكانان على الشكل {0} و {1}. الوسيط الثاني هو المتغيّر <span style="font-family:courier new,courier,monospace;">i</span>، والوسيط الثالث هو <span style="font-family:courier new,courier,monospace;">++i</span>. سيعمل البرنامج على وضع القيمة الممرّرة للتابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> والتي تلي النص التنسيقي مباشرةً (في حالتنا هذه قيمة <span style="font-family:courier new,courier,monospace;">i</span>) في المكان {0}، أمّا المكان {1} فسيُوضع ضمنه القيمة التالية وهي <span style="font-family:courier new,courier,monospace;">++i</span>. ينطبق نفس الكلام تمامًا على العبارة الموجودة في السطر 20.
</p>

<p dir="rtl">
	كما يحتوي السطران 14 و21 على أسلوب جميل لطباعة سطر فاصل في خرج البرنامج بغرض توضيحه. أنشأنا كائنًا من النوع <span style="font-family:courier new,courier,monospace;">string</span> باستخدام العامل <span style="font-family:courier new,courier,monospace;">new</span> ومرّرنا لبانيته وسيطين: الأوّل المحرف '-' من نوع <span style="font-family:courier new,courier,monospace;">char</span> والثاني القيمة 40:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_46"><span class="pln">new string('-', 40)</span></pre>

<p dir="rtl">
	سيولّد ذلك نصّا يحتوي على 40 محرف '-' مكرّر (لاحظ علامتي الاقتباس المفردتين ' ')، يمرَّر هذا النص بعد ذلك إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>. لا تقلق إن بدا هذا الكلام غير مفهومًا الآن، فسنتحدّث عن الكائنات فيما بعد.
</p>

<h3 dir="rtl">
	فهم عامل النفي المنطقي وعامل التحويل بين الأنواع
</h3>

<p dir="rtl">
	أنشئ مشروعًا جديدًا من النوع Console Application سمّه <span style="font-family:courier new,courier,monospace;">UnaryOperatorsTest2</span> ثم استبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">Program.cs</span> بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_48"><span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  namespace </span><span class="typ">UnaryOperatorsTest2</span><span class="pln">
</span><span class="lit">5</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             bool b </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">             </span><span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8.9</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">             </span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">;</span><span class="pln">
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"b = {0}, !b = {1}"</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="pun">!</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
</span><span class="lit">15</span><span class="pln"> 
</span><span class="lit">16</span><span class="pln">             i </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">d</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"d = {0}, after applying casting to (int), i = {1}"</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">,</span><span class="pln"> i</span><span class="pun">);</span><span class="pln">
</span><span class="lit">18</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">19</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">20</span><span class="pln"> </span><span class="pun">}</span></pre>

<p dir="rtl">
	نفّذ البرنامج باستخدام <span style="font-family:courier new,courier,monospace;">Ctrl+F5</span> لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_50"><span class="pln">b = True, !b = False

d = 8.9, after applying casting to (int), i = 8</span></pre>

<p dir="rtl">
	استخدمنا في هذا البرنامج المتغير<span style="font-family:courier new,courier,monospace;"> b</span> من النوع <span style="font-family:courier new,courier,monospace;">bool</span> وهو نوع منطقيّ تحمل المتغيّرات المصرّح عنها بواسطته إحدى قيمتين <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span>. أسندنا للمتغيّر <span style="font-family:courier new,courier,monospace;">b</span> القيمة <span style="font-family:courier new,courier,monospace;">true</span> عند التصريح عنه في السطر 10، ثمّ عرضنا للمستخدم قيمة <span style="font-family:courier new,courier,monospace;">b</span> الأصليّة وقيمته بعد تطبيق عامل النفي المنطقي عليه<span style="font-family:courier new,courier,monospace;"> b! </span>لنحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_52"><span class="pln">b = True, !b = False</span></pre>

<p dir="rtl">
	يعكس هذا العامل الحالة المنطقيّة، فإذا كانت <span style="font-family:courier new,courier,monospace;">true</span> تصبح <span style="font-family:courier new,courier,monospace;">false</span>، أمّا إذا كانت <span style="font-family:courier new,courier,monospace;">false</span> فتصبح <span style="font-family:courier new,courier,monospace;">true</span>. ولكن إذا لاحظت أنّ الخرج يُظهر القيمتين المنطقيتين <span style="font-family:courier new,courier,monospace;">true</span> و <span style="font-family:courier new,courier,monospace;">false</span> بحرفين كبيرين في بداية كل منهما: <span style="font-family:courier new,courier,monospace;">True</span> و <span style="font-family:courier new,courier,monospace;">False</span>. السبب في ذلك أن التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> في السطر 14 يعمل بشكل ضمني على استدعاء التابع <span style="font-family:courier new,courier,monospace;">ToString</span> لكل من الوسيطين الممرّرين له، أي الوسيطين<span style="font-family:courier new,courier,monospace;"> b</span> و<span style="font-family:courier new,courier,monospace;"> b! </span>فيحصل بذلك على التمثيل النصّي للقيمة المنطقيّة الموجودة في كلّ منهما، والذي يبدأ بحرف طباعي كبير. جرّب استبدال العبارة البرمجيّة في السطر 14 بالعبارة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_54"><span class="pln">Console.WriteLine("b = {0}, !b = {1}", b.ToString(), (!b).ToString());</span></pre>

<p dir="rtl">
	التعديل الذي أجريناه في السطر السابق هو استدعاء التابع <span style="font-family:courier new,courier,monospace;">ToString</span> بشكل صريح لكلّ وسيط قبل تمريره إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>. ستحصل بذلك على نفس الخرج دون أيّ تغيير.
</p>

<p dir="rtl">
	بالنسبة لعمليّة التحويل بين الأنواع فقد أجريناها بين المتغيّر <span style="font-family:courier new,courier,monospace;">d</span> من النوع <span style="font-family:courier new,courier,monospace;">double</span> (السطر 11) والمتغيّر<span style="font-family:courier new,courier,monospace;"> i </span>من النوع <span style="font-family:courier new,courier,monospace;">int</span> (السطر 12)، حيث سنحوّل القيمة ذات الفاصلة العشرية 8.9 الموجودة في <span style="font-family:courier new,courier,monospace;">d</span> إلى قيمة صحيحة بدون فاصلة ونخزّنها ضمن<span style="font-family:courier new,courier,monospace;"> i</span>. تجري عملية التحويل هذه في السطر 16 على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_56"><span class="pln">i = (int)d;</span></pre>

<p dir="rtl">
	لاحظ أنّ القوسين المحيطين بـ <span style="font-family:courier new,courier,monospace;">int</span> ضروريين. إذا حاولت إزالة عامل التحويل (int) من العبارة السابقة وحاولت تنفيذ البرنامج فستحصل على الخطأ التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_58"><span class="pln">CS0266 Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)</span></pre>

<p>
	يُشير هذا الخطأ إلى عدم إمكانيّة إسناد قيمة متغيّر من النوع <span style="font-family:courier new,courier,monospace;">double</span> إلى متغيّر من النوع <span style="font-family:courier new,courier,monospace;">int</span> مباشرةً بدون تحويل لأنّ ذلك سيؤدّي إلى ضياع في البيانات (ستضيع القيمة 0.9). يقترح عليك هذا الخطأ استخدام التحويل بين الأنواع cast في الجزء الأخير من الرسالة. أعد وضع عامل التحويل (int) أمام المتغيّر <span style="font-family:courier new,courier,monospace;">d</span> ونفّذ البرنامج لتحصل في الخرج على ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_60"><span class="pln">d = 8.9, after applying casting to (int), i = 8</span></pre>

<p dir="rtl">
	انظر كيف أصبحت قيمة <span style="font-family:courier new,courier,monospace;">i </span>تساوي 8. في الواقع سيصادفنا عامل التحويل كثيرًا في هذه السلسلة.
</p>

<h2 dir="rtl">
	العوامل الثنائية
</h2>

<p dir="rtl">
	تشتمل هذه العوامل على معظم العوامل الموجودة في سي شارب ولها العديد من الأصناف، تحتاج هذه العوامل إلى وجود مُعاملَين operands على طرفيها لكل تعمل، يلخّص الجدول التالي أهم هذه العوامل مع التصنيف الذي تقع ضمنه.
</p>

<center>
	<table border="1" cellpadding="7" cellspacing="0" dir="rtl">
		<tbody>
			<tr>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>العامل</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الوصف</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>الاستخدام</strong>
					</p>
				</td>
				<td bgcolor="#ecf0f1" style="padding: 5px 10px">
					<p style="text-align: center;">
						<strong>التصنيف</strong>
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						+
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عملية الجمع العددي
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x + y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عوامل
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						-
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عملية الطرح العددي
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x - y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						حسابيّة
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						*
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عملية الضرب العددي
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x * y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						/
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عملية القسمة العددية
					</p>

					<p style="text-align: center;">
						(إذا كان كل من المعاملين من نوع صحيح فسيكون ناتج القسمة صحيحًا بدون فاصلة،
					</p>

					<p style="text-align: center;">
						حيث تُهمل الأجزاء العشرية في حال وجودها).
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x / y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						%
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عمليّة باقي القسمة
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x % y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						&gt;
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "أصغر من"
					</p>

					<p style="text-align: center;">
						يُرجع القيمة true إذا كان المُعامل الأيسر أصغر من الأيمن، وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x &lt; y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عوامل مقارنة
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						&lt;
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "أكبر من"
					</p>

					<p style="text-align: center;">
						يُرجع القيمة true إذا كان المُعامل الأيسر أكبر من الأيمن، وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x &gt; y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=&gt;
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "أصغر من أو يساوي"
					</p>

					<p style="text-align: center;">
						يُرجع القيمة true إذا كان المُعامل الأيسر أصغر من أو يساوي الأيمن، وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x &lt;= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=&lt;
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "أكبر من أو يساوي"
					</p>

					<p style="text-align: center;">
						يُرجع القيمة true إذا كان المُعامل الأيسر أكبر من أو يساوي الأيمن، وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x &gt;= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						==
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "المساواة" بين قيمتين،
					</p>

					<p style="text-align: center;">
						يُرجع true إذا كانت القيمتين متساويتين وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x == y
					</p>
				</td>
				<td bgcolor="#ffffff" rowspan="2">
					<p style="text-align: center;">
						عوامل اختبار المساواة
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=!
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل اختبار "عدم المساواة" بين قيمتين،
					</p>

					<p style="text-align: center;">
						يُرجع true إذا كانت القيمتين غير متساويتين وإلّا يُرجع false.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x != y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						&amp;&amp;
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						تطبيق منطق AND على قيمتين (أو تعبيرين) منطقيين.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x &amp;&amp; y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						العوامل
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						||
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						تطبيق منطق OR على قيمتين (أو تعبيرين) منطقيين.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x || y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						الشرطية
					</p>
				</td>
			</tr>
		</tbody>
		<tbody>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل الإسناد للقيمة (أو التعبير)
					</p>

					<p style="text-align: center;">
						الموجودة في اليمين إلى المتغيّر الموجود في اليسار.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x = y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عوامل إسناد
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=+
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل الجمع ثم الإسناد.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x += y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=-
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل الطرح ثم الإسناد.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x -= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=*
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل الضرب ثم الإسناد.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x *= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=/
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل القسمة ثم الإسناد.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x /= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
			<tr>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						=%
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						عامل باقي القسمة ثم الإسناد.
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						x %= y
					</p>
				</td>
				<td bgcolor="#ffffff" style="padding: 5px 10px">
					<p style="text-align: center;">
						 
					</p>
				</td>
			</tr>
		</tbody>
	</table>
</center>

<h3 dir="rtl">
	فهم العوامل الحسابية
</h3>

<p dir="rtl">
	تُعتبر هذه العوامل بسيطة وواضحة وهي مشتركة بين جميع لغات البرمجة. على أيّة حال إليك برنامجًا بسيطًا يتعامل معها ويوضّح وظائفها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_16"><span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln"> 
</span><span class="lit">3</span><span class="pln">  namespace </span><span class="typ">ArithmeticOperators</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">              </span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             string str_x</span><span class="pun">,</span><span class="pln"> str_y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln"> 
</span><span class="lit">12</span><span class="pln">             </span><span class="com">//input operands.</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input left operand (x) : "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln"> 
</span><span class="lit">16</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input right operand (y) : "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">17</span><span class="pln">             str_y </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">18</span><span class="pln"> 
</span><span class="lit">19</span><span class="pln">             </span><span class="com">//convert each operand to integer representative.</span><span class="pln">
</span><span class="lit">20</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             y </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln"> 
</span><span class="lit">23</span><span class="pln">
</span><span class="lit">24</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">25</span><span class="pln"> 
</span><span class="lit">26</span><span class="pln">             </span><span class="com">//perform arithmetic calculations and display results.</span><span class="pln">
</span><span class="lit">27</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x + y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">28</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x - y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">29</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x * y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">30</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x / y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">/</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x % y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">%</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">32</span><span class="pln">
</span><span class="lit">33</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">35</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	نفّذ البرنامج باستخدام <span style="font-family:courier new,courier,monospace;">Ctrl+F5</span>. سيطلب منك البرنامج إدخال المُعامل الأيسر left operand، ثم المُعامل الأيمن right operand، وبعدها ينفّذ العمليّات الحسابيّة الأربع عليهما. جرّب إدخال القيمتين 9 و 2 على الترتيب لتحصل على الخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_14"><span class="pln">Input left operand (x) : 9
Input right operand (y) : 2

x + y = 11
x - y = 7
x * y = 18
x / y = 4
x % y = 1</span></pre>

<p dir="rtl">
	العمليّات الثلاث الأولى واضحة. بالنسبة لعمليّة القسمة يجب أن يكون الناتج 4.5، ولكن بما أنّ عملية القسمة تجري بين قيمتين صحيحتين فإنّ النتيجة يجب أن تكون صحيحة، وبالتالي يُهمل الجزء العشري 0.5 ويكون الناتج 4 فقط. بالنسبة لعمليّة باقي القسمة<span style="font-family:courier new,courier,monospace;"> x % y</span> فإنّ النتيجة 1 هي باقي قسمة 9 على 2.
</p>

<p dir="rtl">
	<strong>ملاحظة</strong>: إذا لم ترغب بحذف الجزء العشري من ناتج عملية القسمة الصحيحة ودون أن تغيّر أنوع المتغيّرات، يمكنك استخدام عامل التحويل بين الأنواع (T). استبدال العبارة الموجودة في السطر 30 بالعبارة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_18"><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"x / y = {0}"</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">/(</span><span class="kwd">double</span><span class="pun">)</span><span class="pln">y</span><span class="pun">);</span></pre>

<p dir="rtl">
	وضعت عامل التحول (double) قبل المتغيّر <span style="font-family:courier new,courier,monospace;">y</span> لتحويل قيمته العدديّة إلى قيمة من نوع <span style="font-family:courier new,courier,monospace;">double</span> (دون المسّ بقيمة <span style="font-family:courier new,courier,monospace;">y</span> الأصليّة بالطبع)، فعندما يرى البرنامج أنّه يُجري عملية القسمة بين قيمة صحيحة (قيمة <span style="font-family:courier new,courier,monospace;">x</span>) وقيمة من النوع <span style="font-family:courier new,courier,monospace;">double</span> فسيعطي الناتج على شكل قيمة من نوع <span style="font-family:courier new,courier,monospace;">double</span> تُمرّر بدورها إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> ليعرض القيمة 4.5 بدلًا من 4. ويمكن فعل نفس الأمر مع المتغيّر <span style="font-family:courier new,courier,monospace;">x</span> بدلًا من <span style="font-family:courier new,courier,monospace;">y</span> إذا أحببت.
</p>

<h3 dir="rtl">
	فهم عوامل المقارنة
</h3>

<p dir="rtl">
	سنتناول عوامل المقارنة &gt; و &lt; و =&gt; و =&lt; و == و =! في البرنامج التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_20"><span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">  
</span><span class="lit">3</span><span class="pln">  
</span><span class="lit">4</span><span class="pln">  namespace </span><span class="typ">RelationalOperators</span><span class="pln">
</span><span class="lit">5</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             </span><span class="kwd">int</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">             string str_x</span><span class="pun">,</span><span class="pln"> str_y</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">            
</span><span class="lit">13</span><span class="pln">
</span><span class="lit">14</span><span class="pln">             </span><span class="com">//input operands.</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input left operand : "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">16</span><span class="pln">             str_x </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input right operand : "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">             str_y </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             </span><span class="com">//convert each operand to integer representative.</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_x</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">             y </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str_y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">24</span><span class="pln">
</span><span class="lit">25</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">26</span><span class="pln"> 
</span><span class="lit">27</span><span class="pln">             </span><span class="com">//perform comparing operations and display results.</span><span class="pln">
</span><span class="lit">28</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} == {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">==</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">29</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} != {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">!=</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">30</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} &gt; {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">31</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} &gt;= {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">&gt;=</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">32</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} &lt; {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">&lt;</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">33</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} &lt;= {1} evaluates to {2}"</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">&lt;=</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
</span><span class="lit">34</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">35</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">36</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	<span style="line-height: 2em;">نفّذ البرنامج وأدخل القيمتين 3 و 4 على الترتيب لتحصل على الخرج التالي:</span>
</p>

<pre class="ipsCode" id="ips_uid_3820_22">Input left operand : 3
Input right operand : 4

3 == 4 evaluates to False
3 != 4 evaluates to True
3 &gt; 4 evaluates to False
3 &gt;= 4 evaluates to False
3 &lt; 4 evaluates to True
3 &lt;= 4 evaluates to True</pre>

<p dir="rtl">
	تكون نتيجة تنفيذ عوامل المقارنة قيمة منطقية <span style="font-family:courier new,courier,monospace;">true</span> أو <span style="font-family:courier new,courier,monospace;">false</span>. جرّب إدخال قيم متنوّعة، كما جرّب إدخال قيمتين متساويتين وانظر إلى الخرج.
</p>

<h3 dir="rtl">
	فهم العوامل الشرطية
</h3>

<p dir="rtl">
	العاملين الشرطيين <span style="font-family:courier new,courier,monospace;">&amp;&amp;</span> (AND) و <span style="font-family:courier new,courier,monospace;">|| </span>(OR) هما عاملان مهمّان جدًّا ويستخدمان بكثرة في بنى القرار في سي شارب. ولهما وجود في جميع لغات البرمجة.
</p>

<p dir="rtl">
	يوضّح البرنامج التالي استخدام هذين العاملين بصورة مبسّطة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3820_24"><span class="lit">1</span><span class="pln">  using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pln">
</span><span class="lit">4</span><span class="pln">  namespace </span><span class="typ">RelationalOperators</span><span class="pln">
</span><span class="lit">5</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
</span><span class="lit">6</span><span class="pln">      </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">7</span><span class="pln">      </span><span class="pun">{</span><span class="pln">
</span><span class="lit">8</span><span class="pln">          </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">9</span><span class="pln">          </span><span class="pun">{</span><span class="pln">
</span><span class="lit">10</span><span class="pln">             </span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">             bool and_operator</span><span class="pun">,</span><span class="pln"> or_operator</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">
</span><span class="lit">13</span><span class="pln">             a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="lit">14</span><span class="pln">             b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">15</span><span class="pln">             c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="lit">16</span><span class="pln">             d </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">
</span><span class="lit">18</span><span class="pln">             and_operator </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">&gt;</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">c </span><span class="pun">&lt;=</span><span class="pln"> d</span><span class="pun">);</span><span class="pln">
</span><span class="lit">19</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"({0} &gt; {1}) &amp;&amp; ({2} &lt;= {3}) evaluates to {4}"</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">,</span><span class="pln"> and_operator</span><span class="pun">);</span><span class="pln">
</span><span class="lit">20</span><span class="pln">
</span><span class="lit">21</span><span class="pln">             or_operator </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">&gt;</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">c </span><span class="pun">&lt;=</span><span class="pln"> d</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln">             </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"({0} &gt; {1}) || ({2} &lt;= {3}) evaluates to {4}"</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">,</span><span class="pln"> or_operator</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">         </span><span class="pun">}</span><span class="pln">
</span><span class="lit">24</span><span class="pln">     </span><span class="pun">}</span><span class="pln">
</span><span class="lit">25</span><span class="pln"> </span><span class="pun">}</span></pre>

<p>
	<span style="line-height: 2em;">لا نستخدم العوامل الشرطيّة بهذا الأسلوب في البرامج الحقيقيّة، ولكنّ هذا الأسلوب مفيد في توضيح آلية عمل العوامل الشرطيّة وتفاعلها مع عوامل المقارنة. نفّذ البرنامج لتحصل على الخرج التالي:</span>
</p>

<pre class="ipsCode" id="ips_uid_3820_26">(1 &gt; 2) &amp;&amp; (5 &lt;= 9) evaluates to False
(1 &gt; 2) || (5 &lt;= 9) evaluates to True</pre>

<p dir="rtl">
	تفسير هذا الخرج يسير للغاية. لنبدأ بالسطر الأوّل، نتيجة حساب التعبير الأول هو <span style="font-family:courier new,courier,monospace;">false</span>:
</p>

<pre class="ipsCode" id="ips_uid_3820_28">(1 &gt; 2) &amp;&amp; (5 &lt;= 9)</pre>

<p dir="rtl">
	وسبب ذلك هو أنّ نتيجة التعبير (2 &lt; 1) هو <span style="font-family:courier new,courier,monospace;">false</span>، أمّا نتيجة حساب (9 =&gt; 5) هو <span style="font-family:courier new,courier,monospace;">true</span> وبالتالي سيعمل العامل الشرطي <span style="font-family:courier new,courier,monospace;">&amp;&amp;</span> بالنتيجة على حساب التعبير<span style="font-family:courier new,courier,monospace;"> false &amp;&amp; true </span>والذي يعطي بكلّ تأكيد القيمة المنطقية <span style="font-family:courier new,courier,monospace;">false</span>. بالنسبة للسطر الثاني، وهو التعبير:
</p>

<pre class="ipsCode" id="ips_uid_3820_30">(1 &gt; 2) || (5 &lt;= 9) </pre>

<p dir="rtl">
	والذي يعطي <span style="font-family:courier new,courier,monospace;">true</span>. والسبب هو أنّ العامل الشرطي<span style="font-family:courier new,courier,monospace;"> || </span>سيعمل على حساب التعبير <span style="font-family:courier new,courier,monospace;">false || true </span>والذي يعطي القيمة المنطقيّة <span style="font-family:courier new,courier,monospace;">true</span>.
</p>

<p dir="rtl">
	لاحظ استخدام الأقواس على أطراف عوامل المقارنة، يمكن الاستغناء عنها، ولكن لا أنصح بذلك، استخدم الأقواس دومًا حتى ولو لم يكن استخدامها ضروريًا لتوضيح منطق البرنامج، ولكن استخدمها بحكمة. السبب في انتفاء الحاجة إلى استخدام الأقواس في هذا البرنامج، هو أنّ عوامل المقارنة لها أسبقيّة تنفيذ أعلى من العوامل الشرطيّة، لذلك فهي تُقيّم قبل تقييم العوامل الشرطيّة.
</p>

<h3 dir="rtl">
	فهم عوامل الإسناد
</h3>

<p dir="rtl">
	استخدمنا حتى الآن عامل الإسناد (=). توجد عوامل إسناد أخرى تُسهّل البرمجة في سي شارب وهي =+ و =- و =* و =/ و =%. الأمر بسيط، بالنسبة لعامل الإسناد =+ يمكن توضيح عمله بالشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_32"><span class="pln">int x = 3;

x += 5;</span></pre>

<p dir="rtl">
	بعد تنفيذ الشيفرة السابقة ستصبح قيمة<span style="font-family:courier new,courier,monospace;"> x</span> تساوي 8. لأنّ العبارة<span style="font-family:courier new,courier,monospace;"> x += 5 </span>تكافئ تمامًا العبارة <span style="font-family:courier new,courier,monospace;">x = x + 5</span> ويمكننا استبدالها بها. يُطبّق نفس الأسلوب تمامًا على العوامل الباقية. فمثلًا انظر إلى الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_34"><span class="pln">int x = 21;

x /= 4;

x %= 3;</span></pre>

<p dir="rtl">
	هل تستطيع تخمين قيمة <span style="font-family:courier new,courier,monospace;">x</span> بعد تنفيذ هذه الشيفرة؟ إذا كانت النتيجة 2 فقد أصبت. السبب في ذلك بسيط. فقد بدأنا بقيمة <span style="font-family:courier new,courier,monospace;">x</span> تساوي 21 ثم نفّذنا العبارة <span style="font-family:courier new,courier,monospace;">x /= 4</span> التي تكافئ العبارة <span style="font-family:courier new,courier,monospace;">x = x / 4</span> وهي قسمة صحيحة، لذلك سيحمل <span style="font-family:courier new,courier,monospace;">x</span> القيمة 5 (بدون فاصلة عشرية). بعد تنفيذ العبارة الأخيرة <span style="font-family:courier new,courier,monospace;">x %= 3 </span>التي تكافئ العبارة <span style="font-family:courier new,courier,monospace;">x = x % 3 </span>ستصبح قيمة <span style="font-family:courier new,courier,monospace;">x</span> تساوي 2 لأنّ باقي قسمة 5 على 3 يساوي 2. وهذا كلّ ما في الأمر.
</p>

<h2 dir="rtl">
	تمارين داعمة
</h2>

<h3 dir="rtl">
	تمرين 1
</h3>

<p dir="rtl">
	حاول تخمين القيمة المنطقيّة التي ستُطبع على الشاشة باستخدام القلم والورقة فقط:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_7"><span class="pln">int a = 30;

a /= 3;
a %= 3;

Console.WriteLine(a == 1);</span></pre>

<h3 dir="rtl">
	تمرين 2
</h3>

<p dir="rtl">
	حاول تخمين قيمة <span style="font-family:courier new,courier,monospace;">f</span> التي ستُطبع على الشاشة باستخدام القلم والورقة فقط:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3820_9"><span class="pln">int x;
double f;

x = 9;
f = (double)x / 2;
f *= 10;

Console.WriteLine("f = {0}", f);</span></pre>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	<a name="_GoBack" rel=""></a> لفد تعرّفنا في هذا الدرس على الأنواع المُضمّنة في سي شارب وعلى مجالات كلٍّ منها، وعلى الفرق الأساسي بين أنواع القيمة value types والأنواع المرجعيّة reference types. كما تحدّثنا عن معظم العوامل التي تدعمها سي شارب وتصنيفاتها. وتناولنا بعض الأمثلة التوضيحيّة على استخدامها.
</p>

<p dir="rtl">
	سنتحدّث في الدرس التالي عن بنى القرار وتغيير مسار البرنامج وهو موضوع مهم في جميع لغات البرمجة.
</p>
]]></description><guid isPermaLink="false">314</guid><pubDate>Tue, 19 Apr 2016 11:07:00 +0000</pubDate></item><item><title>&#x62E;&#x637;&#x648;&#x627;&#x62A;&#x643; &#x627;&#x644;&#x623;&#x648;&#x644;&#x649; &#x645;&#x639; &#x644;&#x63A;&#x629; &#x633;&#x64A; &#x634;&#x627;&#x631;&#x628; #C</title><link>https://academy.hsoub.com/programming/c-sharp/%D8%AE%D8%B7%D9%88%D8%A7%D8%AA%D9%83-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D8%A8-c-r312/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-dot-net-first-program.png.b39b52609f0dd5dd1d883f9e34485ce0.png" /></p>

<div id="wmd-preview-section-17">
	<p id="خطواتك-الأولى-مع-لغة-سي-شارب-c">
		يمكنك تنفيذ البرامج الموجودة ضمن هذه السلسلة (كما وسبق أن ذكرنا في <a href="https://academy.hsoub.com/programming/c-sharp/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D8%AF%D9%88%D8%AA-%D9%86%D8%AA-r311/" rel="">المقدّمة</a>) بطريقتين مختلفتين:
	</p>

	<p>
		الأولى هي تحميل وتنصيب بيئة التطوير المجّانيّة Visual Studio 2015 Community من مايكروسوفت. توفّر هذه البيئة خدمات عظيمة للمطوّر وتسهّل عمليّة كتابة البرامج إلى حدّ كبير. ويمكنك الاستفادة من مزايا تنقيح الأخطاء debugging المتقدّمة التي يوفّرها المنقّح debugger المرفق ضمن هذه البيئة. يمكنك تحميل نسختك المجّانيّة <a href="https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx" rel="external nofollow">من هنا</a>.
	</p>

	<p>
		الطريقة الثانية هي في استخدام الموقع <a href="https://dotnetfiddle.net/" rel="external nofollow">NET Fiddle.</a> الذي يوفّر مزيّة تنفيذ البرامج التي تكتبها على خادم خاص به، ومن ثمّ يعرض لك خرج البرنامج، بدون أن تمتلك نظام تشغيل ويندوز حتى.
	</p>

	<p style="text-align: center;">
		<img class="ipsImage ipsImage_thumbnailed" data-fileid="15037" data-unique="mn6f1u4xm" src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-dot-net-first-program.png.b12cfe5abc030c34da6aced0de5d912c.png" alt="learn-csharp-dot-net-first-program.png"></p>
</div>

<div id="wmd-preview-section-18">
	<h2 id="البرنامج-الأول">
		البرنامج الأول
	</h2>

	<p>
		سنبدأ بمثال عمليّ لنسبر سريعًا أغوار هذه اللغة. شغّل برنامج Visual Studio 2015 Community ثم من القائمة <strong>File</strong> اختر الأمر <strong>New &gt; Project.</strong> 
	</p>

	<p>
		من نافذة مشروع جديد <strong>New Project</strong>، اختر من القسم الأيسر #Visual C ومن القسم الأيمن اختر Console Application. اكتب HelloWorld ضمن حقل الاسم Name في القسم السفلي، ثم اضغط زر OK. انظر الشكل التوضيحي التالي: 
	</p>

	<p style="text-align: center;">
		<a class="ipsAttachLink ipsAttachLink_image" data-fileid="15036" href="https://academy.hsoub.com/uploads/monthly_2016_04/visual_studio_console_application.png.1d0690f3b27ed33610c2788c224af81f.png" rel="external"><img alt="visual_studio_console_application.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15036" data-unique="mm1majn12" src="https://academy.hsoub.com/uploads/monthly_2016_04/visual_studio_console_application.thumb.png.ea72d0f950ff821cfd50697f13ef790f.png"></a>
	</p>

	<p>
		قد تبدو الصورة مختلفة بعض الشيء لديك بحسب إعدادات الإظهار التي اخترتها.
	</p>

	<p>
		سيعمل Visual Studio على إنشاء هذا التطبيق وفتح ملف مُجهّز خصيصًا لك اسمه <span style="font-family:courier new,courier,monospace;">Program.cs</span>. امسح محتويات هذا الملف بالكامل ثم انسخ الشيفرة التالية ضمنه:
	</p>
</div>

<div id="wmd-preview-section-19">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_11">
<span class="pln">1   using System;
2   
3   namespace HelloWorld
4   {
5       class Program
6       {
7           static void Main(string[] args)
8           {
9               Console.WriteLine("Hello World!");
10          }
11      }
12  }</span></pre>

	<p>
		اضغط المفتاحين<span style="font-family:courier new,courier,monospace;"> Ctrl+F5</span> معًا لتبدأ عملية بناء build البرنامج وتنفيذه لتحصل على العبارة Hello World! في خرج البرنامج (أو من القائمة <strong>Debug &gt; Start Without Debugging</strong>). رغم أنّ البرنامج السابق بسيط جدًّا إلًا أنّه يحتوي على الكثير من المفاهيم الجديدة التي سنتناولها تباعًا في هذه السلسلة.
	</p>

	<p>
		يبدأ هذا البرنامج بتعريف نطاق اسم namespace (السطر 3) اسمه <span style="font-family:courier new,courier,monospace;">HelloWorld</span> وهو نفس الاسم الذي زوّدناه للبرنامج، سنتكلّم عن نطاقات الأسماء في درس لاحق، ولكن يكفيك أن تعرف الآن أنّ نطاقات الأسماء هي وسيلة لتنظيم الأصناف ضمن مجموعات مترابطة منطقيًّا. يأتي بعد ذلك تعريف صنف class جديد اسمه <span style="font-family:courier new,courier,monospace;">Program</span> (السطر 5). يحتاج أيّ برنامج مكتوب بالسي شارب إلى نقطة دخول entry point لكي يبدأ تنفيذه. نقطة الدخول يجب أن تكون عبارة عن تابع method اسمه <span style="font-family:courier new,courier,monospace;">Main</span> (السطر 7)، تكون التوابع عادةً ضمن الأصناف، يكفيك الآن أن تفهم التابع على أنّه شبيه بالدّالة function في لغات البرمجة الأخرى. أي هو جزء من الشيفرة يمكن استدعاؤه لتنفيذ ناحية وظيفيّة مُحدّدة في البرنامج وقد يُرجع قيمة ما أو لا يُرجع أيّ شيء. العبارة الموجودة في السطر 9 هي عبارة برمجّية قياسيّة في لغة سي شارب. وظيفة هذه العبارة استدعاء التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> من الصنف Console وتمرير النص "!Hello World" له لكي يُظهر النص !Hello World في خرج البرنامج. 
	</p>

	<p>
		أيّ عبارة برمجيّة في سي شارب يجب أن تنتهي بفاصلة منقوطة (;)، وقد تكون العبارة البرمجيّة مجرّد استدعاء تابع أو أن تكون عمليّة إسناد إلى متغيّر، أو قد تكون مزيجًا بينهما. 
	</p>

	<p>
		إذا كانت لديك معرفة سابقة بلغات برمجة مثل C أو ++C أو Java ستلاحظ أنّ الصيغة النحويّة syntax للغة سي شارب تشبه إلى حدٍّ كبير الصيغة النحويّة لهذه اللّغات. حيث تُستخدم الحاضنات { } مثلًا لتحديد البداية والنهاية للتابع method وللصنف class ولنطاق الاسم namespace. وحتى أنّهما يشكّلان حدود أيّ بنية برمجيّة في لغة سي شارب مثل العبارات التكراريّة. انظر على سبيل المثال إلى السطر 6 لتجد الحاضنة "{" الخاصّة بالصنف <span style="font-family:courier new,courier,monospace;">Program</span> وإلى السطر 12 لتجد حاضنة الإغلاق "}" له. كما ينبغي التنبّه أيضًا إلى كون لغة سي شارب حسّاسة لحالة الأحرف كما هو الحال في لغات البرمجة C و ++C و Java.
	</p>
</div>

<div id="wmd-preview-section-20">
	<h3 id="ملاحظة">
		ملاحظة
	</h3>

	<p>
		يمكن استخدام المفتاح <span style="font-family:courier new,courier,monospace;">F6</span> في بيئة Visual Studio (أو من القائمة<strong> Build &gt; Build Solution</strong>) لبناء البرنامج دون تشغيله (تنفيذه) وذلك اعتبارًا من الشيفرة والحصول على ملف تنفيذي منه له الامتداد exe في حال كان البرنامج لا يحتوي على أيّ خطأ.
	</p>
</div>

<div id="wmd-preview-section-21">
	<h2 id="برنامج-بسيط-لجمع-عددين-صحيحين">
		برنامج بسيط لجمع عددين صحيحين
	</h2>

	<p>
		لنعمل الآن على برنامج عمليّ أكثر. سنكتب برنامج يعمل على جمع عددين صحيحين وإظهار النتيجة للمستخدم. اتبع نفس الخطوات التي أجريناها في البرنامج السابق لإنشاء برنامج جديد باسم <span style="font-family:courier new,courier,monospace;">SumTwoNumbers</span>، انسخ محتويات الشيفرة التالية إلى الملف <span style="font-family:courier new,courier,monospace;">Program.cs</span>:
	</p>
</div>

<div id="wmd-preview-section-22">
	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_13">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">   
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">SumTwoNumbers</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               </span><span class="kwd">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              </span><span class="kwd">int</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">              </span><span class="kwd">int</span><span class="pln"> c</span><span class="pun">;</span><span class="pln">
</span><span class="lit">12</span><span class="pln">  
</span><span class="lit">13</span><span class="pln">              a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
</span><span class="lit">15</span><span class="pln">  
</span><span class="lit">16</span><span class="pln">              c </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="lit">17</span><span class="pln">  
</span><span class="lit">18</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"3 plus 4 equals: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span><span class="pln">
</span><span class="lit">19</span><span class="pln">  
</span><span class="lit">20</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">21</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">22</span><span class="pln">  </span><span class="pun">}</span></pre>

	<p>
		يُقدّم هذا البرنامج البسيط مفهوم التصريح عن المتغيّرات والتعامل معها. صرّحنا في الأسطر من 9 إلى 11 عن ثلاثة متغيّرات <span style="font-family:courier new,courier,monospace;">a</span> و <span style="font-family:courier new,courier,monospace;">b</span> و <span style="font-family:courier new,courier,monospace;">c </span>من النوع int.
	</p>

	<p>
		يجب التصريح في لغة سي شارب عن كل متغيّر قبل استخدامه في البرنامج. لاحظ أنّ التصريح عن متغيّر يتمّ بذكر نوعه ومن ثمّ اسمه. يستطيع المتغيّر من النوع int استيعاب أي عدد صحيح (دون فاصلة عشريّة) يقع بين 2,147,483,648- و 2,147,483,647. لاحظ أنّه قد أسندنا القيمتين 3 و 4 إلى المتغيّرين <span style="font-family:courier new,courier,monospace;">a</span> و <span style="font-family:courier new,courier,monospace;">b</span> على الترتيب، وذلك في السطرين 13 و14. نجري عملية الجمع والإسناد إلى المتغيّر <span style="font-family:courier new,courier,monospace;">c</span> في السطر 16. وفي السطر 18 نعرض رسالة للمستخدم. 
	</p>

	<p>
		يمكن إسناد قيمة للمتغيّر مباشرةً عند التصريح عنه. فمن الممكن مثلًا إسناد القيمتين 3 و 4 للمتغيّرين<span style="font-family:courier new,courier,monospace;"> a </span>و<span style="font-family:courier new,courier,monospace;"> b</span> على الترتيب عند التصريح عنهما وذلك بالشكل التالي:
	</p>
</div>

<div id="wmd-preview-section-23">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_15">
<span class="pln">int a = 3;
int b = 4;</span></pre>

	<p>
		كما يمكن استخدام عبارة تصريح واحدة للتصريح عن عدّة متغيّرات بنفس الوقت. فمثلًا كان من الممكن التصريح عن المتغيّرات <span style="font-family:courier new,courier,monospace;">a</span> و <span style="font-family:courier new,courier,monospace;">b</span> و <span style="font-family:courier new,courier,monospace;">c</span> السابقة بعبارة برمجيّة واحدة على الشكل التالي:
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_17">
<span class="pln">int a, b, c;</span></pre>

	<p>
		في الواقع هناك شكلان من أنواع المتغيّرات تدعمهما منصّة دوت نت. أنواع القيمة value types والأنواع المرجعيّة reference types. سنتحدّث عنهما لاحقًا.
	</p>

	<p>
		يُعتبر النوع int نوع قيمة. يجب إجراء عمليّة إسناد واحدة على الأقل إلى متغيّر قيمة قبل القراءة منه. وإلّا سنحصل على خطأ. جرّب حذف العبارة البرمجيّة الموجودة في السطر 16 والمسؤولة عن إسناد قيمة المجموع إلى المتغيّر c. نفّذ البرنامج وستحصل على الخطأ التالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_19">
<span class="pln">Use of unassigned local variable 'c'</span></pre>

	<p>
		سبب ذلك أنّنا حاولنا قراءة المتغيّر c في السطر 18 دون أن نُسند أيّ قيمة له. 
	</p>

	<p>
		العبارة البرمجيّة الموجودة في السطر 18 مسؤولة عن عرض الرسالة إلى المستخدم كما أسلفنا. ستلاحظ أنّنا مرّرنا التعبير expression التالي إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span>:
	</p>
</div>

<div id="wmd-preview-section-25">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_21">
<span class="pln">"3 plus 4 equals: " + c.ToString()</span></pre>

	<p>
		التعبير البرمجي هو مفهوم موجود في جميع لغات البرمجة تقريبًا، وهو ببساطة ناتج عمليّة برمجيّة باستخدام عامل operator واحد أو أكثر، أو استدعاء إلى تابع أو مزيج بينهما. نسمّي عمليّة معالجة التعبير بتقييم التعبير expression evaluation. العامل المُستخدم هنا هو عامل ضمّ النصوص (+)، ولعلّك تستغرب لماذا أدعوه بعامل ضمّ النصوص رغم أنّه يشبه عامل الجمع العادي الذي يجمع عددين مع بعضهما (انظر السطر 16). يعود السبب في ذلك إلى نوع المُعامِلَين operands الموجودين على طرفيه. يمكنك أن تلاحظ بسهولة أنّ المعامل الأيسر هو النص:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_23">
<span class="pln">"3 plus 4 equals: " </span></pre>

	<p>
		أمّا المعامل الأيمن فهو:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_25">
<span class="pln">c.ToString() </span></pre>

	<p>
		وهو أيضًا نص ويعود سبب ذلك إلى استدعاء التابع <span style="font-family:courier new,courier,monospace;">ToString</span> من المتغيّر <span style="font-family:courier new,courier,monospace;">c</span> المعرّف أصلًا أنّه متغيّر من نوع int. ولكنّ استدعاء هذا التابع من المتغيّر<span style="font-family:courier new,courier,monospace;"> c</span> يؤدّي إلى الحصول على التمثيل النصّي للقيمة العددية الموجودة ضمنه أصلًا. فإذا كان المتغيّر <span style="font-family:courier new,courier,monospace;">c</span> يحمل القيمة العددية 7، فإنّ التابع <span style="font-family:courier new,courier,monospace;">ToString</span> سيُرجع النص "7"، الذي يعمل عامل الضم + على ضمّه مع النص الذي يسبقه لتكون نتيجة التعبير ككل هي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_27">
<span class="pln">"3 plus 4 equals: 7"</span></pre>

	<p>
		سيُمرّر هذا النص إلى التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> لعرضه للمستخدم. 
	</p>

	<p>
		أعتقد أنّك قد بدأت بفهم طريقة الوصول إلى التوابع واستدعائها في لغة سي شارب. فنحن نستخدم اسم الصنف (أو الكائن object كما سنرى لاحقًا) الذي يحوي التابع المراد استدعاؤه متبوعًا بنقطة ثم باسم التابع المطلوب، وبعد ذلك قوسين هلاليّين نمرّر بينهما الوسائط التي يطلبها التابع إذا اقتضت الضرورة لذلك.
	</p>
</div>

<div id="wmd-preview-section-26">
	<h2 id="برنامج-محسن-أكثر-لجمع-عددين">
		برنامج محسن أكثر لجمع عددين
	</h2>

	<p>
		لقد تعلّمنا العديد من المفاهيم الجديدة من خلال البرنامجين السابقين. ولكن لعلّك قد لاحظت من برنامج جمع العددين السابق أنّ البرنامج جامد بعض الشيء. فهو يجمع عدّدين مُحدّدين سلفاً. سنعمل في هذه النسخة المطوّرة من البرنامج على استقبال العددين المراد جمعهما من المستخدم ومن ثمّ إجراء عمليّة الجمع عليهما وعرض النتيجة على المستخدم، مع بعض التحسينات الإضافيّة الأخرى. 
	</p>

	<p>
		أنشئ مشروعًا جديدًا باسم <span style="font-family:courier new,courier,monospace;">EnhancedSumTwoNumbers</span> ثمّ استبدل محتويات الملف <span style="font-family:courier new,courier,monospace;">Program.cs</span> بالشيفرة التالية:
	</p>
</div>

<div id="wmd-preview-section-27">
	<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8024_29">
<span class="lit">1</span><span class="pln">   using </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="lit">2</span><span class="pln">   
</span><span class="lit">3</span><span class="pln">   namespace </span><span class="typ">EnhancedSumTwoNumbers</span><span class="pln">
</span><span class="lit">4</span><span class="pln">   </span><span class="pun">{</span><span class="pln">
</span><span class="lit">5</span><span class="pln">       </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="lit">6</span><span class="pln">       </span><span class="pun">{</span><span class="pln">
</span><span class="lit">7</span><span class="pln">           </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="lit">8</span><span class="pln">           </span><span class="pun">{</span><span class="pln">
</span><span class="lit">9</span><span class="pln">               string str1</span><span class="pun">,</span><span class="pln"> str2</span><span class="pun">,</span><span class="pln"> result</span><span class="pun">;</span><span class="pln">
</span><span class="lit">10</span><span class="pln">              </span><span class="kwd">double</span><span class="pln"> num1</span><span class="pun">,</span><span class="pln"> num2</span><span class="pun">,</span><span class="pln"> sum</span><span class="pun">;</span><span class="pln">
</span><span class="lit">11</span><span class="pln">  
</span><span class="lit">12</span><span class="pln">              </span><span class="com">//prompt user to get input for first value.</span><span class="pln">
</span><span class="lit">13</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input first number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">14</span><span class="pln">              str1 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">15</span><span class="pln">  
</span><span class="lit">16</span><span class="pln">              </span><span class="com">//prompt user to get input for second value.</span><span class="pln">
</span><span class="lit">17</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">Write</span><span class="pun">(</span><span class="str">"Input second number: "</span><span class="pun">);</span><span class="pln">
</span><span class="lit">18</span><span class="pln">              str2 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadLine</span><span class="pun">();</span><span class="pln">
</span><span class="lit">19</span><span class="pln">  
</span><span class="lit">20</span><span class="pln">              </span><span class="com">//convert the input values to double numbers.</span><span class="pln">
</span><span class="lit">21</span><span class="pln">              num1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str1</span><span class="pun">);</span><span class="pln">
</span><span class="lit">22</span><span class="pln">              num2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">double</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">str2</span><span class="pun">);</span><span class="pln">
</span><span class="lit">23</span><span class="pln">  
</span><span class="lit">24</span><span class="pln">              </span><span class="com">//perform sum operation.</span><span class="pln">
</span><span class="lit">25</span><span class="pln">              sum </span><span class="pun">=</span><span class="pln"> num1 </span><span class="pun">+</span><span class="pln"> num2</span><span class="pun">;</span><span class="pln">
</span><span class="lit">26</span><span class="pln">  
</span><span class="lit">27</span><span class="pln">              </span><span class="com">/*concatenate strings to form output 
28              message which contains the result.*/</span><span class="pln">
</span><span class="lit">29</span><span class="pln">              result </span><span class="pun">=</span><span class="pln"> num1</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" + "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> num2</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" = "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> sum</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">();</span><span class="pln">
</span><span class="lit">30</span><span class="pln">  
</span><span class="lit">31</span><span class="pln">              </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span><span class="pln">
</span><span class="lit">32</span><span class="pln">  
</span><span class="lit">33</span><span class="pln">          </span><span class="pun">}</span><span class="pln">
</span><span class="lit">34</span><span class="pln">      </span><span class="pun">}</span><span class="pln">
</span><span class="lit">35</span><span class="pln">  </span><span class="pun">}</span></pre>

	<p>
		نفّذ البرنامج بضغط المفتاحين<span style="font-family:courier new,courier,monospace;"> Ctrl+F5</span> معًا. سيطلب منك البرنامج في البداية إدخال قيمة العدد الأوّل. أدخل القيمة المرغوبة ثم اضغط مفتاح الإدخال Enter. بعد ذلك سيطلب منك البرنامج إدخال قيمة العدد الثاني. أدخلها واضغط Enter. سيعرض البرنامج بعد ذلك النتيجة المطلوبة على شكل رسالة مناسبة. 
	</p>

	<p>
		تحتوي هذه النسخة من برنامج جمع الأعداد على عدّة تحسينات: 
	</p>

	<ol>
<li>
			أصبح برنامجنا يدعم جمع أعداد تقبل فاصلة عشرية من خلال التصريح عن متغيّرات من النوع <span style="font-family:courier new,courier,monospace;">double</span> (انظر السطر 10). والنوع <span style="font-family:courier new,courier,monospace;">double</span> هو النوع الذي يقبل أعدادًا ذات فاصلة عائمة مزدوجة الدقّة. مجال الأعداد التي يقبلها يقع بين ±5.0*10-324 حتى ±1.7*10308. 
		</li>
		<li>
			أصبح بإمكان مستخدم البرنامج أن يُدخل الأعداد المراد جمعها مباشرة من لوحة المفاتيح، وذلك من خلال التابع <span style="font-family:courier new,courier,monospace;">ReadLine</span> من الصنف Console (انظر السطرين 13 و 16) يُوقف هذا التابع تنفيذ البرنامج وينتظر المستخدم أن يُدخل قيمة ما ويضغط مفتاح الإدخال Enter ليتابع البرنامج التنفيذ. 
		</li>
		<li>
			أضفنا تعليقات توضيحيّة ضمن البرنامج. هذه التعليقات لا يكترث بها المترجم، ووظيفتها هي جعل الشيفرة البرمجيّة مقروءةً وسهلة الفهم والتعديل لاحقًا. في الحقيقة تُعتبر عمليّة كتابة التعليقات البرمجيّة فنًّا بحد ذاته، وأنصح أن يمارسها كلّ مبرمج بأيّ لغة برمجة كانت. في الواقع ليس مطلوبًا كتابة التعليقات البرمجيّة قبل كلّ عبارة برمجيّة، فعلى المرء أن يكون حكيمًا في استخدامها بالشكل الذي يحافظ فيه على التوازن بين جعل الشيفرة واضحة ومقروءة، وعدم الإفراط في كتابة التعليقات بدون ضرورة. تدعم لغة سي شارب نوعين من التعليقات: التعليقات على مستوى السطر، حيث يتجاهل المترجم compiler كلّ ما يقع على يمين الرمزين<span style="font-family:courier new,courier,monospace;">//</span>. والتعليقات التي تمتد على عدّة أسطر، حيث يتجاهل المترجم المحتوى الموجود بين الرمزين <span style="font-family:courier new,courier,monospace;">/*</span> والرمزين<span style="font-family:courier new,courier,monospace;"> */</span>. انظر الأسطر 12 و 16 و 20 و 24 من أجل التعليقات على مستوى السطر، والسطرين 27 و 28 من أجل التعليقات التي تمتدّ على عدّة أسطر. 
		</li>
		<li>
			استخدمنا التابع <span style="font-family:courier new,courier,monospace;">Write</span> بدلًا من التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> (انظر السطرين 13 و 17)، والسبب في ذلك هو أنّنا نريد أن يطلب البرنامج من المستخدم إدخال القيمة على نفس السطر الذي تُعرَض فيه الرسالة وليس على سطرٍ منفصل. فالتابع <span style="font-family:courier new,courier,monospace;">Write</span> يعرض النص المُمرّر إليه ولا يُحدِث سطرًا جديدًا. في حين يسلك التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> نفس سلوك التابع <span style="font-family:courier new,courier,monospace;">Write</span> ولكن ينتقل إلى سطر جديد بعد عرض النص. يمكنك أن تجرّب استبدال التابع <span style="font-family:courier new,courier,monospace;">WriteLine</span> بالتابع <span style="font-family:courier new,courier,monospace;">Write</span> لترى الفرق. 
		</li>
		<li>
			جعلنا عمليّة تشكيل النص الذي سيُعرض على المستخدم ضمن سطر منفصل (السطر 29) وأسندنا هذا النص إلى المتغيّر <span style="font-family:courier new,courier,monospace;">result</span> من النوع string. الهدف من هذا الأمر هو جعل الشيفرة نظيفة وواضحة وسهلة للقراءة. النوع string هو من الأنواع المرجعيّة reference types ويُستخدم للتعبير عن النصوص.
		</li>
	</ol>
<p>
		ولكن تبقى هناك بعض العيوب التي لم نعالجها والتي قد تسبّب توقّف البرنامج عن العمل:
	</p>

	<ol>
<li>
			تُعتبر القيم التي يدخلها المستخدم بواسطة التابع <span style="font-family:courier new,courier,monospace;">ReadLine</span> أنّها قيم نصيّة. وحتى نستطيع التعامل معها كأعداد تقبل فاصلة عشريّة يجب تحويلها إلى قيم عددية من النوع <span style="font-family:courier new,courier,monospace;">double</span>. نستطيع ذلك بسهولة من خلال التابع <span style="font-family:courier new,courier,monospace;">Parse</span> من الصنف <span style="font-family:courier new,courier,monospace;">double</span>. يقبل هذا التابع أن نُمرّر إليه قيمة نصيّة ليعيد إلينا التمثيل العددي لها من النوع <span style="font-family:courier new,courier,monospace;">double</span>. ولكنّ السؤال هنا أنّه ماذا لو أدخل المستخدم بشكل غير مقصود (أو مقصود) القيمة النصيّة التالية "abc" للعدد الأوّل؟ عندما يصل تنفيذ البرنامج إلى السطر 21 سيعمل التابع <span style="font-family:courier new,courier,monospace;">Parse</span> على تحويل القيمة "abc" إلى التمثيل العددي من النوع <span style="font-family:courier new,courier,monospace;">double</span> وهذا ما لا يمكن حدوثه بالطبع، لذلك فسيرمي التابع <span style="font-family:courier new,courier,monospace;">Parse</span> استثناءً Exception سيؤدّي إلى توقّف البرنامج عن العمل فورًا! سنتحدّث عن الاستثناءات في درس لاحق. وعلى أيّة حال يمكن حلّ هذه المشكلة بطريقتين مختلفتين سنتحدّث عنهما لاحقًا في هذه السلسلة. ولكنّ المغزى هنا هو أنّه لا تثق بمدخلات المستخدم مطلقًا.
		</li>
		<li>
			تُعتبر عملية ضم النصوص التي أجريناها في السطر 29 غير عمليّة وعادة برمجيّة غير جيّدة. يتعلّق هذا الأمر بالحقيقة طريقة تعامل سي شارب مع النصوص، سأترك الحديث عن هذه المشكلة وطرق حلّها عندما نتحدّث عن النصوص والتعامل معها في الدرس السادس.
		</li>
	</ol>
</div>

<div id="wmd-preview-section-28">
	<h2 id="تمارين-داعمة">
		تمارين داعمة
	</h2>
</div>

<div id="wmd-preview-section-29">
	<h3 id="تمرين-1">
		تمرين 1
	</h3>

	<p>
		اكتب برنامجًا يطبع العبارات التالية كما يلي على الشاشة:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8024_31">
<span class="pln">Today is Sunday.
Tomorrow is Monday.
Yesterday is Saturday.</span></pre>

	<h3>
		تمرين 2
	</h3>
</div>

<div id="wmd-preview-section-30">
	<p>
		اكتب برنامجًا يطلب من المستخدم إدخال قيمتين عدديتين، ومن ثمّ يوجد حاصل الضرب لهما (استخدام العامل *) وبعرض النتيجة على الشاشة. يجب أن يدعم البرنامج الأعداد ذات الفاصلة العشرية.
	</p>
</div>

<div id="wmd-preview-section-31">
	<h2 id="الخلاصة">
		الخلاصة
	</h2>

	<p>
		تعرّفنا في هذا الدرس على الشكل الأساسيّ لأيّ تطبيق مكتوب بلغة سي شارب. كما تعاملنا مع ثلاثة برامج بسيطة للغاية وضّحت مبادئ كتابة برنامج باستخدام سي شارب. سنتناول في الدرس القادم موضوع المتغيّرات وأنواعها والعوامل والتعابير expressions بتفصيل أكبر.
	</p>
</div>
]]></description><guid isPermaLink="false">312</guid><pubDate>Fri, 15 Apr 2016 18:47:02 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; &#x62F;&#x648;&#x62A; &#x646;&#x62A;</title><link>https://academy.hsoub.com/programming/c-sharp/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D8%AF%D9%88%D8%AA-%D9%86%D8%AA-r311/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-dot-net-introduction.png.cc00578735c2b208fc1ee859797f4153.png" /></p>
<p dir="rtl">
	يُعتبر إطار العمل دوت نت NET Framework. من شركة مايكروسوفت من أُطر العمل المشهورة جدًّا، فمنذ الإصدار التجريبي الأوّل أواخر عام 2000 وحتى الإصدار 4.6 حاليًّا شهد تحسينات كبيرة جعلت من لغات البرمجة التي تعمل بالاعتماد عليه لغات برمجة غنيّة ومعاصرة.
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="learn-csharp-dot-net-introduction.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15034" data-unique="aia27q2wk" src="https://academy.hsoub.com/uploads/monthly_2016_04/learn-csharp-dot-net-introduction.png.eda6191543023621487571d10be830ae.png">
</p>

<p dir="rtl">
	يُعتبر إطار العمل دوت نت الكيان الأساسيّ التي تعتمد عليه التطبيقات في تنفيذ المهام المطلوبة منها. فهو يوفّر الوسائل اللازمة لوصول مثل هذه التطبيقات إلى الملفات والتعامل مع HTTP والوصول والتعامل مع قواعد البيانات وغيرها من المهام الأساسيّة التي قد يحتاجها أيّ تطبيق حاسوبيّ. صُمّم إطار العمل دوت نت منذ البداية لكي يعمل على أيّ نظام تشغيل أو أيّ عتاد صلب متاح، وعلى الرغم من أنّ مايكروسوفت لم تدعم تشغيل إطار العمل هذا سوى على أنظمة تشغيل ويندوز، إلّا أنّه جرت محاولات مستقلة لنقله إلى لينكس عن طريق <a href="http://www.mono-project.com/" rel="external nofollow">مشروع </a><a href="http://www.mono-project.com/" rel="external nofollow">mono</a> مفتوح المصدر. وقد نجحت هذه المحاولة بصورة لا بأس بها واستمر المشروع لعدّة سنوات، ثمّ توّج بنقله إلى أنظمة تشغيل الأجهزة الذكيّة وهذا ما قامت به شركة <a href="https://xamarin.com/" rel="external nofollow">Xamarin</a> التي استحوذت عليها شركة مايكروسوفت قبل أقل من شهر من الآن، حيث تمكّنت Xamarin من ذلك بالاعتماد على مشروع mono مفتوح المصدر.
</p>

<p dir="rtl">
	تُعتبر لغة سي شارب #C لغة البرمجة الأساسيّة ضمن إطار العمل دوت نت، وقد واكبْتُ تطوّرها منذ الإصدار الأوّل وحتى اليوم. ومما لا شكّ فيه أنّها قد شهدت تحسينات كبيرة ومزايا مفيدة تجمع بين القوّة والمرونة لتطوير طيف واسع من التطبيقات البرمجيّة تشمل تطبيقات سطح المكتب Desktop Applications وتطبيقات ويب باستخدام ASP.NET وتطبيقات خدمات ويب مثل WCF (اختصار لـ Windows Communication Foundation) وحتى تطبيقات الأجهزة الذكيّة التي تعمل على نظام تشغيل Windows Phone أو التي تعمل على باقي الأنظمة مثل Android و iOS من خلال منصّة Xamarin.
</p>

<p dir="rtl">
	لن ندخل في التفاصيل الدقيقة لمعمارية إطار العمل دوت نت، وذلك لجعل هذه السلسلة مبسّطة قدر المستطاع. يكفيك أن تعلم أنّ إطار العمل هذا يتكوّن من قسمين رئيسيّين:
</p>

<ul dir="rtl">
	<li>
		بيئة التنفيذ المشتركة Common Language Runtime وتُدعى اختصارًا CLR.
	</li>
	<li>
		مكتبة أصناف إطار العمل Framework Class Library وتُدعى اختصارًا FCL.
	</li>
</ul>

<h2 dir="rtl">
	حول هذه السلسلة
</h2>

<p dir="rtl">
	سنتعلّم في هذه السلسلة كتابة تطبيقات باستخدام لغة سي شارب #C بأسلوب مبسّط وسلس وذلك من خلال تطبيقات موجّه الأوامر Console Applications، وسبب تفضيلي لهذه التطبيقات عن سواها، هو أنّه تسمح لك بالتركيز على تعلّم اللغة نفسها دون تشتيت الانتباه إلى العديد من الجوانب التي تتطلّبها أنواع التطبيقات الأخرى كتطبيقات سطح المكتب لويندوز على سبيل المثال، رغم أنّنا سنتحدّث القليل عنها في الدرس الأخير.
</p>

<h3 dir="rtl">
	ما الذي أحتاجه لكي أستفيد من هذه السلسلة؟
</h3>

<p dir="rtl">
	تفترض هذه السلسلة أنّك تمتلك معرفة عامّة بأساسيّات البرمجة. ستحتاج أيضًا إلى حاسوب ذو نظام تشغيل ويندوز 7.1 أو أعلى. بالإضافة إلى تحميل وتنصيب بيئة التطوير <a href="https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx" rel="external nofollow">Visual Studio 2015 Community</a> المجّانيّة.
</p>

<p dir="rtl">
	كما يمكنك تجريب معظم البرامج الموجودة في هذه السلسلة حتى ولو لم يكن لديك نظام تشغيل ويندوز أصلًا عن طريق موقع <a href="https://dotnetfiddle.net/" rel="external nofollow">NET Fiddle.</a> ولكن لن تستفيد بهذه الطريقة من المزايا الهامّة التي يوفّرها لك Visual Studio.
</p>

<h2 dir="rtl">
	الأقسام الأساسية لإطار العمل دوت نت
</h2>

<p dir="rtl">
	سنتحدّث قليلًا عن القسمين الأساسيّين لإطار العمل دوت نت بالإضافة إلى مترجم سي شارب C# Compiler، لكي تتكوّن لدينا الصورة الواضحة لآليّة عمل تطبيقات دوت نت.
</p>

<h3 dir="rtl">
	بيئة التنفيذ المشتركة CLR
</h3>

<p dir="rtl">
	هي البيئة التي تنفّذ البرامج المكتوبة بلغات دوت نت، وتشكّل حاضنةً لهذه البرامج من خلال عزلها عن العتاد الصلب hardware للجهاز التي تعمل عليه. تستطيع تشبيهها بالآلة الافتراضيّة Virtual Machine الخاصّة بلغة Java. وهي مسؤولة عن إدارة المصادر التي يحتاجها البرنامج في عمله، وفي مقدّمتها الذاكرة. حيث تعمل هذه البيئة على إدارة عمليّات إنشاء الكائنات التي يحتاجها البرنامج، ومن ثمّ التخلّص منها عند انتفاء الحاجة إليها.
</p>

<p dir="rtl">
	تتوفّر CLR بشكل افتراضيّ على معظم أنظمة تشغيل ويندوز (مع الاختلاف بالإصدارات) مثل Windows XP و Windows 7 و Windows 8 و Windows 10 و Windows Phone و Windows Server (بمعظم إصداراته).
</p>

<h3 dir="rtl">
	مكتبة أصناف إطار العمل FCL
</h3>

<p dir="rtl">
	تحتوي هذه المكتبة الضخمة على آلاف الأصناف classes التي تسمح لنا بإنجاز أيّ مهمّة تخطر ببالنا. فمن التعامل مع النصوص والتعابير النظاميّة regular expressions إلى التعامل مع الاتصالات الشبكيّة network communications والتعامل مع بروتوكولات الانترنت الشهيرة مثل HTTP وFTP وغيرها، والوصول إلى قواعد البيانات والتعامل معها.
</p>

<p dir="rtl">
	تتكوّن FCL بدورها من عدّة مكتبات فرعيّة، فهناك مكتبة تساعدنا على تطوير  و<a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">برمجة تطبيقات سطح المكتب</a> لويندوز، وأخرى تسمح لنا بتطوير تطبيقات ويب باستخدام تقنيّة ASP.NET، ومكتبة تسمح بإنشاء تطبيقات WCF وهكذا. بمعنى أنّه لن تحتاج إلى التعامل مع كامل مكتبة FCL بل ستنتقي منها ما تحتاجه بحسب متطلّبات عملك، فإذا كنت مطوّر ويب مثلًا فستهتم بالمكتبة الفرعيّة التي تسمح بإنشاء تطبيقات ويب باستخدام ASP.NET. ومن الجدير ذكره أنّ مكتبة FCL تحتوي أيضًا على مكتبة فرعيّة اسمها مكتبة الأصناف الأساسيّة Base Class Library أو اختصارًا BCL، تحتوي هذه المكتبة على الأصناف الأساسيّة التي تعمل مع جميع التطبيقات المنشأة باستخدام المكتبات الأخرى بصرف النظر عن نوعها.
</p>

<h2 dir="rtl">
	مترجم سي شارب C# Compiler
</h2>

<p dir="rtl">
	لكي نتمكّن من تنفيذ البرامج التي نكتبها باستخدام سي شارب، نحتاج إلى مترجم سي شارب C# Compiler. يكون هذا المترجم مضمّنًا بشكل افتراضيّ مع إطار العمل دون نت. يعمل المترجم على تحويل التعليمات البرمجيّة الموجودة في الشيفرة والمكتوبة بلغة سي شارب إلى تعليمات برمجيّة مكتوبة بلغة تُعرف بلغة مايكروسوفت الوسيطيّة Microsoft Intermediate Language أو اختصارًا MSIL. تُعتبر هذه اللغة الوسيطيّة منخفضة المستوى، وهي شبيهة بلغة Assembly الشهيرة. في الواقع ستعمل بيئة التنفيذ المشتركة CLR على تنفيذ التعليمات المكتوبة بلغة MSIL. فبيئة CLR لا تحتاج أن تعرف لغة البرمجة التي كُتب بها البرنامج أصلًا وهي الميزة الأساسيّة التي تسمح للمبرمج الكتابة بأي لغة برمجة تدعم الدوت نت. فطالما أنّ لغة البرمجة تمتلك مترجمًا متوافقًا مع MSIL فلا مشكلة. وهذا ما جرى مع لغات برمجة أخرى مثل Visual Basic.NET ولغة #F وحتى لغة البايثون Python من خلال <a href="http://ironpython.net/" rel="external nofollow">IronPython</a>. انظر الشكل التوضيحي التالي:
</p>

<p dir="rtl" style="text-align: center;">
	<img alt="c_sharp_compiler.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15033" data-unique="3r54aj55w" src="https://academy.hsoub.com/uploads/monthly_2016_04/c_sharp_compiler.png.cf6da9c916d0c55706ee6a452f31464d.png">
</p>

<h2 dir="rtl">
	كيف ينفذ البرنامج باستخدام CLR؟
</h2>

<p dir="rtl">
	توضع الشيفرة البرمجيّة المكتوبة بلغة سي شارب عادةً في ملفات منفصلة لكلٍّ منها الامتداد cs، يعمل المترجم بعد ذلك على قراءة هذه الملفات التي تسمّى بملفّات النص المصدريّ source code files وتحويل التعليمات البرمجيّة المكتوبة بسي شارب إلى لغة MSIL وجعلها ضمن ملف تنفيذي (الملف MyApp.exe في الشكل السابق). عند تنفيذ البرنامج تقرأ CLR التعليمات البرمجيّة الموجودة ضمن الملف التنفيذي والتي تكون بلغة MSIL وتعمل على تنفيذها عن طريق تحويلها إلى تعليمات برمجيّة أصليّة native code مخصّصة لمعالج الحاسوب الذي يعمل عليه البرنامج حاليًّا.
</p>

<p dir="rtl">
	يجري كلّ هذا العمل بسرعة كبيرة جدًّا فعملية التحويل إلى native code لا تجري سوى أوّل مرّة فقط، وبعد ذلك يستفيد البرنامج من السرعة الكبيرة التي توفّرها هذه التعليمات الأصليّة عند التنفيذ.
</p>

<p dir="rtl">
	يُفسّر السيناريو السابق سبب قابليّة عمل برامج دوت نت على أيّ نظام تشغيل أو عتاد حاسوبي. فعمليّة كتابة الشيفرة البرمجيّة بأي لغة دوت نت ومن ثمّ تحويلها إلى لغة مايكروسوفت الوسيطيّة MSIL منفصلة تمامًا عن نظام التشغيل وعن العتاد الحاسوبي الذي سيعمل عليه البرنامج. ولعلّ من أبرز الأمثلة على ذلك البرامج المكتوبة بلغة سي شارب والموجّهة إلى أنظمة تشغيل الأجهزة الذكيّة عن طريق منصة Xamarin التي ذكرناها قبل قليل. فالعمل الأساسي الذي قامت به هذه الشركة هو انتاج بيئة CLR منفصلة لكلّ نظام تشغيل مثل Android و iOS مما يسمح للبرامج المكتوبة بلغة سي شارب الخروج من "قمقم" ويندوز إن صحّ التعبير.
</p>

<p dir="rtl">
	وأكثر من ذلك، فقد أنتجت مايكروسوفت مؤخّرًا نسخة خاصّة وخفيفة من نظام التشغيل Windows 10 أسمته <a href="https://dev.windows.com/en-us/iot" rel="external nofollow">Windows 10 IoT</a> وهو مخصّص لإنترنت الأشياء. يمكن تنصيب نظام التشغيل هذا بكلّ سلاسة ويُسر على جهاز <a href="https://www.raspberrypi.org/" rel="external nofollow">Raspberry Pi</a> المشهور والموجّه لتطبيقات إنترنت الأشياء، وهذا يعني فتح المجال أمام التطبيقات المكتوبة باستخدام لغة سي شارب للعمل على هذا الجهاز وبالتالي الدخول في هذا المجال المهم والواعد.
</p>

<h2 dir="rtl">
	الخلاصة
</h2>

<p dir="rtl">
	<a name="_GoBack" rel=""></a> لغة سي شارب هي لغة عصريّة ولها مستقبل واعد في قطاع الأعمال. فهي اللغة الأساسيّة المستخدمة لكتابة مختلف أنواع التطبيقات الحاسوبيّة ضمن إطار العمل دوت نت. بالإضافة إلى أنّها سلسة وذات بنية مألوفة، ولكن تحتاج إلى قليل من الصبر في تعلّمها. سنتناول في الدروس اللّاحقة كيفيّة كتابة برامج بسيطة ولكن متدرّجة في الصعوبة حتى تكون ملمًّا بأساسيّات هذه اللغة الرائعة.
</p>
]]></description><guid isPermaLink="false">311</guid><pubDate>Thu, 14 Apr 2016 10:04:00 +0000</pubDate></item></channel></rss>
