C#のクラス名の付け方|命名規則・よくある悩み・実例でわかりやすく解説

はじめに

C#でプログラムを書いていると、意外と悩みやすいのが「クラス名」の付け方です。

処理そのものは書けているのに、

C#
public class Data
{
}
C#
public class Manager
{
}
C#
public class UserInfoProcess
{
}

のような名前を付けてしまい、「このクラスは結局何をするものなのか」が後からわかりにくくなることがあります。

C#のクラス名は、単なる識別子ではありません。コードを読む人に対して、そのクラスの役割や責務を伝える重要な情報です。適切なクラス名を付けることで、コードの読みやすさ、保守性、チーム開発のしやすさが大きく変わります。

この記事では、C#のクラス名の基本的な命名規則から、実務で迷いやすい命名パターン、良い例・悪い例、FAQまでわかりやすく解説します。

1. C#のクラス名とは?まず押さえる基本

1-1. クラス名は「何を表すクラスか」を示す名前

C#のクラス名とは、そのクラスが何を表すのかを示す名前です。

たとえば、ユーザーを表すクラスであれば次のように命名します。

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

注文を表すクラスであれば、次のような名前が自然です。

C#
public class Order
{
public int Id { get; set; }
public DateTime OrderedAt { get; set; }
}

このように、クラス名を見るだけで「何を扱うクラスなのか」が想像できることが大切です。

逆に、次のようなクラス名は意味が曖昧です。

C#
public class Data
{
}
C#
public class Info
{
}
C#
public class Process
{
}

DataInfoは一見便利そうですが、あまりに抽象的です。何のデータなのか、何の情報なのかがわからないため、コード全体の見通しが悪くなります。

1-2. クラス名が読みやすさ・保守性に与える影響

クラス名は、コードの読みやすさに直接影響します。

たとえば、次のコードを見てみましょう。

C#
var service = new Service();
service.Execute();

このコードだけでは、何のサービスなのか、何を実行するのかがわかりません。

一方で、次のように書かれていればどうでしょうか。

C#
var emailService = new EmailService();
emailService.SendWelcomeEmail(user);

EmailServiceというクラス名から、メール送信に関する処理を担当していることがわかります。さらに、SendWelcomeEmailというメソッド名から、歓迎メールを送る処理であることも読み取れます。

クラス名が適切だと、コードを読む人は実装の中身を細かく確認しなくても、全体の構造を理解しやすくなります。これは、バグ修正や機能追加を行うときにも大きなメリットになります。

1-3. 変数名・メソッド名・ファイル名との違い

C#では、クラス名、変数名、メソッド名、ファイル名にはそれぞれ役割があります。

クラス名は「何を表す型なのか」を示します。

C#
public class Customer
{
}

変数名は「その値が何なのか」を示します。

C#
Customer customer = new Customer();

メソッド名は「何をする処理なのか」を示します。

C#
public void RegisterCustomer(Customer customer)
{
}

ファイル名は、基本的にそのファイルに定義されている主要なクラス名と一致させます。

Customer.cs

C#では、クラス名とファイル名が違っていてもコンパイルできる場合があります。しかし、実務ではクラス名とファイル名を一致させるのが一般的です。

たとえば、次のようにすると探しやすくなります。

Customer.cs        → public class Customer
OrderService.cs → public class OrderService
UserRepository.cs → public class UserRepository

1-4. C#でクラス名を適当に付けると起きる問題

C#のクラス名を適当に付けると、次のような問題が起きやすくなります。

まず、コードの意味が読み取りにくくなります。

C#
public class Common
{
}

Commonという名前だけでは、何を共通化したクラスなのかがわかりません。便利な名前に見えますが、さまざまな処理が詰め込まれやすく、結果的に保守しづらいクラスになりがちです。

また、似たような名前のクラスが増える原因にもなります。

C#
UserManager
UserService
UserHelper
UserUtility
UserCommon

名前だけでは役割の違いがわからないため、どのクラスを使うべきか迷ってしまいます。

さらに、クラス名が曖昧だと、責務が広がりすぎることがあります。最初は小さな処理だけを担当していたクラスに、後から別の処理がどんどん追加され、巨大なクラスになってしまうのです。

クラス名は、設計の方向性にも影響します。適切な名前を付けることは、適切な責務を持たせることにもつながります。

2. C#のクラス名の基本的な命名規則

2-1. クラス名はPascalCaseで書く

C#のクラス名は、基本的にPascalCaseで書きます。

PascalCaseとは、単語の先頭を大文字にしてつなげる書き方です。

C#
public class User
{
}
C#
public class UserProfile
{
}
C#
public class OrderService
{
}

次のような書き方は、C#のクラス名としては一般的ではありません。

C#
public class user
{
}
C#
public class userProfile
{
}
C#
public class user_profile
{
}

userProfileのような書き方はcamelCaseと呼ばれ、C#では主にローカル変数や引数名で使われます。

C#
public void UpdateUser(User userProfile)
{
}

クラス名にはPascalCaseを使う、と覚えておきましょう。

2-2. 名詞または名詞句で命名する

C#のクラス名は、基本的に名詞または名詞句にします。

良い例は次のとおりです。

C#
public class User
{
}
C#
public class Product
{
}
C#
public class OrderHistory
{
}
C#
public class PaymentService
{
}

クラスは「もの」や「概念」や「役割」を表すことが多いため、名詞で命名すると自然です。

一方、次のような動詞だけのクラス名は避けたほうがよいです。

C#
public class Create
{
}
C#
public class Calculate
{
}
C#
public class Send
{
}

