問題を解決するためのいくつかの異なる方法:
Environment.Exit を return に置き換えるだけです。コンパイラは return がメソッドを終了することを認識していますが、 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 を使用する代わりに int を返す必要があります。この特定のケースでは、これが私の好みの方法です
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;
}
}
キューをnullに初期化します。これは、「初期化されていない変数を自分で見つけます。ありがとうございます」というコンパイラのトリックです。これは便利なトリックですが、この場合は好きではありません。if ブランチが多すぎて、適切に実行しているかどうかを簡単に確認できません。本当にこのようにしたい場合は、次のようなものがより明確になります。
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 の後に return ステートメントを追加します。繰り返しますが、これはコンパイラのトリックのようなものですが、人間のためのセマンティクスも追加するため、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());
}