変数と引数の渡し方
書ける形(13)
Section titled “書ける形(13)”| 書き方 | 説明 |
|---|---|
int a = 1; | ローカル変数 |
var a = 1; | 型の推論 |
int a = 1, b = 2; | まとめた宣言 |
{ int a = 1; } | ブロックによる範囲 |
int a; a = 1; | 宣言してからの代入 |
private static int Counter; | 静的変数 |
int Take(int v) | 値渡し |
int Read(in int v) | in 引数 |
int.TryParse("1", out n) | 実行環境のメソッドからの out |
out int n | その場での out 変数の宣言 |
if (…) a = 1; else a = 2; | if と else での代入 |
switch … case … default … | switch の全ケースでの代入 |
_ = Make(); | 戻り値の破棄 |
書けない形(9)
Section titled “書けない形(9)”| 書き方 | 説明 | エラー | 理由 | 代わりに |
|---|---|---|---|---|
Bump(ref a) | 自分で書いたメソッドへ ref で渡す | TUKI0001 | 未実装 | 戻り値で返す |
Make(out int a) | 自分で書いたメソッドから out で受ける | TUKI0001 | 未実装 | 戻り値で返す |
Bump(ref a[0]) | 配列の要素を ref で渡す | TUKI0001 | 未実装 | 値を渡して戻り値を書き戻す |
ref int r = ref a; | 変数そのものを指す局所 | TUKI0001 | 未定 | 値を持つ |
ref int First(int[] xs) | 変数そのものを返す | TUKI0001 | 未定 | 値を返して呼び出し側で書き戻す |
r = ref b; | 指す先を差し替える | TUKI0001 | 未定 | 同上 |
ref (c ? ref a : ref b) | 条件で指す先を選ぶ | TUKI0001 | 未定 | 同上 |
Make(out _); | out の受け先を捨てる | TUKI0001, TUKI0099 | 未実装 | 変数で受ける |
int.TryParse("1", out _) | 実行環境のメソッドの out を捨てる | TUKI0099 | 未実装 | 変数で受ける |
変数の場所そのものを値として持つ形は、いずれも通りません。ref 局所・ref 戻り値・ref の再代入・条件式の ref が TUKI0001 になります。書き換えた結果は戻り値で返し、呼び出し側で代入します。 |
確定代入は C# の規則がそのまま効きます。すべての分岐で代入していれば、そのあとで読み出せます。代入より前に読むと CS0165 が出ます。
ローカル変数
Section titled “ローカル変数”using UnityEngine;using Tsukimi;
public class VarLocal : TsukimiBehaviour{ void Start() { int a = 1; Debug.Log(a); // => 1 }}using UnityEngine;using Tsukimi;
public class VarInferredType : TsukimiBehaviour{ void Start() { var a = 1; Debug.Log(a); // => 1 }}まとめた宣言
Section titled “まとめた宣言”using UnityEngine;using Tsukimi;
public class VarMultipleDeclarators : TsukimiBehaviour{ void Start() { int a = 1, b = 2; Debug.Log(a + b); // => 3 }}ブロックによる範囲
Section titled “ブロックによる範囲”using UnityEngine;using Tsukimi;
public class VarBlockScope : TsukimiBehaviour{ void Start() { { int a = 1; Debug.Log(a); // => 1 } }}宣言してからの代入
Section titled “宣言してからの代入”宣言だけしておき、あとから代入できます。代入より前に読むと CS0165 で断られます。
using UnityEngine;using Tsukimi;
public class VarAssignBeforeUse : TsukimiBehaviour{ void Start() { int a; a = 1; Debug.Log(a); // => 1 }}インスタンスではなく型に属します。値はふるまいの実体ごとに別で、実体のあいだで共有されません。
using UnityEngine;using Tsukimi;
public class VaStatic : TsukimiBehaviour{ void Start() { Counter = Counter + 1; Debug.Log(Counter); // => 1 }
private static int Counter;}引数へは値を複製して渡します。呼び出し先で引数へ代入しても、呼び出し元の変数は変わりません。
using UnityEngine;using Tsukimi;
public class VaValueParam : TsukimiBehaviour{ void Start() { Debug.Log(Take(1)); // => 1 }
private int Take(int v) { return v; }}呼び出し先で引数へ代入しないことを、宣言に書けます。ref や out と違い、自分で書いたメソッドにも書けます。
using UnityEngine;using Tsukimi;
public class VarInParameter : TsukimiBehaviour{ private int Read(in int v) { return v; }
void Start() { int a = 1; Debug.Log(Read(in a)); // => 1 }}実行環境のメソッドからの out
Section titled “実行環境のメソッドからの out”out を書けるのは、実行環境のメソッドを呼ぶときだけです。自分で書いたメソッドには書けません(TUKI0001)。
using UnityEngine;using Tsukimi;
public class VarOutFromExtern : TsukimiBehaviour{ void Start() { int n; bool ok = int.TryParse("1", out n); Debug.Log(ok ? n : 0); // => 1 }}その場での out 変数の宣言
Section titled “その場での out 変数の宣言”using UnityEngine;using Tsukimi;
public class VarOutDeclaredInline : TsukimiBehaviour{ void Start() { bool ok = int.TryParse("1", out int n); Debug.Log(ok ? n : 0); // => 1 }}if と else での代入
Section titled “if と else での代入”using UnityEngine;using Tsukimi;
public class VaDefAssignIf : TsukimiBehaviour{ void Start() { int a; if (true) { a = 1; } else { a = 2; } Debug.Log(a); // => 1 }}switch の全ケースでの代入
Section titled “switch の全ケースでの代入”using UnityEngine;using Tsukimi;
public class VaDefAssignSwitch : TsukimiBehaviour{ void Start() { int k = 1; int a; switch (k) { case 1: a = 1; break; default: a = 0; break; } Debug.Log(a); // => 1 }}戻り値の破棄
Section titled “戻り値の破棄”using UnityEngine;using Tsukimi;
public class VarDiscard : TsukimiBehaviour{ private int calls;
void Start() { _ = Make(); Debug.Log(calls); // => 1 }
private int Make() { calls = calls + 1; return 1; }}