[C#] 命名規則の基本を解説

当ページのリンクには広告が含まれています。
目次

C#命名規則の基本

命名規則とは?

命名規則とは、クラス名や変数名などの名前の付け方をチームで統一するためのルールです。
英単語の選び方(動詞・名詞)、大文字小文字(PascalCase / camelCase)、略語の扱いをあらかじめ決めておくことで、コードが読みやすくなり、検索しやすくなり、ミスが減ります。
初心者ほど「とりあえず動けばOK」になりがちですが、未来の自分、あるいは他人が読んだときの負担を小さくする“投資”だと考えてください。

命名規則を決めることによる効果

  • 可読性UP
    大文字小文字や単語の並べ方が一定だと、パターン認識が働き、意味を瞬時に把握できます。
    C#では「型やプロパティはPascalCase」「ローカル変数はcamelCase」にするのが一般的で、このように役割ごとにルールを決めることで、名前を見るだけで役割が推測できるようになります。
  • 検索性UP
    エディタでFindGo to Symbolを使うとき、命名規則が一貫していれば、目的の定義にすぐ辿り着けます。
    たとえば「取得する動作は Get」「作成するのは Create」「試行は Try」といった動詞の定番を決めておくと、「何で検索すればよいか」が明確になります。
  • バグ減少
    メソッド名がCalculateTotalなのにキャッシュから返すだけだと、期待と実装の不一致が起きます。
    命名を正すことは、仕様の誤解を早期にあぶり出す効果があります。
  • レビュー効率UP
    idIdどっち?」のような表記ゆれの指摘をなくし、レビューを本質的な設計・アルゴリズムの議論に集中できます。
  • ツールとの相性UP
    ルールが定まっていれば.editorconfigやアナライザで自動チェックできます。
    人間が全部を見張る必要がなくなります。

命名規則の最小構成

以下のルールを守るだけで読みやすさは大きく改善します。

対象命名規則記述例
型名
メソッド名
プロパティ名
PascalCase
(各単語の先頭が大文字)
UserService
GetUserById
CreatedAt
ローカル変数
引数
camelCase
(先頭が小文字+単語境界で大文字)
userId
createdAt
bool型変数肯定形の質問系/状態系isActive
hasItems
canExecute
メソッド名動詞で始めるGet
Set
Find
Create
Update
Delete
Calculate
Validate
TryParse
コレクション名複数形にするusers
orderItems
lines
クラス名名詞/役割名にする
※抽象語は避ける(Manager/Helper/Utilなど)
User
OrderRepository
EmailSender
定数PascalCase+名詞DefaultPageSize
MaxRetries
非同期メソッド末尾にAsyncを付けるGetUserAsync
SaveChangesAsync

名前の長さと具体性のバランス

  • 短すぎて意味不明なものはNG(例:d, tmp, man)
  • 長すぎるのもNG(例:GetAllUsersFromDatabaseAndSortByCreatedAtAscending)
  • 原則は「具体性>省略」だが、局所スコープのループ変数などは短くてOK(例:i, x, line)
  • だいたい3単語ぐらいに収まるのが目安
  • どうしても長くなる場合は設計を見直すサイン

初心者あるある

  • 日本語直訳やローマ字を使ってしまう。(例:TourokuUser)
    ⇒英語に統一しましょう。(RegisterUser)
  • 略語を乱用してしまう。(usr, cfg, svc)
    ⇒なるべくフルスペルで書きましょう。読みやすさ優先です。
  • bool型変数名を否定形にしてしまう。
    ⇒isNotEnabledは読みにくい。否定形の表現は肯定形+条件反転にしましょう。(例:if( !isEnabled ){})

PascalCase と camelCase:C#での使い分け早見表

「どこを大文字にするか」を迷わなくするために、用途ごとの“型”を決めましょう。
C#/.NET では役割によって書式が違うので、形だけで“それが何者か”が分かるようになります。

対象命名規則記述例
クラス
構造体
レコード
PascalCase
(名詞で役割を表す)
UserService
Order
EmailMessage
インターフェイスPascalCase + I接頭辞
(実装と区別しやすい)
IUserRepository
ILogger
列挙型(enum)
列挙子
PascalCaseOrderStatus
名前空間(namespace)PascalCase
(セグメントごとにPascalCase)
MyCompany.Shop.Api
メソッドPascalCase
(動詞で開始/非同期は末尾Async
GetUserById
SendEmail
プロパティ
イベント
PascalCase
(名詞/形容詞で状態を表す)
UserId
CreatedAt
Completed
定数(constPascalCase
(値は不変。大文字スネークは使わない)
DefaultPageSize
MaxRetryCount
フィールド(private)_camelCase
(先頭アンダースコア + camelCase が定番)
_db
_cache
_httpClient
static フィールド(private)_camelCase(または s_系)
(チームで統一。初心者は_でOK)
_instance
引数 / ローカル変数camelCase
(短く明確に)
userId
count
isActive
ラムダ引数(LINQ)camelCase(慣用名可)
(短くてOK、item等も多い)
x
user
line
ジェネリック型パラメータTで始めるTItem
TKey
TValue

ルールと理由をセットで理解すると覚えやすい

  • 公開される名前はPascalCase
    ⇒クラス・メソッド・プロパティなどはAPIの顔。視認性が高いPascalCaseで、英単語の境界が読み取れる書き方にします。GetUserByIdgetuserbyid を見比べると、可読性の差は明らかです。
  • 内部で使う名前(変数・引数)はcamelCase
    ⇒コードの流れの中で読む対象。文中に溶け込みやすく、先頭小文字→後続単語の頭を大文字で区切ることで、読みやすさとコンパクトさを両立します。userId, createdAt, isEnabled など。
  • private フィールドは _camelCase
    this. と見分けやすく、メソッドの引数・ローカル変数とも衝突しにくいのが利点です。_db, _cache, _logger のように“裏方の部品”感が出ます。
  • 定数(const)はPascalCase
    ⇒C#ではMAX_VALUE のような完全大文字スネークケースは原則使いません。メンバーと同じくPascalCaseで、人が読む名詞にします(DefaultTimeout など)。static readonly も不変概念のときはPascalCaseに寄せると分かりやすい。
  • boolは Is/Has/Can で始める
    IsActive, HasItems, CanExecute のように質問に答える形にすると、条件式が自然文のように読めます。if (isActive && hasItems) { ... } は直感的です。
  • 非同期は Async サフィックス
    GetUserAsync, SaveChangesAsync のように末尾固定で付けます。呼び出し時に await を忘れにくくなり、同期版と視覚的に区別できます。

よく使う役割別の命名ガイド

「どの動詞を先頭に置くか」「boolはどんな接頭辞にするか」を最初に決めておくと、命名に迷いません。
C#/.NETでよく使う命名を役割別にリスト化し、選び方の基準と記述例で命名規則を覚えていきましょう。

目的推奨動詞使い分けの基準記述例
取得
(存在が前提)
Get存在する前提で取り出す。
なければ例外。
GetUserById(int userId)
検索
(ないかも)
Find見つからない可能性がある。
見つからなければnullを返す。
FindUser(string email)
安全な取得TryGet例外を出さず、bool で成否+outを返す。TryGetUser(int id, out User user)
作成
(インスタンス生成)
Create新しいものを作る。
(戻り値が新インスタンス)
CreateOrder(CreateOrderRequest req)
追加
(集合に入れる)
Add既存のコレクションやDBにデータを加える。AddItem(OrderItem item)
更新
(既存の変更)
Update既存オブジェクト/レコードの内容を変更する。UpdateEmail(int userId, string email)
削除
(永続データ)
DeleteDB/ファイルなどを削除する。DeleteUser(int userId)
取り除く
(コレクション)
Removeコレクションやキャッシュからデータを取り除く。RemoveItem(Guid id)
すべて消すClearコレクションの内容をすべて消す。ClearCache()
読み込みLoad
Read
ファイル/ストレージからデータを読み取る。LoadSettings()
保存Save
Write
設定/データを保存する。SaveSettings(Settings s)
変換Convert
ToXxx
FromXxx
型変換・表現変換。ToDto(User u)
FromJson(string json)
解析
(文字列⇒型)
Parse
TryParse
文字列⇒型。
失敗時の方針で使い分け。
DateTime.TryParse(...)
計算Calculate
Compute
関数的な計算。CalculateTotal()
検証Validate値や状態が条件を満たすか確認する。
(違反⇒結果 or 例外)
ValidatePassword(string value)
保障
(なければ用意)
Ensure条件を満たすようにする。
(無ければ作る)
EnsureDirectory(string path)
開始 / 停止Start
Stop
プロセス・監視・タイマーなどを開始/停止する。StartTimer()
StopTimer()
有効 / 無効化Enable
Disable
機能トグル。EnableFeature(string name)
接続 / 切断Connect
Disconnect
ネットワーク・DBなどの接続/切断。ConnectAsync()
Disconnect()

最後に

命名は「作法」ではなく「仕様の圧縮」です。

良い命名は、頭の中にある変換作業を最小化し、コードだけで仕様が語れる状態を作ります。
作法として丸暗記するのではなく、「名前=契約」という視点で命名してコーディングするように心がけましょう。
命名規則を守ることができれば、プロジェクトは速く・安全に拡張できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次