C#のpublic classとは?意味・使い方・アクセス修飾子の違いを初心者向けに解説

はじめに

C#を学び始めると、コードの中でよく目にするのがpublic classという書き方です。

C#
public class Person
{
}

一見すると短いコードですが、ここにはC#の基本である「クラス」と「アクセス修飾子」の考え方が含まれています。特に初心者のうちは、publicの意味、classの意味、public classにすると何が変わるのかが分かりにくいかもしれません。

この記事では、C#のpublic classについて、意味・使い方・アクセス範囲・他のアクセス修飾子との違いを初心者向けに解説します。コード例も交えながら説明するので、C#でクラスを定義する基本を理解したい方はぜひ参考にしてください。

1. C#のpublic classとは?初心者向けに意味を解説

1-1. public classの基本的な意味

C#のpublic classとは、「どこからでも利用できるクラスを定義する」という意味です。

C#
public class User
{
}

このコードでは、Userという名前のクラスを定義しています。先頭に付いているpublicは、このクラスを他の場所から使えるようにするための指定です。

つまり、public class Userは「外部からアクセス可能なUserクラスを作る」という意味になります。

1-2. publicは「アクセス修飾子」、classは「クラス定義」

public classは、2つの要素に分けて考えると理解しやすくなります。

C#
public class User

publicはアクセス修飾子です。アクセス修飾子とは、そのクラスやメンバーをどこから使えるかを決めるキーワードです。

classはクラスを定義するためのキーワードです。C#では、データや処理をまとめた設計図としてクラスを作成します。

つまり、public classは「アクセス範囲がpublicのクラスを定義する」という書き方です。

1-3. public classを使うと何ができるのか

public classを使うと、そのクラスを同じプロジェクト内だけでなく、別のプロジェクトや別のアセンブリからも利用できるようになります。

たとえば、共通処理をまとめたライブラリを作る場合、そのライブラリを使う側から見えるクラスはpublic classとして定義する必要があります。

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

このように定義しておくと、外部のコードからCalculatorクラスを使って計算処理を呼び出せます。

1-4. public classがよく使われる場面

public classは、外部から利用されることを前提としたクラスでよく使われます。

たとえば、Webアプリケーションのコントローラー、APIのレスポンス用クラス、ライブラリとして公開する機能、複数のファイルから使う共通クラスなどです。

一方で、アプリケーション内部だけで使うクラスまで何でもpublicにする必要はありません。必要以上にpublicにすると、外部から自由に使える範囲が広がり、保守が難しくなることがあります。

2. C#におけるclassの基本を理解しよう

2-1. classとはオブジェクトの設計図

C#におけるclassとは、オブジェクトを作るための設計図です。

たとえば、人を表すクラスを作るなら、名前や年齢などのデータ、自己紹介をする処理などをまとめられます。

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

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

このPersonクラスは、人を表すための設計図です。実際に使うときは、この設計図からオブジェクトを作成します。

2-2. クラス・オブジェクト・インスタンスの違い

初心者が混乱しやすい言葉に、クラス、オブジェクト、インスタンスがあります。

クラスは設計図です。オブジェクトは、その設計図をもとに作られた実体です。インスタンスも、クラスから作られた実体を指す言葉です。

C#
Person person = new Person();

このコードでは、Personクラスからpersonというインスタンスを作成しています。

Personはクラス、new Person()で作られたものがオブジェクトまたはインスタンス、personはそのインスタンスを扱うための変数です。

2-3. クラスに含められるメンバー

C#のクラスには、さまざまなメンバーを含めることができます。

代表的なものは、フィールド、プロパティ、メソッド、コンストラクターです。

C#
public class Product
{
private int price;

public string Name { get; set; }

public Product(string name, int price)
{
Name = name;
this.price = price;
}

public int GetPrice()
{
return price;
}
}

この例では、priceがフィールド、Nameがプロパティ、Productがコンストラクター、GetPriceがメソッドです。

クラスは、関連するデータと処理をひとまとめにするために使います。

