C#のクラスとメソッドを基礎から解説|定義・呼び出し方・使い方がわかる入門ガイド

はじめに

C#を学び始めると、早い段階で「クラス」や「メソッド」という言葉が出てきます。どちらもC#プログラミングの基本となる重要な仕組みですが、初心者のうちは「クラスとは何か」「メソッドはどこに書くのか」「どうやって呼び出すのか」がわかりにくいと感じることも多いでしょう。

C#では、処理をただ上から順番に書くだけでなく、クラスというまとまりの中にデータや処理を整理して書きます。そして、具体的な処理はメソッドとして定義し、必要なタイミングで呼び出して使います。

この記事では、C#のクラスとメソッドについて、定義方法、呼び出し方、使い分け、よくあるエラーまで基礎からわかりやすく解説します。これからC#を学ぶ初心者の方でも理解しやすいように、サンプルコードを交えながら順番に説明していきます。

1. C#のクラスとメソッドとは?まず押さえる基礎知識

C#のクラスとメソッドを理解するには、まずそれぞれの役割を分けて考えることが大切です。

クラスは、データや処理をまとめるための設計図です。一方、メソッドは、クラスの中に書かれる具体的な処理のまとまりです。

たとえば「車」をプログラムで表す場合、車の名前、速度、色などの情報をクラスに持たせ、走る、止まる、加速するなどの処理をメソッドとして定義します。

C#では、このようにクラスとメソッドを組み合わせてプログラムを作っていきます。

1-1. C#におけるクラスの役割

C#におけるクラスは、関連するデータや処理をひとつにまとめるための仕組みです。

たとえば、ユーザー情報を扱うプログラムでは、名前、年齢、メールアドレスなどのデータをまとめて管理したい場面があります。このようなときにクラスを使うと、ユーザーに関する情報や処理をひとつのまとまりとして扱えます。

C#
class User
{
public string Name;
public int Age;
}

この例では、Userというクラスを定義しています。NameAgeは、ユーザーに関するデータです。

クラスを使うことで、プログラムの構造が整理され、後から見ても何を表しているのかがわかりやすくなります。

1-2. C#におけるメソッドの役割

メソッドは、特定の処理をひとまとめにしたものです。

たとえば、画面にメッセージを表示する処理、計算する処理、データを保存する処理などをメソッドとして定義できます。

C#
class Message
{
public void Show()
{
Console.WriteLine("こんにちは");
}
}

この例では、Showというメソッドを定義しています。Showメソッドを呼び出すと、画面に「こんにちは」と表示されます。

メソッドを使うことで、同じ処理を何度も書かずに済みます。また、処理の役割ごとに分けられるため、コードが読みやすくなります。

1-3. クラスとメソッドの関係

C#では、基本的にメソッドはクラスの中に定義します。

C#
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

このコードでは、Calculatorというクラスの中に、Addというメソッドがあります。Addメソッドは、2つの数値を受け取り、その合計を返します。

つまり、クラスは大きなまとまりであり、メソッドはその中にある処理のまとまりです。

クラスとメソッドの関係をイメージすると、クラスは「箱」、メソッドはその箱の中に入っている「機能」と考えるとわかりやすいでしょう。

1-4. オブジェクト指向プログラミングとのつながり

C#はオブジェクト指向プログラミングを基本とする言語です。

オブジェクト指向とは、プログラムで扱うものを「オブジェクト」として考え、データと処理をまとめて管理する考え方です。

クラスはオブジェクトの設計図であり、クラスから作られた実体をインスタンスと呼びます。メソッドは、そのオブジェクトが持つ動作を表します。

たとえば、Carクラスから作られた車のインスタンスに対して、Runメソッドを呼び出すことで「走る」という処理を実行できます。

C#
class Car
{
public void Run()
{
Console.WriteLine("車が走ります");
}
}

このように、C#のクラスとメソッドは、オブジェクト指向プログラミングを理解するうえで欠かせない基本要素です。

2. C#のクラスの基本構文と定義方法

C#でクラスを使うには、まずクラスを定義する必要があります。クラス定義の基本形を覚えておくと、さまざまなプログラムで応用できます。

2-1. クラスを定義する基本形

C#でクラスを定義する基本形は次のとおりです。

C#
class クラス名
{
// フィールド
// プロパティ
// メソッド
}

実際の例を見てみましょう。

