مشكلة مع المتغيرات المحلية في C #
-
18-09-2019 - |
سؤال
لدي اثنين من المتغيرات التي يجب تعيينها داخل حلقة. على ما يبدو، عندما تخطئ الحلقة، يتجاهل C # ما حدث هناك، يتم إرجاع المتغيرات إلى حالتها الأصلية. على وجه التحديد، أحتاج إلى أن تكون العناصر الأخيرة والخاصة للقائمة. إليك الرمز:
int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
// At this point, temp1 and temp2 are treated as uninitialized
ملاحظة: NeverMind أسماء متغيرة سيئة، فهي متغيرات مؤقتة حقا. أي شيء أكثر تعقيدا سوف يخلط بين الأشياء.
الآن، هناك طريقتان (الذي أعرفه) لحل هذا: واحد هو معرفة كيفية جعل المتغيرات مباشرة بعد خروج الحلقة، والآخر هو القيام بشيء ما في بيثون، حيث يمكنك القيام به temp = my_list[-1]
للحصول على العنصر الأخير من القائمة. هل أي من هذه ممكن في ج #؟
يحرر: عندما أحاول الترجمة، أحصل على خطأ "استخدام المتغير المحلي غير المعظم". لا يتم تشغيل هذا الرمز، إنه يجلس فقط داخل طريقة لا يتم استدعاؤها أبدا. إذا كان هذا يساعد، أحاول استخدام المتغيرات داخل حلقة أخرى.
المحلول
لماذا لا تفعل فقط ...
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
نصائح أخرى
إذا كان Toreturn.Count 0، فلن يتم تهيئة الحلقة أبدا ويتم تهيئة temp1 و temp2 أبدا.
ما هذا؟
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
حاول إعطاء TEMP1 و TEMP2 القيمة الأولية IE 0 أو أي ما هو مناسب لأنها قد لا يتم تهيئةها
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
المحول البرمجي يتطلب ذلك temp1
و temp2
نكون بالتأكيد عينت قبل محاولة قراءة قيمها. برنامج التحويل البرمجي لا يعرف أن حلقة الخاص بك ستعيين المتغيرات. لا يعرف ما إذا كان حلقة يدير على الإطلاق. كما أنه لا يعرف ما إذا كانت شروطك إذا كانت true
.
الرمز أعلاه يتأكد من ذلك temp1
و temp2
تم تخصيصها لشيء ما. إذا كنت تريد أن تكون متأكدا ما إذا كان temp1
و temp2
تم تعيينها في الحلقة, ، النظر في تتبع هذا:
int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
temp1Assigned = true;
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
temp2Assigned = true;
}
}
إذا كنت تريد قيمة افتراضية:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
إذا كنت لا تهتم بالقيمة الافتراضية ولديها الشيكات السابقة لعدد في مكانها:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];