2-4. 初心者が混同しやすいclassとメソッドの違い

classとメソッドは役割が違います。

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

C#
public class Greeting
{
public void SayHello()
{
Console.WriteLine("Hello");
}
}

この例では、Greetingがクラスで、SayHelloがメソッドです。

クラスは大きな入れ物、メソッドはその中にある処理と考えると分かりやすいでしょう。

3. public classの書き方と基本構文

3-1. public classの基本構文

public classの基本構文は次のとおりです。

C#
public class クラス名
{
// フィールド、プロパティ、メソッドなどを書く
}

クラス名は通常、先頭を大文字にしたパスカルケースで書きます。

C#
public class Customer
{
}

customerではなくCustomerのように書くのがC#では一般的です。

3-2. public classを使った簡単なコード例

次の例では、Carというpublic classを定義しています。

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

public void Drive()
{
Console.WriteLine(Name + "が走ります");
}
}

このクラスは、車の名前を表すNameプロパティと、走る処理を表すDriveメソッドを持っています。

使う側のコードは次のようになります。

C#
Car car = new Car();
car.Name = "スポーツカー";
car.Drive();

public classとして定義されているため、アクセスできる場所からインスタンスを作成して利用できます。

3-3. ファイル名とクラス名の関係

C#では、ファイル名とクラス名を必ず一致させる必要はありません。

たとえば、Sample.csというファイルの中にUserクラスを書くこともできます。

C#
public class User
{
}

ただし、実務ではファイル名とクラス名を一致させるのが一般的です。

たとえば、UserクラスであればUser.csというファイル名にします。その方が、どのファイルにどのクラスが書かれているか分かりやすくなります。

3-4. namespaceとの組み合わせ方

C#では、クラスをnamespaceの中に定義することがよくあります。

C#
namespace MyApp.Models
{
public class User
{
public string Name { get; set; }
}
}

namespaceは、クラスを整理するための名前空間です。同じクラス名があっても、名前空間が違えば別のクラスとして扱えます。

別のファイルから使う場合は、usingを使って名前空間を読み込みます。

C#
using MyApp.Models;

User user = new User();

3-5. Mainメソッドとの関係

C#のコンソールアプリケーションでは、プログラムの開始地点としてMainメソッドが使われます。

C#
public class Program
{
public static void Main()
{
Console.WriteLine("開始");
}
}

Programクラス自体をpublic classにすることもありますが、アプリケーション内部だけで使う場合は必ずしもpublicである必要はありません。

また、最近のC#ではトップレベルステートメントを使い、Mainメソッドを明示的に書かない形式もあります。

C#
Console.WriteLine("開始");

ただし、クラスの基本を学ぶ段階では、public class ProgramMainメソッドの形を理解しておくとよいでしょう。

4. publicを付ける意味とアクセス範囲

4-1. publicを付けたクラスのアクセス範囲

publicを付けたクラスは、他のコードからアクセスできる公開クラスになります。

C#
public class Sample
{
}

このSampleクラスは、同じプロジェクト内の別ファイルからも使えます。また、条件を満たせば別プロジェクトからも使えます。

ただし、publicにしたからといって、すべての場所から無条件に使えるわけではありません。名前空間や参照設定が必要になる場合があります。

4-2. 同じプロジェクト内から使えるケース

同じプロジェクト内であれば、public classは別ファイルから利用できます。

C#
// User.cs
namespace MyApp
{
public class User
{
public string Name { get; set; }
}
}
C#
// Program.cs
using MyApp;

User user = new User();
user.Name = "Taro";

このように、同じプロジェクト内で名前空間が合っていれば、別ファイルにあるpublic classを使えます。

4-3. 別のプロジェクトやアセンブリから使えるケース

別プロジェクトからpublic classを使うには、クラスがpublicであるだけでなく、プロジェクト参照やライブラリ参照が必要です。

たとえば、MyLibraryというクラスライブラリに次のクラスがあるとします。

