تمرين - استخدام معلمات القيمة ونوع المرجع
في C#، يمكن تصنيف المتغيرات إلى نوعين رئيسيين، أنواع القيم وأنواع المراجع. تصف هذه الأنواع كيفية تخزين المتغيرات لقيمها.
تحتوي أنواع القيم مثل intو boolfloatdoubleو char على قيم مباشرة. لا تخزن الأنواع المرجعية مثل stringو arrayو كائنات (مثل مثيلات Random) قيمها مباشرة. بدلا من ذلك، تخزن الأنواع المرجعية عنوانا حيث يتم تخزين قيمتها.
المعلمات التي تم تمريرها حسب القيمة وتم تمريرها حسب المرجع
عند تمرير وسيطة إلى أسلوب، يتم نسخ قيم متغيرات نوع القيمة إلى الأسلوب . كل متغير له نسخته الخاصة من القيمة، لذلك لا يتم تعديل المتغير الأصلي.
مع أنواع المراجع، يتم تمرير عنوان القيمة إلى الأسلوب . يشير المتغير المعطا إلى الأسلوب إلى القيمة الموجودة في هذا العنوان، لذلك تؤثر العمليات على هذا المتغير على القيمة المشار إليها من قبل الآخر.
إشعار
من المهم أن نتذكر أن هذا string هو نوع المرجع، ولكنه غير قابل للتغيير. وهذا يعني أنه بمجرد تعيين قيمة لها، لا يمكن تغييرها. في C#، عند استخدام الأساليب وعوامل التشغيل لتعديل سلسلة، تكون النتيجة التي يتم إرجاعها هي في الواقع كائن سلسلة جديد.
في هذا التمرين، ستتعرف على المزيد حول تمرير وسيطات نوع المرجع والقيمة إلى أساليب.
اختبار النجاح حسب القيمة
في محرر تعليمة Visual Studio برمجية، احذف أي تعليمة برمجية موجودة من التدريبات السابقة.
أدخل التعليمات البرمجية التالية في محرر التعليمات البرمجية Visual Studio:
int a = 3; int b = 4; int c = 0; Multiply(a, b, c); Console.WriteLine($"global statement: {a} x {b} = {c}"); void Multiply(int a, int b, int c) { c = a * b; Console.WriteLine($"inside Multiply method: {a} x {b} = {c}"); }يتم تمرير المتغيرات
aوbوcإلىMultiplyالأسلوب . تتم طباعة قيم المتغيرات أثناء تنفيذ الأسلوب، وتتم طباعتها مرة أخرى بعد اكتمال الأسلوب.الأعداد الصحيحة هي أنواع قيم، يتم نسخ قيمها عند تمريرها إلى أساليب. ما الذي تعتقد أن ناتجه
cسيكون؟احفظ التعليمات البرمجية وقم بتشغيلها لمراقبة الإخراج التالي:
inside Multiply method: 3 x 4 = 12 global statement: 3 x 4 = 0لاحظ أن قيمة
cيتم تغييرها فقط داخلMultiplyالأسلوب . خارج الأسلوب ،cيحتفظ بقيمته الأصلية.
اختبار المرور حسب المرجع
حذف التعليمات البرمجية السابقة من محرر التعليمات البرمجية Visual Studio.
أدخل التعليمات البرمجية التالية في محرر التعليمات البرمجية Visual Studio:
int[] array = {1, 2, 3, 4, 5}; PrintArray(array); Clear(array); PrintArray(array); void PrintArray(int[] array) { foreach (int a in array) { Console.Write($"{a} "); } Console.WriteLine(); } void Clear(int[] array) { for (int i = 0; i < array.Length; i++) { array[i] = 0; } }تبدأ التعليمات البرمجية بتهيئة
arrayلتحتوي على بعض قيم الأعداد الصحيحة. يتم عرض القيم باستخدامPrintArrayالأسلوب .Clearيتم استدعاء الأسلوب على الصفيف، ثم تتم طباعة الصفيف مرة أخرى.الصفائف هي أنواع مرجعية. تخزن أنواع المراجع عنوان قيمها في الذاكرة. ماذا تعتقد أن الإخراج سيكون؟
احفظ التعليمات البرمجية وقم بتشغيلها لمراقبة الإخراج التالي:
1 2 3 4 5 0 0 0 0 0لاحظ أن الصفيف يظل معدلا خارج
Clearنطاق الأسلوب. يحدث هذا لأنClearالأسلوب حدث القيم المخزنة في كل عنوان.
اختبار باستخدام السلاسل
في وقت سابق، تعلمت أن السلاسل هي نوع غير قابل للتغيير . على الرغم من أن السلسلة هي نوع مرجعي، إلا أن قيمتها لا يمكن تغييرها بمجرد تعيينها، على عكس المصفوفة. ربما لاحظت ذلك إذا كنت قد استخدمت أساليب مثل string.Replace أو string.ToUpper. في هذه المهمة، ستتعلم تصحيح خطأ شائع تم العثور عليه عند العمل مع السلاسل.
في محرر تعليمة Visual Studio برمجية، احذف أي تعليمة برمجية موجودة من التدريبات السابقة.
أدخل التعليمات البرمجية التالية في محرر التعليمات البرمجية Visual Studio:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(status, false); Console.WriteLine($"End: {status}"); void SetHealth(string status, bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }احفظ التعليمات البرمجية وقم بتشغيلها لمراقبة الإخراج التالي:
Start: Healthy Middle: Unhealthy End: HealthySetHealthإذا لم يؤد الأسلوب إلى إخراج الحالة، فربما افترضت أن الأسلوب لم ينفذ بشكل صحيح. بدلا من ذلك، تم إنشاء سلسلة جديدة بالقيمة "غير سليمة" ثم فقدانها في نطاق الأسلوب.لتصحيح هذه المشكلة، يمكنك التغيير
SetHealthلاستخدام متغير الحالة العمومية بدلا من ذلك.تحديث التعليمات البرمجية الخاصة بك كما يلي:
string status = "Healthy"; Console.WriteLine($"Start: {status}"); SetHealth(false); Console.WriteLine($"End: {status}"); void SetHealth(bool isHealthy) { status = (isHealthy ? "Healthy" : "Unhealthy"); Console.WriteLine($"Middle: {status}"); }في هذه التعليمة البرمجية، يمكنك الكتابة فوق المتغير العمومي
statusبقيمة السلسلة الجديدة.احفظ التعليمات البرمجية وقم بتشغيلها لمراقبة الإخراج التالي:
Start: Healthy Middle: Unhealthy End: Unhealthyالآن يتم التقاط السلسلة المحدثة وتخزينها بشكل صحيح.
خلاصة
إليك ما تعلمته عن نوع القيمة ومعلمات نوع المرجع حتى الآن:
- يمكن تصنيف المتغيرات على أنها أنواع قيم وأنواع مرجعية.
- تحتوي أنواع القيم مباشرة على قيم، وتخزن أنواع المراجع عنوان القيمة.
- تنشئ الأساليب التي تستخدم وسيطات نوع القيمة نسختها الخاصة من القيم.
- تؤثر الأساليب التي تقوم بإجراء تغييرات على معلمة صفيف على صفيف الإدخال الأصلي.
- السلسلة هي نوع مرجع غير قابل للتغيير.
- لا تؤثر الأساليب التي تقوم بإجراء تغييرات على معلمة سلسلة على السلسلة الأصلية.