処理を表したい場合は、動詞ではなく、役割を表す名詞句にします。

C#
public class UserCreator
{
}
C#
public class PriceCalculator
{
}
C#
public class EmailSender
{
}

ただし、CreatorSenderのような名前を使う場合は、そのクラスの責務が本当に明確かどうかも確認しましょう。

2-3. 英単語を使い、省略しすぎない

C#のクラス名には、基本的に英単語を使います。

C#
public class Customer
{
}
C#
public class Invoice
{
}
C#
public class ProductCategory
{
}

英語にすると長くなるからといって、省略しすぎるのは避けましょう。

悪い例です。

C#
public class Usr
{
}
C#
public class Ord
{
}
C#
public class PrdCat
{
}

このような省略は、書いた本人にはわかっても、他の人には伝わりにくいです。数か月後の自分が読んでも、意味を思い出せない可能性があります。

改善するなら、次のようにします。

C#
public class User
{
}
C#
public class Order
{
}
C#
public class ProductCategory
{
}

ただし、一般的に広く使われている略語であれば使用しても問題ありません。

C#
public class UserDto
{
}
C#
public class ApiClient
{
}
C#
public class HtmlParser
{
}

DTOAPIHTMLなどは、多くの開発者に通じる略語です。ただし、プロジェクト内で表記を統一することが大切です。

2-4. 数字・記号・アンダースコアは基本的に避ける

C#のクラス名では、数字や記号、アンダースコアは基本的に避けます。

避けたい例です。

C#
public class User_001
{
}
C#
public class Order_Service
{
}
C#
public class Product2
{
}

C#ではアンダースコアを使った名前も書けますが、クラス名ではPascalCaseを使うのが一般的です。

C#
public class OrderService
{
}

数字を使いたくなるケースもありますが、Product2UserService2のような名前は、設計が整理されていないサインであることが多いです。

たとえば、次のような名前があるとします。

C#
public class PaymentService
{
}

public class PaymentService2
{
}

この場合、何が違うのかがわかりません。

改善するなら、違いがわかる名前にします。

C#
public class CreditCardPaymentService
{
}
C#
public class BankTransferPaymentService
{
}

名前に数字を付ける前に、「何が違うクラスなのか」を言葉で表せないか考えてみましょう。

2-5. C#の予約語はクラス名に使わない

C#には、classnamespacepublicreturnなどの予約語があります。これらは言語仕様で特別な意味を持つため、通常はクラス名として使えません。

たとえば、次のようなクラス名は避けます。

C#
public class Class
{
}
C#
public class Namespace
{
}
C#
public class Return
{
}

C#では、@を付けることで予約語を識別子として使える場合があります。

C#
public class @class
{
}

しかし、このような書き方は読みづらく、実務では避けるべきです。

予約語と紛らわしい名前ではなく、具体的な意味を持つ名前にしましょう。

C#
public class SchoolClass
{
}
C#
public class NamespaceDefinition
{
}
C#
public class ReturnValue
{
}

2-6. ファイル名とクラス名は基本的に一致させる

C#では、1つのファイルに複数のクラスを書くこともできます。しかし、基本的には1ファイルに1つの主要なクラスを定義し、ファイル名とクラス名を一致させるのがわかりやすいです。

たとえば、次のようにします。

User.cs
C#
public class User
{
}
OrderService.cs
C#
public class OrderService
{
}

ファイル名とクラス名が一致していると、Visual Studioやエディタ上で目的のクラスを探しやすくなります。

悪い例です。

Data.cs
C#
public class UserProfile
{
}

この場合、UserProfileクラスを探したいときに、Data.csというファイル名からは見つけにくくなります。

特にチーム開発では、ファイル名とクラス名を一致させるだけでも、コードの見通しがかなり良くなります。

3. C#のクラス名の付け方|実務で使える考え方

3-1. クラスの責務から名前を決める

C#のクラス名を決めるときは、まず「このクラスの責務は何か」を考えます。

責務とは、そのクラスが担当する役割のことです。

たとえば、ユーザー情報を表すだけのクラスであれば、次のような名前が自然です。

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

ユーザー登録の処理を担当するクラスであれば、次のような名前が考えられます。

C#
public class UserRegistrationService
{
}

ユーザー情報をデータベースから取得するクラスであれば、次のような名前が考えられます。

C#
public class UserRepository
{
}

同じ「ユーザー」に関するクラスでも、責務によって名前は変わります。

C#
User
UserProfile
UserRepository
UserRegistrationService
UserController
UserDto

クラス名を考えるときは、「このクラスは何を知っているのか」「このクラスは何を担当しているのか」を言葉にしてみると決めやすくなります。

3-2. 「何を扱うクラスか」で名前を決める

もっとも基本的な考え方は、「何を扱うクラスか」で名前を決めることです。

商品を扱うなら、次のようになります。

C#
public class Product
{
}

注文を扱うなら、次のようになります。

C#
public class Order
{
}

顧客を扱うなら、次のようになります。

C#
public class Customer
{
}

さらに具体化したい場合は、名詞を組み合わせます。

C#
public class ProductCategory
{
}
C#
public class OrderHistory
{
}
C#
public class CustomerAddress
{
}

このように、「対象となるもの」を中心に考えると、自然なクラス名になりやすいです。

3-3. 「何をするクラスか」を名前に含める場合

クラスが何らかの処理を担当する場合は、「何をするクラスか」を名前に含めることがあります。

たとえば、価格を計算するクラスなら次のようにします。