C#
namespace MyLibrary
{
public class MessageService
{
public string GetMessage()
{
return "Hello";
}
}
}

別プロジェクトから使うには、MyLibraryを参照に追加し、必要に応じてusing MyLibrary;を書きます。

C#
using MyLibrary;

MessageService service = new MessageService();
Console.WriteLine(service.GetMessage());

4-4. publicにしても使えない場合がある理由

クラスをpublicにしても、使えない場合があります。

代表的な原因は、名前空間が違う、usingが不足している、プロジェクト参照が追加されていない、クラスのメンバーがprivateになっている、コンストラクターが公開されていないなどです。

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

この場合、Userクラス自体はpublicですが、Nameプロパティはprivateなので外部からアクセスできません。

public classはクラス自体の公開範囲を決めるものであり、クラスの中身まで自動的にすべて公開するわけではありません。

5. C#のアクセス修飾子の違い

5-1. publicとprivateの違い

publicは外部からアクセスできることを意味します。privateは同じクラスの中からしかアクセスできないことを意味します。

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

private int Age { get; set; }
}

この例では、Nameは外部から使えますが、AgeUserクラスの内部からしか使えません。

なお、トップレベルのクラスにprivateを付けることはできません。private classは、クラスの中に定義するネストされたクラスで使います。

5-2. publicとinternalの違い

internalは、同じアセンブリ内からのみアクセスできることを意味します。

C#
internal class AppHelper
{
}

同じプロジェクト内では使えますが、別のプロジェクトからは通常アクセスできません。

publicは外部プロジェクトにも公開する場合に使い、internalはアプリ内部やライブラリ内部だけで使いたい場合に使います。

5-3. publicとprotectedの違い

protectedは、継承関係にあるクラスからアクセスできることを意味します。

C#
public class Animal
{
protected string Name { get; set; }
}

public class Dog : Animal
{
public void SetName()
{
Name = "Pochi";
}
}

この例では、DogクラスはAnimalクラスを継承しているため、protectedNameにアクセスできます。

ただし、トップレベルのクラスにprotectedを付けることはできません。protectedは主にメンバーやネストされたクラスに使います。

5-4. publicとprotected internalの違い

protected internalは、同じアセンブリ内、または派生クラスからアクセスできることを意味します。

C#
public class BaseClass
{
protected internal void Show()
{
Console.WriteLine("表示");
}
}

publicほど完全に公開するわけではありませんが、protectedinternalより広い範囲で使える場合があります。

ただし、初心者のうちはまずpublicprivateinternalを理解することが大切です。protected internalは、継承やライブラリ設計を学ぶ段階で覚えるとよいでしょう。

5-5. クラスに使えるアクセス修飾子と使えない修飾子

トップレベルのクラスに使える主なアクセス修飾子は、publicinternalです。

C#
public class PublicClass
{
}

internal class InternalClass
{
}

一方、トップレベルのクラスにprivateprotectedを付けることはできません。

ただし、クラスの中にクラスを定義するネストされたクラスでは、privateprotectedも使えます。

C#
public class OuterClass
{
private class InnerClass
{
}
}

5-6. アクセス修飾子の使い分け早見表

publicは、どこからでも使わせたい場合に使います。

internalは、同じプロジェクトや同じアセンブリ内だけで使いたい場合に使います。

privateは、同じクラスの中だけで使いたい場合に使います。

protectedは、継承したクラスから使わせたい場合に使います。

protected internalは、同じアセンブリ内、または派生クラスから使わせたい場合に使います。

初心者が最初に意識すべきなのは、「外部に公開する必要があるものだけpublicにする」という考え方です。

6. public classとinternal classの違い

6-1. internal classとは何か

internal classとは、同じアセンブリ内からのみアクセスできるクラスです。

C#
internal class FileHelper
{
}

アセンブリとは、簡単に言えばビルドされたプログラムやライブラリの単位です。通常、1つのプロジェクトが1つのアセンブリになります。

