【C#】オブジェクト指向（クラスとオブジェクトの続き）

●はじめに

　こんにちは。
　今回は、プログラミングするうえでは避けては通れないオブジェクト指向について続きの説明をしていきたいと思います。
　私も初めて見たときは癖があって理解するのに時間がかかりましたがわかりやすく解説していきます。

「え、そもそもC#とか初めてなんだけど。。。」
「プログラミングの基礎がわからない。」

という方向けの記事ではないので以下のサイトの基本編を学んでからこの記事を読んでください。
[→一週間で身につくC#言語の基本](https://csharp.sevendays-study.com/)

「C#の配列変数くらいまでならできるよー」
って方でオブジェクト指向につまずいている方は是非、読んでください。

また、前回はクラスとオブジェクトの説明をしたので読んでいない方はこちらをご覧ください。
[→【C#】オブジェクト指向（クラスとオブジェクト）](https://qiita.com/hiroyuki-tabuchi/items/762e006a54be1d80e84e)
　
　
●フィールド
　前回は、以下のサンプルプログラムについて載せ、クラスの仕組みおよびインスタンスの生成まで説明しました。

```C#:Person.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test_CS
{
    class Person
    {
        // 名前（フィールド）
        public string name = "";
        // 年齢（フィールド）
        public int age = 0;
        // 情報の表示（メソッド）
        public void ShowAgeAndName()
        {
            Console.WriteLine("名前:{0} 年齢:{1}", name, age);
        }
        // 情報の設定
        public void SetAgeAndName(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    }
}
```

```C#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test_CS
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1, p2;
            // 1つ目のPersonクラスのメソッドのインスタンスを生成
            p1 = new Person();
            // 2つ目のPersonクラスのメソッドのインスタンスを生成
            p2 = new Person();
            p1.name = "山田太郎"; // フィールドnameに値を代入
            p1.age = 19; // フィールドageに値を代入
            // メソッドでnameとageを設定
            p2.SetAgeAndName("佐藤花子", 23);
            // それぞのインスタンスnameとageを表示
            p1.ShowAgeAndName();
            p2.ShowAgeAndName();
        }
    }
}
```

```C#:実行結果
名前:山田太郎 年齢:19
名前:佐藤花子 年齢:23
```
　
　前回説明した通り、クラスPersonには、フィールドとメソッドが存在します。まずは、フィールドから説明しましょう。Personクラスには、以下のフィールドが存在します。
| フィールド名 | 型 | 初期値 |
|:-:|:-:|:-:|
| age  | int  | 0  |
| name  | string  | ""  |

　フィールドには初期値を代入することが可能です。**初期値はインスタンス生成と同時に代入されます。**

```C#:
// 名前（フィールド）
public string name = "";
// 年齢（フィールド）
public int age = 0;
```
　これにより、インスタンスp1は、int型のageという変数と、string型のnameという変数をもつことができるようになります。Personクラスの外部であるProgram.csからは、以下のようにアクセスします。

```C#:
p1.name = "山田太郎"; // フィールドnameに値を代入
p1.age = 19; // フィールドageに値を代入
```

　「インスタンスが入った変数名、フィールド名」とすることにより、外部からアクセスすることが可能です。これにより、インスタンスp1のフィールドnameには"山田太郎"という文字列が、フィールドageには19という数値が代入されます。
　
　
●メソッド
　続いて、操作であるメソッドについて説明しましょう。メソッドは何らかのデータを外部から受け取り、それをもとに処理をして、実行結果を出力するというものです。

```C#:
public void ShowAgeAndName()
{
    Console.WriteLine("名前:{0} 年齢:{1}", name, age);
}
```

　このメソッドを呼び出しているのが以下です。

```C#:
p1.ShowAgeAndName();
p2.ShowAgeAndName();
```
 
　メソッドを呼び出す方法は以下のような書式になります。
```C#:
インスタンスが入った変数名.メソッド名(引数１,引数２...);
```

　引数というのは、メソッドを呼び出す際に与える情報のことです。必要のない場合は省略します。また、複数ある場合は、間をカンマで区切って与えます。
　ここで紹介した、ShowAgeAndName()メソッドは、引数のないメソッドなので()の中は空欄となっています。このメソッドはフィールドnameおよび、ageを表示します。p1に関しては、Program.csの18、19行目で、nameおよび、ageに「山田太郎」「19」を代入しているために、「名前：山田太郎 年齢：19」が出力されます。
　
　
●メソッドの引数
　では、p2の実行結果が「名前：佐藤花子 年齢：23」となるのは、なぜでしょう？これは、Personクラスのもう１つのメソッドである、SetAgeAndName()によるものです。
 
```C#:SetAgeAndNameメソッド
public void SetAgeAndName(string name, int age)
{
    this.name = name;
    this.age = age;
}
```

　このメソッドには、()内にカンマで区切って２つの変数が定義されています。この変数のことを、**引数（ひきすう）** といいます。この値は、このメソッドを呼び出すときに、外部から与えられます。
　
　
●自分自身のインスタンスを指すthis
　Person.csでは、この引数で与えられたnameおよびageを、フィールドであるnameとageに代入しています。この２つは同じ名前なので、それらを区別するために、フィールドの先頭にthisをつけています。
　thisは、**自分自身のインスタンスを表す記号**で、これを先頭につけることにより、その変数がフィールドであることを示しています。これにより、引数の値が同名のフィールドに代入されます。
　ただし、thisをつけなくてもよいケースも存在します。それは、すでに説明したShowAgeAndName()メソッドのようなケースです。このメソッドは、引数などでフィールドと同名の変数を使っていません。そのため、明確に区別しなくてもname、ageと書けば、フィールドであることは明白です。このような場合はthisがなくてもフィールドであることがわかるので、thisを省略しても問題がないのです。
　
　
●終わりに
　いかがでしたでしょうか。オブジェクト指向は初めのうちは感覚がつかみにくいところがありますが、コードを書いているうちに慣れてきますのでご安心ください。また、オブジェクト指向は今回のサンプルコードはベースになるものでカプセル化や継承、ポリモーフィズムなどを用いて書けるようになると応用が利くので機会があれば説明したいと思います。
　
　
【投稿者】
エンジニアファーストの会社 [株式会社CRE-CO](https://www.cre-co.jp/#top)　田渕浩之

【参考文献】
[→1週間でC#の基礎が学べる本](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7C-%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-1%E9%80%B1%E9%96%93%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BA%80%E7%94%B0-%E5%81%A5%E5%8F%B8/dp/4295007331/ref=sr_1_20?qid=1687129207&refinements=p_n_feature_seven_browse-bin%3A3332747051&s=books&sr=1-20)