C#
class Person
{
public string Name;

public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

このコードでは、Personというクラスを定義しています。クラスの中には、Nameというフィールドと、SayHelloというメソッドがあります。

C#では、クラスの中に関連するデータや処理を書きます。これにより、プログラム全体を整理しやすくなります。

2-2. クラス名の付け方と命名ルール

C#のクラス名は、一般的にパスカルケースで書きます。

パスカルケースとは、単語の先頭を大文字にする書き方です。

C#
class User
{
}

class UserProfile
{
}

class ProductManager
{
}

クラス名は、そのクラスが何を表しているのかがわかる名前にすることが大切です。

悪い例として、次のような名前は避けたほうがよいでしょう。

C#
class Data
{
}

class Test
{
}

class A
{
}

これらの名前は、何を扱うクラスなのかがわかりにくくなります。

一方で、次のような名前であれば役割が伝わりやすくなります。

C#
class Customer
{
}

class Order
{
}

class InvoiceCalculator
{
}

C#のクラス名は、読みやすさと意味のわかりやすさを意識して付けることが重要です。

2-3. フィールド・プロパティ・メソッドの配置

クラスの中には、主にフィールド、プロパティ、メソッドを配置します。

フィールドは、クラスが持つデータです。

C#
private string name;

プロパティは、データを安全に読み書きするための仕組みです。

C#
public string Name { get; set; }

メソッドは、処理を定義するためのものです。

C#
public void ShowName()
{
Console.WriteLine(Name);
}

これらを組み合わせると、次のようなクラスになります。

C#
class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}

public void ShowName()
{
Console.WriteLine(Name);
}
}

最近のC#では、簡潔に書ける自動実装プロパティもよく使われます。

C#
class Person
{
public string Name { get; set; }

public void ShowName()
{
Console.WriteLine(Name);
}
}

初心者のうちは、クラスの中には「データ」と「処理」が入ると理解しておくとよいでしょう。

2-4. public・privateなどのアクセス修飾子

C#では、クラスやメソッド、フィールド、プロパティにアクセス修飾子を付けることができます。

アクセス修飾子は、その要素をどこから使えるかを決めるものです。

よく使うアクセス修飾子には、次のようなものがあります。

publicは、どこからでもアクセスできることを意味します。

C#
public string Name { get; set; }

privateは、同じクラスの中からだけアクセスできることを意味します。

C#
private int age;

クラスの外から使いたいメソッドにはpublicを付け、クラス内部だけで使うデータや処理にはprivateを付けることが多いです。

C#
class Person
{
private int age;

public void SetAge(int value)
{
if (value >= 0)
{
age = value;
}
}

public int GetAge()
{
return age;
}
}

この例では、ageフィールドをprivateにして、外部から直接変更できないようにしています。その代わり、SetAgeメソッドとGetAgeメソッドを通じて値を扱います。

アクセス修飾子を使うことで、データを安全に管理しやすくなります。

3. C#のメソッドの基本構文と作り方

メソッドは、C#で処理を整理するための基本です。メソッドを使えるようになると、同じ処理を再利用したり、長い処理をわかりやすく分けたりできます。

3-1. メソッドを定義する基本形

C#でメソッドを定義する基本形は次のとおりです。

C#
アクセス修飾子 戻り値の型 メソッド名(引数)
{
// 実行する処理
}

具体的な例を見てみましょう。

C#
public void SayHello()
{
Console.WriteLine("こんにちは");
}

このメソッドは、呼び出されると画面に「こんにちは」と表示します。

publicはアクセス修飾子、voidは戻り値がないこと、SayHelloはメソッド名です。

メソッドは、クラスの中に書きます。

C#
class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

このように、C#のメソッドは「どこから呼び出せるか」「何を返すか」「どんな名前か」「どんな引数を受け取るか」を決めて定義します。

3-2. 戻り値のあるメソッドとvoidメソッド

メソッドには、戻り値があるものとないものがあります。

戻り値がないメソッドでは、voidを使います。

C#
public void ShowMessage()
{
Console.WriteLine("メッセージを表示します");
}

このメソッドは処理を実行するだけで、値を返しません。

一方、戻り値があるメソッドでは、戻す値の型を指定します。

C#
public int GetNumber()
{
return 10;
}

このメソッドは、int型の値を返します。

呼び出し側では、戻り値を変数に代入できます。

C#
int number = GetNumber();
Console.WriteLine(number);

