こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「C#のvarってなに?」
「varはどういう仕組みになっているの?」
というお悩みの方に向けた内容となっています。
UnityのC#では、変数の型として「var」というキーワードを使って指定することができます。
このvarとは、型推論と呼ばれるキーワードで、自動的に変数の型を決めてくれるという機能を持っています。
varを活用することで、スクリプト内を簡潔に書くことができる一方で、varはローカル変数でしか使うことができないという制約があります。
そこで、このページでは、UnityのC#で使うことができるvarというキーワードについて、どんな仕組みや機能なのかをまとめていきます。
varとは?
まずは、varがどういうものなのかについて紹介していきます。
値から推測して自動で型が決められるキーワード
varとは、右辺の値から推測して自動で変数の型を決めてくれるキーワードで、型推論と呼ばれる機能を持っています。
通常、変数を宣言する場合、以下のように「float」や「string」といったデータの型を記述することで、そのデータを入れるための変数が作成されて、データを保持・使用することができます。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
// 変数の宣言
float num = 2.5f; // float型の変数を宣言
string name = "tomoya"; // string型の変数を宣言
}
}
しかし、型名の代わりに「var」と記述することで、右辺で代入した値からそれぞれの型を推測し自動で変数の型を決めてくれます。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
// 変数の宣言
var num = 2.5f; // 自動でfloat型になる
var name = "tomoya"; // 自動でstring型になる
}
}
そのため、varを使うことで、変数宣言時に型を指定していなくても、型を指定した時と同じようにその変数を使うことができます。
コードを簡潔に書くことができる
varを使うメリットとして、スクリプト内のコードを簡潔にして、読みやすくするという効果があります。
特に、型名の文字数が長い場合や何度も同じ型名を書く必要がある場合などは、varを使うことで非常に効果的になります。
例えば、以下のように「Dictionary」や「Quaternion」の型名が長い変数などを宣言しているスクリプトがあったとします。
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int num = 53;
Dictionary<int, string> dictionary = new Dictionary<int, string>();
Quaternion objQ = transform.rotation;
Rigidbody rb = GetComponent<Rigidbody>();
}
}
これをvarキーワードを使うことで、以下のように簡潔に書くことができるようになります。
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
var num = 53;
var dictionary = new Dictionary<int, string>();
var objQ = transform.rotation;
var rb = GetComponent<Rigidbody>();
}
}
varの使い方
ここからは、varの使い方や注意点について紹介していきます。
変数の宣言時に初期化して使う
varキーワードを使えるのは、変数の宣言時に初期化する場合だけとなっています。
varは、変数に入る値で型を推測することになるので、宣言だけでは使うことができません。
例えば、以下のように7行目で変数を宣言だけしておき、あとで値を代入しても、varでは型を推測できないため、コンパイルエラーが発生します。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
var num; // 型が推測できないためエラーが発生
num = 2.5f;
Debug.Log(num);
}
}

これを以下のように7行目で宣言した際に初期化することで、型を推測することができるため、エラーが発生しなくなります。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
var num = 2.5f; // 初期化していれば型が推測できる
Debug.Log(num);
}
}

また、初期化していても、値から型が推測できないような場合には、コンパイルエラーが発生します。
なお、一度型が推測されて定義されたら、その後異なるデータ型の値を代入しても、型が変わることはありません。
メンバ変数では使えない
varを使う際の注意点として、ローカル変数でしか使えず、クラス内のメンバ変数の宣言に使うことはできません。
- ローカル変数 ⇒ メソッドの中で宣言した変数でそのメソッド内でのみ使える変数
- メンバ変数 ⇒ クラスの中で宣言した変数でそのクラス内で自由に使える変数
例えば、以下のように、Numというメソッドを作って、その中の12行目で変数を宣言する際は、ローカル変数となるのでvarを使うことができます。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
Debug.Log(Num(15));
}
int Num(int num)
{
var addNum = num; // ローカル変数を宣言
addNum++;
return addNum;
}
}

しかし、以下のように、5行目で変数を宣言して、その変数をStartメソッド内で利用するような場合、この変数はメンバ変数となるためvarを使うことができず、コンパイルエラーが発生します。
using UnityEngine;
public class Test : MonoBehaviour
{
var num = 15; // メンバ変数のためコンパイルエラー
void Start()
{
Debug.Log(num);
}
}

そのため、varを使用する際は、メソッド内のローカル変数で宣言・初期化する場合にのみ使うことができます。
まとめ
このページでは、UnityのC#で使えるvarというキーワードについて、どんな仕組みなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?
varは型推論と呼ばれるキーワードで、変数の型を自動的に決めてくれるという役割を持っています。
varを使えば型を指定しなくて良いので便利ですが、ローカル変数の宣言時しか使うことができないという制約があります。
ただ、長い型名などを何度も書くような場合では、コードを簡潔に書くことができるので非常に便利です。
最後までお読みいただきまして、ありがとうございました!
コメント