internal classは、アプリやライブラリの内部処理を隠したいときに便利です。

6-2. public classとのアクセス範囲の違い

public classは、別のアセンブリからもアクセスできます。

一方、internal classは、同じアセンブリ内からしかアクセスできません。

C#
public class PublicService
{
}

internal class InternalService
{
}

この場合、別プロジェクトから見えるのはPublicServiceです。InternalServiceは同じアセンブリ内でのみ使えます。

6-3. ライブラリ開発でpublic classを使うケース

クラスライブラリを作る場合、利用者に使ってもらうクラスはpublic classにします。

C#
namespace MyLibrary
{
public class CsvReader
{
public void Read()
{
Console.WriteLine("CSVを読み込みます");
}
}
}

このようなクラスは、ライブラリの利用者が直接呼び出すため、publicにする必要があります。

ただし、ライブラリ内部だけで使う補助クラスまでpublicにする必要はありません。

6-4. アプリ内部だけで使うならinternal classが適しているケース

アプリ内部だけで使うクラスなら、internal classが適している場合があります。

C#
internal class LogFormatter
{
public string Format(string message)
{
return "[LOG] " + message;
}
}

このLogFormatterは、アプリ内部のログ整形だけに使うのであれば、外部に公開する必要はありません。

外部から使わせる必要がないクラスはinternalにすることで、意図しない利用を防げます。

6-5. どちらを選ぶべきか判断基準

public classにするかinternal classにするかは、そのクラスを外部に公開する必要があるかで判断します。

別プロジェクトやライブラリ利用者に使ってもらうクラスならpublic classです。

同じアプリや同じライブラリの内部だけで使うクラスならinternal classです。

迷った場合は、最初から何でもpublicにするのではなく、必要になったときに公開範囲を広げる考え方がおすすめです。

7. public classの具体的な使い方

7-1. public classを定義する例

まずは、シンプルなpublic classを定義してみましょう。

C#
public class Book
{
public string Title { get; set; }
}

このBookクラスは、書籍のタイトルを表すTitleプロパティを持っています。

クラス自体がpublicなので、アクセスできる場所からBookクラスを利用できます。

7-2. public classからインスタンスを作成する例

public classを使うには、通常newを使ってインスタンスを作成します。

C#
Book book = new Book();
book.Title = "C#入門";
Console.WriteLine(book.Title);

このコードでは、Bookクラスからbookインスタンスを作成し、Titleに値を設定しています。

public classは設計図であり、実際にデータを持たせて使うにはインスタンス化が必要です。

7-3. publicなフィールド・プロパティ・メソッドを使う例

クラスをpublicにしても、メンバーがpublicでなければ外部から使えません。

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

public void Study()
{
Console.WriteLine(Name + "が勉強しています");
}
}

使う側は次のように書けます。

C#
Student student = new Student();
student.Name = "Hanako";
student.Study();

NameプロパティもStudyメソッドもpublicなので、クラスの外からアクセスできます。

7-4. 別ファイルからpublic classを呼び出す例

C#では、別ファイルに定義したpublic classを呼び出せます。

C#
// User.cs
namespace MyApp.Models
{
public class User
{
public string Name { get; set; }
}
}
C#
// Program.cs
using MyApp.Models;

User user = new User();
user.Name = "Taro";
Console.WriteLine(user.Name);

別ファイルでも、同じプロジェクト内で名前空間が正しく指定されていれば利用できます。

7-5. 別プロジェクトからpublic classを参照する例

別プロジェクトからpublic classを使うには、参照設定が必要です。

たとえば、CommonLibraryプロジェクトに次のクラスがあるとします。

C#
namespace CommonLibrary
{
public class DateHelper
{
public string GetTodayText()
{
return DateTime.Today.ToString("yyyy/MM/dd");
}
}
}

アプリ側のプロジェクトでCommonLibraryを参照に追加し、次のように使います。

C#
using CommonLibrary;

DateHelper helper = new DateHelper();
Console.WriteLine(helper.GetTodayText());