戻り値があるメソッドは、計算結果や判定結果などを呼び出し元に返したいときに使います。

C#
public bool IsAdult(int age)
{
return age >= 20;
}

この例では、年齢が20以上ならtrue、そうでなければfalseを返します。

3-3. 引数を使うメソッドの書き方

引数とは、メソッドに渡す値のことです。

メソッドに引数を使うと、外部から値を受け取って処理できます。

C#
public void SayHello(string name)
{
Console.WriteLine(name + "さん、こんにちは");
}

このメソッドは、nameという文字列を受け取り、その名前を使ってメッセージを表示します。

呼び出すときは、次のように値を渡します。

C#
SayHello("田中");

実行結果は次のようになります。

田中さん、こんにちは

引数は複数指定することもできます。

C#
public int Add(int a, int b)
{
return a + b;
}

このメソッドは、abを受け取り、その合計を返します。

C#
int result = Add(3, 5);
Console.WriteLine(result);

実行結果は次のとおりです。

8

引数を使うことで、同じメソッドでも渡す値によって異なる結果を得られます。

3-4. return文の使い方

return文は、メソッドから値を返すときに使います。

C#
public int Add(int a, int b)
{
return a + b;
}

この例では、a + bの計算結果を呼び出し元に返しています。

戻り値の型がintの場合は、int型の値を返す必要があります。

C#
public string GetMessage()
{
return "こんにちは";
}

このメソッドでは、戻り値の型がstringなので、文字列を返しています。

voidメソッドでは、基本的に値を返すreturnは使いません。ただし、処理を途中で終了するためにreturn;だけを書くことはできます。

C#
public void CheckNumber(int number)
{
if (number < 0)
{
Console.WriteLine("負の数です");
return;
}

Console.WriteLine("0以上の数です");
}

この例では、numberが負の数の場合、メッセージを表示してメソッドを終了します。

return文は、メソッドの結果を返すだけでなく、処理の流れを制御するためにも使われます。

3-5. メソッド名の付け方と命名ルール

C#のメソッド名も、一般的にはパスカルケースで書きます。

C#
public void ShowMessage()
{
}

public int CalculateTotal()
{
return 0;
}

public bool IsValid()
{
return true;
}

メソッド名は、そのメソッドが何をするのかがわかる名前にしましょう。

たとえば、合計金額を計算するメソッドなら、次のような名前が適しています。

C#
CalculateTotal

ユーザー名を表示するメソッドなら、次のような名前がわかりやすいです。

C#
ShowUserName

避けたほうがよい名前は、意味があいまいなものです。

C#
public void Do()
{
}

public void Execute()
{
}

public void Test()
{
}

これらの名前は、処理内容が伝わりにくくなります。

C#のメソッド名は、動詞から始めると役割がわかりやすくなります。たとえば、ShowGetSetCalculateCreateCheckなどがよく使われます。

4. クラス内でメソッドを呼び出す方法

メソッドは、定義しただけでは実行されません。実際に処理を動かすには、メソッドを呼び出す必要があります。

C#では、メソッドの種類や場所によって呼び出し方が変わります。

4-1. 同じクラス内のメソッドを呼び出す

同じクラス内にあるメソッドは、メソッド名を書くだけで呼び出せます。

C#
class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}

public void Start()
{
SayHello();
}
}

この例では、Startメソッドの中からSayHelloメソッドを呼び出しています。

同じクラス内であれば、通常はクラス名やインスタンス名を付けなくてもメソッドを呼び出せます。

複数の処理をメソッドに分けて、ひとつのメソッドから順番に呼び出すこともできます。

C#
class Process
{
public void Run()
{
Step1();
Step2();
Step3();
}

private void Step1()
{
Console.WriteLine("処理1");
}

private void Step2()
{
Console.WriteLine("処理2");
}

private void Step3()
{
Console.WriteLine("処理3");
}
}

このように書くと、Runメソッドを見るだけで処理の流れがわかりやすくなります。

4-2. インスタンスを作成してメソッドを呼び出す

クラスのメソッドを外部から使う場合は、クラスのインスタンスを作成して呼び出すのが基本です。

C#
class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

このクラスのSayHelloメソッドを呼び出すには、次のようにインスタンスを作成します。

C#
Greeting greeting = new Greeting();
greeting.SayHello();

new Greeting()によって、Greetingクラスのインスタンスが作成されます。そして、作成したインスタンスの後にドットを付けてメソッドを呼び出します。

