コンテンツにスキップ

文と制御構文

書き方説明注意
if / else条件による分岐
switch (n) { case 1: ... }値による分岐(文)
n switch { 1 => 10, _ => 0 }値による分岐(式)ケースが値を尽くしていても、int と列挙型では省けません。省けるのは union だけです。
n switch { var v when v > 0 => 10, _ => 0 }条件を付けたケースswitch 文の case には書けません。
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; }無限ループの脱出抜けるには本体の break が必要です。
if (...) { return; }途中の return
{ … }ブロック
;何もしない文
const int a = 1;ローカル定数
int Twice(int x) { return x * 2; }ローカル関数外の変数は読めますが、書き戻せません(非対応)。
static int Twice(int x) { … }static なローカル関数
for (;;)for の 3 部の省略
return;値を返さない return
class MyError : System.Exception { }例外の型の宣言
書き方説明エラー理由代替
goto top;ラベルへ飛ぶTUKI0001, TUKI0099設計ループで書き直す
goto case c; / goto default;switch の別のケースへ飛ぶTUKI0001設計共通の処理をメソッドへ出して、両方の case から呼ぶ
case 0: if (c) { break; } …ケースの途中で抜けるTUKI0001未定抜ける条件を反転し、残りをその条件の下に書く
L: stmt文にラベルを付けるTUKI0099設計goto が無いので、ラベルを使わない形に書き直す
throw new Exception();例外を投げるTUKI0001, TUKI0101環境戻り値や状態で失敗を表す
try { } catch { }例外を受けるTUKI0001環境事前に条件を確認する
throw;捕まえた例外を投げ直すTUKI0001環境戻り値や状態で失敗を表す
catch (…) when (…)条件つきで例外を受けるTUKI0001環境同上
try { } finally { }例外の有無によらず後始末を実行するTUKI0001環境後始末をブロックの最後に書く
using (r) { … }ブロックを抜けるときに後始末するTUKI0001未実装後始末のメソッドを自分で呼ぶ(finally が無いので、途中で抜けたときは実行されません)
using var r = …;宣言した変数の後始末を任せるTUKI0001, TUKI0099未実装同上
yield return / yield break少しずつ返すTUKI0001環境配列に詰めて返す
IEnumerator<int> Nums()イテレータを返すTUKI0001環境同上
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環境時間をおいて呼び出す仕組みを使う
async void Go()戻り値の無い非同期メソッドを書く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
}
}

_ => のケースが必要です。

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 を書くと、パターンに当たったうえで条件が真のときだけ、そのケースを選びます。

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) は条件を評価せずに回り続けます。

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); // => 1
if (Level() > 0) { return; }
Debug.Log(2);
}
}
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;
}
}

例外の型は宣言できますが、投げることも捕まえることもできません。

using UnityEngine;
using Tsukimi;
public class MyError : System.Exception { }
public class ExCustom : TsukimiBehaviour
{
void Start()
{
Debug.Log(1); // => 1
}
}