C#入門 基礎 クラスとインスタンスの生成とコンストラクタを解説

当サイトではアフィリエイト広告を利用しています。

C#初級プログラミング

クラスってよく聞きますよね。
オブジェクト指向言語には100%出てくる言葉です。
この言葉の意味が分かるまで私は恥ずかしながら何年かかかりました。
当時(2002年ごろ)は周りにオブジェクト指向を理解できてる先輩はほとんどいなかったので結局いろんなオブジェクト指向の本を読み漁り理解することになりました。

そんなコアな話は別のページでするとしてここでは初心者の方でもわかる内容で大事な2割をお伝えします。それでは早速やっていきましょう!

オブジェクト指向に関する解説はこちらのページでしています↓

オブジェクト指向設計
「オブジェクト指向設計」の記事一覧です。

クラスとは

クラスとは値とメソッドのひとかたまりです。
値はintやstringなどを学びましたね。
他から呼び出すことのできる処理です。

C#はオブジェクト指向言語と呼ばれる言語なので,処理をできるだけ細かくクラスというものに細分かして,各クラスが独立して値とメソッドを管理します。

なぜそんなことをするかというと,その方がわかりやすくて,修正とか機能追加がしやすい,他の人が見ても理解しやすい,などのメリットがありますが,初心者の方には非常に難しい話になると思います。

私もオブジェクト指向を理解するまでには時間がかかりました。
とりあえずクラスは「値」と「メソッド」のひとかたまりと覚えておいてください。

それでは実際にクラスを作成してみましょう。

クラスの作り方

「プロジェクト」右クリックで「追加」の「新しい項目」を選択します。

「クラス」を選択して「名前」を「Sum」にして「追加」を押下します。

これで,プロジェクトに「Sum」クラスが追加されました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp1
{
    class Sum
    {
    }
}

いま,Sumクラスはこのような感じになっています。
最初のusing5行はおまじないとおもって無視してください。
「namespace」は階層分けのためにあるのでこれもとりあえず無視します。  

class Sum{}

の部分がクラスの定義になります。

class Sum
{
}

今は作成したばかりなので,定義は何もありません。
ではここに値と処理を入れてみましょう。

class Sum
{
    public int ValueA;
    public int ValueB;

    public int ReturnValue()
    {
        return ValueA + ValueB;
    }
}

これで,値と処理が入りました。
「public」は外部から参照できることを示します。
外部から値を変えたり参照したい場合は「public」か「internal」を使用します。

「internal」は同一アセンブリからの参照が可能なのですが,この場合同一プロジェクトと考えてください。

「public」はプロジェクトが異なっても参照可能です。
それなら全部publicでいいのでは?と思われるかもしれませんが,publicの場合は外部に波及している影響範囲がわかりづらくなるというデメリットがあります。

同一プロジェクトでしか使用しないのであれば,Internalにすることで,例えばクラス名を変更した場合などは,コンパイルエラーが発生するため,コードの影響範囲がわかりやすくなります。

今回はpublicにしておきます。
publicのValueAとValueBがあります。
ReturnValueを呼び出すとValueAとValueBを足した値が返却されます。
これはただそれだけのクラスになります。

インスタンスの生成

作成したSumクラスを呼び出してみましょう。

Sum sum = new Sum();
sum.ValueA = 10;
sum.ValueB = 20;
int result = sum.ReturnValue();
Console.WriteLine(result);

「Sum sum = new Sum();」の部分でSumクラスのインスタンスを生成しています。

インスタンスとはクラスを使える状態にするという事です。
これから先クラスというのは使える状態にしないと使えないことを覚えておいてください。

使える状態の事をインスタンスと呼んでいます。
クラスはインスタンスにしないと使えません。
インスタンスにするにはnewキーワードを使います。
新しいSumクラスをsumという名前で生成するという意味になります。

C#は大文字と小文字を区別するため,このようにクラス名の頭文字を小文字にしてインスタンス名することが多いです。