C#
インスタンス名.メソッド名();

これが、C#でインスタンスメソッドを呼び出す基本形です。

4-3. staticメソッドを呼び出す

staticが付いたメソッドは、インスタンスを作成せずに呼び出せます。

C#
class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
}

このAddメソッドはstaticメソッドです。呼び出すときは、クラス名を使います。

C#
int result = MathHelper.Add(3, 5);
Console.WriteLine(result);

staticメソッドの呼び出し方は次の形です。

C#
クラス名.メソッド名();

staticメソッドは、特定のインスタンスに依存しない処理に向いています。たとえば、計算処理や文字列の変換処理などです。

4-4. Mainメソッドからクラスのメソッドを使う

C#のコンソールアプリでは、Mainメソッドがプログラムの開始地点になります。

C#
class Program
{
static void Main(string[] args)
{
Greeting greeting = new Greeting();
greeting.SayHello();
}
}

class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

この例では、Mainメソッドの中でGreetingクラスのインスタンスを作成し、SayHelloメソッドを呼び出しています。

実行結果は次のとおりです。

こんにちは

Mainメソッドはstaticメソッドなので、非staticメソッドを直接呼び出すことはできません。そのため、インスタンスを作成してからメソッドを呼び出します。

一方、呼び出したいメソッドがstaticであれば、インスタンスを作らずに呼び出せます。

C#
class Program
{
static void Main(string[] args)
{
Greeting.SayHello();
}
}

class Greeting
{
public static void SayHello()
{
Console.WriteLine("こんにちは");
}
}

この場合は、Greeting.SayHello()のようにクラス名から直接呼び出せます。

5. インスタンスメソッドとstaticメソッドの違い

C#のメソッドには、大きく分けてインスタンスメソッドとstaticメソッドがあります。この違いは、初心者がつまずきやすいポイントです。

5-1. インスタンスとは何か

インスタンスとは、クラスをもとに作られた実体のことです。

クラスは設計図、インスタンスはその設計図から作られた具体的なものと考えるとわかりやすいです。

C#
class Person
{
public string Name { get; set; }
}

このPersonクラスから、次のようにインスタンスを作成できます。

C#
Person person1 = new Person();
person1.Name = "田中";

Person person2 = new Person();
person2.Name = "佐藤";

person1person2は、どちらもPersonクラスから作られたインスタンスです。しかし、それぞれ別のデータを持っています。

C#
Console.WriteLine(person1.Name);
Console.WriteLine(person2.Name);

実行結果は次のようになります。

田中
佐藤

このように、インスタンスごとに異なる状態を持てることが、クラスを使う大きなメリットです。

5-2. インスタンスメソッドの特徴

インスタンスメソッドは、インスタンスに対して呼び出すメソッドです。

C#
class Person
{
public string Name { get; set; }

public void Introduce()
{
Console.WriteLine("私の名前は" + Name + "です");
}
}

このIntroduceメソッドは、インスタンスのNameプロパティを使っています。

C#
Person person = new Person();
person.Name = "田中";
person.Introduce();

実行結果は次のとおりです。

私の名前は田中です

インスタンスメソッドは、インスタンスごとのデータを使う処理に向いています。

たとえば、ユーザーの名前を表示する、商品の価格を計算する、銀行口座の残高を変更するなど、個別の状態に関係する処理ではインスタンスメソッドを使います。

5-3. staticメソッドの特徴

staticメソッドは、インスタンスを作成しなくても呼び出せるメソッドです。

C#
class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}

呼び出すときは、クラス名を使います。

C#
int result = Calculator.Add(10, 20);
Console.WriteLine(result);

実行結果は次のとおりです。

30

staticメソッドは、特定のインスタンスの状態に依存しない処理に向いています。

たとえば、単純な計算、日付の変換、文字列の整形などはstaticメソッドとして定義されることがあります。

ただし、staticメソッドの中からインスタンスのフィールドやプロパティを直接使うことはできません。

C#
class Sample
{
public string Name { get; set; }

public static void ShowName()
{
// Console.WriteLine(Name); // エラー
}
}

staticメソッドはインスタンスに属していないため、インスタンスごとのデータを直接扱えないのです。

5-4. 使い分けの判断基準

インスタンスメソッドとstaticメソッドは、次のように使い分けると考えやすくなります。

インスタンスごとのデータを使う場合は、インスタンスメソッドを使います。