クラスがpublicであり、参照設定と名前空間が正しければ、別プロジェクトから呼び出せます。

8. public classを使うときの注意点

8-1. 何でもpublicにしない

初心者のうちは、エラーを避けるために何でもpublicにしてしまうことがあります。

しかし、すべてをpublicにすると、外部から自由に使える範囲が広がりすぎます。その結果、後から変更しにくくなったり、意図しない使われ方をされたりする可能性があります。

外部に公開する必要がないクラスは、internalにすることも検討しましょう。

8-2. クラスはpublicでもメンバーがprivateなら外部から使えない

public classであっても、クラスの中のメンバーがprivateなら外部からアクセスできません。

C#
public class Account
{
private string Password { get; set; }
}

この場合、Accountクラス自体にはアクセスできますが、Passwordには外部からアクセスできません。

外部から使いたいプロパティやメソッドには、必要に応じてpublicを付ける必要があります。

8-3. namespaceや参照設定が原因で使えないことがある

public classなのに使えない場合、アクセス修飾子以外に原因があることも多いです。

たとえば、名前空間が違う場合はusingが必要です。

C#
using MyApp.Models;

また、別プロジェクトのクラスを使う場合は、プロジェクト参照が追加されている必要があります。

publicにしているのにクラスが見つからない場合は、クラス名、namespace、using、参照設定を確認しましょう。

8-4. クラス名の付け方に注意する

クラス名は、役割が分かる名前にすることが大切です。

C#
public class Data
{
}

このような名前だと、何のデータを扱うクラスなのか分かりにくいです。

C#
public class CustomerData
{
}
C#
public class OrderService
{
}

このように、具体的な役割が分かる名前にすると、コードが読みやすくなります。

8-5. 保守性を考えてアクセス範囲を決める

アクセス修飾子は、単にエラーを消すために付けるものではありません。

どこから使えるようにするべきか、どこからは使えないようにするべきかを考えて指定します。

外部に公開する必要があるクラスはpublic classにします。内部だけで使うクラスはinternal classにします。クラス内部だけで使うメンバーはprivateにします。

このようにアクセス範囲を適切に決めることで、保守しやすいコードになります。

9. public classでよくあるエラーと解決方法

9-1. 「アクセスできない保護レベルです」と表示される

「アクセスできない保護レベルです」というエラーは、アクセス修飾子が原因で発生することが多いです。

たとえば、メソッドがprivateになっていると、クラスの外から呼び出せません。

C#
public class Sample
{
private void Show()
{
Console.WriteLine("Hello");
}
}

外部から呼び出したい場合は、メソッドをpublicにします。

C#
public class Sample
{
public void Show()
{
Console.WriteLine("Hello");
}
}

クラスだけでなく、呼び出したいメンバーのアクセス修飾子も確認しましょう。

9-2. クラスが見つからない

public classなのにクラスが見つからない場合、名前空間が原因かもしれません。

C#
namespace MyApp.Models
{
public class User
{
}
}

このクラスを別ファイルから使う場合は、次のようにusingを追加します。

C#
using MyApp.Models;

また、クラス名のスペルミスや、ファイルがプロジェクトに含まれていない可能性もあります。

9-3. usingを追加しても使えない

usingを追加しても使えない場合は、参照設定が不足している可能性があります。

usingは名前空間を省略して書けるようにするものですが、別プロジェクトのクラスを使うには、そのプロジェクトへの参照が必要です。

つまり、別プロジェクトのpublic classを使うには、次の2つが必要です。

参照設定を追加すること。

正しいusingを書くこと。

このどちらかが不足していると、public classでも使えません。

9-4. public classなのに別プロジェクトから呼べない

public classなのに別プロジェクトから呼べない場合は、以下を確認しましょう。

クラスが本当にpublicになっているか。

コンストラクターがpublicになっているか。

呼び出したいメソッドやプロパティがpublicになっているか。

参照設定が追加されているか。

namespaceとusingが正しいか。

