لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 07/28/24 في كل الموقع
-
السلام عليكم ازي اقدر اطبق الlabel encoder بلغه باثيون علي البيانات ده علي عمود ال gender ؟ diabetes_prediction_dataset.csv2 نقاط
-
السلام عليكم ورحمة الله وبركاته ممكن اعرف ليه مكتبة ريأكت مش موجودة في مسار تطوير الويب2 نقاط
-
2 نقاط
-
هل يوجد برنامج يمكن تنصيبه في الحاسب لتعلم الكتابه السريعه على الكيبورد؟ويعمل بدون الحاجه للاتصال بالانترنت1 نقطة
-
السلام عليكم اخواني لقد اتممت بفضل الله ثم هذه الاكاديميه المحترمه و المحترفه دوره جافاسكريبت و قد حصلت علي الشهاده الحمد لله في الاول عملت المشاريع التطبيقيه مع المحاضر ولاكن فقط اخذت الفكره و تبقطها باسلوبي حتي اتمكن من تقويه نفسي و تعزيز الكود الحاص بي قد تواصلت مع خدمه العملاء و كانوا سريعين في الرد جزاهم الله كل خير انتظرت حتي يتم مراجعت مشاريعي و الحمد لله تم الموافقه عليها اتاني موعد الانترفيو الصوتي و كان مع الباشمهندس عبدالحميد و احب ان اقول يالها من مقابله مع شخص خلوق ذو خبره ربنا يبارك له و يزيده من علمه انتظرت فقط يوم واحد حتي يتم ابلاغي بالنتيجه و التي كانت بفضل الله بالقبول اتاني مشروع التخرج و كان علي ان اسلمه خلال 15 يوما و يلزم رفعه علي استضافه ليعمل مثل اي موقع الحمد لله قبل المده بكثير تم تسليم المشروع انتظرت عده ايام حتي يتم مراجعه الكود بالكامل و الحمد لله بعد مراجعه الكود كان يوجد ملاحظات تم حلها الحمد لله ثم تواصل معي مدير الاكاديميه الباشمهندس عبداللطيف الله يكرم الباشمهندس و يحقق ليه كل امانيه و يزيده من علمه فقد نصحني بماذا افعل في المستقبل و لكي احصل علي الشهاده و لكي يعطيني باقي الخطوات الان قد انهيت مغامراتي مع Django ايضا هنا في كورس Python و الان في مغامره جديده مع Ruby on rails احب ان اشكر حضراتكم و اشكر هذه الاكاديميه من كل قلبي فانا الان اسعد انسان لان اخيرا قد تحقق حلمي بعد مجهود و تعب دام قرابه السنه1 نقطة
-
لا مشكلة، فتلك البيانات متاحة للجميع وليست بيانات خاصة أو حساسة، فالمشاريع يتم عرضها في جوجل وأرشفتها، وأيضًا الجميع يرى تلك البيانات. لكن الفائدة الحقيقية تكمن في استخراج معلومات وإحصائيات مفيدة منها ورسومات بيانية.1 نقطة
-
هل يحق لي نشر اعمالي التي قمت بتصميمها لعملائي على معرض اعمالي في مستقل ؟1 نقطة
-
بالطبع لا مشكلة وحتى الأعمال التي قمتي بها طالما لا يوجد ما يمنع ذلك. فالتصميمات التي تم رفضها تستطيعي حتى نشر الملفات المصدرية إن أردتي.1 نقطة
-
في حال كان العقد بينك وبين العميل ينص على ألا يتم نشر تلك الأعمال في معرض أعمالك فلا يجب ذلك بالطبع، وتقومين بذلك مقابل سعر إضافي بطبيعة الحال. لكن أغلب المشاريع ليست كذلك، ويحق لك وضع الصور في معرض أعمالك كما تشائين ولكن بدون أية روابط من شأنها نشر الملفات المصدرية فتلك من حق العميل فقط.1 نقطة
-
1 نقطة
-
اتمام جزاك الله خير بس مش ممكن نعمل كده باستخدم مكتبه numpy ؟ اتمام جزاك الله خير بس مش ممكن نعمل كده باستخدم مكتبه numpy ؟ انا عملت الكود بس اي ده هو عمل هو 0 و 1 من غير انا ما اعمل طيب افرض انا عاوز اعكس مثل اخلي الرجال 0 والنساء 1 اعمل اي ؟ وكمان ازي احفظ الملف الجديد ؟1 نقطة
-
لتطبيق LabelEncoder على البيانات سنحتاج إلى استخدام مكتبة pandas لتحميل البيانات ومكتبة scikit-learn لتطبيق التشفير هذا مثال للتوضيح فقط: import pandas as pd from sklearn.preprocessing import LabelEncoder file_path = 'diabetes_prediction_dataset.csv' data = pd.read_csv(file_path) هنا قمنا باستدعاء المكتبات اللازمة للعمل وقمنا بتحميل البيانات من ملف CSV. print(data.head()) بعدها نقوم باستظهار البيانات وقراءتها من خلال الدالة print. columns_to_encode = ['Gender', 'Outcome'] label_encoders = {} for column in columns_to_encode: le = LabelEncoder() data[column] = le.fit_transform(data[column]) label_encoders[column] = le print(data.head()) encoded_file_path = 'encoded_diabetes_prediction_dataset.csv' data.to_csv(encoded_file_path, index=False) بعدها نقوم باستعراض أول 5 صفوف من البيانات لتحديد الأعمدة التي تحتاج إلى تشفير ونقوم بتطبيق LabelEncoder على الأعمدة المختارة ثم استعراض البيانات بعد التشفير وحفظها ضمن ملف.1 نقطة
-
السلام عليكم هو ازي البيانات الموجود علي موقع كاجل بيانات غير مشفر مع العلم انها حقيقي ؟1 نقطة
-
أتفهم ما تقصده بخصوص التشفير، لكن تلك البيانات متاحة للعموم وليست ملكية خاصة أي ليس عليها حقوق ملكية. ما لا يتم نشره ويصبح متاح للعموم هي البيانات الحساسة مثل بيانات المستخدمين وغيرها والتي لا يجب الإطلاع عليها من قبل الجميع، بينما تمتلكها الشركات فقط. الأمر الذي يجعل الشركات الكبيرة قادرة على توظيف تعلم الآلة للتدرب على تلك البيانات الحساسة. ويمكن الاستعاضة عن ذلك بتدريب النماذج على بيانات تم توليدها والتي تعرف باسم Synthetic Data، وذلك هو الإتجاه السائد مستقبلاً بحلول 2030:1 نقطة
-
مرحبًا، لماذا يجب أن تكون مشفرة؟ في حال كانت مشفرة لن يستطيع الجميع استعمالها. يبدو أنك تخلط بين حقوق الملكية و التشفير، بشكل عام هناك الكثير من البيانات التي يمكن أن تكون عامة و فكرة أنها حقيقية لا يغير من ذلك. بشكل عام عند جمع البيانات من الأشخاص يجب التوضيح للأشخاص و أخذ موافقتهم على أن تكون هذه البيانات عامة، أو أخذ موافقة الجهة المسؤولة عن البيانات. تحياتي.1 نقطة
-
السلام عليكم يعطيكن العافية.. لو سمحتوا انا خلصت القسم الأول وحاليا عم مكنه أكثر لكي أبدأ لارافيل ... فيني بس خلص القسم الأول قدم اختبار فيه ولا فقط بس يخلص الكورس من خلال مشروع وكذا... شكرا جزيلا .1 نقطة
-
نعم يفضل الإحتفاظ دائماً بالتطبيقات العملية ومنها المشروع الموجود في أول مسارز1 نقطة
-
السلام عليكم ورحمة الله وبركاته طريقه كتابه كود phpفي برنامجxammp؟ وماهو حل الخطا في xammp عندما لايستجيب؟1 نقطة
-
بعد تثبيت XAMPP، قم بفتح مجلد التثبيت، بشكل افتراضي يكون المسار على C:\xampp\htdocs، أنشئ مجلد جديد داخل htdocs لمشروعك، مثلا firstproject، بعدها استخدم أي محرر نصوص مثل Visual Studio Code لكتابة كود PHP، و احفظ الملف باسم index.php داخل المجلد الذي أنشأته firstproject، يمكنك كتابة كود بسيط مثل: <?php echo "Hello, World!"; ?> افتح لوحة تحكم XAMPP، شغل خدمة Apache بالضغط على زر "Start" بجانب Apache، ثم افتح متصفح الإنترنت وأدخل العنوان التالي: http://localhost/firstproject/index.php. ، يجب أن ترى النص "Hello, World!" يظهر على الشاشة.1 نقطة
-
التقنيات التي ذكرتيها One-Hot Encoding، Label Encoding، وOrdinal Encoding هي تقنيات تستخدم لتحويل البيانات الفئوية إلى بيانات عددية حتى يمكن استخدامها في نماذج التعلم الآلي. سنبدأ ب One-Hot Encoding حيث تقوم بتحويل كل قيمة فئوية إلى مجموعة من الأعمدة الثنائية (0 أو 1)، حيث يكون لكل فئة عمود منفصل، لنفترض أن لدينا عمودا يحتوي على الألوان: ["Green", "Red", "Blue"]. ،لإستخدام هذه القيم في تدريب النموذج لدينا نحتاج إلى تحويلها إلى أرقام و بالتالي تصبح بهذه الطريقة: أما بالنسبة ل Label Encoding فالفكرة تقوم بتحويل كل فئة إلى رقم صحيح فريد،لنفترض أن لدينا نفس العمود بألوان مختلفة، عند تحويلها تصبح بهذا الشكل حيث كل رقم يمثل لون معين: و أخيرا Ordinal Encoding هذه التقنية تستخدم عندما تكون هناك علاقة ترتيبية بين الفئات، وتقوم بترتيب الفئات بناء على ترتيب محدد، نفترض أن لدينا عمود يحتوي على درجات تعليمية: ["Poor", "Good", "Very Good", "Excellent"]، بعد تحويلها تصبح بهذه الطريقة. و اختيار نوع التشفير يعتمد على طبيعة البيانات والعلاقة بين الفئات، فإذا كانت الفئات غير ترتيبية، فإن One-Hot Encoding هو الخيار الأمثل، و إذا كانت الفئات ترتيبية ولها معنى، فإن Ordinal Encoding هو الأنسب، بينما Label Encoding يمكن استخدامه في حال كانت العلاقة الترتيبية غير هامة ولكن يجب الحذر من إدخال ترتيب غير مقصود.1 نقطة
-
إذا كنت مهتمًا لأن تصبح مهندس برمجيات وتتساءل عن طبيعة عمل مهندس البرمجيات وعن المهام التي ستوكل إليك عند العمل في هذه الوظيفة في شركة ما، وهل راتب مهندس البرمجيات مجزي أم لا ويتناسب مع الجهد المبذول، ففي مقال اليوم سنجيبك على كل هذه التساؤلات ونساعدك في معرفة أهم التقنيات والمتطلبات التي عليك تعلمها كي تصبح مهندس برمجيات محترف ونضع لك قائمة بأهم مصادر تعلمها. من هو مهندس البرمجيات مهندس البرمجيات هو المبرمج الذي يطبق مبادئ الهندسة في عملية تصميم وتطوير البرمجيات، فهو شخص خبير يمتلك معرفة دقيقة بأنواع البرمجيات المختلفة مثل برامج النظام والبرامج التطبيقية ويعرف الكثير من لغات البرمجة والتقنيات الرقمية. كما يعرف مهندس البرمجيات كيف يحدد احتياجات مستخدمي البرامج والتطبيقات بدقة وكيف يصفها ويعبر عنها بشكل واضح ومفهوم ويقسمها لمهام متعددة لتنفيذها وفق خطوات محددة ومنظمة، فهو يطور هذه البرمجيات خلال مراحل متخلفة وباتباع منهجيات محددة لتطوير البرمجيات مثل منهجية الشلال Waterfall أو منهجية أجايل Agile ويطبق المبادئ الهندسية في كل مرحلة من هذه المراحل للحصول على برمجيات عالية الأداء تلبي المتطلبات. الفرق بين المبرمج ومهندس البرمجيات؟ انتبه فليس كل مبرمج أو مطور تطبيقات هو مهندس برمجيات، وعلى الرغم من أن مصطلحات مثل مطور ومبرمج ومهندس برمجيات تستخدم في كثير من الأحيان للدلالة على نفس الوظيفة إلا أن هناك اختلافات بينهما، فمسؤوليات مهندسي البرمجيات أشمل وأوسع. فدور المبرمج يقتصر على مهمة محددة وهي كتابة الشيفرات والأكواد البرمجية ويتطلب هذا الدور فهمًا قويًا بلغات البرمجة والخوارزميات وأنواعها وهياكل البيانات واستخداماتها، في حين يشرف مهندس البرمجيات على كامل عملية تطوير البرمجيات بدءًا من مرحلة وضع المتطلبات والتصميم الأولي وصولًا لمرحلة البرمجة وكتابة الأكواد، وانتهاء بمرحلة الاختبار والصيانة، ويتطلب منه هذا الدو الشامل فهمًا قويًا بدورة حياة تطوير البرمجيات ومنهجيات تطويرها وأنماط تصميم البرمجيات إضافة لفهم لغات البرمجة والخوارزميات. بمعنى آخر يهتم المبرمج بأمور تنفيذ المشروع ويكتب الكود البرمجي الخاص به وهو ما يعرف بمصطلح implementation، أما مهندس البرمجيات فيقوم بأكثر من ذلك بكثير فهو يخطط ويحلل متطلبات المشروع ويقدم أنسب الحلول لتحقيقه بناءً على معرفته وخبرته الهندسية ويبدأ دوره قبل بدء المبرمج بمرحلة كتابة الكود إذ يكون لديه تصور واضح عن مراحل العمل ككل قبل البدء بإنجازه. هل ترغب في تصميم وتطوير برمجيات متقنة لأعمالك؟ وظّف مهندس برمجيات خبير من مستقل أضف مشروعك الآن أهمية هندسة البرمجيات تعد هندسة البرمجيات واحدة من أكثر الوظائف المطلوبة اليوم والتي ستظل مطلوبة في المستقبل، نظرًا للتطور التقني المتسارع والمتشعب في مختلف المجالات ما يستدعي الحاجة إلى توظيف مهندسي البرمجيات لتطوير برامج وتطبيقات تحل مختلف المشكلات بشرعة واحترافية. ولا تقتصر أهمية هندسىة البرمجيات على شركات التطوير البرمجي بل تلجأ معظم القطاعات والصناعات اليوم مثل شركات الاتصالات والبنوك ومؤسسات القطاع الصحي وغيرها من قطاعات العمل إلى التحول الرقمي وتحتاج إلى تعيين مهندسي البرمجيات للاستفادة من مهاراتهم في برمجة التطبيقات المختلفة وصيانتها وتحسينها. وهذا الطلب المرتفع يجعل رواتب مهندسي البرمجيات أعلى بكثير من المهن الأخرى، وبالطبع يختلف راتب مهندس البرمجيات اعتمادًا على الخبرة ومكان العمل لكنه بالعموم يتقاضى رواتب مرتفعة ومجزية مقارنة ببقية الوظائف لذا احرص على تطوير خبراتك ومهاراتك إذا أردت أن تضمن راتبًا مجزيًا. مهام مهندس البرمجيات قد تختلف مهام مهندس البرمجيات من مكان عمل لآخر وحسب نوع البرمجيات التي يطلب منه تطويرها، لكن بشكل عام إذا قررت العمل في وظيفة مهندس برمجيات فقد يطلب منك القيام بالمهام التالية: تحليل متطلبات مستخدمي المنتج البرمجي المطلوب تطويره وتحديد مواصفاته بناء على هذه المتطلبات تصميم البرمجيات وإعداد وثائق تخطيط المشروع والمواصفات ووثائق اختبار الوحدات التي تحدد التصور العام للبرامج المطلوب تطويرها وتوضح تفاصيل عملها وهيكليتها ومكوناتها المختلفة قبل البدء بنتفيذها. اختيار لغة البرمجة والتقنيات المناسبة لتطوير التطبيقات وكتابة الشيفرات البرمجة اللازمة لتنفيذها. اختبار البرمجيات بشكل مؤتمت أو يدوي والتأكد من خلوها من الأخطاء وإصلاحها في حال وجودها. الإشراف على عملية نشر البرمجيات وإتاحتها للمستخدمين. فحص أي عيوب في البرمجيات بعد نشرها، وصيانتها بصورة دورية وضمان توافقها مع أي أجهزة أو تقنيات جديدة. وضع تصور لتطويرات مستقبلية وإضافة ميزات جديدة تحسن هذه البرمجيات. مهارات مهندس البرمجيات يحتاج أي مهندس البرمجيات لامتلاك مجموعة من المهارات الفنية والسمات الشخصية ومن أهم هذه السمات نذكر: مهارات في التفكير المنطقي والتحليلي ومرونة في التعامل مع المشكلات وإيجاد حلول فعالة لها. معرفة جيدة بالخوارزميات وهياكل البيانات مهارات تقنية ومعرفة جيدة بلغات البرمجة وأهم أطر العمل والمكتبات المساعدة التنظيم ومهارات التواصل الجيدة للتفاعل مع فريق العمل البرمجي والعملاء ومدراء المشاريع. معرفة بدورة حياة البرمجيات ومراحل تطويرها ومعرفة بمنهجيات تطوير البرمجيات وآلية تطبيقها. القدرة على التطور المستمر ومتابعة أحدث التقنيات واستخدامها فالمجال البرمجي سريع التطور. ولمطالعة المزيد من السمات الشخصية التي تحتاج لامتلاكتها لتكون مهندس برمجيات ناجح أنصحك بمشاهدة الفيديو التالي: مجالات عمل هندسة البرمجيات إذا قررت العمل في وظيفة هندسة البرمجيات فلن يقتصر عملك على الإشراف على عملية تطوير البرمجيات وتطبيق مبادئ الهندسة على البرمجيات كما شرحنا سابقًا، فمجالات البرمجة كثيرة ومتنوعة لذا ستجد العديد من المجالات التي يمكنك العمل بها بحسب خبرتك والمهارات التي تتقنها والتقنيات التي تهتم للعمل بها. ومن أهم مجالات عمل هندسة البرمجيات نذكر: مطور برمجيات أو مطور تطبيقات مثل تطبيقات الويب أو تطبيقات الجوال أو التطبيقات المدمجة وإنترنت الأشياء IoT. مهندس DevOps أو مهندس حوسبة سحابية مسؤول عن إدارة دورة حياة تطوير البرمجيات ونشر التطبيقات. عالم بيانات أو مهندس بيانات تحلل وتستخرج رؤى وقرارات مفيدة من البيانات باستخدام الأساليب الإحصائية وخوارزميات التعلم الآلي. مهندس ذكاء اصطناعي وتعلم آلي تطور وتنفذ خوارزميات التعلم الآلي لحل المشكلات والتنبؤ بالتوقعات المستقبلية. مهندس أمن سيبراني تكتشف وتعالج أي ثغرات أو تهديدات أمنية تهدد الشبكات والأنظمة الحاسوبية. مهندس قواعد بيانات مسؤول عن تصميم وإنشاء وإدارة قواعد البيانات الخاصة بالجهة التي تعمل بها أو التطبيقات التي تستخدم هذه البيانات. كانت هذه نبذة سريعة عن أهم مجالات عمل مهندسي البرمجيات، وبالطيع تختلف طبيعة عمل مهندس البرمجيات بحسب الدور الذي يؤديه، وحجم مكان العمل، والتقنيات المستخدمة لتأدية هذا العمل، لذا إذا وجدت فرصة عمل تتطلب تخصص هندسة البرمجيات في شركة ما، فمن الأفضل أن تتأكد أولًا من الوصف الوظيفي لها وتسأل عن المهام والمسؤوليات المطلوبة منك بشكل دقيق لتعرف إن كانت هذه الوظيفة تلائمك أم لا. وفر وقتك وجهدك بتطوير حلول برمجية احترافية لأعمالك استعن بأفضل مهندسي البرمجيات على خمسات اطلب خدمتك الآن كيف أصبح مهندس برمجيات إذا كنت تطمح لأن تدرس برمجة الحاسوب وتتعلم كافة المهارات اللازمة للتصبح مهندس برمجيات محترف، فأمامك طريقان الأول هو الدراسة الأكاديمية لتخصص هندسة البرمجيات والتسجيل في إحدى الجامعات المتخصصة في هندسة الحاسوب أو هندسة البرمجيات أو أي تخصص مشابه، لكن هذا الطريق طويل ويستغرق مدة لا تقل عن أربع إلى خمس سنوات وقد لا يتاح للجميع بسبب تكلفة الدراسة الجامعية وعدد المقاعد المحدود في كل كلية. لذا قد ترغب في اختصار الجهد والتكاليف وتلجأ إلى تعلم هندسة البرمجيات بشكل ذاتي من خلال اكتساب المؤهلات والمهارات التقنية بنفسك والجيد في هذا الخيار أنه يساعدك على اختصار وقت التعلم ودخول سوق العمل التقني لاسيما أن الكثير من الشركات اليوم لم تعد تشترط الشهادات بل تهتم بوجود الخبرات اللازمة والمثبتة لتوظيفك. ستجد الكثير من مصادر التعلم المفيدة من دروس مقالات وكتب ودورات تدريبية على الإنترنت تساعدك على احتراف لغات البرمجة ومبادئ هندسة البرمجيات لكن معظمها باللغة الإنجليزية، وإذا كنت تبحث عن مصدر عربي عالي الجودة لتعلم هندسة البرمجيات فقد وفرت لك أكاديمية حسوب العديد من الدورس والمقالات المجانية التي تساعدك على تعلم كافة لغات البرمجة المشهورة والمطلوبة مثل لغة بايثون Python أو جافا Java أو C++ أو غيرها من لغات البرمجة، ومن الأفضل أن تركز على لغات البرمجة المطلوبة في سوق العمل الذي تستهدفه أو المنطقة التي تهدف للبحث عن وظيفة فيها. كما توفر دروس متعددة لتعلم أساسيات الخوارزميات وهياكل البيانات والتعرف على دورة حياة تطوير البرمجيات وكيفية وأنماط التصميم البرمجية وغيرها من المفاهيم التي تساعدك على تعلم مبادئ الهندسة وتطبيقها على تطوير البرمجيات، وبالتدريب وتطوير العديد من المشاريع البرمجية التي تحل مشكلات برمجية مختلفة ستتمكن تطبيق ما تعلمته من مهارات واكتساب خبرة أكبر في هندسة البرمجيات وبناء معرض أعمال يعزز فرصتك في الحصول على العمل. ولا تنسى أن تعزز مهاراتك الناعمة كالتنظيم والتفكير المنطقي والإبداعي والقدرة على التواصل والعمل الجماعي فهذه المهارات لا تقل أهمية عن المهارات البرمجية ويركز عليها أصحاب العمل، وبعد اكتسابك لهذه الخبرات أنصحك بالبحث عن فرصة للتدرب او التطوع في إحدى الشركات التي توفر فرصًا لمهندسي البرمجيات الجدد للتدرب واكتساب خبرة عملية وقد هذه الفرص تكون مدفوعة أو غير مدفوعة لكنها تساعدك بشكل كبير لاكتساب الخبرات اللازمة التي تؤهلك للعمل في إحدى مجالات عمل مهندس البرمجيات في الشركات والمؤسسات. وإذا كنت مهتمًا بتعلم مهارات هندسة البرمجيات الأساسية لكنك مشتت وتائه ولا تعرف من أين تبدأ أنصحك بالبدء مع دورة علوم الحاسوب من أكاديمية حسوب فهي توفر العديد من المسارات التعليمية المفيدة التي يحتاج أي مهندس برمجيات لمعرفتها، تمتد هذه الدورة لأكثر من 60 ساعة تدريبية تتعلم من خلالها مبادئ البرمجة وأسس هندسة البرمجيات وغيرها من المعلومات القيمة، كما توفر لك مدربين أكفاء يرشدونك خلال التعلم ويجيبون على أي تساؤل يواجهك كما يمكنك الحصول في النهاية على شهادة معتمدة تعزز فرصتك في الحصول على فرصة العمل التي تطمح لها. أوجزنا لك في هذه الفقرة أهم الخطوات التي يمكنك اتباعها لتكون مهندس برمجيات محترف، وإذا كنت مهتمًا بمطالعة المزيد من المعلومات حول هذا الموضوع أنصحك بمطالعة مقالنا الطريقة الأمثل لدراسة تخصص هندسة البرمجيات. الخلاصة تعرفنا في مقال اليوم على وظيفة مهندس البرمجيات وأهميتها، وأهم المهارات التي تحتاجها لتصبح مهندس برمجيات والواجبات التي عليك القيام بها عند العمل في هذه الوظيفة، وفي ختام المقال تذكر أن أي شخص اليوم يمكنه أن يتعلم البرمجة ويدرس هندسة البرمجيات وينجح في مزاولة هذا التخصص، كل ما يحتاجه هو امتلاك الصبر والإرادة والكثير من الالتزام والمثابرة. اقرأ أيضًا تعرف على تخصص هندسة البرمجيات تعرف على وظائف البرمجة الأعلى أجرًا مدخل إلى تطوير البرمجيات Software Development الأخطاء السبع القاتلة لأيّ مشروع برمجيات شهادات البرمجة: أهميتها وسبل الحصول عليها ما هي مدة تعلم البرمجة؟1 نقطة
-
يتساءل كثير من المُقبلين على تعلم البرمجة: هل شهادات البرمجة ضرورية؟ هل يجب على المرء أن يدرس في الجامعة حتى يحصل على شهادة برمجة معتمدة؟ كيف يمكن أن يحصل المرء على شهادات احترافية في البرمجة؟ وكيف يمكن أن يتعلمها بنفسه أصلًا؟ هل يمكن الحصول على شهادات برمجة من الإنترنت؟ يجيبك هذا المقال على كافة هذه التساؤلات. ما هي شهادات البرمجة؟ الشهادة توثيق وتأكيد وكفالة تصدرها جهة موثوقة وتضمن بها معرفة شخصٍ ما بمجموعة من المعارف. لا تخرج شهادات البرمجة عن هذا التعريف، فهي شهادات تصدرها جهات موثوقة (من جامعات أو أكاديميات أو منصات تعليمية إلخ)، تكون دليلًا على معرفة حامل الشهادة بمجموعة من المعارف البرمجية. تقدّم المنصات التعليمية على الإنترنت عادةً شهادات برمجة تشهد على إتمام دورة في مجال معين، أما شهادات البرمجة الجامعية فتشهد على أن الطالب قد أتم جميع مواده الدراسية ونجح فيها. هل يجب الحصول شهادة جامعية حتى تكون مبرمجًا؟ لعلك تتساءل هل يجب على كل من يريد تعلم البرمجة أو الحصول على شهادات برمجة معتمدة أن يدرس في الجامعة؟ قبل الإجابة على هذا السؤال تجدر الإشارة لأن إحصائيات موقع statista تشير بأن قرابة 25% من مطوري البرمجيات غير حاصلين على شهادة جامعية في البرمجة! أي إن ربع مطوري البرمجيات عالميًّا لم يتمّوا أو لم يبدؤوا أي تعليم جامعي، وتتوزع النسبة الباقية بين الحاصلين على شهادة بكلوريوس والحاصلين على شهادات أعلى. فكيف يمكن أن نفهم هذه الإحصائيات؟ لا شكّ أن الشهادة الجامعية مفيدة في مجال البرمجة كما في غيره من المجالات. إذ تسهّل الشهادة الجامعية حياتك المهنية لا سيما في بدايتها، حين تكون هي الإثبات الوحيد على معرفتك في المجال. لكن حتى إن كنت حاصلًا على شهادة جامعية، فإن تطورك المهني سيبلغ بك مرحلة تصبح بها خبراتك وأعمالك السابقة أهم من شهادتك الجامعية، إذ تصبح هي الدليل الأقوى على معرفتك ومهارتك. فإذا كنت قبل التقدّم إلى أول وظيفة تملك أعمالًا تشهد على مهارتك، أو تحمل شهادات غير جامعية تضمن معرفتك، فإن هذا سيكون كافيًا لإثبات معرفتك ومهارتك. يمكنك الاستعاضة عن شهادة البرمجة الجامعية بالتعلم الذاتي من جهة موثوقة تمنحك شهادات برمجة تعكس خبراتك. تقدم منصات التعلم على الإنترنت تعليمًا يركّز على الجانب العملي أكثر من الجانب النظري، ويختصر في الوقت نفسه كثيرًا من الوقت على المتعلم. لقد صنع كثير من المطورين أنفسهم في مدة لا تتجاوز عامًا واحدًا من التعلم الذاتي. كيف تتعلم البرمجة ذاتيًّا تتميز البرمجة على غيرها من المجالات بسهولة تعلّمها ذاتيًّا على الإنترنت. فبالإضافة إلى توفر دورات تقدم شهادات معتمدة في البرمجة على الإنترنت (المزيد عنها في الفقرة التالية)، يفيض الإنترنت بمصادر متنوعة لتعلم البرمجة ذاتيًّا. ولا تكاد تخلو لغة برمجة من كتاب رسمي أصدره مجتمعها ليساعد المبرمجين على تعلمها ذاتيًّا. وفي العالم العربي، يلمع نجم أكاديمية حسوب في مساعدة المبرمجين على التعلم الذاتي والحصول على شهادات برمجة، إذ تقدّم الأكاديمية 19 كتابًا في شتى مجالات البرمجة، تناسب مختلف مستويات المتعلمين، منها: تعلم البرمجة للمبتدئين: يأخذك هذا الكتاب في رحلة لتعلم البرمجة من الصفر، يمرّ فيها على محطّات مختلفة، منها أنواع البيانات، وبناء الواجهات الرسومية، وكتابة تطبيقات الويب، وغير ذلك. البرمجة بلغة بايثون: يقدم هذا الكتاب مجموعة من المقالات الكفيلة بإعطاء القارئ فهمًا شاملًا وكاملًا للغة بايثون، وهو، كالكتاب السابق، مناسب للمبتدئين. البرمجة بلغة جافاسكربت: هل فكرت من قبل في استخدام البرمجة لبناء رجل آلي؟ أو في بناء لغة برمجة خاصة بك؟ يمرّ هذا الكتاب على مختلف المفاهيم في لغة جافاسكريبت، ويختم بمشروع بناء موقع باستخدام بيئة نود جي إس Node.js. دورات عربية تقدم شهادات معتمدة في البرمجة بالإضافة إلى كتب تعلم البرمجة، توفر أكاديمية حسوب دورات تعليمية باللغة العربية تقدم شهادات معتمدة في البرمجة. تتنوع مواضيع الدورات ومجالاتها، وتناسب المبتدئين في تعلم البرمجة والذين لا يمتلكون أي خبرة سابقة أو الذين يريدون الحصول على شهادات برمجة. من أبرز هذه الدورات نذكر: دورة علوم الحاسوب: تناسب هذه الدورة المبتدئ الذي يريد تعلم البرمجة ولا يعرف من أين يبدأ. تأخذ الدورة بيد الطالب حتى يصل إلى مستوًى متقدم في علوم الحاسوب (مثل أنظمة التشغيل وقواعد البيانات وتقنيات الويب). دورة تطوير التطبيقات باستخدام لغة Python: تساعدك هذه الدورة على احتراف لغة بايثون دون أي معرفة سابقة بها، لتستطيع بعدها بناء مختلف أنواع التطبيقات باستخدام هذه اللغة. ستحصل في نهاية الدورة على شهادة برمجة معتمدة في لغة بايثون. دورة تطوير التطبيقات باستخدام لغة JavaScript: تعلمك هذه الدورة بناء تطبيقات الويب والحاسوب والجوال باستخدام لغة جافاسكريبت JavaScript، وهي مناسبة لمن ليس له خبرة سابقة في البرمجة. تقدم الأكاديمية للذين أتمّوا هذه الدورة شهادة برمجة معتمدة في لغة البرمجة جافا سكريبت JavaScript. دورة تطوير تطبيقات الويب باستخدام لغة PHP: للمهتمين بمجال الويب والواجهات الخلفية، تقدم هذه الدورة طريقًا نحو احتراف لغة PHP وإطار عمل Laravel، كما تعلّمك تطوير قوالب ووردبريس WordPress. دورة تطوير تطبيقات الويب باستخدام لغة Ruby: تتعلم في هذه الدورة لغة Ruby وإطار العمل Ruby on Rails، كما ستتعلم التعامل مع قواعد البيانات وتطوير شبكة اجتماعية مثل تويتر. دورة الذكاء الاصطناعي: دورة جديدة تقدمها أكاديمية حسوب لتعلم الذكاء الصنعي وتحليل البيانات من الصفر. تناسب هذه الدورة من يعرف لغةً من لغات البرمجة ويريد تطوير مهاراته في الذكاء الصنعي. دورة تطوير واجهات المستخدم: تقدم هذه الدورة للمتعلم معارف متنوعة متعلقة بتطوير واجهات المستخدم، وتعرّفه على تقنيات ويب كثيرة، كما يتعلم فيها بناء صفحات الهبوط وواجهات مواقع الويب. تناسب هذه الدورة كل مستويات المتعلمين. نصائح لاحتراف البرمجة دون شهادة جامعية إليك بعض النصائح التي تساعدك على أن تصبح مبرمجًا دون الحاجة إلى شهادات برمجة أكاديمية: تعلم الخوارزميات وأسس التفكير المنطقي قبل تعلّم البرمجة. ابدأ بمواد مناسبة للمبتدئين (راجع الفقرتين السابقتين). استكشف مجالات البرمجة وأنواعها المختلفة وحدد المجال الذي تريد التخصص فيه مثلًا: برمجة تطبيقات الجوال، أو برمجة مواقع الويب، أو الذكاء الاصطناعي. ابحث عن مشاريع مفتوحة المصدر في المجال الذي اخترته وشارك في تطويرها. انضم إلى مجتمعات برمجية وتشارك خبراتك ومهاراتك مع غيرك من المطورين. ابنِ مشروعًا صغيرًا مفتوح المصدر لتستعمله فيما بعد دليلًا على مهاراتك وخبراتك السابقة. لا تقتصر على لغة برمجة واحدة أو إطار عمل واحد، كلما ازدادت معارفك ازدادت فرص نجاحك في سوق العمل. خاتمة تتنوع الطرق إلى تعلم البرمجة واحترافها من شخص لآخر، وهي لا تقتصر على التعليم الجامعي وحده أو التعلم الذاتي وحده.، وكذلك تتنوع شهادات البرمجة ومصادر الحصول عليها، بين الشهادات الجامعية والشهادات التي تقدمها منصات التعلم الإلكتروني المختلفة ولك أن تختار ما يناسبك من بين هذه الطرق المختلفة. أرجو أن يكون هذا المقال قد أفادك ودلّك على محطة الانطلاق في رحلة تعلم البرمجة والحصول على شهادات برمجة معتمدة. اقرأ أيضًا دليلك الشامل لتعلم البرمجة والتعرف على أهميتها أهمية البرمجة وأهم لغات البرمجة ما هي مدة تعلم البرمجة كيف تصبح مبرمجًا محترفًا تعرف على تخصص هندسة البرمجيات1 نقطة
-
لغة C# هي لغة برمجة أنيقة، كائنيّة التوجه Object-oriented بأنواع بيانات سليمة Type-safe تمكّن المطورين من بناء تطبيقات آمنة ومتينة تعمل على إطار العمل NET. // تبدأ التعليقات وحيدة السطر بشريطين مائلين هكذا // /* توضع التعليقات متعدّدة الأسطر بين العلامة أعلاه والعلامة أسفله */ هذا تعليق xml يُستخدَم لتوليد توثيق خارجي أو لتقديم مساعدة حسب السياق في بيئة تطوير مندمجة IDE. /// <param name="firstParam"> لتوثيق الدالة Parameter الذي هو معامل firstParam هذا تعليق</param> /// <returns>معلومات عن القيمة المُرجَعة للدالة/returns> //public void MethodOrClassOrOtherWithParsableHelp(string firstParam) {} يحدّد فضاءات اﻷسماء Namespaces التي ستستخدمها هذه الشفرة فضاءات الأسماء أدناه هي كلّها جزء من مكتبة الأصناف Classes المعيارية في إطار العمل NET. 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; فضاء الأسماء هذا ليس مُتضمّنا في المكتبة المعيارية: using System.Data.Entity; لكي تتمكّن من استخدام المكتبة أعلاه فستحتاج لإضافة مرجع إلى ملف dll وهو ما يمكن لمدير الحزم NuGet فعلُه: Install-Package EntityFramework تعرّف فضاءات الأسماء مجالات لتنظيم الشفرات ضمن حزم Packages أو وِحْدات Modules لاستخدام فضاء الأسماء المُعرّف أدناه في شفرة أخرى نضيف العبارة Learning.CSharp إلى فضاءات الأسماء المستخدمة namespace Learning.CSharp { يجب أن يحوي كل ملف cs. على الأقل على صنف Class له نفس اسم الملف. يمكنك لك عدم التقيّد بهذا الشرط، إلا أنه أفضل لصحة الشفرة المصدرية public class LearnCSharp { صياغة أساسية: يمكنك التجاوز إلى “ميزات مثيرة للاهتمام” إن سبق لك كتابة شفرات بجافا أو سي++ 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"); أنواع البيانات Types والمتغيّرات Variables دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن عرّف المتغيّرات على النحو التالي <type> <name> Sbyte - عدد صحيح (سالب أو موجب) على 8 بتات (محصور بين 128- و127) sbyte fooSbyte = 100; Byte - عدد طبيعي (موجب فقط) على 8 بتات (محصور بين 0 و255) byte fooByte = 100; Short - عدد صحيح أو طبيعي طوله 16 بتات صحيح short محصور بين -32,768 و32,767 طبيعي ushort محصور بين 0 و65,535 short fooShort = 10000; ushort fooUshort = 10000; عدد صحيح fooInt أو طبيعي fooUint طوله 32 بت int fooInt = 1; // (-2,147,483,648 <= int <= 2,147,483,647) uint fooUint = 1; // (0 <= uint <= 4,294,967,295) Long عدد صحيح fooLong أو طبيعي fooUlong طوله 64 بت long fooLong = 100000L; // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807) ulong fooUlong = 100000L; // (0 <= ulong <= 18,446,744,073,709,551,615) النوع المبدئي default للأعداد هو int أو uint حسب طول العدد. والحرف L وراء العدد يشير إلى أن نوع العدد هو long أو ulong Double - فاصلة عائمة مزدوجة الدقة حسب المعيار 64-bit IEEE 754 double fooDouble = 123.4; // الدقة: 15-16 رقما Float - فاصلة عائمة وحيدة الدقة 32-bit IEEE 754 Floating Point float fooFloat = 234.5f; // الدقة: 7 أرقام يشير الحرف f وراء العدد إلى أن نوع العدد هو Float Decimal - نوع بيانات بطول 128 بت، ودقّة أعلى من بقية أنواع البيانات ذات الفاصلة العائمة مناسب للحسابات المالية والنقدية decimal fooDecimal = 150.3m; // Boolean - true & false bool fooBoolean = true; // or false Char - نوع بيانات بطول 16 بت يرمز لمحرف يونيكود `char fooChar = 'A'; Strings – على النقيض من جميع أنواع البيانات السابقة التي هي أنواع لقيم البيانات فإن النوع String - سلسلة محارف - هو نوع لمرجع Reference بمعنى أنه يمكنه أخذ القيمة null string fooString = "\"escape\" quotes and add \n (new lines) and \t (tabs)"; Console.WriteLine(fooString); يمكن الوصول إلى كل محرف من سلسلة المحارف عن طريق ترتيبه في السلسلة char charFromString = fooString[1]; // => 'e' لا يمكن التعديل على سلاسل المحارف؛ التعليمة fooString[1] = X خاطئة مقارنة سلاسل محارف مع قيمة الخاصيّة CurrentCulture المعرّفة في المكتبة المعيارية لتمثيل اللغة المستخدمة في النظام، مع تجاهل حالة الأحرف IgnoreCase string.Compare(fooString, "x", StringComparison.CurrentCultureIgnoreCase); تهيئة سلسلة المحارف اعتمادا على sprintf string fooFs = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2); التاريخ والتهيئة DateTime fooDate = DateTime.Now; Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy")); سلاسل المحارف الأصلية Verbatim String يمكنك استخدام العلامة @ أمام سلسلة محارف لتخليص جميع المحارف الموجودة في السلسلة string path = "C:\\Users\\User\\Desktop"; string verbatimPath = @"C:\Users\User\Desktop"; Console.WriteLine(path == verbatimPath); // => true يمكنك توزيع سلسلة محارف على أكثر من سطر بالرمز @ لتخليص العلامة " ضع مكانها "" (" مرتين) string bazString = @"Here's some stuff on a new line! ""Wow!"", the masses cried"; استخدم الكلمة المفتاحية const لجعل المتغيّر ثابتًا غير قابل للتعديل وتُحسب القيم الثابتة أثناء تصريف البرنامج compile time const int HoursWorkPerWeek = 9001; بنى البيانات المصفوفات - يبدأ العنصر الأول عند الترتيب 0 ويجب تحديد قياس المصفوفة عند تعريفها صيغة تعريف المصفوفة هي كالتالي: ;<datatype>[] <var name> = new <datatype>[<array size>] المصفوفة intArray في المثال التالي تحوي 10 أعداد int[] intArray = new int[10]; طريقة أخرى لتعريف مصفوفة وتهيئتها int[] y = { 9000, 1000, 1337 }; ترتيب عناصر المصفوفة - الوصول إلى عنصر Console.WriteLine("intArray @ 0: " + intArray[0]); المصفوفات قابلة للتعديل. intArray[1] = 1; القوائم تُستخدَم القوائم أكثر من المصفوفات لما توفّره من مرونة وصيغة تعريف قائمة هي على النحو التالي: ;List<datatype> <var name> = new List<datatype>() List<int> intList = new List<int>(); List<string> stringList = new List<string>(); List<int> z = new List<int> { 9000, 1000, 1337 }; // تحديد القيم الابتدائية لعناصر القائمة تُستخدَم الإشارتان <> للأنواع العميمة Generics - راجع فقرة ميزات رائعة ليست للقوائم قيم مبدئية ويجب أولا إضافة قيمة قبل إمكانية الوصول إلى العنصر intList.Add(1); Console.WriteLine("intList @ 0: " + intList[0]); بنى تحتية أخرى يجدر بك مراجعتها: قوائم الانتظار Queues/ الرصوص Stacks القواميس Dictionaries HashSet تجميعاـ القراءة فقط Read-only collections الأزواج المُرتّبة Tuples (الإصدار 4 من .NET. فما فوق) العوامل Console.WriteLine("\n→Operators"); int i1 = 1, i2 = 2; // اختصار لتعريف متغيّرات عدة في آن واحد العمليات الحسابية واضحة Console.WriteLine(i1 + i2 - i1 * 3 / 7); // => 3 المقياس Modulo Console.WriteLine("11%3 = " + (11 % 3)); // => 2 عوامل المقارنة Console.WriteLine("3 == 2? " + (3 == 2)); // => false Console.WriteLine("3 != 2? " + (3 != 2)); // => true Console.WriteLine("3 > 2? " + (3 > 2)); // => true Console.WriteLine("3 < 2? " + (3 < 2)); // => false Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true عوامل المقارنة البتّية Bitwise ~ عامل التكملة الأحادي (إن كان البت يحوي 0 يحوله إلى 1، وإن كان يحوي واحد يحوّله إلى صفر) >> إزاحة البتات إلى اليسار << إزاحة البتات إلى اليمين & عامل “و” المنطقي ^ عامل “أو” المنطقي غير الشامل exclusive OR | عامل “أو” المنطقي الشامل inclusive OR التزايد Incrementation int i = 0; Console.WriteLine("\n->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. تناقص قبلي بنى التحكّم Console.WriteLine("\n->Control Structures"); تتبع بنية التحكم if else طريقة كتابة بنى التحكم في C int j = 10; if (j == 10) { Console.WriteLine("I get printed"); } else if (j > 10) { Console.WriteLine("I don't"); } else { Console.WriteLine("I also don't"); } العوامل الثلاثية بنية تحكّم if else بسيطة تمكن كتابتها على النحو التالي: <condition> ? <true> : <false> int toCompare = 17; string isTrue = toCompare == 17 ? "True" : "False"; حلقة While التكرارية int fooWhile = 0; while (fooWhile < 100) { //تتكرّر الحلقة مئة مرة، من القيمة 0 إلى القيمة 99 fooWhile++; } حلقة Do.. While التكرارية int fooDoWhile = 0; do { الحلقة معدّة للتكرار مئة مرة، من القيمة 0 إلى القيمة 99 Start iteration 100 times, fooDoWhile 0->99 if (false) continue; // تجاوز التكريرة الحالية fooDoWhile++; if (fooDoWhile == 50) break; // توقيف الحلقة تماما، والخروج منها } while (fooDoWhile < 100); حلقة for التكرارية ذات الصيغة: (<for(<start_statement>; <conditional>; <step for (int fooFor = 0; fooFor < 10; fooFor++) { // تتكرّر الحلقة عشر مرات، من القيمة 0 إلى القيمة 9 } حلقة For Each يمكن استخدام حلقة التكرار foreach للمرور عبر أي كائن Object يُنفّذ الصنف IEnumerable أو <IEnumerable<T تنفّذ جميع الأنواع التجميعية (المصفوفات، القوائم، القواميس…) في إطار العمل .Net واجهة أو أكثر من الأصناف المذكورة (يمكن حذف ()ToCharArray من التعليمة أدناه، لأن String تنفّذ الواجهة IEnumerable) foreach (char character in "Hello World".ToCharArray()) { // تمرّ على جميع المحارف في السلسلة } تعليمة Switch تعمل Switch مع أنواع البيانات byte, short, char, وint تعمل كذلك مع أنواع البيانات Enum (نتعرّض لها أدناه)، الصنف String وبضعة أصناف خاصّة تغلّف أنواع بيانات أساسية: Character,Byte,Short, و Integer. int month = 3; string monthString; switch (month) { case 1: monthString = "January"; break; case 2: monthString = "February"; break; case 3: monthString = "March"; break; يمكن تنفيذ أكثر من إجراء في كل حالة case، إلا أنه لا يمكن إضافة إجراء ضمن حالة دون إضافة تعليمة توقيف break; قبل الحالة الموالية (إن أردت فعل هذا الأمر، فستحتاج لإضافة تعليمة goto case x بعد الإجراء) case 6: case 7: case 8: monthString = "Summer time!!"; break; default: monthString = "Some other month"; break; } التحويل بين أنواع البيانات وجبْر الأنواع Typecasting تحويل البيانات تحويل سلسلة محارف String إلى عدد Integer سيظهر استثناء Exception في حالة إخفاق عملية التحويل int.Parse("123");// نحصُل على النسخة العددية من سلسلة المحارف "123" عند استخدام الدالة TryParse لتحويل نوع البيانات فإن قيمة التحويل ستكون القيمة المبدئية لنوع البيانات وفي حالة الأعداد فإن القيمة المبدئية هي 0 int tryInt; if (int.TryParse("123", out tryInt)) // ترجع الدالة قيمة منطقية Console.WriteLine(tryInt); // 123 تحويل الأعداد إلى سلاسل محارف String يتضمّن الصنف Convert عددا من التوابع Methods لتسهيل التحويل Convert.ToString(123); أو tryInt.ToString(); جبر أنواع البيانات جبر العدد العشري 15 للحصول على قيمة من النوع int ثم جبر القيمة المُتحصَّل عليها ضمنيا لنحصُل على النوع long long x = (int) 15M; } الأصناف راجع التعريفات في آخر الملف public static void Classes() { انظر تعريف الكائنات في آخر الملف استخدم الكلمة المفتاحية new لاستهلال صنف Bicycle trek = new Bicycle(); استدعاء توابع الكائن trek.SpeedUp(3); // يجب دائما المرور عبر المعدّلات والمسترجعات Setter and getter methods trek.Cadence = 100; يُستخدم التابع ToString لعرض قيمة الكائن Console.WriteLine("trek info: " + trek.ToString()); استهلال كائن جديد من الصنف PennyFarthing PennyFarthing funbike = new PennyFarthing(1, 10); Console.WriteLine("funbike info: " + funbike.ToString()); Console.Read(); } // نهاية التابع الرئيس Main method مَدخل الكونسول Console entry. التطبيقات التي تعمل عبر الطرفية يجب أن يكون لديها مدخل عبارة عن تابع رئيس public static void Main(string[] args) { OtherInterestingFeatures(); } ميزات مثيرة للاهتمام التوقيعات المبدئية للتوابع public // مجال الرؤية static // يسمح بالاستدعاء المباشر من الصنف دون المرور بكائنات int // نوع البيانات المُرجَعة, MethodSignatures( int maxCount, // المتغيّر الأول عددي int count = 0, // القيمة المبدئية هي 0، تُستخدَم إن لم يُمرَّر متغير إلى التابع int another = 3, params string[] otherParams // يستقبل بقية المتغيّرات المُمررة إلى التابع جميعا ) { return -1; } يمكن أن تكون أسماء التوابع متطابقة، ما دامت التوقيعات مختلفة وكل تابع لا يختلف عن آخر سوى في نوع البيانات المُرجَع ليس وحيدا public static void MethodSignatures( ref int maxCount, // تمرير المعاملات حسب المرجع، وليس القيمة out int count) { المعامل المُمرر في المتغيّر count سيحوي القيمة 15 خارج هذه الدالة count = 15; // معامل الخروج out يجب أن يُسنَد قبل الانتهاء من التابع } أنواع البيانات العميمة Generics الأصناف TKey وTValue يحدّدها المستخدم الذي يستدعي هذه الدالة ويحاكي هذا التابع عمل SetDefault في بايثون public static TValue SetDefault<TKey, TValue>( IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultItem) { TValue result; if (!dictionary.TryGetValue(key, out result)) return dictionary[key] = defaultItem; return result; } يمكنك تقييد الكائنات التي يمكن تمريرها إلى الدالة public static void IterateAndPrint<T>(T toPrint) where T: IEnumerable<int> { بما أن الصنف T ينفّذ IEnumerable فإنه يمكننا المرور على عناصره باستخدام foreach foreach (var item in toPrint) // العنصر هو من النوع int Console.WriteLine(item.ToString()); } الكلمة المفتاحية “yield” يدلّ استخدام yield أن التابع الذي تظهر فيه هذه الكلمة المفتاحية لديه خاصيّة التكرار (أي أنه يمكن استخدام التابع مع الحلقة foreach) public static IEnumerable<int> YieldCounter(int limit = 10) { for (var i = 0; i < limit; i++) yield return i; } نستطيع استدعاء التابع أعلاه على النحو التالي public static void PrintYieldCounterToConsole() { foreach (var counter in YieldCounter()) Console.WriteLine(counter); } يمكن استخدام yield return أكثر من مرّة في نفس التابع public static IEnumerable<int> ManyYieldCounter() { yield return 0; yield return 1; yield return 2; yield return 3; } كما يمكنك استخدام “yield break” لتوقيف التكرار التابع التالي يُرجِع نصف القيم الموجودة بين 0 وlimit public static IEnumerable<int> YieldCounterWithBreak(int limit = 10) { for (var i = 0; i < limit; i++) { if (i > limit/2) yield break; yield return i; } } public static void OtherInterestingFeatures() { المعاملات الاختيارية MethodSignatures(3, 1, 3, "Some", "Extra", "Strings"); MethodSignatures(3, another: 3); // تعيين قيمة المعامل مباشرة، مع تجاوز المعاملات الاختيارية تمرير المعاملات بالمرجع By reference، والقيمة المُرجعة Out parameter BY REF AND OUT PARAMETERS int maxCount = 0, count; // المعاملات المُمررة بالمرجع يجب أن تحوي قيمة MethodSignatures(ref maxCount, out count); توابع التمديد Extension methods int i = 3; i.Print(); // مُعرَّفة أدناه الأنواع التي تقبل قيمة فارغة Nullable types، مناسبة للتخاطب مع قواعد البيانات والقيم المُرجَعة وأي نوع بيانات قيمي (أي ليس صنفا) يمكن جعله يقبل قيما فارغة بكتابة ? بعده <type>? <var name> = <value> int? nullable = null; // اختصار لـ Nullable<int> Console.WriteLine("Nullable variable: " + nullable); bool hasValue = nullable.HasValue; // قيمة منطقية صحيحة true إن لم يكن يساوي null علامتا الاستفهام المتلاصقتان ?? هما اختصار لتحدد قيمة مبدئية في حال كان المتغيّر فارغا نعطيه 0 قيمة مبدئية int notNullable = nullable ?? 0; // 0 ?. هذه العلامة عي عامل للتحقّق من القيمة الفارغة null nullable?.Print(); // استخدم تابع التمديد Print() إذا كان المتغيّر nullable مختلفا عن null المتغيّرات ضمنية النوع - يمكنك ترك المُصرّف Compiler يحدّد نوع المتغيّر: var magic = "magic is a string, at compile time, so you still get type safety"; ;magic = 9 لن تُسنَد القيمة 9 إلى المتغيّر magic لأنه يحوي سلسلة محارف الأنواع العميمة var phonebook = new Dictionary<string, string>() { {"Sarah", "212 555 5555"} // إضافة عنوان إلى دفتر العناوين }; استدعاء الدالة SetDefault المُعرَّفة أعلاه Console.WriteLine(SetDefault<string,string>(phonebook, "Shaun", "No Phone")); // No Phone يمكنك عدم تحديد TKey و TValue بما أنه يمكن استنتاجهما تلقائيا Console.WriteLine(SetDefault(phonebook, "Sarah", "No Phone")); // 212 555 5555 الدوال مجهولة الاسم Lambda expressions - تتيح كتابة شفرات على نفس السطر Func<int, int> square = (x) => x * x; // آخر عنصر من T هو القيمة المُرجعة Console.WriteLine(square(3)); // 9 التعامل مع الأخطاء try { var funBike = PennyFarthing.CreateWithGears(6); لن تُنفَّذ لأن CreateWithGears تتسبّب في استثناء Exception 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 تُنفّذ بعد } إدارة الموارد يمكنك إدارة الموارد المتوفّرة بسهولة حيث تنفّذ أغلب الكائنات التي تستعمل الموارد غير المستغلة (الملفات، سياق الأجهزة الطرفية، …إلخ) تُنفّذ الواجهة IDisposable تتولّى التعليمة using التخلّص من كائنات IDisposable using (StreamWriter writer = new StreamWriter("log.txt")) { writer.WriteLine("Nothing suspicious here"); } يُتخلَّص من جميع الموارد بعد الانتهاء من تنفيذ هذه الشفرة حتى ولو تسبّبت في استثناء البرمجة المتوازية var words = new List<string> {"dog", "cat", "horse", "pony"}; Parallel.ForEach(words, new ParallelOptions() { MaxDegreeOfParallelism = 4 }, word => { Console.WriteLine(word); } ); تشغيل هذه الشفرة سينتُج عنه مُخرجات متعدّدة لأن كلّ تشعّب thread يُكمل في وقت مختلف عن الآخر. أدناه أمثلة على المُخرجات cat dog horse pony dog horse pony cat الكائنات الديناميكية (رائعة للعمل مع لغات برمجة أخرى) dynamic student = new ExpandoObject(); student.FirstName = "First Name"; لا تحتاج لتعريف صنف أولا بل إنه يمكنك إضافة توابع (يُرجع التابع أدناه سلسلة محارف ويتلقّى سلسلة محارف) student.Introduce = new Func<string, string>( (introduceTo) => string.Format("Hey {0}, this is {1}", student.FirstName, introduceTo)); Console.WriteLine(student.Introduce("Beth")); تنفّذ أغلب التجميعات Collections الواجهة <IQUERYABLE<T التي توفّر الكثير من التوابع المفيدة var bikes = new List<Bicycle>(); // دراجات هوائية bikes.Sort(); // يرتّب القائمة bikes.Sort((b1, b2) => b1.Wheels.CompareTo(b2.Wheels)); // يرتّب القائمة بناءً على عدد العجلات var result = bikes .Where(b => b.Wheels > 3) // الترشيج والفلترة .Where(b => b.IsBroken && b.HasTassles) .Select(b => b.ToString()); // var sum = bikes.Sum(b => b.Wheels); يجمع عدد العجلات في كامل القائمة وينشئ قائمة من الكائنات الضمنية Implicit objects بالاعتماد على بعض خواص الدراجة الهوائية var bikeSummaries = bikes.Select(b=>new { Name = b.Name, IsAwesome = !b.IsBroken && b.HasTassles }); من الصعب توضيح الأمر هنا، إلا أنك تحصُل على نوع البيانات قبل الانتهاء من التعليمات، إذ أن المصرّف يمكنه العمل ضمنا على الأنواع أعلاه foreach (var bikeSummary in bikeSummaries.Where(b => b.IsAwesome)) Console.WriteLine(bikeSummary.Name); التوازي مع ASPARALLEL نخلط عمليّات LINQ والعمليّات المتوازية var threeWheelers = bikes.AsParallel().Where(b => b.Wheels == 3).Select(b => b.Name); سيحدث الأمر بالتوازي. تُنشَأ التشعبات تلقائيا وستُقسَّم النتائج بينها طريقة رائعة للعمل مع مجموعة بيانات ضخمة إن كانت لديك الكثير من الأنوية Cores LINQ تربط بين مخزن بيانات وكائنات من الصنف <IQueryable<T مثلا: LinqToSql تربط الكائنات مع قاعدة بيانات، LinqToXml تربط الكائنات مع مستند XML var db = new BikeRepository(); يؤجَّل التنفيذ، وهو أمر جيّد عند التعامل مع قواعد البيانات var filter = db.Bikes.Where(b => b.HasTassles); // no query run if (42 > 6) // يمكنك الاستمرار في إضافة المرشحات، حتى تلك المشروطة؛ مناسبة لميزة "البحث المتقدّم" filter = filter.Where(b => b.IsBroken); // no query run var query = filter .OrderBy(b => b.Wheels) .ThenBy(b => b.Name) .Select(b => b.Name); // still no query run يعمل الاستعلام الآن، إلا أنك لا تحصُل على نتائج الاستعلام إلا عند المرور عليها foreach (string bike in query) Console.WriteLine(result); } } // نهاية الصنف LearnCSharp يمكنك إضافة أصناف أخرى في ملف cs. public static class Extensions { توابع الصنف Extensions public static void Print(this object obj) { Console.WriteLine(obj.ToString()); } } التفويض والأحداث public class DelegateTest { public static int count = 0; public static int Increment() { // زيادة العدّاد ثم إرجاع النتيجة return ++count; } التفويض delegate هو مرجع لتابع لجعل مرجع على التابع Increment نبدأ بتعريف تفويض بنفس التوقيع أي أنه لا يأخذ أية معطيات ويُرجع عددا من النوع int public delegate int IncrementDelegate(); يمكن أيضا استخدام حدث Event لتحريك التفويض أنشئ حدثا بنوع التفويض public static event IncrementDelegate MyEvent; static void Main(string[] args) { نحيل إلى التابع Increment باستهلال التفويض وتمرير معطى هو التابع نفسه IncrementDelegate inc = new IncrementDelegate(Increment); Console.WriteLine(inc()); // => 1 يمكن تركيب التفويضات بالعامل + IncrementDelegate composedInc = inc; composedInc += inc; composedInc += inc; سينفّذ التفويض composedInc التابع Increment ثلاث مرات Console.WriteLine(composedInc()); // => 4 الاشتراك في الحدث باستخدام التفويض MyEvent += new IncrementDelegate(Increment); MyEvent += new IncrementDelegate(Increment); تحريك الحدث، أي تنفيذ كل التفويضات المشترِكة في هذا الحدث Console.WriteLine(MyEvent()); // => 6 } } صيغة تعريف صنف: <public/private/protected/internal> class <class name>{` // حقول البيانات، المشيّدات، الدوالّ.. كلّها في الداخل //تُستدعى الدوال بنفس طريقة استدعاء التوابع في جافا } 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; } للخاصيّات صياغة استثنائية عندما نريد خاصية متاحة للقراءة فقط بمعنى أنها تعيد فقط نتيجة عبارة public string LongName => Name + " " + _speed + " speed"; النوع enum هو نوع بيانات قيمية يتمثّل في مجموعة من المتغيّرات ثابتة القيمة هذا النوع هو في الواقع مجرّد ربط اسم بقيمة (عددية، إن لم يحدد نوع آخر) أنواع البيانات الموثوقة في قيم الثوابت هي byte, sbyte, short, ushort, int, uint, long, و ulong ولا يمكن أن توجد نفس القيمة مرتين في متغيّر من النوع enum public enum BikeBrand { AIST, BMC, Electra = 42, // مباشرة enum يمكن تعيين قيمة المتغيّر في Gitane // 43 } عرّفنا هذا النوع داخل الصنف Bicycle لذا فهو نوع داخلي وعندما نريد استخدامه خارج الصنف فسيتوجّب أن نكتُب Bicycle.Brand public BikeBrand Brand; بعد تعريف نوع enum يصبح بإمكاننا تعريف متغيّر من هذا النوع تستطيع التعليم على وجود قيم عدّة يمكن الاختيار بينها بإضافة الصنف FlagsAttribute قبل تعريف النوع enum يمكن استخدام أي صنف متفرّع عن الصنف Attribute لتعليم أنواع البيانات، التوابع والمعاملات…إلخ يمكن استخدام العوامل المنطقية & و | لإجراء عمليّات منطقية داخل القيمة [Flags] public enum BikeAccessories { None = 0, Bell = 1, MudGuards = 2, // نحتاج لتعيين القيم يدويا Racks = 4, Lights = 8, FullPackage = Bell | MudGuards | Racks | Lights } الاستخدام: aBike.Accessories.HasFlag(Bicycle.BikeAccessories.Bell) في الإصدارات السابقة على الإصدار الرابع من إطار العمل NET (aBike.Accessories & Bicycle.BikeAccessories.Bell) == Bicycle.BikeAccessories.Bell public BikeAccessories Accessories { get; set; } تنتمي الخاصيّات المُعلمة بالكلمة المفتاحية static للصنف نفسه، وليس لكائن عكس بقية الخاصيّات يمكن الوصول إلى هذه الخاصيّات دون الرجوع إلى كائن محدّد ;Console.WriteLine("Bicycles created: " + Bicycle.bicyclesCreated) public static int BicyclesCreated { get; set; } عيّن القيم غير القابلة للتعديل أثناء التشغيل ولا يمكن إسناده إلا عند تعريفها أو داخل مشيّد readonly bool _hasCardsInSpokes = false; // خاصيّة خاصّة وللقراءة فقط المشيّدات Constructors هي طريقة لإنشاء الأصناف أدناه المشيّد المبدئي public Bicycle() { this.Gear = 1; // يمكن الوصول إلى خاصيّات الصنف بالكلمة المفتاحية this Cadence = 50; // إلا أنك لا تحتاجها في كل الحالات _speed = 5; Name = "Bontrager"; Brand = BikeBrand.AIST; BicyclesCreated++; } هذا مشيّد مُعيّن (يحوي معطيات) 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; } يمكن وضع المشيّدات بالتسلسل public Bicycle(int startCadence, int startSpeed, BikeBrand brand) : this(startCadence, startSpeed, 0, "big wheels", true, brand) { } صيغة كتابة الدوال (<public/private/protected> <return type> <function name> <args>) يمكن للأصناف أن تعيّن مسترجعات ومعدّلات لحقولها كما يمكنها تنفيذ الخاصيّات عبر دوال (وهي الطريقة المفضّلة في Csharp) ويمكن لمعاملات التابع أن تحوي قيما مبدئية، في هذه الحالة، يمكن استدعاء التوابع بدون تمرير معطيات عن هذه العوامل public void SpeedUp(int increment = 1) { _speed += increment; } public void SlowDown(int decrement = 1) { _speed -= decrement; } تعيّن الخاصيّات القيم وتسترجعها. إن كان غرضك الوصول إلى البيانات فقط دون تعديلها فالخاصيّات أنسب. يمكن أن يكون للخاصيّة مسترجع أو معدّل أو كلاهما private bool _hasTassles; // متغيّر خاص public bool HasTassles // مسترجع عام { get { return _hasTassles; } set { _hasTassles = value; } } كما يمكنك تعريف خاصيّة تلقائية في سطر واحد ستُنشئ هذه الصيغة حقلا داعما تلقائيا يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل أو كليهما public bool IsBroken { get; private set; } يمكن للخاصيّات أن تكون تلقائية التنفيذ public int FrameSize { get; // يمكنك الحد من مجال الرؤية على المسترجع أو المعدّل //Framesize يمكنه استدعاء معدّل Bicycle يعني هذا أن الصنف private set; } يمكن تعريف فهرس على الكائنات يمكنك مثلا كتابة bicycle[0] التي ترجع القيمة “chris” للحصول على أول راكب أو كتابة “bicycle[1] = "lisa لتعيين الراكب الثاني (دراجة رباعية المقاعد!) private string[] passengers = { "chris", "phil", "darren", "regina" }; public string this[int i] { get { return passengers[i]; } set { passengers[i] = value; } } تابع لعرض قيم حقول الكائن public virtual string Info() { return "Gear: " + Gear + " Cadence: " + Cadence + " Speed: " + _speed + " Name: " + Name + " Cards in Spokes: " + (_hasCardsInSpokes ? "yes" : "no") + "\n------------------------------\n" ; } يمكن للتوابع أن تكون ثابتة (الكلمة المفتاحية static). مناسبة للدوال المساعدة public static bool DidWeCreateEnoughBicycles() { داخل التابع الثابت لا يمكن إجراء عمليات سوى على الحقول الثابتة return BicyclesCreated > 9000; } إن كان الصنف لا يحتاج إلا إلى حقول ثابتة فربما يكون من الأفضل أن يكون الصنف نفسه ثابتا } // نهاية الصنف Bicycle PennyFarthing هو صنف متفرّع من الصنف Bicycle class PennyFarthing : Bicycle { (يمثّل هذا الصنف تلك الدراجات الهوائية التي لديها عجلة أمامية كبيرة جدا، وليست لديها مسنّنات Gears لتعديل السرعة) . نستدعي مشيّد الصنف الأب 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; } } تحتوي الواجهات على التوقيعات فقط interface IJumpable { void Jump(int meters); // جميع الأعضاء في الواجهة هي مبدئيا عمومية } interface IBreakable { bool Broken { get; } // يمكن للواجهات أن تحوي خاصيّات كما يمكنها أن تتضمّن واجهات وأحداثا } يمكن للأصناف أن ترث Inherit من صنف واحد آخر على الأكثر، إلا أنه يمكنها تنفيذ أي عدد من الواجهات ويجب أن يكون الصنف الأب الأول في لائحة الأصناف تليه الواجهات كلّها class MountainBike : Bicycle, IJumpable, IBreakable { int damage = 0; public void Jump(int meters) { damage += meters; } public bool Broken { get { return damage > 100; } } } صنف للاتصال بقاعدة البيانات، نستخدمه مثالا لعمل LinqToSql يعمل إطار العمل EntityFramework Code First لربط الكائنات بسجلات جداول البيانات (بنفس طريقة ActiveRecord في روبي، إلا أنه ثنائي الاتجاه) public class BikeRepository : DbContext { public BikeRepository() : base() { } public DbSet<Bicycle> Bikes { get; set; } } يمكن تقسيم الأصناف على ملفات cs. عدّة A1.cs public partial class A { public static void A1() { Console.WriteLine("Method A1 in class A"); } } A2.cs public partial class A { public static void A2() { Console.WriteLine("Method A2 in class A"); } } يستخدم الصنف Program أدناه الصنف A المُقسّم على ملفي cs. Program using the partial class "A" public class Program { static void Main() { A.A1(); A.A2(); } } يمكن الإداراج في سلاسل المحارف String interpolation بكتابة $ أمام السلسلة ثم إحاطة المتغيّر المُدرج بقوسين معكوفين { }. يمكنك أيضا تجميع السلسلتين، الأصلية والمُعدّلة، بالعلامة @ 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([email protected]"C:\Users\{username}\Desktop"); } } ميزات جديدة في الإصدار C# 6 class GlassBall : IJumpable, IBreakable { تمهيد الخاصيّات التلقائية public int Damage { get; private set; } = 0; تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات public string Name { get; } = "Glass ball"; تمهيد الخاصيّات التلقائية المقتصرة على المسترجعات في المشيّد public string GenieName { get; } public GlassBall(string genieName = null) { GenieName = genieName; } public void Jump(int meters) { if (meters < 0) العبارة nameof() مستحدثة وينتُج عنها التحقّق من وجود المعرّف "nameof(x) == "x تحول على سبيل المثال دون بقاء أسماء المتغيّرات القديمة في رسائل الخطأ بعد تحديثها throw new ArgumentException("Cannot jump negative amount!", nameof(meters)); Damage += meters; } الخاصيّات المعرَّفة ضمن هيكل العبارة public bool Broken => Damage > 100; نفس الشيء بالنسبة للتوابع public override string ToString() // سلسلة محارف تُدرج ضمنها متغيّرات => $"{Name}. Damage taken: {Damage}"; public string SummonGenie() العوامل المشترطة بالقيمة الفارغة null ترجع العبارة x?.y القيمة null بمجرد كون x مساوية ل null، بدون تقييم y => GenieName?.ToUpper(); } static class MagicService { private static bool LogException(Exception ex) { /* سجّل الاستثناءات في مكان ما */ log exception somewhere */ return false; } public static bool CastSpell(string spell) { try { // API نفترض هنا أننا نستدعي واجهة تطبيقات برمجية throw new MagicServiceException("Spell failed", 42); // نجح الاستدعاء return true; } يلتقط استثناء في حالة إخفاق استدعاء واجهة التطبيقات، أي أن قيمة Code تساوي 42 Only catch if Code is 42 i.e. spell failed catch(MagicServiceException ex) when (ex.Code == 42) { // أخفق الاستدعاء return false; } استثماءات أخرى أو الاستثناء MagicServiceException عندما تكون قيمة المتغير Code مختلفة عن 42 catch(Exception ex) when (LogException(ex)) { // لا يصل التنفيذ إلى هذه الكتلة } return false; } لاحظ أن التقاط الاستثناء MagicServiceException وإعادة إطلاقه عندما يكون المتغير Code لا يساوي القيمة 42 أو 117 هو أمر مختلف، إذ أن كتلة catch-all الأخيرة لن تلتقط الاستثناء المُعاد public class MagicServiceException : Exception { public int Code { get; } public MagicServiceException(string message, int code) : base(message) { Code = code; } } الخاصية Obsolete public static class PragmaWarning { [Obsolete("Use NewMethod instead", false)] public static void ObsoleteMethod() { /*شفرة برمجية قديمة هنا */ } public static void NewMethod() { /* شفرة برمجية جديدة */ } public static void Main() { ObsoleteMethod(); تحذير يظهر عند استخدام شفرة برمجية قديمة، ناتج عن الوسم Obsolete أعلاه CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead' تعطّل التعليمة التالية إظهار التحذير السابق #pragma warning disable CS0618 ObsoleteMethod(); // لا تحذير #pragma warning restore CS0618 ObsoleteMethod(); // CS0618: 'ObsoleteMethod is obsolete: Use NewMethod instead' } } } // نهاية فضاء الأسماء using System; ميزة في C# 6: إمكانية استخدام static مع using 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)); } } } ميزة جديدة في C# 7 ثبّت آخر إصدار من Microsoft.Net.Compilers باستخدام Nuget ثبّت آخر إصدار من System.ValueTuple باستخدام Nuget using System; namespace Csharp7 { الأزواج المرتبة Tuples، التفكيك DECONSTRUCTION والإلغاءات Discards class TuplesTest { public (string, string) GetName() { // Item1، Item2 .... تُسمى الحقول في الأزواج المرتبة مبدئيا بـ var names1 = ("Peter", "Parker"); Console.WriteLine(names1.Item2); // => Parker يمكن تخصيص أسماء الحقول تعريف النوع الأول (string FirstName, string LastName) names2 = ("Peter", "Parker"); تعريف النوع الثاني var names3 = (First:"Peter", Last:"Parker"); Console.WriteLine(names2.FirstName); // => Peter Console.WriteLine(names3.Last); // => Parker return names3; } public string GetLastName() { var fullName = GetName(); يمكن تفكيك الأزواج المرتبة (string firstName, string lastName) = fullName; يمكن إلغاء حقول من الزوج المرتب بعد تفكيكه بالعلامة _ Fields in a deconstructed tuple can be discarded by using _ var (_, last) = fullName; return last; } يمكن تفكيك أي نوع بيانات على نفس المنوال باستخدام التابع Deconstruct 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}"); // => num1: 4, num2: 10 Console.WriteLine(tt.GetLastName()); } } مطابقة الأنماط Pattern matching 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); } } } الإحالة إلى الموارد المحلية Reference locals تعطيك إمكانية إرجاع مرجع Reference كائن بدلا من قيمته class RefLocalsTest { لاحظ الكلمة المفتاحية ref في تعليمة الإرجاع return public static ref string FindItem(string[] arr, string el) { for(int i=0; i<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]); // => apple } } الدوال المحليّة Local functions class LocalFunctionTest { private static int _id = 0; public int id; public LocalFunctionTest() { id = generateId(); لا يمكن الوصول إلى الدالة المحلية خارج هذا المجال int generateId() { return _id++; } } public static void AnotherMethod() { var lf1 = new LocalFunctionTest(); var lf2 = new LocalFunctionTest(); Console.WriteLine($"{lf1.id}, {lf2.id}"); // => 0, 1 int id = generateId(); // خطأ // error CS0103: The name 'generateId' does not exist in the current context } } } ترجمة -وبتصرّف- للمقال Learn C# in Y Minutes1 نقطة