C#
public class PriceCalculator
{
}

メールを送信するクラスなら、次のようにします。

C#
public class EmailSender
{
}

レポートを生成するクラスなら、次のようにします。

C#
public class ReportGenerator
{
}

ただし、処理内容を名前に含める場合でも、クラス名そのものは名詞句にします。

悪い例です。

C#
public class CalculatePrice
{
}

改善例です。

C#
public class PriceCalculator
{
}

悪い例です。

C#
public class SendEmail
{
}

改善例です。

C#
public class EmailSender
{
}

メソッド名は動詞から始めることが多いですが、クラス名は名詞または名詞句にするのが基本です。

3-4. ドメイン・用途・役割を組み合わせる

実務では、単にServiceRepositoryと付けるだけでは不十分なことが多いです。そこで、ドメイン、用途、役割を組み合わせて命名します。

たとえば、注文に関するサービスなら次のようにします。

C#
public class OrderService
{
}

注文の支払い処理を担当するなら、さらに具体化します。

C#
public class OrderPaymentService
{
}

ユーザー登録専用のサービスなら、次のようにします。

C#
public class UserRegistrationService
{
}

商品検索を担当するクラスなら、次のようにできます。

C#
public class ProductSearchService
{
}

命名の考え方としては、次の順番で組み合わせるとわかりやすくなります。

対象 + 用途 + 役割

例です。

User + Registration + Service
Order + Payment + Service
Product + Search + Service
Customer + Address + Repository

結果として、次のようなクラス名になります。

C#
UserRegistrationService
OrderPaymentService
ProductSearchService
CustomerAddressRepository

長くなりすぎる場合は、クラスの責務が広すぎないかも確認しましょう。

3-5. 迷ったときは具体的すぎず抽象的すぎない名前にする

クラス名は、抽象的すぎても具体的すぎても使いにくくなります。

抽象的すぎる例です。

C#
public class Data
{
}
C#
public class Processor
{
}
C#
public class Manager
{
}

これらは意味が広すぎて、何を担当するクラスなのかわかりません。

一方で、具体的すぎる名前も問題になることがあります。

C#
public class UserNameAndEmailAndPasswordValidationService
{
}

この名前は長すぎます。名前を見るだけで疲れてしまいますし、責務が細かく分かれていない可能性もあります。

改善するなら、次のようにします。

C#
public class UserValidationService
{
}

クラス名は、読む人が役割を理解できる程度に具体的でありながら、長くなりすぎないことが大切です。

目安としては、名前だけを見て「何を扱うクラスか」「どんな役割か」がだいたいわかれば十分です。

4. C#のクラス名でよく使われる命名パターン

4-1. Model・Entityを使うクラス名

ModelEntityは、データ構造や業務上の概念を表すクラス名でよく使われます。

たとえば、ユーザーを表すクラスです。

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

Entityとして明示したい場合は、次のようにすることもあります。

C#
public class UserEntity
{
public int Id { get; set; }
public string Name { get; set; }
}

ViewModelを使う場合は、画面表示用のデータであることを示します。

C#
public class UserViewModel
{
public string DisplayName { get; set; }
}

ModelEntityの使い分けはプロジェクトによって異なりますが、一般的には次のように考えるとわかりやすいです。

Entityは、データベースやドメイン上の実体を表すときに使われます。

C#
public class ProductEntity
{
}

Modelは、画面やAPI、アプリケーション上で扱うデータ構造を広く表すときに使われます。

C#
public class ProductModel
{
}

ただし、すべてのクラスにModelEntityを付ければよいわけではありません。単にUserProductで十分な場合も多くあります。

4-2. Serviceを使うクラス名

Serviceは、業務ロジックやアプリケーションの処理を担当するクラスによく使われます。

例です。

C#
public class UserService
{
}
C#
public class OrderService
{
}
C#
public class PaymentService
{
}

ただし、Serviceは便利な反面、何でも入れられる名前になりやすい点に注意が必要です。

悪い例です。

C#
public class UserService
{
public void RegisterUser() { }
public void SendEmail() { }
public void ExportCsv() { }
public void DeleteOldLogs() { }
}

このように、ユーザーに少しでも関係していれば何でも入れてしまうと、責務が広がりすぎます。

必要に応じて、より具体的な名前に分けましょう。

C#
public class UserRegistrationService
{
}
C#
public class UserNotificationService
{
}
C#
public class UserExportService
{
}

Serviceを使うときは、「何のサービスなのか」「どの業務処理を担当するのか」がわかる名前にすることが大切です。

4-3. Repositoryを使うクラス名

Repositoryは、データの取得や保存を担当するクラスによく使われます。

たとえば、ユーザー情報をデータベースから取得したり保存したりするクラスです。

C#
public class UserRepository
{
public User FindById(int id)
{
// データベースからユーザーを取得する処理
return new User();
}

public void Save(User user)
{
// データベースにユーザーを保存する処理
}
}

商品を扱うRepositoryなら、次のようになります。

C#
public class ProductRepository
{
}

注文を扱うRepositoryなら、次のようになります。

C#
public class OrderRepository
{
}

Repositoryという名前を使う場合は、データアクセスに関する責務を持つクラスであることが伝わるようにしましょう。

逆に、業務ロジックを大量に含める場合は、RepositoryではなくServiceなどに分けることを検討します。

4-4. Controllerを使うクラス名

Controllerは、ASP.NET Core MVCやWeb APIでよく使われる命名パターンです。リクエストを受け取り、必要な処理を呼び出し、レスポンスを返す役割を持ちます。