C#
class User
{
public string Name { get; set; }

public void ShowName()
{
Console.WriteLine(Name);
}
}

特定のインスタンスに依存しない処理の場合は、staticメソッドを使います。

C#
class TaxCalculator
{
public static int AddTax(int price)
{
return (int)(price * 1.1);
}
}

判断に迷ったときは、「この処理は個別のデータを使うか」を考えるとよいでしょう。

たとえば、ユーザーごとの名前や年齢を使うならインスタンスメソッドです。単純に2つの数値を足すだけならstaticメソッドでも問題ありません。

5-5. 初心者が混同しやすいポイント

初心者がよく混同するのは、staticメソッドからインスタンスメソッドを直接呼び出そうとするケースです。

C#
class Program
{
static void Main(string[] args)
{
SayHello(); // エラー
}

public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

Mainメソッドはstaticですが、SayHelloメソッドはインスタンスメソッドです。そのため、直接呼び出すことはできません。

この場合は、インスタンスを作成して呼び出します。

C#
class Program
{
static void Main(string[] args)
{
Program program = new Program();
program.SayHello();
}

public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

または、SayHelloメソッドをstaticにします。

C#
class Program
{
static void Main(string[] args)
{
SayHello();
}

public static void SayHello()
{
Console.WriteLine("こんにちは");
}
}

どちらが正しいかは、メソッドがインスタンスのデータを使うかどうかで判断します。

6. クラスとメソッドを使った実践コード例

ここからは、C#のクラスとメソッドを使った実践的なコード例を見ていきます。基本構文を理解したら、実際にコードを書いて動かすことで理解が深まります。

6-1. 簡単なクラスを作成するサンプル

まずは、簡単なクラスを作成してみましょう。

C#
using System;

class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine("こんにちは、" + Name + "です");
}
}

class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "田中";
person.SayHello();
}
}

このコードでは、Personクラスを定義しています。Personクラスには、NameプロパティとSayHelloメソッドがあります。

Mainメソッドでは、Personクラスのインスタンスを作成し、Nameに値を設定してからSayHelloメソッドを呼び出しています。

実行結果は次のとおりです。

こんにちは、田中です

この例から、クラスにデータと処理をまとめる基本的な流れがわかります。

6-2. メソッドで処理を分けるサンプル

次に、処理を複数のメソッドに分ける例を見てみましょう。

C#
using System;

class Cooking
{
public void Start()
{
Prepare();
Cook();
Serve();
}

private void Prepare()
{
Console.WriteLine("材料を準備します");
}

private void Cook()
{
Console.WriteLine("料理を作ります");
}

private void Serve()
{
Console.WriteLine("料理を出します");
}
}

class Program
{
static void Main(string[] args)
{
Cooking cooking = new Cooking();
cooking.Start();
}
}

実行結果は次のとおりです。

材料を準備します
料理を作ります
料理を出します

このコードでは、StartメソッドからPrepareCookServeメソッドを順番に呼び出しています。

処理をメソッドに分けることで、各処理の役割が明確になります。また、コードの見通しがよくなり、修正もしやすくなります。

6-3. 引数と戻り値を使ったサンプル

次に、引数と戻り値を使ったメソッドの例です。

C#
using System;

class Calculator
{
public int Add(int a, int b)
{
return a + b;
}

public int Multiply(int a, int b)
{
return a * b;
}
}

class Program
{
static void Main(string[] args)
{
Calculator calculator = new Calculator();

int sum = calculator.Add(5, 3);
int product = calculator.Multiply(5, 3);

Console.WriteLine("足し算の結果: " + sum);
Console.WriteLine("掛け算の結果: " + product);
}
}

実行結果は次のとおりです。

足し算の結果: 8
掛け算の結果: 15

この例では、AddメソッドとMultiplyメソッドがそれぞれ2つの引数を受け取り、計算結果を返しています。

引数と戻り値を使うことで、メソッドをより柔軟に使えるようになります。

6-4. 複数のメソッドを組み合わせるサンプル

複数のメソッドを組み合わせると、より実用的な処理を作れます。

C#
using System;

class ScoreChecker
{
public void ShowResult(int score)
{
string grade = GetGrade(score);
bool passed = IsPassed(score);

Console.WriteLine("点数: " + score);
Console.WriteLine("評価: " + grade);
Console.WriteLine("合格: " + passed);
}

private string GetGrade(int score)
{
if (score >= 90)
{
return "A";
}
else if (score >= 70)
{
return "B";
}
else if (score >= 50)
{
return "C";
}
else
{
return "D";
}
}

private bool IsPassed(int score)
{
return score >= 60;
}
}