特に、クラスはpublicでもコンストラクターがprivateだと、外部からnewできません。

C#
public class Sample
{
private Sample()
{
}
}

この場合、外部から次のようには書けません。

C#
Sample sample = new Sample();

インスタンスを作成させたいなら、コンストラクターもpublicにします。

9-5. コンストラクターやメソッドが呼び出せない

コンストラクターやメソッドが呼び出せない場合も、アクセス修飾子を確認します。

C#
public class Report
{
private Report()
{
}

private void Print()
{
}
}

このクラスはpublicですが、コンストラクターもメソッドもprivateなので外部から使えません。

外部から使いたい場合は、次のようにします。

C#
public class Report
{
public Report()
{
}

public void Print()
{
Console.WriteLine("印刷します");
}
}

C#では、クラス本体とメンバーのアクセス修飾子を別々に考える必要があります。

10. public classに関するよくある質問

10-1. C#のclassは必ずpublicにするべき?

C#のclassは必ずpublicにする必要はありません。

外部から使わせたいクラスはpublic classにしますが、同じプロジェクト内や同じアセンブリ内だけで使うクラスはinternal classで十分な場合があります。

何でもpublicにするのではなく、そのクラスをどこから使わせたいかで判断しましょう。

10-2. public classとpublic static classの違いは?

public classは、通常インスタンスを作成して使います。

C#
public class User
{
public string Name { get; set; }
}
C#
User user = new User();

一方、public static classはインスタンスを作成せずに使うクラスです。

C#
public static class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}
}
C#
int result = MathHelper.Add(1, 2);

static classにはインスタンスメンバーを持たせることはできません。共通処理やユーティリティ処理をまとめるときによく使われます。

10-3. public classとprivate classは何が違う?

public classは外部からアクセスできるクラスです。

private classは外部からアクセスできないクラスですが、トップレベルのクラスとしては使えません。private classは、クラスの中に定義するネストされたクラスで使います。

C#
public class Outer
{
private class Inner
{
}
}

この場合、InnerクラスはOuterクラスの内部からのみ使えます。

初心者のうちは、トップレベルのクラスには主にpublicまたはinternalを使うと覚えておくとよいでしょう。

10-4. 1つのファイルにpublic classを複数書ける?

C#では、1つのファイルにpublic classを複数書くことができます。

C#
public class ClassA
{
}

public class ClassB
{
}

ただし、実務では1つのファイルに1つの主要なクラスを書くことが多いです。

複数のクラスを1つのファイルにまとめると、ファイルが大きくなり、目的のクラスを探しにくくなることがあります。

基本的には、UserクラスならUser.csOrderクラスならOrder.csのように分けると分かりやすくなります。

10-5. 初心者はどのアクセス修飾子から覚えるべき?

初心者は、まずpublicprivateinternalを覚えるのがおすすめです。

publicは外部から使える。

privateは同じクラスの中だけで使える。

internalは同じアセンブリ内だけで使える。

この3つを理解できると、C#のクラス設計がかなり分かりやすくなります。

その後、継承を学ぶ段階でprotectedprotected internalを覚えるとよいでしょう。

まとめ

C#のpublic classとは、外部からアクセス可能なクラスを定義するための書き方です。

publicはアクセス修飾子で、どこから使えるかを決めます。classはクラスを定義するキーワードで、データや処理をまとめる設計図を作ります。

public classを使うと、同じプロジェクト内だけでなく、参照設定を行った別プロジェクトからも利用できるクラスを作れます。ただし、クラスがpublicでも、メンバーがprivateであれば外部からは使えません。

C#では、何でもpublicにするのではなく、外部に公開する必要があるものだけをpublicにすることが大切です。アプリ内部だけで使うクラスならinternal class、クラス内部だけで使うメンバーならprivateを選ぶと、保守しやすいコードになります。

public classはC#の基本中の基本です。意味と使い方をしっかり理解しておくことで、クラス設計やオブジェクト指向プログラミングをスムーズに学べるようになります。