例です。

C#
public class UsersController
{
}
C#
public class OrdersController
{
}

ASP.NET Coreでは、Controllerクラス名にControllerを付けるのが一般的です。

C#
public class ProductsController
{
}

Controller名は、扱うリソースに合わせて命名します。

ユーザーを扱うなら、

C#
UsersController

注文を扱うなら、

C#
OrdersController

商品を扱うなら、

C#
ProductsController

のようにします。

Web APIでは、リソースを扱うController名に複数形を使うこともよくあります。ただし、プロジェクト内で単数形・複数形の方針を統一することが大切です。

4-5. Managerを使うクラス名

Managerは、何かを管理するクラス名として使われることがあります。

C#
public class UserManager
{
}
C#
public class SessionManager
{
}
C#
public class CacheManager
{
}

ただし、Managerは意味が広くなりやすい名前です。「管理する」と言っても、作成、更新、削除、通知、変換、保存など、さまざまな処理が含まれてしまう可能性があります。

悪い例です。

C#
public class OrderManager
{
public void CreateOrder() { }
public void CancelOrder() { }
public void SendOrderEmail() { }
public void ExportOrderCsv() { }
public void CalculateOrderTotal() { }
}

このように、何でも担当するクラスになっている場合は、より具体的な名前に分けることを検討します。

C#
public class OrderCreationService
{
}
C#
public class OrderCancellationService
{
}
C#
public class OrderNotificationService
{
}

Managerを使ってはいけないわけではありません。しかし、名前が曖昧になりやすいため、より具体的な名前が付けられないかを先に考えるのがおすすめです。

4-6. Helper・Utilityを使うクラス名

HelperUtilityは、補助的な処理をまとめるクラス名として使われることがあります。

C#
public class StringHelper
{
}
C#
public class DateTimeUtility
{
}
C#
public class FileHelper
{
}

ただし、HelperUtilityも非常に便利な名前なので、使いすぎると責務が曖昧になります。

悪い例です。

C#
public class CommonHelper
{
public string FormatDate(DateTime date) { return ""; }
public void SendEmail() { }
public int CalculatePrice() { return 0; }
public void SaveFile() { }
}

このようなクラスは、関係のない処理が集まりやすくなります。

改善するなら、処理の種類ごとに分けます。

C#
public class DateFormatter
{
}
C#
public class EmailSender
{
}
C#
public class PriceCalculator
{
}
C#
public class FileStorage
{
}

HelperUtilityを使う場合は、本当に補助的な処理なのか、より意味のある名前にできないかを確認しましょう。

4-7. Factoryを使うクラス名

Factoryは、オブジェクトの生成を担当するクラスに使われます。

C#
public class UserFactory
{
public User Create(string name)
{
return new User
{
Name = name
};
}
}

複雑な生成処理がある場合や、生成条件によって返すオブジェクトを変える場合に使われます。

例です。

C#
public class PaymentFactory
{
public IPayment Create(string paymentType)
{
if (paymentType == "CreditCard")
{
return new CreditCardPayment();
}

return new BankTransferPayment();
}
}

Factoryを使うと、「このクラスは何かを作る役割を持つ」ということが名前からわかります。

ただし、単にnewするだけのクラスに無理にFactoryを作る必要はありません。生成処理が複雑な場合に使うと効果的です。

4-8. DTO・Request・Responseを使うクラス名

APIやレイヤー間のデータ受け渡しでは、DTORequestResponseといった名前がよく使われます。

DTOは、Data Transfer Objectの略で、データを運ぶためのオブジェクトです。

C#
public class UserDto
{
public int Id { get; set; }
public string Name { get; set; }
}

リクエスト用のクラスにはRequestを付けます。

C#
public class CreateUserRequest
{
public string Name { get; set; }
public string Email { get; set; }
}

レスポンス用のクラスにはResponseを付けます。

C#
public class CreateUserResponse
{
public int UserId { get; set; }
public string Message { get; set; }
}

検索条件を表す場合は、次のような名前もよく使われます。

C#
public class UserSearchRequest
{
public string Keyword { get; set; }
}
C#
public class UserSearchResponse
{
public List<UserDto> Users { get; set; }
}

RequestResponseを付けると、APIの入力用なのか出力用なのかがわかりやすくなります。

5. C#のクラス名の具体例

5-1. 良いクラス名の例

良いクラス名は、役割が明確で、読みやすく、プロジェクト内の命名規則に合っています。

例です。

C#
public class User
{
}

ユーザーを表すクラスだとすぐにわかります。

C#
public class Order
{
}

注文を表すクラスとして自然です。

C#
public class ProductCategory
{
}

商品カテゴリを表すクラスだとわかります。

C#
public class UserRepository
{
}

ユーザーのデータ取得や保存を担当するクラスだと想像できます。

C#
public class OrderPaymentService
{
}

注文の支払い処理を担当するサービスだとわかります。

C#
public class PriceCalculator
{
}

価格計算を担当するクラスだとわかります。

C#
public class ReportGenerator
{
}

レポート生成を担当するクラスだとわかります。

良いクラス名に共通しているのは、名前を読んだだけで役割をある程度想像できることです。

5-2. 悪いクラス名の例

悪いクラス名は、意味が曖昧だったり、短すぎたり、責務が広すぎたりします。

例です。

C#
public class Data
{
}

何のデータなのかわかりません。

C#
public class Info
{
}

何の情報なのかが不明です。

C#
public class Common
{
}

共通処理を何でも入れてしまいやすい名前です。

