コンテンツにスキップ

変数と引数の渡し方

書き方説明注意
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();戻り値の破棄
書き方説明エラー理由代替
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 です
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
}
}
using UnityEngine;
using Tsukimi;
public class VarMultipleDeclarators : TsukimiBehaviour
{
void Start()
{
int a = 1, b = 2;
Debug.Log(a + b); // => 3
}
}
using UnityEngine;
using Tsukimi;
public class VarBlockScope : TsukimiBehaviour
{
void Start()
{
{
int a = 1;
Debug.Log(a); // => 1
}
}
}

宣言だけしておき、あとから代入できます。

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
}
}

呼び出し先が値を書き込みます。

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
}
}

呼び出し先が読んでから変更します。

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
}
}
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
}
}
using UnityEngine;
using Tsukimi;
public class VarOutDeclaredInline : TsukimiBehaviour
{
void Start()
{
bool ok = int.TryParse("1", out int n);
Debug.Log(ok ? n : 0); // => 1
}
}
using UnityEngine;
using Tsukimi;
public class VaDefAssignIf : TsukimiBehaviour
{
void Start()
{
int a;
if (true) { a = 1; } else { a = 2; }
Debug.Log(a); // => 1
}
}
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
}
}
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;
}
}