• ホーム
  • C#
  • C#のクラスとインスタンスとオブジェクト

C#のクラスとインスタンスとオブジェクト

「クラスってサブルーチンみたいなもの?」みたいな感覚のままC#で色々作ってみようとして調べてたら、やっぱりクラスについてちょっと勉強しないとダメな感じがしてきましたので、メモっておきます。

目次

  1. クラスの定義
  2. インスタンスとオブジェクトは何が違う?
  3. クラスからインスタンスを生成する
  4. クラスに含まれるものは?
    1. フィールド
    2. メソッド
    3. コンストラクター
    4. プロパティ

クラスの定義

MSDNのプログラミングガイドによると、クラスはデータと動作を一つにまとめたもので、オブジェクトやインスタンスの設計図のようなものと書かれています。部品(オブジェクト)を生成する金型のようなものですね。

インスタンスとオブジェクトは何が違う?

C#のプログラミングのいろいろな解説を読んでると、クラスから生成したものをインスタンスと呼んだりオブジェクトと呼んだり、本やサイトによってまちまちです。何が違うのでしょうか。 困ったときのWikipediaですが、クラスによって生成されたオブジェクトの実態をインスタンスと呼ぶとのことです。つまりオブジェクトというのはそこにある物や事柄を示すものであって、必ずしもクラスから生成されるわけではないものです。数多あるオブジェクトのうち、クラスから生成された物をインスタンスと呼びます。 160121-1-01

クラスからインスタンスを生成する

クラスの宣言は下記のようにします。publicはスコープを表す修飾子です。

public class Hogehoge
{
    //ここに色々書く
}

インスタンスを生成するには、newというキーワードを使います。

Hogehoge objectName = new Hogehoge();

Hogehogeクラスのインスタンスが生成され、objectNameという変数にそのインスタンスへの参照が入れられます。Hogehogeという名前の金型(クラス)でパーツ(インスタンス)を作って、その保管場所(参照)をobjectNameという台帳(変数)に書いておくという感じですね。

クラスに含まれるものは?

「クラスはデータと動作をまとめたもの」ということは、クラスに含まれる物は何種類かあります。ひっくるめてメンバーと呼ぶようです。MSDNに一覧表があります。

メンバー

説明

フィールド

クラス内だけで使用される変数

定数

変更不可なフィールドまたはプロパティ

プロパティ

フィールドの値の読み取り/書き込み/計算をする特殊なメソッド

メソッド

クラスが実行できる動作の定義で、パラメータの受け取りと出力データを返すことができる

イベント

他のオブジェクトに、何かが起きたことを通知する

演算子

オーバーロードされた演算子はメンバーとみなす

インデクサ-

インスタンスに配列のようなインデックスを付けられる

コンストラクター

インスタンスを生成するときに呼び出されるメソッド

デストラクタ-

インスタンスがメモリから削除されるときに呼び出されるメソッド

入れ子にされた型

別の型で宣言された型

使う頻度が高そうなのは、フィールドとプロパティとメソッドとイベントとコンストラクターでしょうか。

フィールド

クラス内を通して使用される変数です。

public class Hogehoge
{
    private string _piyo; // フィールド

    public string Foo; // これもできるけど非推奨
}

クラス内の各メソッドからアクセスできます。静的でないフィールドはインスタンス毎に固有のものになります。静的フィールドにすると、そのクラスの全てのインスタンスが共有する変数になります。publicにもできるけれども、非推奨だそうです。MSDNとしては、インスタンスから外に公開するデータは、メソッドかプロパティかインデクサ-で提供するように書かれています。 インスタンスのフィールドへのアクセスには、ドットを使います。

Hogehoge objectName = new Hogehoge();
objectName.Foo = "Bar";

オブジェクトを生成したときに、最初にフィールドが初期化され、その後にコンストラクターが実行されます。

メソッド

メソッドには動作を定義します。引数と戻り値を設定できます。メソッド名に続く括弧内に引数の定義を書きます。returnキーワードに続けて戻り値を書きます。

public class Hogehoge
{
    public string Fumo(string athlete) // メソッド
    {
        if (athlete == "きせのん")
        {
            return "アレ";
        }
        else
        {
            return athlete;
        }
    }
}

インスタンスのメソッドにアクセスするには、ドットを使います。

string returnedValue = "";
Hogehoge objectName = new Hogehoge();
returnedValude = objectName.Fumo("ゆづ");

コンストラクター

インスタンスを生成するときに自動的に呼び出されるメソッドです。メソッドの名前をクラスと同じ名前にします。インスタンスのフィールドを初期化したりするときに利用します。引数を定義できます。

public class Hogehoge
{
    public string Foo; // フィールドの定義

    public void Hogehoge(string athlete) // コンストラクター
    {
        Foo = athlete;
    }
}

こういう場合、インスタンスを生成するときは下記のように引数を渡します。

Hogehoge objectName = new Hogehoge("ゆづ"); // 引数を渡してインスタンスを生成する
string returnedValue = objectName.Foo; // retuenedValueに「ゆづ」が入るはず

プロパティ

getアクセサー/setアクセサーの両方あるいはいずれかを持つメソッドです。インスタンスを使う側からは、フィールドのようにアクセスできます。外からはインスタンスのフィールドのように簡単にアクセスできるけど、内部ではデータの受け渡しと同時にプログラムが実行されるようになっているという感じです。 getアクセサーはプロパティの値を取得する場合に、setアクセサーはプロパティに値を設定する場合に使用します。ですから、getアクセサーにはreturnキーワードが必要になります。また、setアクセサーはvoidのメソッドのようなものになります。

public class Hogehoge
{
    private string _piyo; // フィールドの定義

    public string Fumo // プロパティ
    {
        get
        {
            return _piyo;
        }
        set
        {
            _piyo = value;
        }
    }
}

こんな感じでアクセスします。

Hogehoge objectName = new Hogehoge(); // インスタンスを生成する
objectName.Fumo = "ゆづ"; // setアクセサーが実行される
string returnedValue = objectName.Fumo; // getアクセサーが実行される

インスタンスを使う側からするとまるで変数のようですね。でも、インスタンス内部での処理はまるでメソッドのようです。

公開日

広告