C#
public class Manager
{
}

何を管理するのかがわかりません。

C#
public class Test
{
}

テスト用なのか、実装用なのか判断できません。

C#
public class A
{
}

短すぎて意味が伝わりません。

C#
public class UserService2
{
}

UserServiceとの違いがわかりません。

このような名前を見つけたら、「このクラスは何を表しているのか」「何を担当しているのか」を言葉にして、より具体的な名前に変更しましょう。

5-3. 抽象的すぎるクラス名の改善例

抽象的すぎるクラス名は、具体的な役割が伝わる名前に改善します。

悪い例です。

C#
public class Data
{
}

改善例です。

C#
public class UserData
{
}

さらに、データの意味を明確にするなら次のようにします。

C#
public class UserProfile
{
}

悪い例です。

C#
public class Processor
{
}

改善例です。

C#
public class PaymentProcessor
{
}

悪い例です。

C#
public class Helper
{
}

改善例です。

C#
public class DateFormatter
{
}

悪い例です。

C#
public class Manager
{
}

改善例です。

C#
public class SessionManager
{
}

さらに具体的にできるなら、次のようにします。

C#
public class UserSessionStore
{
}

抽象的な名前を改善するときは、「何の」「どんな役割の」クラスなのかを追加するとわかりやすくなります。

5-4. 長すぎるクラス名の改善例

クラス名は具体的であることが大切ですが、長すぎる名前は読みづらくなります。

悪い例です。

C#
public class UserNameAndEmailAndPasswordValidationService
{
}

改善例です。

C#
public class UserValidationService
{
}

悪い例です。

C#
public class ProductPriceAndTaxAndDiscountCalculationService
{
}

改善例です。

C#
public class ProductPriceCalculator
{
}

悪い例です。

C#
public class CustomerOrderHistoryCsvFileExportService
{
}

改善例です。

C#
public class OrderHistoryCsvExporter
{
}

長すぎるクラス名になる場合は、次のどちらかを疑いましょう。

1つ目は、名前に情報を詰め込みすぎているケースです。重要な単語だけを残せば、短くできます。

2つ目は、クラスの責務が多すぎるケースです。1つのクラスが複数の役割を持っているなら、クラスを分割したほうがよい場合があります。

5-5. 日本語ローマ字のクラス名を避けるべき理由

C#では、日本語のローマ字を使ったクラス名も書けます。

C#
public class Seihin
{
}
C#
public class Chumon
{
}
C#
public class Kokyaku
{
}

しかし、実務では基本的に避けたほうがよいです。

理由は、英単語より意味が伝わりにくいからです。SeihinよりProductChumonよりOrderKokyakuよりCustomerのほうが、多くの開発者に伝わりやすくなります。

改善例です。

C#
public class Product
{
}
C#
public class Order
{
}
C#
public class Customer
{
}

また、ローマ字は表記ゆれが起きやすいという問題もあります。

C#
Chumon
Tyumon
Chuumon

このように、人によって書き方が変わる可能性があります。英単語で統一したほうが、コード全体の一貫性を保ちやすくなります。

5-6. 初心者がやりがちな命名ミスと修正例

初心者がやりがちなミスとして、まず短すぎる名前があります。

悪い例です。

C#
public class U
{
}

修正例です。

C#
public class User
{
}

次に、意味が広すぎる名前です。

悪い例です。

C#
public class Common
{
}

修正例です。

C#
public class DateFormatter
{
}
C#
public class FilePathBuilder
{
}

次に、処理名をそのままクラス名にしてしまうケースです。

悪い例です。

C#
public class CreateUser
{
}

修正例です。

C#
public class UserCreator
{
}

または、サービスとして表現します。

C#
public class UserRegistrationService
{
}

次に、camelCaseでクラス名を書いてしまうケースです。

悪い例です。

C#
public class userProfile
{
}

修正例です。

C#
public class UserProfile
{
}

最後に、ファイル名とクラス名が合っていないケースです。

悪い例です。

UserData.cs
C#
public class CustomerProfile
{
}

修正例です。

CustomerProfile.cs
C#
public class CustomerProfile
{
}

命名ミスは、慣れるまでは誰でも起こします。大切なのは、あとから読んだときに意味が伝わる名前になっているかを意識することです。

6. C#のクラス名でよくある悩み

6-1. ServiceとManagerはどう使い分ける?

ServiceManagerはどちらもよく使われる名前ですが、意味が似ているため迷いやすいです。

一般的には、業務処理やアプリケーションの処理を表す場合はServiceを使うことが多いです。

C#
public class OrderService
{
}
C#
public class PaymentService
{
}

一方、状態やリソースを管理する意味合いが強い場合はManagerが使われることがあります。

C#
public class SessionManager
{
}
C#
public class CacheManager
{
}

ただし、Managerは意味が広くなりやすいため、安易に使うと責務が曖昧になります。

迷ったときは、まずServiceManagerを付ける前に、より具体的な名前にできないか考えましょう。

C#
public class PriceCalculator
{
}
C#
public class EmailSender
{
}
C#
public class ReportGenerator
{
}

このように、具体的な役割を表す名前にできるなら、そのほうがわかりやすい場合があります。

6-2. HelperとUtilityは使ってもいい?

HelperUtilityは使っても構いません。ただし、使いすぎには注意が必要です。

たとえば、文字列操作だけをまとめるなら次のような名前は理解しやすいです。

C#
public class StringHelper
{
}

日付関連の補助処理なら、次のような名前も考えられます。

C#
public class DateTimeUtility
{
}