class Program
{
static void Main(string[] args)
{
ScoreChecker checker = new ScoreChecker();
checker.ShowResult(85);
}
}

実行結果は次のとおりです。

点数: 85
評価: B
合格: True

このコードでは、ShowResultメソッドが全体の流れを担当し、GetGradeメソッドが評価を判定し、IsPassedメソッドが合格かどうかを判定しています。

役割ごとにメソッドを分けることで、ひとつひとつの処理が短くなり、読みやすいコードになります。

6-5. 実行結果の確認方法

C#のコードを実行するには、Visual Studio、Visual Studio Code、またはオンラインのC#実行環境などを使います。

コンソールアプリとして実行する場合は、Console.WriteLineを使って結果を表示すると確認しやすくなります。

C#
Console.WriteLine("確認したい値");

変数の値を確認したい場合は、次のように書けます。

C#
int result = 10 + 20;
Console.WriteLine(result);

実行結果は次のとおりです。

30

メソッドが正しく動いているか確認するときは、メソッドを呼び出して、期待した結果が表示されるかを見ます。

C#
Calculator calculator = new Calculator();
int result = calculator.Add(2, 3);
Console.WriteLine(result);

実行結果が5になれば、Addメソッドが正しく動いていると確認できます。

初心者のうちは、コードを書いたら少しずつ実行して確認する習慣をつけることが大切です。

7. クラスでよく使う関連機能

C#のクラスを使うときには、メソッド以外にもよく登場する機能があります。ここでは、コンストラクター、プロパティ、thisキーワード、オーバーロード、継承について基礎を解説します。

7-1. コンストラクターの基本

コンストラクターは、クラスのインスタンスが作成されるときに自動で呼び出される特別なメソッドです。

コンストラクターは、クラス名と同じ名前で定義します。また、戻り値の型は書きません。

C#
class Person
{
public string Name { get; set; }

public Person(string name)
{
Name = name;
}

public void SayHello()
{
Console.WriteLine("こんにちは、" + Name + "です");
}
}

このクラスでは、インスタンス作成時に名前を受け取ります。

C#
Person person = new Person("田中");
person.SayHello();

実行結果は次のとおりです。

こんにちは、田中です

コンストラクターを使うと、インスタンス作成時に必要な初期設定を行えます。

7-2. プロパティの基本

プロパティは、クラスのデータを読み書きするための仕組みです。

C#
class Person
{
public string Name { get; set; }
}

この例では、Nameというプロパティを定義しています。

プロパティは、次のように値を設定したり取得したりできます。

C#
Person person = new Person();
person.Name = "田中";

Console.WriteLine(person.Name);

実行結果は次のとおりです。

田中

プロパティを使うことで、クラスの外部からデータを扱いやすくなります。

また、値の設定時に条件を加えることもできます。

C#
class Person
{
private int age;

public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
}
}
}

このように書くと、年齢に負の値が入るのを防げます。

7-3. thisキーワードの使い方

thisは、現在のインスタンス自身を表すキーワードです。

特に、フィールドやプロパティと引数の名前が同じときによく使います。

C#
class Person
{
private string name;

public Person(string name)
{
this.name = name;
}

public void ShowName()
{
Console.WriteLine(this.name);
}
}

この例では、コンストラクターの引数nameとフィールドnameが同じ名前です。

this.nameと書くことで、クラスのフィールドを指していることが明確になります。

プロパティでも同じように使えます。

C#
class Person
{
public string Name { get; set; }

public Person(string name)
{
this.Name = name;
}
}

thisは必ず使わなければならないわけではありませんが、コードの意味を明確にしたいときに役立ちます。

7-4. オーバーロードの基本

オーバーロードとは、同じ名前のメソッドを、引数の数や型を変えて複数定義することです。

C#
class Calculator
{
public int Add(int a, int b)
{
return a + b;
}

public int Add(int a, int b, int c)
{
return a + b + c;
}

public double Add(double a, double b)
{
return a + b;
}
}

この例では、Addという同じ名前のメソッドが3つあります。しかし、引数の数や型が異なるため、C#では別のメソッドとして扱われます。

呼び出すときは、渡す引数によって自動的に使われるメソッドが決まります。

