コンテンツにスキップ

制御の流れ

書き方説明
if / else条件による分岐
switch (n) { case 1: ... }値による分岐(文)
n switch { 1 => 10, _ => 0 }値による分岐(式)
n switch { var v when v > 0 => 10, _ => 0 }条件を付けたケース
n > 0 ? 10 : 20条件演算子
while (n < 3)条件が続く間の繰り返し
do { ... } while (n < 3);後判定の繰り返し
for (int i = 0; i < 3; i++)回数を決めた繰り返し
for (int i = 0, j = 3; i < j; i++, j--)複数の変数での繰り返し
foreach (int v in a)配列の走査
foreach (var (a, b) in ps)走査しながらの分解
for { for { } }ループの入れ子
breakループの脱出
continue次の周への継続
while (true) { ... break; }無限ループの脱出
if (...) { return; }途中での復帰
{ … }ブロック
;何もしない文
const int a = 1;ローカル定数
int Twice(int x) { return x * 2; }ローカル関数
static int Twice(int x) { … }static なローカル関数
for (;;)for の 3 部の省略
return;値を返さない復帰
書き方説明エラー理由代わりに
goto top;ラベルへ飛ぶTUKI0001, TUKI0099設計ループで書き直す
goto case c; / goto default;switch の別のケースへ飛ぶTUKI0001設計共通の処理をメソッドへ出して、両方の case から呼ぶ
L: stmt文にラベルを付けるTUKI0099設計goto が無いので、ラベルを使わない形に書き直す
throw new Exception();例外を投げるTUKI0001, TUKI0101環境戻り値や状態で失敗を表す
try { } catch { }例外を受けるTUKI0001環境事前に条件を確かめる
catch (…) when (…)条件つきで例外を受けるTUKI0001環境同上
try { } finally { }例外の有無によらず後始末を走らせるTUKI0001環境後始末をブロックの最後に書く
using (r) { … }区間を抜けるときに後始末するTUKI0001未実装後始末のメソッドを自分で呼ぶ(finally が無いので、途中で抜けたときは走りません)
using var r = …;宣言した変数の後始末を任せるTUKI0001, TUKI0099未実装同上
yield return / yield break少しずつ返すTUKI0001, TUKI0099環境配列に詰めて返す
p switch { (1, 2) => … }ケースで位置ごとに分解するTUKI0001未実装{ Item1: 1, Item2: 2 } と書くか、要素を読んでから比べる
void Bump() { n = n + 1; }(外の変数へ書き戻す)メソッドの中の関数から、外の変数を書き換えるTUKI0001未定戻り値で返して、呼び出した側で代入する(値を読むだけの関数は書けます)
ref int r = ref a;変数に別名を付けるTUKI0001未定値を代入して使う
lock (o) { … }排他制御をするTUKI0001環境実行の流れが 1 本しか無いので要らない
async Task Go() { await ...; }非同期に待つTUKI0001, TUKI0101環境時間をおいて呼び出す仕組みを使う
n switch { 1 => 10, 2 => 20 }既定のケースを置かずに分けるTUKI0001設計_ => を必ず置く。union に対してだけ省ける
foreach (var (a, b) in ps)(Deconstruct を自分で書いた型)自分で書いた分解の手順を使うTUKI0001設計フィールドを名前で読む
using UnityEngine;
using Tsukimi;
public class ExpressionsIfElse : TsukimiBehaviour
{
void Start()
{
int n = 1;
if (n > 0) { n = 2; } else { n = 3; }
Debug.Log(n); // => 2
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsSwitchStatement : TsukimiBehaviour
{
void Start()
{
int n = 1;
switch (n)
{
case 1: n = 10; break;
default: n = 0; break;
}
Debug.Log(n); // => 10
}
}

_ => のケースが要ります。ケースが値を尽くしていても、int と列挙型では省けません。省けるのは union だけです。

using UnityEngine;
using Tsukimi;
public class ExpressionsSwitchExpression : TsukimiBehaviour
{
void Start()
{
int n = 1;
int r = n switch { 1 => 10, _ => 0 };
Debug.Log(r); // => 10
}
}

when を書くと、パターンに当たったうえで条件が真のときだけ、そのケースを選びます。switch 文の case には書けません。

using UnityEngine;
using Tsukimi;
public class ExpressionsSwitchArmWhen : TsukimiBehaviour
{
void Start()
{
int n = 1;
int r = n switch { var v when v > 0 => 10, _ => 0 };
Debug.Log(r); // => 10
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsTernary : TsukimiBehaviour
{
void Start()
{
int n = 1;
int r = n > 0 ? 10 : 20;
Debug.Log(r); // => 10
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsWhile : TsukimiBehaviour
{
void Start()
{
int n = 0;
while (n < 3) { n++; }
Debug.Log(n); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsDoWhile : TsukimiBehaviour
{
void Start()
{
int n = 0;
do { n++; } while (n < 3);
Debug.Log(n); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsFor : TsukimiBehaviour
{
void Start()
{
int total = 0;
for (int i = 0; i < 3; i++) { total += i; }
Debug.Log(total); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsForMultiInit : TsukimiBehaviour
{
void Start()
{
int count = 0;
for (int i = 0, j = 3; i < j; i++, j--) { count++; }
Debug.Log(count); // => 2
}
}

foreach が回せるのは配列だけです。実行環境に列挙子が無いためです。

using UnityEngine;
using Tsukimi;
public class ExpressionsForeachArray : TsukimiBehaviour
{
void Start()
{
int[] a = new int[] { 1, 2 };
int total = 0;
foreach (int v in a) { total += v; }
Debug.Log(total); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsForeachDeconstruct : TsukimiBehaviour
{
void Start()
{
(int, int)[] ps = { (1, 2) };
foreach (var (a, b) in ps) { Debug.Log(a + b); } // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsNestedLoop : TsukimiBehaviour
{
void Start()
{
int count = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++) { count++; }
}
Debug.Log(count); // => 4
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsBreak : TsukimiBehaviour
{
void Start()
{
int count = 0;
for (int i = 0; i < 5; i++)
{
if (i == 2) { break; }
count++;
}
Debug.Log(count); // => 2
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsContinue : TsukimiBehaviour
{
void Start()
{
int count = 0;
for (int i = 0; i < 5; i++)
{
if (i == 2) { continue; }
count++;
}
Debug.Log(count); // => 4
}
}

while (true) は条件を評価せずに回り続けます。抜けるには本体の break が要ります。

using UnityEngine;
using Tsukimi;
public class ExpressionsWhileTrueBreak : TsukimiBehaviour
{
void Start()
{
int n = 0;
while (true)
{
n++;
if (n > 2) { break; }
}
Debug.Log(n); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class ExpressionsReturnEarly : TsukimiBehaviour
{
private int Level() { return 1; }
void Start()
{
Debug.Log(1);
if (Level() > 0) { return; }
Debug.Log(2);
}
}
// 出力
// 1
using UnityEngine;
using Tsukimi;
public class StBlock : TsukimiBehaviour
{
void Start()
{
{
int a = 1;
Debug.Log(a); // => 1
}
}
}
using UnityEngine;
using Tsukimi;
public class StEmpty : TsukimiBehaviour
{
void Start()
{
;
Debug.Log(1); // => 1
}
}
using UnityEngine;
using Tsukimi;
public class StLocalConst : TsukimiBehaviour
{
void Start()
{
const int a = 1;
Debug.Log(a); // => 1
}
}

メソッドの中に関数を宣言できます。外の変数は読めますが、書き戻せません(書けない形)。

using UnityEngine;
using Tsukimi;
public class StLocalFunc : TsukimiBehaviour
{
void Start()
{
int Twice(int x) { return x * 2; }
Debug.Log(Twice(2)); // => 4
}
}
using UnityEngine;
using Tsukimi;
public class StLocalFuncStatic : TsukimiBehaviour
{
void Start()
{
static int Twice(int x) { return x * 2; }
Debug.Log(Twice(2)); // => 4
}
}
using UnityEngine;
using Tsukimi;
public class StForOmitted : TsukimiBehaviour
{
void Start()
{
int i = 0;
for (;;) { i++; if (i > 2) break; }
Debug.Log(i); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class StReturnVoid : TsukimiBehaviour
{
void Start()
{
Debug.Log(1); // => 1
return;
}
}