しかし、次のような名前は避けたほうがよいです。

C#
public class CommonHelper
{
}
C#
public class AppUtility
{
}

このようなクラスは、さまざまな処理が無秩序に集まりやすくなります。

HelperUtilityを使う前に、より具体的な名前にできないか考えてみましょう。

C#
public class DateFormatter
{
}
C#
public class FileNameGenerator
{
}
C#
public class UrlBuilder
{
}

具体的な名前にできるなら、そちらを優先するのがおすすめです。

6-3. クラス名が長くなりすぎるときはどうする?

クラス名が長くなりすぎるときは、まず責務が多すぎないか確認します。

たとえば、次のようなクラス名があるとします。

C#
public class UserRegistrationAndEmailNotificationService
{
}

このクラスは、ユーザー登録とメール通知の2つの責務を持っている可能性があります。その場合は、クラスを分けたほうがわかりやすくなります。

C#
public class UserRegistrationService
{
}
C#
public class UserNotificationService
{
}

また、名前の中に不要な単語が入っていないかも確認しましょう。

C#
public class ProductPriceCalculationService
{
}

この場合、CalculationServiceよりもCalculatorを使うと短くできます。

C#
public class ProductPriceCalculator
{
}

長いクラス名を見つけたら、「名前を短くする」だけでなく、「クラスの責務を整理する」ことも大切です。

6-4. 同じようなクラス名が増えたときの対処法

同じようなクラス名が増えたときは、役割の違いを明確にしましょう。

たとえば、次のようなクラスがあるとします。

C#
UserService
UserManager
UserHelper
UserUtility

この状態では、それぞれの違いがわかりにくいです。

役割ごとに名前を見直すと、次のようになります。

C#
UserRegistrationService
UserAuthenticationService
UserProfileUpdater
UserRepository

このようにすると、クラスごとの役割が明確になります。

また、名前空間やフォルダ構成を見直すことも有効です。

Services/
UserRegistrationService.cs
UserAuthenticationService.cs

Repositories/
UserRepository.cs

Models/
User.cs
UserProfile.cs

クラス名だけで区別しようとすると長くなりすぎる場合があります。その場合は、名前空間やフォルダも含めて整理しましょう。

6-5. 単数形と複数形はどちらを使う?

C#のクラス名では、基本的に単数形を使います。

C#
public class User
{
}
C#
public class Product
{
}
C#
public class Order
{
}

クラスは1つの概念や1つの型を表すため、単数形が自然です。

一方で、複数の要素を扱うコレクションや一覧を表す場合は、複数形を使うことがあります。

C#
public class UsersController
{
}
C#
public class OrdersController
{
}

ASP.NET CoreのControllerでは、リソース名として複数形を使うこともあります。

ただし、重要なのはプロジェクト内で統一することです。

C#
UsersController
ProductsController
OrdersController

とするなら、他のControllerも複数形にそろえると読みやすくなります。

6-6. Interface名にはIを付けるべき?

C#では、インターフェース名の先頭にIを付ける命名が一般的です。

C#
public interface IUserRepository
{
}
C#
public interface IPaymentService
{
}
C#
public interface ILogger
{
}

実装クラスは、次のようにします。

C#
public class UserRepository : IUserRepository
{
}
C#
public class PaymentService : IPaymentService
{
}

Iを付けることで、名前を見ただけでインターフェースであることがわかります。

ただし、プロジェクトやチームによっては、別の命名方針を採用することもあります。既存のプロジェクトに参加する場合は、そのプロジェクトのルールに合わせましょう。

6-7. 抽象クラスの名前はどう付ける?

抽象クラスは、継承されることを前提としたクラスです。名前には、共通の概念や基底クラスであることがわかる表現を使います。

よく使われるのはBaseを付けるパターンです。

C#
public abstract class ControllerBase
{
}
C#
public abstract class EntityBase
{
}
C#
public abstract class RepositoryBase
{
}

ただし、必ずBaseを付けなければならないわけではありません。抽象的な概念をそのまま名前にすることもあります。

C#
public abstract class Shape
{
}
C#
public class Circle : Shape
{
}
C#
public class Rectangle : Shape
{
}

この場合、Shapeは図形という抽象的な概念を表しており、CircleRectangleが具体的な実装になります。

抽象クラスの名前は、「継承先のクラスと自然な関係になるか」を考えると決めやすくなります。

7. C#の命名規則でクラス名以外も押さえておきたいポイント

7-1. メソッド名の命名規則

C#のメソッド名も、基本的にPascalCaseで書きます。

C#
public void RegisterUser()
{
}
C#
public int CalculateTotalPrice()
{
return 0;
}
C#
public string GetDisplayName()
{
return "";
}

メソッド名は処理を表すため、動詞または動詞句にするのが一般的です。

C#
CreateUser
UpdateProfile
DeleteOrder
CalculatePrice
SendEmail

クラス名が名詞中心であるのに対して、メソッド名は動詞中心になると覚えておくとわかりやすいです。

7-2. プロパティ名の命名規則

C#のプロパティ名もPascalCaseで書きます。

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

複数の単語を組み合わせる場合もPascalCaseです。

C#
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime CreatedAt { get; set; }

プロパティ名は、その値が何を表すのかがわかる名前にします。

悪い例です。

C#
public string Str { get; set; }

改善例です。

C#
public string UserName { get; set; }

7-3. 変数名の命名規則

C#のローカル変数や引数名は、一般的にcamelCaseで書きます。

C#
public void RegisterUser(User user)
{
string displayName = user.Name;
}

