سؤال

وأنا لست متأكدا لماذا أنا الحصول على هذا الخطأ، ولكن لا ينبغي أن هذا الرمز الترجمة، لأن أنا فحص بالفعل لمعرفة ما إذا كان يتم الحصول على تهيئة الانتظار؟

public static void Main(String[] args)
{
    Byte maxSize;
    Queue queue;

    if(args.Length != 0)
    {
        if(Byte.TryParse(args[0], out maxSize))
            queue = new Queue(){MaxSize = maxSize};
        else
            Environment.Exit(0);
    }
    else
    {
        Environment.Exit(0);
    }

    for(Byte j = 0; j < queue.MaxSize; j++)
        queue.Insert(j);
    for(Byte j = 0; j < queue.MaxSize; j++)
        Console.WriteLine(queue.Remove());
}

وحتى إذا لم يتم تهيئة طابور، ثم لحلقات ليست حق الوصول إليه؟ منذ برنامج إنهاء بالفعل مع Environment.Exit (0)؟

والأمل ya'll يمكن أن تعطيني بعض المؤشرات:)

وشكرا.

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

المحلول

والمترجم لا يعرف أن Environment.Exit () سوف إنهاء البرنامج. انها مجرد يراك تنفيذ أسلوب ثابت على فئة. مجرد تهيئة queue لاغية عند نعلن ذلك.

Queue queue = null;

نصائح أخرى

لا يعرف المترجم أن Environment.Exit () لا يعود. لماذا لا مجرد "العودة" من منزل ()؟

وهناك عدة طرق مختلفة لحل المشكلة:

واستبدال فقط Environment.Exit مع عودة. المترجم يعرف أن عودة تنتهي طريقة، ولكن لا يعرف أن Environment.Exit يفعل.

static void Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return;
    } else {
       return;   
}

وبطبيعة الحال، يمكنك حقا فقط الحصول على بعيدا مع ذلك لأنك كنت تستخدم 0 كما رمز إنهاء الخاصة بك في جميع الحالات. حقا، يجب أن تعيد عدد صحيح بدلا من استخدام Environment.Exit. لهذه الحالة بالذات، وهذا سيكون بلدي الطريقة المفضلة

static int Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return 1;
    } else {
       return 2;
    }
}

وتهيئة طابور لاغية، الذي هو في الحقيقة مجرد خدعة المترجم الذي يقول "أنا معرفة بلدي متغيرات غير مهيأ الخاصة، وشكرا جزيلا لكم". انها خدعة مفيدة، ولكن أنا لا أحب ذلك في هذه الحالة - أن يكون لديك عدد كبير جدا إذا الفروع الاختيار بسهولة أن كنت أفعل ذلك بشكل صحيح. إذا كنت <م> حقا أردت أن تفعل ذلك بهذه الطريقة، شيء من هذا القبيل سيكون أكثر وضوحا:

static void Main(string[] args) {
  Byte maxSize;
  Queue queue = null;

  if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) {
     Environment.Exit(0);
  }
  queue = new Queue(){MaxSize = maxSize};

  for(Byte j = 0; j < queue.MaxSize; j++)
    queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
    Console.WriteLine(queue.Remove());
}

وإضافة عبارة عودة بعد Environment.Exit. مرة أخرى، وهذا هو أكثر من خدعة مترجم - ولكن قليلا أكثر شرعي IMO لأنه يضيف دلالات بالنسبة للبشر، وكذلك (على الرغم من أنها سوف تبقي لكم من أن مدونة التغطية 100٪ أدعياء)

static void Main(String[] args) {
  if(args.Length != 0) {
     if(Byte.TryParse(args[0], out maxSize)) {
        queue = new Queue(){MaxSize = maxSize};
     } else {
        Environment.Exit(0);
        return;
     }
  } else { 
     Environment.Exit(0);
     return;
  }

  for(Byte j = 0; j < queue.MaxSize; j++)
     queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
     Console.WriteLine(queue.Remove());
}

والمترجم يعرف فقط أن متاحة أو غير قابلة للوصول إذا كنت تستخدم "العودة". التفكير في Environment.Exit () كدالة أن استدعاء، والمترجم لم يكن يعرف أنه سيتم إغلاق التطبيق.

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