変数と引数の渡し方
対応(15)
Section titled “対応(15)”| 書き方 | 説明 | 注意 |
|---|---|---|
int a = 1; | ローカル変数 | |
var a = 1; | 型の推論 | |
int a = 1, b = 2; | まとめた宣言 | |
{ int a = 1; } | ブロックによる範囲 | |
int a; a = 1; | 宣言してからの代入 | 代入より前に読むと CS0165 のエラーになります。 |
private static int Counter; | 静的変数 | 値は Behaviour のインスタンスごとに別で、インスタンスのあいだで共有されません。 |
int Take(int v) | 値渡し | 呼び出し先で引数へ代入しても、呼び出し元の変数は変わりません。 |
int Read(in int v) | in 引数 | |
bool TryHalf(int v, out int result) | out 引数 | 渡せるのは、呼び出し元のローカル変数か引数と、呼び出し先自身が読み書きしないフィールドです。配列の要素は渡せません(同じ配列に別の名前が付いていないかを判別できないため)。 |
void Bump(ref int v) | ref 引数 | 渡せる先は out と同じです。 |
int.TryParse("1", out n) | 実行環境のメソッドからの out | |
out int n | その場での out 変数の宣言 | |
if (…) a = 1; else a = 2; | if と else での代入 | |
switch … case … default … | switch の全ケースでの代入 | |
_ = Make(); | 戻り値の破棄 |
非対応(7)
Section titled “非対応(7)”| 書き方 | 説明 | エラー | 理由 | 代替 |
|---|---|---|---|---|
Bump(ref a[0]) | 配列の要素を ref で渡す | TUKI0001 | 設計 | いったんローカル変数で受けてから要素へ代入する |
ref int r = ref a; | 変数を参照するローカル変数(ref ローカル) | 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 “宣言してからの代入”宣言だけしておき、あとから代入できます。
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; }}呼び出し先で引数へ代入しないことを、宣言に書けます。
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 引数”呼び出し先が値を書き込みます。
using UnityEngine;using Tsukimi;
public class VarOutParameter : TsukimiBehaviour{ private bool TryHalf(int v, out int result) { result = v / 2; return v % 2 == 0; }
void Start() { int half; bool even = TryHalf(10, out half); Debug.Log(even); // => true Debug.Log(half); // => 5 }}ref 引数
Section titled “ref 引数”呼び出し先が読んでから変更します。
using UnityEngine;using Tsukimi;
public class VarRefParameter : TsukimiBehaviour{ private void Bump(ref int v) { v = v + 1; }
void Start() { int count = 1; Bump(ref count); Bump(ref count); Debug.Log(count); // => 3 }}実行環境のメソッドからの out
Section titled “実行環境のメソッドからの out”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; }}