سؤال

والنظر،

        static void Main(string[] args)
        {
            Console.WriteLine(fun());
        }

        static int fun()
        {
            int i = 0;
            try
            {
                i = 1;
                return i;
            }
            catch (Exception ex)
            {
                i = 2;
                return i;
            }
            finally
            {
                i = 3;
            }
        }

ونموذج التعليمات البرمجية مخرجات "1". ولكن يتم تغيير قيمة ط 3 في منع أخيرا. لماذا لم يكن قيمة 'ط' تغيرت إلى 3؟

وشكرا لك،

هل كانت مفيدة؟

المحلول

والنظر في هذا code- أعتقد يفسر رمز ما كنت أفكر، وكيف يمكنك ان تجعل ما هو رأيك يجب أن يحدث في الواقع يحدث:

static void Main(string[] args)
{
    int counter = 0;
    Console.WriteLine(fun(ref counter)); // Prints 1
    Console.WriteLine(counter); // Prints 3
}        

static int fun(ref int counter)
{
  try
  {
      counter = 1;
      return counter;
  }
  finally
  {
      counter = 3;
  }
}

ومع هذا الرمز الذي يعود 1 من طريقة، ولكن عليك أيضا تعيين المتغير العداد إلى 3، والتي يمكنك الوصول إليها من خارج الأسلوب.

نصائح أخرى

وعليك أن تتذكر أن ينفذ أخيرا بعد كل شيء آخر في محاولة والصيد. وضع العبارة عودة بعد محاولة / صيد / أخيرا بيان لأنها قد تعود 3.

وأتصور إذا كنت تستخدم نوع مرجع بدلا من نوع القيمة التي تريد الحصول على سلوك مختلف.

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

وانها مثل العبارة باستخدام مع عودة داخل ... و"تخلص" لا يزال يحدث، بعد عودة (إذا جاز التعبير).

وأخيرا يتم تنفيذ دائما

والتعليمات البرمجية الخاصة بك دائما ينفذ في النهاية لا يهم إذا كان طرح استثناء أم لا. لذا التعليمات البرمجية يجب أن يكون في الواقع:

try
{
    i = 1;
}
catch
{
    i = 2;
}
finally
{
    i = 3;
}
return i;

ولكن في هذه الحالة تافهة وأخيرا كتلة لا معنى كبير. لأننا سوف يعود دائما 3 بغض النظر عن ما حدث قبل ذلك.

وأخيرا يستخدم لتحرير موارد

وينبغي عادة أن تستخدم كتلة finally عندما يكون لديك لاطلاق سراح بعض موارد النظام المخصصة ضمن كتلة try (أي وسم البداية اتصال DB لقراءة البيانات في كتلة try وإغلاقه في finally). ولذلك سوف تحصل دائما على صدر بغض النظر إذا كان هناك استثناء أم لا. في هذه الحالة فإنه لا معنى كبير لاستخدام كتلة finally.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top