camelCaseは、最初の単語の先頭を小文字にし、2語目以降の先頭を大文字にする書き方です。

C#
user
userName
orderId
totalPrice
createdAt

変数名も、意味がわかる名前にすることが大切です。

悪い例です。

C#
var x = 100;
var d = DateTime.Now;
var list = GetUsers();

改善例です。

C#
var totalPrice = 100;
var currentDate = DateTime.Now;
var users = GetUsers();

ただし、短いスコープのループ変数などでは、iのような短い名前が使われることもあります。

C#
for (int i = 0; i < users.Count; i++)
{
Console.WriteLine(users[i].Name);
}

7-4. 名前空間の命名規則

名前空間は、クラスを整理するための仕組みです。C#では、名前空間もPascalCaseで書くのが一般的です。

C#
namespace MyApp.Models
{
}
C#
namespace MyApp.Services
{
}
C#
namespace MyApp.Repositories
{
}

名前空間は、プロジェクト名や会社名、機能名などを組み合わせて作ることが多いです。

C#
namespace CompanyName.ProductName.FeatureName
{
}

例です。

C#
namespace SampleApp.Users.Services
{
public class UserRegistrationService
{
}
}

名前空間を整理すると、同じようなクラス名があっても役割を区別しやすくなります。

7-5. インターフェース名の命名規則

C#のインターフェース名は、先頭にIを付け、PascalCaseで書くのが一般的です。

C#
public interface IUserRepository
{
}
C#
public interface IEmailSender
{
}
C#
public interface IPaymentService
{
}

インターフェース名も、役割がわかる名前にします。

悪い例です。

C#
public interface IService
{
}

改善例です。

C#
public interface IUserRegistrationService
{
}
C#
public interface IOrderRepository
{
}

インターフェースは実装クラスとセットで使われることが多いため、名前の対応関係も意識しましょう。

C#
public interface IUserRepository
{
}

public class UserRepository : IUserRepository
{
}

7-6. 定数・列挙型の命名規則

C#の定数名は、一般的にPascalCaseで書きます。

C#
public const int MaxRetryCount = 3;
C#
public const string DefaultUserName = "Guest";

他の言語では大文字とアンダースコアを使って定数を書くことがあります。

C#
MAX_RETRY_COUNT

しかし、C#ではPascalCaseがよく使われます。

列挙型もPascalCaseで命名します。

C#
public enum OrderStatus
{
Pending,
Paid,
Shipped,
Cancelled
}

列挙型名は単数形にするのが一般的です。

C#
OrderStatus
PaymentStatus
UserRole

各値もPascalCaseで書きます。

C#
Pending
Completed
Cancelled

8. C#のクラス名を決めるときのチェックリスト

8-1. クラスの責務が名前からわかるか

クラス名を決めたら、まず「名前から責務がわかるか」を確認しましょう。

たとえば、次の名前は曖昧です。

C#
public class UserManager
{
}

何を管理するのかが広すぎます。

ユーザー登録を担当するなら、次のようにできます。

C#
public class UserRegistrationService
{
}

ユーザー認証を担当するなら、次のようにできます。

C#
public class UserAuthenticationService
{
}

名前を見ただけで、そのクラスが何を担当しているか想像できることが大切です。

8-2. PascalCaseになっているか

C#のクラス名はPascalCaseにします。

良い例です。

C#
public class UserProfile
{
}

悪い例です。

C#
public class userProfile
{
}
C#
public class user_profile
{
}

複数の単語を使う場合は、それぞれの単語の先頭を大文字にします。

C#
OrderPaymentService
ProductSearchRequest
CustomerAddressRepository

命名に迷ったときでも、まずPascalCaseになっているかは必ず確認しましょう。

8-3. 省略しすぎていないか

クラス名を短くしようとして、省略しすぎていないか確認しましょう。

悪い例です。

C#
public class UsrSvc
{
}

改善例です。

C#
public class UserService
{
}

悪い例です。

C#
public class PrdRepo
{
}

改善例です。

C#
public class ProductRepository
{
}

省略は、書くときは楽ですが、読むときの負担を増やします。特にチーム開発では、誰が読んでも意味が伝わる名前を優先しましょう。

8-4. 汎用的すぎる名前になっていないか

DataInfoCommonManagerHelperのような汎用的すぎる名前になっていないか確認しましょう。

悪い例です。

C#
public class Common
{
}

改善例です。

C#
public class FilePathBuilder
{
}
C#
public class DateFormatter
{
}
C#
public class CsvExporter
{
}

汎用的な名前を付けたくなったときは、「何のためのクラスなのか」をもう一段具体的に考えることが大切です。

8-5. プロジェクト内で命名ルールが統一されているか

クラス名は、プロジェクト内で統一されていることも重要です。

たとえば、DTOの表記が混在していると読みづらくなります。

C#
UserDTO
OrderDto
ProductDataTransferObject

どれが正しいというより、プロジェクト内で統一されているかが大切です。

たとえば、Dtoに統一するなら次のようにします。

C#
UserDto
OrderDto
ProductDto

Controllerの単数形・複数形も同じです。

C#
UserController
OrdersController
ProductController

このように混在している場合は、方針を決めてそろえましょう。

C#
UsersController
OrdersController
ProductsController

命名規則は、個人の好みよりもプロジェクト全体の一貫性を優先することが大切です。

8-6. 将来読んだ人にも意味が伝わるか

最後に、「将来このコードを読んだ人にも意味が伝わるか」を確認しましょう。

