VisualStudioでクラスを作成する
①プロジェクト→右クリック→「追加」→「クラス」
※フォルダに入れたい場合は先に「追加」→「新しいフォルダー」でフォルダを作り、そのフォルダを右クリック→「追加」→「クラス」
フォルダ名の例:Data
②クラス名を付けて「追加」クリック。
※クラス名はパスカルケースでつける。例:VirtualGirlfriend.cs
クラスの書き方(基本)
※以下の例のように、プロパティが簡潔な処理の場合、通常は②③を合わせた書き方である自動実装プロパティ(後述)を使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LoveLoveMemorial.Data { //①クラスの定義 internal class VirtualGirlfriend { //②フィールドの定義 private string _name; private int _favorability; //③プロパティの定義 public string Name { get{ return _name; } set{ _name = value; } } public int Favorability { get{ return _favorability; } set{ _favorability = value; } } //④コンストラクタ public VirtualGirlfriend(string name, int favorability) { this.Name = name; this.Favorability = favorability; } //⑤メソッド public void Print() { Console.WriteLine($"名前:{this.Name}"); Console.WriteLine($"好感度:{this.Favorability}"); } } } |
①クラスの定義
・クラスは、アクセス修飾子 class クラス名{}で定義する。
・{}の中にフィールドやメソッドなど(メンバー)を記述する。
・クラスの定義の上に書かれているnamespaceは名前空間(ネームスペース)といい、この名前空間の中にこのクラスが属することを表す。
・同じ名前空間の中では、同じ名前のクラスは定義できない。
・逆に、名前空間が違えば、同じ名前のクラスを定義できる。
・トップレベルのクラス(名前空間直下、またはファイル直下のクラス)のアクセス修飾子はpublicかinternalしか指定できない。
・ネストされたクラス(クラスの中のクラス)には5つのアクセス修飾子を使用できる。
アクセス修飾子(アクセシビリティ)
public | どこからでもアクセス可能 |
internal | 同じプログラムの中からのみアクセス可能 |
protected | 宣言した型の内部と、型から派生した型からのみアクセス可能 |
private | 宣言した型の内部からのみアクセス可能 |
protected internal | protectedの範囲とinternalの範囲を合わせた範囲からのみアクセス可能 |
②フィールドの定義
・フィールドとは、クラスのもつデータを格納する変数である。
・カプセル化の実現のために、基本的にprivateで定義する。
・フィールド変数であることがすぐにわかるよう、慣習的に変数名の先頭に‗をつけることが多い。
・フィールドのスコープは、そのフィールドが定義されているクラス全体に及ぶ。
・インスタンスの生成時に、インスタンスごとにメモリ上に確保される。
③プロパティの定義
・プロパティとは、クラスの外部から安全にフィールドにアクセス(値の読み書き)するための手段となる特殊なメソッド。
・上記のコードのような簡潔な処理のほか、入力チェックなどの複雑な処理も書ける。
・get … アクセサー。値の取得時に実行する処理。
・set … setアクセサー。値の書き込み時に実行する処理。渡された値をvalueで受け取り、フィールドに格納する。
・プロパティはクラスの外部からクラスにアクセスする手段であるため、基本的にpublicで定義する。
・クラスの内部でしか値をセットしない場合(クラスに定義されたメソッドを介してしか値をセットしない場合など)は set を private set にする。
④コンストラクタの定義
・コンストラクタとは、クラスのインスタンス化(実体化)の際に、自動的に呼び出される特殊なメソッドである。
・クラス名と同じ名前で定義する。
・コンストラクタは複数定義することができる。インスタンス化の際に与えられた引数に応じたコンストラクタが呼ばれる。
・引数で渡された値をフィールドに格納するなど、インスタンスの初期化の処理を書く。
・デフォルトコンストラクタ…コンストラクタを定義しない場合に内部的に必ず作成されるコンストラクタ。何の処理も行わない。独自にコンストラクタを定義した場合は使用されない。
thisキーワード
クラスのインスタンスへの参照を取得するキーワード。現在のインスタンスを表す。インスタンスメソッドを呼び出す際に隠し第1引数として暗黙的に渡される。
⑤メソッドの定義
・クラスのもつ「振る舞い(動作、機能など)」を定義する。
・呼び出し元に何らかの値を返す場合は、メソッド名の前に戻り値の型を記述する。戻り値がない場合はvoidを記述する。
クラスの書き方(自動実装プロパティを使用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LoveLoveMemorial.Data { //①クラスの定義 internal class VirtualGirlfriend { //private string _name; //private int _favorability; //public string Name //{ //get{ return _name; } //set{ _name = value; } //} //public int Favorability //{ //get{ return _favorability; } //set{ _favorability = value; } //} //②プロパティの定義(自動実装プロパティ) public string Name { get; set; } public int Favorability { get; set; } //③コンストラクタ public VirtualGirlfriend(string name, int favorability) { this.Name = name; this.Favorability = favorability; } //④メソッド public void Print() { Console.WriteLine($"名前:{this.Name}"); Console.WriteLine($"好感度:{this.Favorability}"); } } } |
①③④は上述「クラスの書き方(基本)」を参照
②プロパティの定義(自動実装プロパティ)
・プロパティの処理が基本的な値の受け渡しのみの場合、自動実装プロパティで簡潔に記述できる。
・public 型名 プロパティ名 { get; set; } で定義する。
・フィールドが内部的に生成される。このフィールドをバッキングフィールド、またはバックフィールドと呼ぶ。バッキングフィールドには直接アクセスすることはできない。
・{get; private set;} なども指定可能。
・コードスニペットで簡単に入力できる。
1.propと入力 → Tabキー2回
2.Tabキーで型にフォーカスし、型名を入力
3.Tabキーでプロパティ名にフォーカスし、プロパティ名を入力
4.エンターで決定
1 2 3 4 5 6 7 8 9 10 11 12 |
public string Name { get; set; } //自動実装プロパティ //上記のように記述すると //内部的に以下のコードが生成される private string _name; //バッキングフィールド(直接アクセス不可) public string Name { get{ return _name; } set{ _name = value; } } |
クラスの使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Program { static void Main(string[] args) { //①インスタンスを生成 var mariko = new VirtualGirlfriend("真理子",0); //②インスタンスのプロパティを呼び出す Console.WriteLine(mariko.Name); Console.WriteLine(mariko.Favorability); //③インスタンスのメソッドを呼び出す mariko.Print(); } } |
①インスタンスを生成
・クラスは単なる定義であるため、実体化しないと使えない。この実体をインスタンスという。
・インスタンスの生成はnewキーワードを使う。
・new に続けてクラスのコンストラクタを記述する。コンストラクタに引数がある場合は引数を指定する。
②インスタンスのプロパティを呼び出す
・インスタンス名.プロパティ名でプロパティの値を取得できる。