LoginSignup
4
6

More than 3 years have passed since last update.

C#でstaticが何か分からずに詰まってしまったので備忘録

Last updated at Posted at 2020-05-21

初投稿です。Unity初心者の私がstaticが何者なのか分からなくなったので忘れないように記しておきます。
間違っていたら指摘していただけると嬉しいです

Staticとは何ぞ?

Staticは静的と訳されています
クラスのメンバーを定義する時に下記のようにstaticを付けることで
static 型名 フィールド名 (例: static float Sin)
その変数は静的変数・静的メソッドになります

静的って何だよ

静的とは、静的メンバー(クラスやオブジェクトの持つ変数や関数)の宣言に使用します。
静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。
少なくとも
・静的である=>動かなく値は固定=>(constのような)定数
という事ではないです。自分は脳内でこのように勝手に変換してしまってハマっていました。

じゃあ何をやっているの?

staticはそのクラスが持つ変数やメソッドで有ることを示します。
動かせないお弁当箱を置いておくようなもので中身を見たり中身を入れ替えたり出来ます。

いちいちインスタンスを取得してからアクセスしていましたが、
インスタンスを取得せずアクセスできるようになります。

静的クラス

下記のようにstaticを付けることでstaticとして宣言され、staticメソッドのみが含まれます
public static class Math

public static class Math //静的クラス
{
    public static readonly float PI = 3.14f;
    public static float CircumferenceLength(float diameter) 
    {
        return diameter * PI; //直径から円周を返す雑メソッド
    }

    //static(静的クラスでは)が無いのでエラー
    //静的クラスでインスタンスのメンバーを宣言することはできません。と言われる
    public /*static*/ int Abs(float val) 
    {
        return (int)Mathf.Abs(val); //絶対値にしてintで返すメソッド、なおエラーを吐く
    }
}

静的フィールドとメソッド

この例では、新しい従業員の名前と ID を読み取り、従業員数のカウンターを 1 つインクリメントして、新しい従業員の情報と従業員数を表示します。

NAKAMA_Manager.cs

using UnityEngine;

public class NAKAMA_Manager : MonoBehaviour
{
    public void Start()
    {
        var employee1 = new Employee("一般人", 5);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee1.name}");
        Debug.Log($"HP: {employee1.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); //Employeeクラスにアクセス

        var employee2 = new Employee("パチュリー", 30000);
        Employee.AddEmployee();
        Debug.Log($"NAME: {employee2.name}");
        Debug.Log($"HP: {employee2.hp}");
        Debug.Log($"Employee数: {Employee.employeeCounter}"); 
    }
}

public class Employee //従業員
{
    public string name; //インスタンスされる度(newされる度)に生成される変数)
    public int hp; //インスタンスされる度(newされる度)に生成される変数)

    public Employee(string name, int hp)
    {
        this.name = name;
        this.hp = hp;
    }

    public static int employeeCounter; //クラスが持つ変数
    public static int AddEmployee() 
    {
        employeeCounter++;
        return employeeCounter;
    }
}

実行結果
image.png

まとめ

・クラスのメンバーを定義する時にstaticを付けると静的宣言、静的メソッドになる
・静的メンバーは、特定のオブジェクトではなく、型自体に属する
・インスタンスを取得せずともアクセスできるようになる

参考にしたサイト

4
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6