UnsplashのMike Kotschが撮影した写真
目次
業務でC#を扱うことになり、C#の基礎の部分について備忘録を兼ねて記事を作成しています。
C#の基礎の大部分は以下のページにまとめていて、この記事ではクラスについてまとめています。
https://tekutekku.com/csharp_basic_1/
そもそもクラスとは何?必要?という疑問もあるかと思いますので、クラスの何が便利かを簡単にまとめます。
プログラミングでは、「値を保存したいなら変数」、「処理を保存したいなら関数」を使います。
しかし、規模が大きくなってくると変数、関数が多くなり整理する必要が出てきます。
この「変数、関数が多くなり整理」できるのがクラスです。
役割ごとに変数、関数をクラスとまとめることでグループ化ができます。
クラスは基本的に別ファイルに記述し、処理の中で適宜呼び出して使いますが、
以下はクラスの使い方の概要をわかりやすくするためにファイル分けを無視して、クラスを使う際の基本的なコードを書いています。
//名前空間の定義(クラス、ファイルを呼び出すときのキーワード)
namespace 名前空間;
//クラスの定義
アクセス修飾子 class クラス名{
//プロパティの定義
アクセス修飾子 データ型 プロパティ名;
//メソッドの定義
アクセス修飾子 戻り値の型 メソッド名(){
//処理内容
}
}
//クラスの呼出
using 名前空間;
//インスタンス化
クラス名 インスタンス変数名 = new クラス名();
//プロパティの呼出
Console.WriteLine(インスタンス変数名.プロパティ名);
//メソッドの呼び出し
インスタンス変数名.メソッド名();
例)
//名前空間の定義(クラス、ファイルを呼び出すときのキーワード)
namespace Sample;
//クラスの定義
public class SayHello{
//プロパティの定義
public string name = "taro";
//メソッドの定義
public void hello(){ //↓自クラスのプロパティは「this.プロパティ名」で呼び出す。
Console.WriteLine($"Hello!! {this.name}");
}
}
//クラスの呼出
using Sample;
//インスタンス化
FirstClass obj = new FirstClass();
//プロパティの呼出 ※「taro」と出力される
Console.WriteLine(obj.name);
//メソッドの呼び出し ※「Hello taro」と出力される
obj.hello();
続いて、クラスを実際に使う例です。
ここではクラスを別ファイルに記述し、Program.csで呼び出して使ってみます。
今回は「FirstClass.cs」というファイルを作成してクラスを定義し、Program.csで呼び出してみます。
手順1.FirstClass.csをProgram.csと同じ階層に作成し、以下を書き込んでください。
//名前空間の定義(クラス、ファイルを呼び出すときのキーワード)
namespace Sample;
//クラスの定義
public class FirstClass{
//プロパティの定義
public string name = "taro";
//メソッドの定義
public void hello(){
Console.WriteLine($"{this.name} Hello!!");
}
}
手順2.Program.csに以下のように記述してください。
//クラスの呼出
using Sample;
//インスタンス化
FirstClass obj = new FirstClass();
Console.WriteLine(obj.name);
obj.hello();
Program.csにデフォルトで記述されているコードは全て削除していただいて問題ありません。
F5キーで実行し、以下のように出力されれば成功です。
taro
taro Hello!!
クラス内に定義するメソッドで、インスタンス生成時に自動で呼び出される特殊なメソッドのこと。
以下のように使います。
■定義
namespace 名前空間;
アクセス修飾子 class クラス名{
//コンストラクタの定義
アクセス修飾子 クラス名(データ型 引数){
~コンストラクタの処理を記述する~
}
}
コンストラクタはクラス名をそのままメソッド名として使います。
また、戻り値の型の指定はしません。
■コンストラクタを使う
using 名前空間;
クラス名 インスタンス変数名 = new クラス名(引数); //⇐このタイミングでコンストラクタ実行!
コンストラクタはインスタンス化の際に自動で実行されます。
コンストラクタに渡す引数は「new クラス名(引数)」の部分で渡します。
例)
■定義
namespace Sample;
public class SayHello{
public string name;
//コンストラクタの定義
public SayHello(string name){
this.name = name; //プロパティに値をセット
Console.WriteLine($"{this.name} Hello!!");
}
}
■コンストラクタを使う
using Sample;
SayHello obj = new SayHello("taro");
出力:taro Hello!!
クラスは親子関係を持たせることができ、
親クラスで定義したメソッドを子クラスで呼び出したりできます。
やり方は簡単でクラス定義時に以下のように書くことで継承できます。
public 子クラス名:親クラス名{
}
例)
namespace Sample;
//親クラスの定義
public class ParentClass{
public void hello(){
Console.WriteLine("Hello!!");
}
}
//子クラスの定義
public class ChildClass:ParentClass{
}
using Sample;
//子クラスをインスタンス化
ChildClass obj = new ChildClass();
//親クラスのhelloメソッドを呼び出す。
obj.hello();
出力:Hello!!
以降では「名前空間」や「プロパティ」、「メソッド」などクラスについて調べるとよく出会う用語について、厳密ではないけど簡単に解説しています。
クラスに定義した変数のことです。
クラスに定義した関数のことです。
クラスは変数、関数を整理するものとお伝えしましたが、それだけでなく、クラスの持つ便利な特徴としてインスタンス化があります。
クラスは、クラスに定義したプロパティとメソッドをそのまま使うのではなく、「インスタンス」というクラスのコピーを作成して使います。
どんな時にインスタンス化の機能が便利かと言うと、
クラスとしてDB操作をする処理を作成したとします。
クラス、インターフェースなどをグループ化するための仕組みです。
名前空間を使うと以下のようなメリットがあります。
■グループ化と整理
関連する型(クラス、インターフェースなど)をまとめることで、大規模なプロジェクトでもコードが見やすくなります。
■名前の衝突の回避
異なる名前空間内で同じ名前の型(クラス名、インターフェース名など)を使用できます。
これにより、同じ名前を使用しても、名前空間が異なればコンパイラが正しく解釈し、名前の衝突を回避できます。
以下によく使う3つを記載します。
・public:どこからでも呼び出せる
・proctected:同じクラス内及びこのクラスを継承したクラスの処理で呼び出せる
・private:同じクラス内の処理でしか呼び出せない
Microsoft公式にアクセス修飾子の解説があったので、以下にリンクを載せておきます。
参考ページ:
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/access-modifiers
子クラスで親クラスのプロパティやメソッドを上書きして定義できる機能で、子クラスの柔軟性がたかまります。
クラスについては以上です。