C#
Calculator calculator = new Calculator();

Console.WriteLine(calculator.Add(1, 2));
Console.WriteLine(calculator.Add(1, 2, 3));
Console.WriteLine(calculator.Add(1.5, 2.5));

実行結果は次のとおりです。

3
6
4

オーバーロードを使うと、似た処理を同じメソッド名でまとめられるため、使いやすいクラスを作れます。

7-5. 継承とクラスの関係

継承とは、あるクラスの機能を別のクラスに引き継ぐ仕組みです。

元になるクラスを基底クラス、継承するクラスを派生クラスと呼びます。

C#
class Animal
{
public void Eat()
{
Console.WriteLine("食べます");
}
}

class Dog : Animal
{
public void Bark()
{
Console.WriteLine("吠えます");
}
}

この例では、DogクラスがAnimalクラスを継承しています。

そのため、Dogクラスのインスタンスから、AnimalクラスのEatメソッドを呼び出せます。

C#
Dog dog = new Dog();
dog.Eat();
dog.Bark();

実行結果は次のとおりです。

食べます
吠えます

継承を使うと、共通する処理を基底クラスにまとめ、派生クラスで個別の処理を追加できます。

ただし、初心者のうちはまずクラスとメソッドの基本を理解し、その後で継承を学ぶとスムーズです。

8. C#のクラスとメソッドでよくあるエラー

C#のクラスとメソッドを学ぶとき、初心者がつまずきやすいエラーがあります。よくある原因を知っておくと、エラーが出たときに落ち着いて対処できます。

8-1. インスタンスを作らずにメソッドを呼び出している

インスタンスメソッドは、インスタンスを作成してから呼び出す必要があります。

次のコードはエラーになります。

C#
class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

class Program
{
static void Main(string[] args)
{
Greeting.SayHello(); // エラー
}
}

SayHelloメソッドはstaticではないため、クラス名から直接呼び出せません。

正しくは、インスタンスを作成して呼び出します。

C#
class Program
{
static void Main(string[] args)
{
Greeting greeting = new Greeting();
greeting.SayHello();
}
}

インスタンスメソッドを呼び出すときは、newでインスタンスを作ることを忘れないようにしましょう。

8-2. staticと非staticの使い分けミス

C#では、staticメソッドと非staticメソッドを混同するとエラーが発生します。

特によくあるのが、staticメソッドから非staticメンバーを直接使おうとするケースです。

C#
class Program
{
string message = "こんにちは";

static void Main(string[] args)
{
Console.WriteLine(message); // エラー
}
}

Mainメソッドはstaticですが、messageはインスタンスフィールドです。そのため、直接アクセスできません。

解決方法のひとつは、インスタンスを作成することです。

C#
class Program
{
string message = "こんにちは";

static void Main(string[] args)
{
Program program = new Program();
Console.WriteLine(program.message);
}
}

もうひとつの方法は、フィールドをstaticにすることです。

C#
class Program
{
static string message = "こんにちは";

static void Main(string[] args)
{
Console.WriteLine(message);
}
}

どちらを選ぶかは、そのデータがインスタンスごとに異なるものか、クラス全体で共通のものかで判断します。

8-3. アクセス修飾子による呼び出しエラー

privateが付いたメソッドやフィールドは、クラスの外から呼び出せません。

C#
class Sample
{
private void Show()
{
Console.WriteLine("表示します");
}
}

class Program
{
static void Main(string[] args)
{
Sample sample = new Sample();
sample.Show(); // エラー
}
}

Showメソッドはprivateなので、Sampleクラスの外からは呼び出せません。

外部から呼び出したい場合は、publicにします。

C#
class Sample
{
public void Show()
{
Console.WriteLine("表示します");
}
}

ただし、すべてをpublicにすればよいわけではありません。外部から使う必要がない処理はprivateにしておくと、クラスの内部構造を守りやすくなります。

8-4. 戻り値や引数の型が合わない

メソッドの戻り値や引数の型が合わない場合もエラーになります。

次のコードを見てみましょう。

C#
public int GetNumber()
{
return "10"; // エラー
}

戻り値の型はintですが、返している値は文字列です。そのためエラーになります。

正しくは、int型の値を返します。

C#
public int GetNumber()
{
return 10;
}

引数の型が合わない場合もエラーになります。

C#
public void ShowAge(int age)
{
Console.WriteLine(age);
}