出来立てのSumクラスはValueAもValueBも初期値が入っています。
そのあとValueAとValueBにそれぞれ10と20の値を入れています。

SumクラスでValueAとValueBをpublicにしているため,異なるクラスであるForm1クラスからも参照できます。

試しにValueAをprivateに変更すると見えなくなります。
興味のある方はお試しください。

ReturnValue()ではValueAとValueBを足した値が返却されますから,resultには「30」が設定され,コンソールに30と表示されます。
これでクラスをインスタンスにするやり方と,使い方がわかりましたね。

「こんなクラスを作らなくてもフォーム画面などにValueAとValueBとReturnValue()の関数を書けばいいじゃないの?」と思われるかもしれませんが,これには訳があります。

今回はAとBを足すという非常に単純な処理ですが,「ValueAとValueBを足して消費税をかけて,シルバー会員のときは10%OFFにする」という仕様だった場合,各画面で処理を行うと,いろんなところに同じようなメソッドが散らばる可能性があります。

その場合,仕様が変わって20%OFFとなった時,あらゆるところを直さないといけなくなります。
それをSumクラスに処理を記載していれば,Sumクラスの修正だけで済みます。

このようにオブジェクト指向では1つ1つのクラスに分けて,専門的な処理をさせていきます。

消費税と20%OFFの概念を入れるとこんな感じになります。

class Sum
{
    private float _tax = 0.08f;
    private float _discount = 0.2f;

    public int ValueA;
    public int ValueB;

    public int ReturnValue()
    {
        var value = ValueA + ValueB;
        var taxValue = value * _tax;
        var discountValue = value * _discount;
        return Convert.ToInt32(value + taxValue - discountValue);
    }
}

クラスを作成することでディスカウントや消費税の概念が1か所に集まるので,より良いコーディングなります。

コンストラクタとは

今回はValueAとValueBをpublicにして画面クラスから設定しましたが,Sumクラスを生成する時点で値が判明しているのであれば,クラス生成時に設定が可能です。

クラス生成時に動作する処理部分をコンストラクタと呼んでいます。

class Sum
{
    private float _tax = 0.08f;
    private float _discount = 0.2f;

    private int _valueA;
    private int _valueB;

    public Sum(int valueA,int valueB)
    {
        _valueA = valueA;
        _valueB = valueB;
    }

    public int ReturnValue()
    {
        var value = _valueA + _valueB;
        var taxValue = value * _tax;
        var discountValue = value * _discount;
        return Convert.ToInt32(value + taxValue - discountValue);
    }
}

public Sum(int valueA,int valueB)の部分がコンストラクタといわれる部分です。
publicの後にvoidや戻り値の型を書かずに,クラス名を書くとコンストラクタになります。

引数のvalueA,valueBはSumクラス生成時に指定する必要がる引数という意味になります。
この部分に値を設定してクラスのインスタンスを生成します。
publicで宣言していたValueAとValueBがprivateの_valueA,_valueBになっていることに注目してください。

コンストラクタで値を設定することで,外部からの設定が不要になり,publicをprivateに変更できました。

これで_valueA,_valueBはこのクラスでしか使用しない非常に見通しのよい変数になりました。

クラスの中の変数をprivateにして外部から参照できないようにするプログラミング手法を「カプセル化」と呼びます。

C#の慣例でprivate変数は頭文字小文字,開発チームによってはアンダーバーを付けることがよくあります。

この変更により呼び出し元のコードは次のようになります。

Sum sum = new Sum(10, 20);
int result = sum.ReturnValue();
Console.WriteLine(result);

Sumをnewするタイミングで値を設定しています。
これでSumクラスは「消費税」と「割引率」という値と「それをどう計算するか」という

メソッドが1つになったクラスとなり,大変意味のある機能となりました。
これで画面が100画面あろうとSumクラスがいつも同じ計算をしてくれます。