ここでいう「将来読んだ人」には、他の開発者だけでなく、数か月後の自分も含まれます。

その場の勢いで次のような名前を付けると、後から意味がわからなくなります。

C#
public class Temp
{
}
C#
public class NewLogic
{
}
C#
public class FixClass
{
}

一時的な対応であっても、役割が伝わる名前を付けましょう。

C#
public class LegacyUserImporter
{
}
C#
public class OrderMigrationService
{
}
C#
public class PaymentRetryHandler
{
}

クラス名は、未来の開発者へのメッセージです。時間が経っても意味が伝わる名前を意識しましょう。

9. C#のクラス名に関するFAQ

9-1. C#のクラス名は日本語でも使える?

C#では、日本語のクラス名を使うこと自体は可能です。

C#
public class ユーザー
{
}

しかし、実務では基本的に英語のクラス名を使うことが多いです。

理由は、英語のほうがライブラリやフレームワークとの相性がよく、多くの開発者にとって読みやすいからです。また、日本語名は環境やツールによって扱いにくい場合もあります。

そのため、次のように英語で命名するのがおすすめです。

C#
public class User
{
}
C#
public class Order
{
}
C#
public class Product
{
}

学習用や個人用の小さなコードであれば日本語を使っても動きますが、実務やチーム開発では英語に統一するのが無難です。

9-2. クラス名にアンダースコアを使ってもいい?

C#では、クラス名にアンダースコアを使うことはできます。

C#
public class User_Profile
{
}

しかし、C#の一般的な命名規則では、クラス名はPascalCaseで書くため、アンダースコアは基本的に使いません。

改善例です。

C#
public class UserProfile
{
}

アンダースコアは、フィールド名や特殊な用途で使われることはありますが、クラス名では避けるのが一般的です。

9-3. クラス名とファイル名が違っても動く?

C#では、クラス名とファイル名が違っていてもコンパイルできる場合があります。

たとえば、次のようなファイルでも動くことがあります。

Data.cs
C#
public class UserProfile
{
}

しかし、実務ではおすすめしません。ファイル名とクラス名が違うと、目的のクラスを探しにくくなるからです。

基本的には、次のように一致させましょう。

UserProfile.cs
C#
public class UserProfile
{
}

ファイル名とクラス名を一致させるだけで、プロジェクトの見通しが良くなります。

9-4. クラス名は短いほうがいい?

クラス名は、短ければよいわけではありません。大切なのは、短さとわかりやすさのバランスです。

短すぎる悪い例です。

C#
public class U
{
}
C#
public class Svc
{
}

意味が伝わる名前にすると、次のようになります。

C#
public class User
{
}
C#
public class UserService
{
}

一方で、長すぎる名前も読みづらくなります。

C#
public class UserNameAndEmailAndPasswordValidationService
{
}

改善例です。

C#
public class UserValidationService
{
}

クラス名は、必要な意味が伝わる範囲で、できるだけシンプルにするのが理想です。

9-5. 命名規則に違反してもコンパイルできる?

命名規則に違反していても、文法上問題がなければコンパイルできる場合があります。

たとえば、次のようなクラス名でも、C#の文法としては使える場合があります。

C#
public class user_profile
{
}

しかし、コンパイルできることと、良い名前であることは別です。

C#では、クラス名はPascalCaseで書くのが一般的です。

C#
public class UserProfile
{
}

命名規則は、コードを読みやすくし、チームで保守しやすくするためのものです。コンパイルできるからといって、自由に命名してよいわけではありません。

9-6. Microsoftの命名規則に必ず従うべき?

基本的には、C#や.NETの一般的な命名規則に従うのがおすすめです。

特に、次のようなルールは多くのプロジェクトで使われています。

クラス名: PascalCase
メソッド名: PascalCase
プロパティ名: PascalCase
ローカル変数名: camelCase
インターフェース名: I + PascalCase

ただし、既存プロジェクトに参加する場合は、そのプロジェクトの命名ルールを優先することも大切です。

たとえば、既存コードがDto表記で統一されているなら、新しく追加するクラスもそれに合わせます。

C#
UserDto
OrderDto
ProductDto

命名規則は、絶対的な正解を探すものではなく、コードを読みやすく保つための約束です。チーム内で一貫性があることを重視しましょう。

まとめ

C#のクラス名は、コードの読みやすさや保守性に大きく影響します。

基本として、クラス名はPascalCaseで書き、名詞または名詞句を使います。

C#
public class UserProfile
{
}
C#
public class OrderPaymentService
{
}
C#
public class ProductRepository
{
}

また、クラス名は「何を表すクラスか」「何を担当するクラスか」がわかる名前にすることが大切です。

避けたい名前の例は次のようなものです。

C#
Data
Info
Common
Manager
Helper
UserService2

これらは意味が曖昧になりやすく、後から保守しづらくなる原因になります。

クラス名に迷ったときは、次のポイントを確認しましょう。

クラスの責務が名前からわかるか
PascalCaseになっているか
省略しすぎていないか
汎用的すぎる名前になっていないか
ファイル名とクラス名が一致しているか
プロジェクト内で命名が統一されているか
将来読んだ人にも意味が伝わるか

C#のクラス名に完璧な唯一の正解があるわけではありません。しかし、読み手に伝わる名前、責務が明確な名前、一貫性のある名前を意識することで、コードの品質は大きく向上します。

クラス名は、設計そのものを表す重要な要素です。なんとなく名前を付けるのではなく、「このクラスは何を表しているのか」を考えながら、わかりやすい名前を付けていきましょう。