using System;
using System.Collections.Generic;
namespace JetBrains.ReSharper.Koans.Navigation
{
// 移動メニュー (Navigate to) を使ってみます。 - Control Flow Target
//
// 現在の場所から移動する便利な方法です。
// 基本的な仕組みは 基本編 4.1-Navigate_To_menu.cs を参照してください。
//
// Navigate to の操作方法
// Alt+` (ReSharper VisualStudio Keymap)
// Ctrl+Shift+G (Rider Default IntelliJ Keymap)
//
// 対象の上にキャレットを置き、実行してみましょう。
//
// 1. キャレットが制御キーワード (Control Flow Keyword) 上にある場合の動作を試してみましょう。
// ReSharper や Rider はコードの流れも解釈し、次の実行位置を教えてくれます。
public class NavigateToControlFlowKeyword
{
public void ControlFlowWithForStatement()
{
for (int i = 0; i < Children.Count; i++)
{
var child = Children[i];
// a) "continue" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// for 構文の i++ のところにキャレットが移動しましたか?
if (ShouldSkipChild(child))
continue;
// b) "break" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// for ループを抜けた次の実行ラインにキャレットが移動しましたか?
if (ShouldStop(child))
break;
// c) "return" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// 当該関数のスコープであるブレースの末尾 "}" にキャレットが移動しましたか?
if (ShouldQuit(child))
return;
}
Console.WriteLine("Finished loop");
}
public void ControlFlowWithSwitchStatement(Size size)
{
switch (size)
{
case Size.Large:
// d) "break" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// switchを抜けた次の実行ラインにキャレットが移動しましたか?
break;
case Size.Medium:
// e) "return" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// 当該関数のスコープであるブレースの末尾 "}" にキャレットが移動しましたか?
return;
case Size.Small:
// e) "throw" にキャレットを置き、 Navigate to → Control Flow Target と選択します。
// 当該関数のスコープであるブレースの末尾 "}" にキャレットが移動しましたか?
throw new ArgumentOutOfRangeException("size");
}
Console.WriteLine("Finished switch");
}
#region Implementation details
private IList Children { get { return new List(); } }
private bool ShouldSkipChild(string child)
{
return child == "Barry";
}
private bool ShouldStop(string child)
{
return child == "Rocky";
}
private bool ShouldQuit(string child)
{
return child == "Damien";
}
public enum Size
{
Large,
Medium,
Small
}
#endregion
}
}