تمرين - استكشاف Clear() وتغيير الحجم()
- 15 دقائق
بينما تستمر في تطوير متعقب منصة منصة لشركة الخدمات اللوجستية، من المحتمل أنك تحتاج إلى تتبع المنصات الجديدة وإزالة المنصات القديمة من نظام التعقب. لذلك، كيف يمكنك إنشاء وظيفة تعقب تسمح بإضافة المنصات وإزالتها؟
استخدام أساليب الصفيف لمسح صفيف وتغيير حجمه.
Array.Clear() تمكنك الطريقة من إزالة محتويات عناصر معينة في الصفيف الخاص بك، واستبدالها بالقيمة الافتراضية للصفيف. على سبيل المثال، إذا قمت بمسح عنصر في string صفيف، يتم استبدال القيمة التي تم مسحها ب null. وبالمثل، عند مسح عنصر في int صفيف، يكون الاستبدال هو 0 (صفر).
Array.Resize() من ناحية أخرى، يسمح لك الأسلوب بإضافة عناصر أو إزالتها من الصفيف الخاص بك.
احذف عامل تشغيل
//تعليق السطر أو استخدمه للتعليق على جميع التعليمات البرمجية من التدريبات السابقة.تحديث التعليمات البرمجية الخاصة بك في محرر التعليمات البرمجية Visual Studio كما يلي:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }إشعار
يستخدم هذا المثال بناء جملة تعبير المجموعة، المقدمة في C# 12.
خذ دقيقة للتركيز على سطر التعليمات البرمجية
Array.Clear(pallets, 0, 2);.هنا تستخدم
Array.Clear()الأسلوب لمسح القيم المخزنة في عناصر الصفيف بدءا منpalletsعناصر الفهرس0والمسح2.في قائمة Visual Studio Code File ، حدد Save.
يجب حفظ ملف Program.cs قبل إنشاء التعليمات البرمجية أو تشغيلها.
في لوحة EXPLORER، لفتح Terminal في موقع مجلد TestProject، انقر بزر الماوس الأيمن فوق TestProject، ثم حدد Open in Integrated Terminal.
يجب فتح لوحة Terminal، ويجب أن تتضمن موجه أوامر يظهر أن Terminal مفتوحة لموقع مجلد TestProject.
في موجه الأوامر Terminal، لتشغيل التعليمات البرمجية، اكتب dotnet run ثم اضغط على Enter.
إشعار
إذا رأيت رسالة تقول "تعذر العثور على مشروع لتشغيله"، فتأكد من أن موجه الأوامر Terminal يعرض موقع مجلد TestProject المتوقع. على سبيل المثال:
C:\Users\someuser\Desktop\csharpprojects\TestProject>عند تشغيل التعليمات البرمجية، ترى أنه يتم مسح القيم المخزنة في العنصرين الأولين من الصفيف. في الخاصية
Lengthوالع العبارةforeach، لا تزال العناصر موجودة، ولكنها الآن فارغة.Clearing 2 ... count: 4 -- -- -- B12 -- A13
سلسلة فارغة مقابل أخرى خالية.
عند الاستخدام Array.Clear()، لم تعد العناصر التي تم إلغاء تحديدها تشير إلى سلسلة في الذاكرة. في الواقع، يشير العنصر إلى لا شيء على الإطلاق. إن الإشارة إلى لا شيء مفهوم مهم يمكن أن يكون من الصعب فهمه في البداية.
ماذا لو حاولت استرداد قيمة عنصر متأثر بالأسلوب Array.Clear() ، هل يمكنك القيام بذلك؟
الوصول إلى قيمة عنصر مسح
هناك حاجة إلى نهجين لتحديد قيمة عنصر مسح لمعرفة كيفية عمل المحول البرمجي C# بقيمة خالية.
إدراج أسطر تعليمات برمجية جديدة حول سطر التعليمات البرمجية
Array.Clear(pallets, 0, 2);كما يلي:Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}");تحقق من أن التعليمات البرمجية الخاصة بك يجب أن تتطابق مع قائمة التعليمات البرمجية التالية:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0]}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0]}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك.
ينبغي أن تشاهد المخرج التالي:
Before: B14 After: Clearing 2 ... count: 4 -- -- -- B12 -- A13
إذا كنت تركز على سطر الإخراج After: ، فقد تعتقد أن القيمة المخزنة في pallets[0] سلسلة فارغة. ومع ذلك، يقوم المحول البرمجي C# ضمنيًا بتحويل القيمة الخالية إلى سلسلة فارغة للعرض التقديمي.
استدعاء أسلوب مساعد سلسلة على عنصر مسح
لإثبات أن القيمة المخزنة في pallets[0] بعد مسحها فارغة، ستقوم بتعديل مثال التعليمات البرمجية ToLower() لاستدعاء الأسلوب على pallets[0]. إذا كانت سلسلة، فإنه ينبغي أن تعمل بشكل جيد. ولكن إذا كانت خالية، فإنه يجب أن يتسبب الرمز في طرح استثناء.
لاستدعاء الأسلوب في
ToLower()كل مرة تحاول فيها الكتابةpallets[0]إلى وحدة التحكم، قم بتحديث التعليمات البرمجية الخاصة بك كما يلي:Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}");تأكد من أن التعليمات البرمجية تطابق سرد التعليمات البرمجية التالية:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Console.WriteLine($"Before: {pallets[0].ToLower()}"); Array.Clear(pallets, 0, 2); Console.WriteLine($"After: {pallets[0].ToLower()}"); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك. هذه المرة، عند تشغيل التعليمات البرمجية، سترى رسالة خطأ كبيرة. إذا قمت بتحليل النص، فسترى الرسالة التالية:
System.NullReferenceException: Object reference not set to an instance of an object.يتم طرح هذا الاستثناء لأن محاولة استدعاء الأسلوب على محتويات
pallets[0]العنصر تحدث قبل أن يكون لدى المحول البرمجي C# فرصة لتحويل قيمة خالية ضمنيا إلى سلسلة فارغة.الأخلاقية للقصة هي أن
Array.Clear()يزيل مرجع عنصر صفيف إلى قيمة إذا كان موجودا. لإصلاح ذلك، قد تتحقق من قيمة فارغة قبل محاولة طباعة القيمة.لتجنب الخطأ، أضف عبارة
ifقبل الوصول إلى عنصر صفيف يحتمل أن يكون فارغا.
if (pallets[0] != null)
Console.WriteLine($"After: {pallets[0].ToLower()}");
تغيير حجم الصفيف لإضافة المزيد من العناصر
بعد ذلك، أعد صياغة سرد التعليمات البرمجية من الخطوة 1 لتضمين التعليمات البرمجية لتغيير حجم الصفيف. عند الاستكمال، يجب أن يتطابق رمزك مع قائمة الرمز التالي:
string[] pallets = ["B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }خذ بضع دقائق للتركيز على السطر
Array.Resize(ref pallets, 6);.هنا، تقوم باستدعاء الأسلوب الذي
Resize()يمر فيpalletsالصفيف حسب المرجع، باستخدامrefالكلمة الأساسية . في بعض الحالات، تتطلب الطرق منك تمرير الوسيطات حسب القيمة (الافتراضية) أو حسب المرجع (باستخدام الكلمة الأساسية المرجعية). تتطلب أسباب ضرورة ذلك شرحا طويلا ومعقدا حول كيفية إدارة الكائنات في .NET. وللأسف، يتجاوز ذلك نطاق هذه الوحدة. عند الشك، يوصى بالنظر إلى Intellisense أو Microsoft Docs للحصول على أمثلة حول كيفية استدعاء أسلوب معين بشكل صحيح.في هذه الحالة، تقوم بإعادة تغيير حجم
palletsالصفيف من أربعة عناصر إلى6. تتم إضافة العناصر الجديدة في نهاية العناصر الحالية. العنصران الجديدان خاليان حتى تقوم بتعيين قيمة لهما.احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك. عند تشغيل التعليمة البرمجية، يجب أن ترى الإخراج التالي.
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02
تغيير حجم الصفيف لإزالة العناصر
وعلى العكس من ذلك، يمكنك إزالة عناصر الصفيف باستخدام Array.Resize().
تحديث التعليمات البرمجية الخاصة بك في محرر التعليمات البرمجية Visual Studio كما يلي:
string[] pallets = [ "B14", "A11", "B12", "A13" ]; Console.WriteLine(""); Array.Clear(pallets, 0, 2); Console.WriteLine($"Clearing 2 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 6); Console.WriteLine($"Resizing 6 ... count: {pallets.Length}"); pallets[4] = "C01"; pallets[5] = "C02"; foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); } Console.WriteLine(""); Array.Resize(ref pallets, 3); Console.WriteLine($"Resizing 3 ... count: {pallets.Length}"); foreach (var pallet in pallets) { Console.WriteLine($"-- {pallet}"); }احفظ ملف التعليمات البرمجية، ثم استخدم Visual Studio Code لتشغيل التعليمات البرمجية الخاصة بك. عند تشغيل التعليمات البرمجية، يجب أن تشاهد الإخراج التالي:
Clearing 2 ... count: 4 -- -- -- B12 -- A13 Resizing 6 ... count: 6 -- -- -- B12 -- A13 -- C01 -- C02 Resizing 3 ... count: 3 -- -- -- B12لاحظ أنه لم يزيل الاستدعاء
Array.Resize()أول عنصرين خاليين. بدلا من ذلك، أزال العناصر الثلاثة الأخيرة. وبشكل ملحوظ، تمت إزالة العناصر الثلاثة الأخيرة على الرغم من احتوائها على قيم سلسلة.
هل يمكنك إزالة عناصر فارغة من صفيف؟
Array.Resize() إذا لم يزيل الأسلوب العناصر الفارغة من صفيف، فهل هناك أسلوب مساعد آخر يقوم بالمهمة تلقائيا؟ لا. أفضل طريقة لإفراغ العناصر من صفيف هي حساب عدد العناصر غير الفارغة عن طريق التكرار من خلال كل عنصر وتكبير متغير (عداد). بعد ذلك، قد تقوم بـ «إنشاء صفيف ثانٍ» وهو حجم متغير العداد. وأخيرًا، يمكنك القيام بـ «التكرار الحلقي» خلال كل عنصر في الصفيف الأصلي ثم «نسخ القيم غير الخالية إلى الصفيف الجديد».
خلاصة
فيما يلي بعض الأفكار المهمة التي قمت بتغطيتها في هذه الوحدة:
- استخدم
Clear()الأسلوب لـ «إفراغ القيم من العناصر في الصفيف». - استخدم
Resize()الأسلوب لـ «تغيير عدد العناصر في الصفيف»، «إزالة أو إضافة عناصر من نهاية الصفيف». - تعتبر عناصر الصفيف الجديدة والعناصر التي تم مسحها خالية، بمعنى أنها لا تشير إلى قيمة في الذاكرة.