ShowAge("20"); // エラー

ShowAgeメソッドはint型の引数を受け取るため、文字列の"20"は渡せません。

正しくは、数値を渡します。

C#
ShowAge(20);

C#は型を重視する言語なので、メソッドの引数や戻り値の型を意識することが大切です。

8-5. クラス名・メソッド名の記述ミス

クラス名やメソッド名のスペルミス、大文字小文字の違いもエラーの原因になります。

C#では、大文字と小文字が区別されます。

C#
class Greeting
{
public void SayHello()
{
Console.WriteLine("こんにちは");
}
}

このメソッドを次のように呼び出すとエラーになります。

C#
Greeting greeting = new Greeting();
greeting.sayhello(); // エラー

正しくは、定義した名前と同じように書きます。

C#
greeting.SayHello();

SayHellosayhelloは、C#では別の名前として扱われます。

エラーが出たときは、クラス名、メソッド名、変数名のスペルや大文字小文字を確認しましょう。

9. 初心者がクラスとメソッドを理解するための学習ポイント

C#のクラスとメソッドを理解するには、文法を覚えるだけでなく、実際にコードを書いて使ってみることが大切です。

最初から複雑な設計をしようとすると難しく感じます。まずは、小さなクラスと短いメソッドを作るところから始めましょう。

たとえば、Personクラス、Calculatorクラス、Productクラスなど、身近なものを題材にすると理解しやすくなります。

C#
class Product
{
public string Name { get; set; }
public int Price { get; set; }

public void ShowInfo()
{
Console.WriteLine(Name + ": " + Price + "円");
}
}

このように、データと処理をひとつのクラスにまとめる練習をすると、クラスの役割が自然に理解できます。

9-1. 処理をメソッドに分ける考え方

初心者が特に意識したいのは、処理をメソッドに分ける考え方です。

すべての処理をMainメソッドに書いてしまうと、コードが長くなり、何をしているのかわかりにくくなります。

C#
static void Main(string[] args)
{
Console.WriteLine("名前を入力してください");
string name = Console.ReadLine();

Console.WriteLine("年齢を入力してください");
int age = int.Parse(Console.ReadLine());

Console.WriteLine(name + "さんは" + age + "歳です");
}

このコードは短いうちは問題ありませんが、処理が増えると読みづらくなります。

そこで、処理をメソッドに分けます。

C#
using System;

class Program
{
static void Main(string[] args)
{
string name = InputName();
int age = InputAge();
ShowProfile(name, age);
}

static string InputName()
{
Console.WriteLine("名前を入力してください");
return Console.ReadLine();
}

static int InputAge()
{
Console.WriteLine("年齢を入力してください");
return int.Parse(Console.ReadLine());
}

static void ShowProfile(string name, int age)
{
Console.WriteLine(name + "さんは" + age + "歳です");
}
}

このように分けると、Mainメソッドを見るだけで全体の流れがわかります。

メソッドに分けるときは、「この処理は何をしているのか」を考えて名前を付けるとよいでしょう。

たとえば、入力する処理ならInputName、計算する処理ならCalculateTotal、表示する処理ならShowResultのようにします。

処理をメソッドに分ける習慣をつけると、C#のコードが読みやすくなり、後から修正しやすいプログラムを書けるようになります。

まとめ

C#のクラスとメソッドは、プログラムを整理して書くための基本的な仕組みです。

クラスは、データや処理をまとめるための設計図です。メソッドは、クラスの中に定義する処理のまとまりです。C#では、クラスの中にフィールド、プロパティ、メソッドを配置し、必要に応じてインスタンスを作成して使います。

メソッドには、戻り値があるものとないものがあり、引数を使うことで外部から値を受け取って処理できます。また、インスタンスメソッドとstaticメソッドの違いを理解することも重要です。

インスタンスメソッドは、インスタンスごとのデータを使う処理に向いています。一方、staticメソッドは、特定のインスタンスに依存しない処理に向いています。

初心者のうちは、まず小さなクラスを作り、その中に簡単なメソッドを定義して呼び出す練習をしましょう。処理をメソッドに分けることで、コードが読みやすくなり、C#らしいプログラムの書き方が身についていきます。

C#のクラスとメソッドをしっかり理解できると、オブジェクト指向プログラミングの考え方も学びやすくなります。まずは基本構文を覚え、サンプルコードを実際に動かしながら、少しずつ応用できるようにしていきましょう。