コンテンツにスキップ

変数と引数の渡し方

書き方説明
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();戻り値の破棄
書き方説明エラー理由代わりに
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 の再代入・条件式の refTUKI0001 になります。書き換えた結果は戻り値で返し、呼び出し側で代入します。

確定代入は 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
}
}
}

宣言だけしておき、あとから代入できます。代入より前に読むと 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; }
}

呼び出し先で引数へ代入しないことを、宣言に書けます。refout と違い、自分で書いたメソッドにも書けます。

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 を書けるのは、実行環境のメソッドを呼ぶときだけです。自分で書いたメソッドには書けません(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
}
}
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;
}
}