C#の規則を初心者向けに完全解説|命名規則・コーディング規約・基本構文のルール一覧
C#の規則には、守らなければコンパイルできない基本構文のルール、名前の付け方を統一する命名規則、読みやすいコードを書くためのコーディング規約があります。
この記事では、C#初心者が押さえておきたい規則を、サンプルコードとともに体系的に解説します。C#の文法エラーを減らしたい人や、他の開発者が読みやすいコードを書きたい人は、順番に確認していきましょう。
1. C#の「規則」とは?初心者が最初に理解すべき3つの意味
1-1. C#の規則は「基本構文」「命名規則」「コーディング規約」に分けて考える
C#の規則は、大きく次の3種類に分けられます。
| 種類 | 内容 | 守らなかった場合 |
|---|---|---|
| 基本構文 | セミコロン、波かっこ、型、条件式など | コンパイルエラーになることがある |
| 命名規則 | クラス名、変数名、メソッド名などの付け方 | 動作するが読みにくくなる |
| コーディング規約 | インデント、改行、コメントなどの書式 | 動作するが保守しにくくなる |
例えば、次のコードは変数名の付け方が一般的な命名規則に反していますが、文法としては成立します。
int UserAge = 20;ローカル変数にはcamelCaseを使うのが一般的なので、次のように書くと自然です。
int userAge = 20;一方、セミコロンを省略した次のコードは文法エラーです。
int userAge = 20このように、「コンパイラが要求する規則」と「人間が読みやすくするための規則」を分けて理解することが重要です。
1-2. C#の規則を守るとコードが読みやすく保守しやすくなる
コーディング規則を統一すると、コードを書いた本人だけでなく、ほかの開発者も処理内容を理解しやすくなります。
特にチーム開発では、開発者ごとに命名や改行の方法が異なると、コードレビューや修正に余計な時間がかかります。一定の規則に従って書かれたコードは、変更箇所を見つけやすく、機能追加や不具合修正も行いやすくなります。Microsoftの.NETコーディング規則でも、可読性、一貫性、共同作業、保守性を高めるために規則を統一することが推奨されています。
1-3. 初心者が混同しやすい「文法ルール」と「書き方の慣習」の違い
文法ルールは、C#コンパイラがプログラムを解釈するために必要な決まりです。
例えば、次のコードでは文字列の末尾を示すダブルクォーテーションがありません。
Console.WriteLine("Hello);これはコンパイルできません。
一方、次のコードは読みにくいものの、文法上は問題ありません。
if(age>=18){Console.WriteLine("成人です");}一般的なコーディング規約に合わせると、次のようになります。
if (age >= 18){Console.WriteLine("成人です");}初心者は、エラーになったときに「文法が間違っているのか」「推奨される書き方から外れているだけなのか」を切り分けましょう。
1-4. C#とC言語・C++・Javaの規則の違い
C#はC言語、C++、Javaと似た記号や構文を持っています。例えば、セミコロン、波かっこ、if、forなどは共通しています。
ただし、実行環境や型の仕組み、メモリ管理、ライブラリの設計には違いがあります。C#は.NET上で動作するマネージド言語であり、ガベージコレクション、プロパティ、イベント、デリゲート、LINQ、非同期処理など、.NETと組み合わせた機能を利用できます。
C言語やC++の経験があっても、その命名規則やメモリ管理方法をそのままC#に持ち込むのではなく、C#と.NETの慣習に合わせることが大切です。
2. C#の基本構文に関するルール一覧
2-1. C#プログラムの基本構造
伝統的なC#のコンソールプログラムは、次のように構成されます。
using System;namespace SampleApp{internal class Program{private static void Main(){Console.WriteLine("Hello, C#!");}}}
主な構成要素は次のとおりです。
using:名前空間内の型を簡潔に記述するnamespace:型を分類するclass:データや処理をまとめるMain:プログラムの開始地点になる文:実際に実行する処理を書く
現在のC#では、クラスやMainメソッドを省略するトップレベルステートメントも利用できます。
Console.WriteLine("Hello, C#!");学習中は、クラスとMainを明示する従来形式を理解したうえで、トップレベルステートメントとの違いを学ぶとよいでしょう。
2-2. usingディレクティブの書き方
usingディレクティブを記述すると、名前空間を毎回完全修飾名で書く必要がなくなります。
using System;using System.Collections.Generic;using System;がある場合は、次のように書けます。
Console.WriteLine("Hello");usingがない場合は、完全修飾名を使います。
System.Console.WriteLine("Hello");使用していないusingは削除し、必要なものだけを残すのが基本です。プロジェクト全体で共通して使う名前空間は、global usingで指定する方法もあります。
2-3. namespaceの役割と書き方
namespaceは、クラスやインターフェイスなどの型を分類し、同名の型が衝突するのを防ぐ仕組みです。
波かっこを使う従来形式は次のとおりです。
namespace MyCompany.MyApp{internal class UserService{}}ファイルスコープ形式では、次のように書けます。
namespace MyCompany.MyApp;internal class UserService{}
ファイルスコープ名前空間はネストを1段減らせるため、現在の新しいコードで広く使われています。1つのファイルに記述できるファイルスコープ名前空間は1つです。
2-4. classの定義ルール
クラスは、classキーワードの後ろにクラス名を書いて定義します。
public class User{public string Name { get; set; } = string.Empty;}クラス名にはPascalCaseを使うのが一般的です。また、クラスが何を担当するのか分かる名前を付けます。
// 分かりにくいpublic class Data{}// 役割が伝わりやすいpublic class CustomerRepository{}
2-5. Mainメソッドの基本ルール
従来形式の実行可能プログラムでは、Mainメソッドがエントリーポイントになります。
internal class Program{private static void Main(){Console.WriteLine("開始");}}Mainはクラスまたは構造体の中に記述し、staticを付けます。戻り値にはvoid、int、Task、Task<int>などを指定できます。
コマンドライン引数を受け取る場合は、次のように書きます。
private static void Main(string[] args){Console.WriteLine($"引数の数: {args.Length}");}ただし、トップレベルステートメントを使うプログラムでは、明示的なMainメソッドを書かない構成も可能です。
2-6. 文の終わりにはセミコロンを付ける
変数宣言、代入、メソッド呼び出しなど、多くの文の末尾にはセミコロンを付けます。
int age = 20;age = 21;Console.WriteLine(age);ただし、クラス、メソッド、if文など、波かっこで終わる構造の直後には通常セミコロンを付けません。
if (age >= 18){Console.WriteLine("成人です");}2-7. ブロックは波かっこで囲む
クラス、メソッド、条件分岐、繰り返し処理などの範囲は、{と}で囲みます。
if (isLoggedIn){ShowDashboard();}C#では、処理が1文だけなら波かっこを省略できる場合があります。
if (isLoggedIn)ShowDashboard();ただし、後から処理を追加したときのミスを防ぐため、初心者は1文だけでも波かっこを付けるのがおすすめです。
2-8. コメントの書き方
1行コメントには//を使います。
// ユーザーの年齢を保持するint userAge = 20;複数行コメントには/と/を使います。
/*- 入力値を検証し、
- 問題がなければ登録する*/
クラスやメソッドの説明には、XMLドキュメントコメントを使えます。
/// <summary>/// 商品の税込価格を計算します。/// </summary>public decimal CalculatePrice(decimal price){return price * 1.1m;}コメントは「コードを日本語に置き換える」のではなく、処理の理由や背景を補足するために使いましょう。
2-9. C#は大文字と小文字を区別する
C#では、大文字と小文字が異なる名前として扱われます。
int userCount = 10;int UserCount = 20;この2つは別の変数です。また、次のコードはConsoleの先頭が小文字なのでエラーになります。
console.WriteLine("Hello");正しくは次のとおりです。
Console.WriteLine("Hello");3. C#の命名規則一覧
3-1. C#の命名規則で使われる主な記法
C#では、主にPascalCaseとcamelCaseが使われます。
| 記法 | 例 | 主な用途 |
| PascalCase | UserName | クラス、メソッド、プロパティ、定数 |
| camelCase | userName | ローカル変数、引数 |
| _camelCase | _userName | privateフィールド |
PascalCaseは各単語の先頭を大文字にします。camelCaseは最初の単語を小文字で始め、2語目以降の先頭を大文字にします。MicrosoftのC#命名ガイドでも、型やpublicメンバーにはPascalCase、メソッド引数やローカル変数にはcamelCaseが示されています。
3-2. クラス名はPascalCaseで書く
クラス名はPascalCaseで書きます。
public class OrderService{}次のような名前は避けます。
public class order_service{}役割を表す名詞または名詞句を選ぶことも重要です。
public class InvoiceCalculator{}3-3. メソッド名はPascalCaseで書く
メソッド名もPascalCaseを使用します。
public void SaveUser(){}メソッドは処理を表すため、動詞または動詞を含む名前が適しています。
CalculateTotal();FindCustomer();SendEmail();3-4. プロパティ名はPascalCaseで書く
プロパティ名にはPascalCaseを使います。
public string UserName { get; set; } = string.Empty;public int Age { get; set; }
GetUserNameのようなメソッド風の名前ではなく、保持している値を表す名詞を付けるのが一般的です。
3-5. 変数名はcamelCaseで書く
ローカル変数にはcamelCaseを使います。
int itemCount = 5;string customerName = "佐藤";decimal totalPrice = 1200m;xやtmpのような短すぎる名前は、用途が限定される場合を除いて避けます。
// 分かりにくいdecimal x = price * quantity;// 分かりやすいdecimal totalPrice = price * quantity;
3-6. 引数名はcamelCaseで書く
メソッドの引数名にもcamelCaseを使います。
public decimal CalculateTotal(decimal unitPrice, int quantity){return unitPrice * quantity;}引数名を見るだけで、どのような値を渡すのか分かるようにします。
3-7. 定数名はPascalCaseで書く
C#の一般的な規則では、定数名にもPascalCaseを使います。
private const int MaxRetryCount = 3;private const decimal TaxRate = 0.1m;ほかの言語で見られる、すべて大文字の名前を使う必要はありません。
// C#では一般的ではないprivate const int MAX_RETRY_COUNT = 3;ただし、既存プロジェクトで別のルールが定められている場合は、プロジェクトの規約を優先します。
3-8. インターフェイス名は先頭にIを付ける
インターフェイス名はPascalCaseで書き、先頭に大文字のIを付けます。
public interface IUserRepository{User? FindById(int userId);}実装クラスは、先頭のIを除いた名前にすることがあります。
public class UserRepository : IUserRepository{public User? FindById(int userId){return null;}}インターフェイスにIを付ける方法は、.NETで広く使われている命名規則です。
3-9. privateフィールドはアンダースコア付きcamelCaseで書く
privateインスタンスフィールドには、先頭にアンダースコアを付けたcamelCaseがよく使われます。
public class UserService{private readonly IUserRepository _userRepository;public UserService(IUserRepository userRepository){_userRepository = userRepository;}
}
引数とフィールドを区別しやすい点がメリットです。
_name = name;ただし、アンダースコアはC#の文法上必須ではありません。チームやプロジェクトの規約によっては、別の形式を採用する場合もあります。
3-10. 名前に使う英単語は意味が伝わるものを選ぶ
名前は短さよりも意味の伝わりやすさを優先します。
// 意味が不明確int d = 30;// 意味が伝わるint retentionDays = 30;
略語を使いすぎると、書いた本人以外には意味が分からなくなります。
// 分かりにくいint usrCnt;// 分かりやすいint userCount;
ただし、id、url、htmlなど、広く理解されている略語は利用できます。プロジェクト内で同じ単語に複数の表記を使わないことも大切です。
4. C#のコーディング規約で押さえるべきルール
4-1. インデントはスペース4つを基本にする
C#では、インデントにスペース4つを使う形式が一般的です。
if (isValid){SaveData();}インデントがないコードは、ブロックの範囲が分かりにくくなります。
if (isValid){SaveData();}タブを使うかスペースを使うかは開発環境によって異なる場合がありますが、同じプロジェクト内で統一することが重要です。
4-2. 1行に複数の処理を書かない
複数の処理を1行に詰め込むと、変更内容やエラー箇所を確認しにくくなります。
// 避けたい書き方int count = 0; count++; Console.WriteLine(count);1文ずつ改行します。
int count = 0;count++;Console.WriteLine(count);4-3. 波かっこの位置を統一する
C#では、開始波かっこを次の行に置くAllman形式が一般的です。
public void Save(){if (CanSave()){WriteFile();}}開始波かっこを同じ行に置いても文法エラーにはなりませんが、ファイルごとに書き方が異なる状態は避けましょう。波かっこの位置はEditorConfigでも設定できます。
4-4. 空行を使って処理のまとまりを分ける
処理の目的が変わる場所に空行を入れると、流れを把握しやすくなります。
User user = FindUser(userId);ValidateUser(user);
SaveUser(user);SendNotification(user);
ただし、1行ごとに空行を入れると、かえってまとまりが分かりにくくなります。意味のある処理単位で区切りましょう。
4-5. 不要なコメントを書きすぎない
コードを読めば分かる内容を、そのままコメントにする必要はありません。
// countに1を足すcount++;コメントがなくても意味が分かる名前を使うほうが効果的です。
retryCount++;コメントを書く場合は、「なぜその処理が必要なのか」「なぜ通常とは異なる方法を採用したのか」を説明します。
// 外部APIの制限を避けるため、1秒待ってから再試行するawait Task.Delay(1000);4-6. マジックナンバーを避ける
意味を説明せず、数値を直接記述することをマジックナンバーと呼びます。
if (retryCount >= 3){StopProcessing();}3が何を表しているのか分かるよう、定数に置き換えます。
private const int MaxRetryCount = 3;if (retryCount >= MaxRetryCount){StopProcessing();}
ただし、0や1など、文脈から意味が明らかな値まで無理に定数化する必要はありません。
4-7. varを使う場面と明示的な型を書く場面
varを使うと、右辺からローカル変数の型が推論されます。
var userName = "佐藤";var itemCount = 5;varは型がなくなる機能ではありません。上のuserNameはstring、itemCountはintとしてコンパイルされます。
生成される型が右辺から明確な場合は、varを使うと重複を減らせます。
var users = new List<User>();右辺だけでは型を判断しにくい場合は、明示的な型を書くと読みやすくなります。
decimal totalPrice = CalculateTotal();varを使うかどうかは、プロジェクトの規約と可読性を基準に決めましょう。
4-8. nullチェックを適切に書く
参照型の値がnullになる可能性がある場合は、使用前に確認します。
if (user is null){return;}Console.WriteLine(user.Name);
nullではないことを確認する場合は、is not nullを使えます。
if (user is not null){Console.WriteLine(user.Name);}null条件演算子やnull合体演算子も便利です。
int nameLength = user?.Name?.Length ?? 0;引数がnullであってはいけない場合は、早い段階で例外を発生させます。
public void Save(User user){ArgumentNullException.ThrowIfNull(user);// 保存処理
}
nullable参照型を有効にすると、stringとstring?を区別し、コンパイラの警告を使ってnull関連のミスを減らせます。
4-9. 例外処理の基本ルール
例外処理にはtry、catch、finallyを使います。
try{string text = File.ReadAllText("data.txt");Console.WriteLine(text);}catch (FileNotFoundException ex){Console.WriteLine($"ファイルが見つかりません: {ex.FileName}");}発生する可能性がある例外を具体的に捕捉し、適切に処理します。理由なくすべての例外を無視するコードは避けましょう。
// 避けたい例try{SaveData();}catch{}後処理が必要なリソースには、using文またはusing宣言を使用します。
using StreamReader reader = File.OpenText("data.txt");string text = reader.ReadToEnd();例外は通常とは異なる問題を通知するために使い、通常の条件分岐の代わりとして乱用しないことも重要です。
4-10. チーム開発では規約を統一する
個人の好みよりも、プロジェクト全体の一貫性を優先します。
例えば、ある開発者はprivateフィールドにアンダースコアを付け、別の開発者は付けない状態では、コード全体が読みにくくなります。
命名、インデント、varの使用方針、波かっこの位置などをEditorConfigやアナライザーで設定すると、開発環境が違っても同じルールを適用できます。
5. C#の型・変数・演算子に関するルール
5-1. 変数は使用前に宣言する
変数を使う前に、名前と型を宣言します。
int age;age = 20;Console.WriteLine(age);
宣言していない変数は使用できません。
userName = "佐藤";また、ローカル変数は値を代入してから読み取る必要があります。
int count;Console.WriteLine(count); // エラー初期値を代入すれば使用できます。
int count = 0;Console.WriteLine(count);5-2. 変数には型を指定する
C#は静的型付け言語です。変数には、扱うデータの種類を表す型があります。
int age = 20;string name = "佐藤";bool isActive = true;varを使用した場合も、コンパイル時に型が決まります。
var price = 1000m; // decimal型異なる型の値を無条件に代入することはできません。
int count = "10"; // エラー5-3. int・double・string・boolの基本ルール
初心者が最初に使う代表的な型は次のとおりです。
int itemCount = 10;double average = 12.5;string productName = "ノート";bool isAvailable = true;intは整数、doubleは小数を含む数値、stringは文字列、boolはtrueまたはfalseを扱います。
金額計算では、2進浮動小数点型のdoubleよりもdecimalが適していることがあります。
decimal price = 1980.50m;文字列はダブルクォーテーション、1文字を表すcharはシングルクォーテーションで囲みます。
string message = "Hello";char initial = 'A';5-4. 値型と参照型の違い
C#の型は、大きく値型と参照型に分けられます。
代表的な値型は、int、double、bool、decimal、列挙型、構造体です。値型の変数を代入すると、基本的には値そのものがコピーされます。
int first = 10;int second = first;second = 20;
Console.WriteLine(first); // 10Console.WriteLine(second); // 20
代表的な参照型は、クラス、配列、デリゲート、stringです。クラスのインスタンスを代入すると、同じオブジェクトへの参照がコピーされます。
User firstUser = new User { Name = "佐藤" };User secondUser = firstUser;secondUser.Name = "鈴木";
Console.WriteLine(firstUser.Name); // 鈴木
なお、stringは参照型ですが、内容を変更できないイミュータブルな型として設計されています。
5-5. 代入と比較の違い
代入には=、等しいかどうかの比較には==を使います。
int age = 20;if (age == 20){Console.WriteLine("20歳です");}
初心者は、代入と比較を混同しないように注意しましょう。
文字列も==で内容を比較できます。
if (userName == "admin"){Console.WriteLine("管理者です");}大文字と小文字を無視するなど、比較条件を明示したい場合はstring.Equalsを使います。
bool isAdmin = string.Equals(userName,"admin",StringComparison.OrdinalIgnoreCase);5-6. 算術演算子の使い方
基本的な算術演算子は次のとおりです。
| 演算子 | 意味 | 例 |
+ | 加算 | a + b |
- | 減算 | a - b |
* | 乗算 | a * b |
/ | 除算 | a / b |
% | 余り | a % b |
int total = 10 + 5;int remainder = 10 % 3;整数同士の除算では、小数部分が切り捨てられます。
int result = 5 / 2;Console.WriteLine(result); // 2小数として計算するには、どちらかを小数型にします。
double result = 5.0 / 2;Console.WriteLine(result); // 2.55-7. 比較演算子の使い方
比較演算子は、2つの値を比較してboolを返します。
| 演算子 | 意味 |
== | 等しい |
!= | 等しくない |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
bool isAdult = age >= 18;bool isEmpty = itemCount == 0;5-8. 論理演算子の使い方
複数の条件を組み合わせるには、論理演算子を使います。
| 演算子 | 意味 |
&& | かつ |
</span></td><td><br class="ProseMirror-trailingBreak"></td><td><span> | または |
! | 否定 |
if (age >= 18 && hasPermission){Enter();}if (isAdmin || isOwner){ShowSettings();}if (!isEnabled){DisableButton();}&&と||を混在させる場合は、かっこを使って意図を明確にします。
if ((isAdmin || isOwner) && isActive){ShowSettings();}5-9. 型変換とキャストのルール
安全に変換できる型では、暗黙的な変換が行われます。
int count = 10;long largeCount = count;情報が失われる可能性がある変換には、明示的なキャストが必要です。
double price = 19.8;int roundedDownPrice = (int)price;文字列を数値に変換する場合、外部入力にはTryParseを使うと安全です。
string input = "123";if (int.TryParse(input, out int number)){Console.WriteLine(number);}else{Console.WriteLine("数値を入力してください");}
int.Parseは変換できない文字列が渡されると例外を発生させるため、入力内容が保証されている場合に使用します。
6. C#の条件分岐・繰り返し処理のルール
6-1. if文の基本ルール
if文は、条件がtrueのときに処理を実行します。
if (age >= 18){Console.WriteLine("成人です");}C#の条件式にはbool型の値が必要です。数値を直接条件にすることはできません。
int count = 1;// エラーif (count){}
次のように比較式を書きます。
if (count > 0){}6-2. else ifとelseの使い方
複数の条件を順番に判定する場合は、else ifとelseを使います。
if (score >= 80){Console.WriteLine("合格");}else if (score >= 60){Console.WriteLine("再試験");}else{Console.WriteLine("不合格");}上から順番に評価され、最初に一致したブロックだけが実行されます。そのため、範囲の広い条件を先に書くと意図しない結果になることがあります。
6-3. switch文の基本ルール
1つの値に応じて処理を分ける場合は、switch文を使えます。
switch (status){case "Pending":Console.WriteLine("処理待ち");break;case "Completed":Console.WriteLine("完了");break;default:Console.WriteLine("不明な状態");break;
}
基本的なswitch文では、各caseの処理をbreakなどで終了させます。
値を返すだけなら、switch式を使うと簡潔に書けます。
string message = status switch{"Pending" => "処理待ち","Completed" => "完了",_ => "不明な状態"};6-4. for文の基本ルール
回数が決まっている繰り返しには、for文が適しています。
for (int index = 0; index < 5; index++){Console.WriteLine(index);}for文のかっこ内には、初期化、継続条件、更新処理を記述します。
配列やリストの添字は通常0から始まるため、範囲外アクセスに注意しましょう。
for (int index = 0; index < users.Count; index++){Console.WriteLine(users[index].Name);}6-5. while文の基本ルール
条件を満たしている間、処理を繰り返す場合はwhile文を使います。
int count = 0;while (count < 3){Console.WriteLine(count);count++;}
条件が常にtrueになると無限ループになります。ループ内で条件に関係する値を更新しているか確認しましょう。
6-6. foreach文の基本ルール
配列やコレクションの要素を順番に処理する場合は、foreach文が読みやすい方法です。
foreach (User user in users){Console.WriteLine(user.Name);}添字が必要ない場合は、forよりもforeachを優先すると意図が伝わりやすくなります。
foreach (string productName in productNames){Console.WriteLine(productName);}6-7. breakとcontinueの使い分け
breakはループ自体を終了します。
foreach (User user in users){if (user.Id == targetId){foundUser = user;break;}}continueは現在の繰り返しだけを中断し、次の要素へ進みます。
foreach (User user in users){if (!user.IsActive){continue;}SendEmail(user);
}
多用すると処理の流れが追いにくくなるため、必要な場面に限定します。
6-8. 条件式は読みやすく書く
複雑な条件式は、意味のある変数やメソッドに分割します。
// 読みにくいif (age >= 18 && hasAccount && !isSuspended && balance >= 1000){Apply();}bool canApply =age >= 18 &&hasAccount &&!isSuspended &&balance >= 1000;if (canApply){Apply();}
条件に名前を付けることで、その条件が何を意味しているのか理解しやすくなります。
7. C#のクラス・メソッド・プロパティのルール
7-1. クラスは役割ごとに分ける
1つのクラスに、画面表示、データ保存、メール送信、計算など、無関係な役割をすべて詰め込まないようにします。
public class OrderCalculator{public decimal CalculateTotal(Order order){return order.Items.Sum(item => item.Price * item.Quantity);}}public class OrderRepository{public void Save(Order order){// 保存処理}}役割ごとに分割すると、変更の影響範囲を限定しやすくなります。
7-2. メソッドは1つの処理に集中させる
メソッドが長くなった場合は、複数の役割を持っていないか確認します。
public void RegisterUser(User user){ValidateUser(user);SaveUser(user);SendWelcomeEmail(user);}詳細な処理を別のメソッドに分けると、メインの流れが読みやすくなります。
private void ValidateUser(User user){// 検証処理}private void SaveUser(User user){// 保存処理}
7-3. 戻り値の型を正しく指定する
値を返すメソッドでは、メソッド名の前に戻り値の型を書きます。
public int Add(int firstNumber, int secondNumber){return firstNumber + secondNumber;}値を返さない場合はvoidを指定します。
public void ShowMessage(string message){Console.WriteLine(message);}戻り値がintなのに文字列を返すことはできません。
public int GetCount(){return "10"; // エラー}7-4. 引数の数を増やしすぎない
引数が多すぎるメソッドは、呼び出し方を間違えやすくなります。
CreateUser("佐藤","太郎",20,"Tokyo","example@example.com",true);関連する値をクラスやレコードにまとめる方法があります。
public record CreateUserRequest(string LastName,string FirstName,int Age,string Address,string Email,bool IsActive);public void CreateUser(CreateUserRequest request){}すべてのメソッドを機械的に引数1個にする必要はありませんが、引数が増えたら設計を見直しましょう。
7-5. アクセス修飾子の基本ルール
アクセス修飾子は、クラスやメンバーをどこから利用できるか指定するキーワードです。
public class UserService{private readonly UserRepository _repository;public void Save(User user){Validate(user);_repository.Save(user);}private void Validate(User user){// 検証処理}
}
必要以上にpublicにせず、外部へ公開する必要がないメンバーはprivateなどに制限します。
7-6. public・private・protected・internalの違い
主なアクセス修飾子は次のとおりです。
| 修飾子 | アクセスできる範囲 |
public | どこからでもアクセスできる |
private | 同じ型の内部だけ |
protected | 同じ型と派生型 |
internal | 同じアセンブリ内 |
トップレベルのクラスにアクセス修飾子を書かなかった場合は、通常internalになります。クラス内のフィールドやメソッドに書かなかった場合は、通常privateです。
ただし、省略時の規則に頼りすぎず、重要なメンバーではアクセス範囲を明示すると意図が伝わりやすくなります。
7-7. プロパティを使う基本ルール
クラスの状態を外部へ公開するときは、publicフィールドではなくプロパティを使うのが一般的です。
public class User{public string Name { get; set; } = string.Empty;}読み取り専用にする場合は、setterを公開しません。
public class Order{public decimal TotalPrice { get; private set; }}計算結果を返すプロパティも作成できます。
public string FullName => $"{LastName} {FirstName}";7-8. staticを使う場面
staticを付けたメンバーは、インスタンスを作らずに利用できます。
public static class PriceCalculator{public static decimal AddTax(decimal price){return price * 1.1m;}}呼び出し側は次のようになります。
decimal total = PriceCalculator.AddTax(1000m);特定のインスタンス状態を必要としない処理に適しています。ただし、状態を持つstaticメンバーを増やしすぎると、テストや並行処理が難しくなる場合があります。
7-9. コンストラクターの基本ルール
コンストラクターは、インスタンス作成時の初期化処理を行います。戻り値の型は書かず、クラス名と同じ名前にします。
public class User{public User(string name){Name = name;}public string Name { get; }
}
呼び出し方は次のとおりです。
User user = new User("佐藤");クラスが正常に動作するために必要な値は、コンストラクターで受け取ると、初期化漏れを防ぎやすくなります。
8. C#初心者がやりがちな規則違反と修正例
8-1. セミコロンの付け忘れ
誤った例です。
int count = 10Console.WriteLine(count);修正例です。
int count = 10;Console.WriteLine(count);エラーが次の行に表示されることもあるため、その直前の行も確認しましょう。
8-2. 大文字・小文字の間違い
誤った例です。
string UserName = "佐藤";Console.WriteLine(username);修正例です。
string userName = "佐藤";Console.WriteLine(userName);入力を手作業で繰り返さず、Visual Studioの入力補完を活用すると間違いを減らせます。
8-3. 変数名がわかりにくい
誤った例です。
int a = 1000;int b = 3;int c = a * b;修正例です。
int unitPrice = 1000;int quantity = 3;int totalPrice = unitPrice * quantity;値が何を表しているのか、名前から判断できるようにします。
8-4. インデントが崩れている
読みにくい例です。
if (isActive){Console.WriteLine("有効");if (isAdmin){Console.WriteLine("管理者");}}修正例です。
if (isActive){Console.WriteLine("有効");if (isAdmin){Console.WriteLine("管理者");}
}
フォーマッターを使用すれば、インデントを自動的に整えられます。
8-5. 1つのメソッドに処理を書きすぎる
長いメソッドでは、入力検証、計算、保存、通知などが混在しやすくなります。
public void ProcessOrder(Order order){ValidateOrder(order);decimal total = CalculateTotal(order);SaveOrder(order, total);SendConfirmation(order);}各処理を別メソッドや別クラスへ分けると、修正やテストを行いやすくなります。
8-6. nullを考慮していない
危険な例です。
User? user = FindUser(userId);Console.WriteLine(user.Name);FindUserがnullを返すと例外が発生します。
修正例です。
User? user = FindUser(userId);if (user is null){Console.WriteLine("ユーザーが見つかりません");return;}
Console.WriteLine(user.Name);
8-7. コメントとコードの内容が一致していない
次のコードでは、コメントと実際の条件が一致していません。
// 18歳以上なら処理するif (age >= 20){Register();}コードを変更した際にコメントを更新し忘れると、誤解の原因になります。コメントがなくても意図が分かる名前やメソッド構成を優先し、必要なコメントだけを残しましょう。
8-8. エラーメッセージを読まずに修正しようとする
コンパイルエラーが発生したら、まず次の情報を確認します。
エラーコード
エラーメッセージ
ファイル名
行番号
エラーが発生した行の直前
例えば、「; expected」はセミコロン不足、「The name ... does not exist」は変数名の間違いやスコープ外参照の可能性があります。
表示された行だけに原因があるとは限りません。波かっこやダブルクォーテーションの閉じ忘れが、後ろの行でエラーとして表示されることもあります。
9. C#の規則を効率よく身につける方法
9-1. 公式ドキュメントで基本ルールを確認する
C#の文法や言語仕様を確認するときは、Microsoft LearnのC#ドキュメントが基本資料になります。
検索結果の記事だけで判断せず、疑問に感じた構文について、公式リファレンスやプログラミングガイドを確認する習慣を付けましょう。C#ガイドには、基本構文、型、クラス、非同期処理、新機能、言語リファレンスなどがまとめられています。
9-2. Visual Studioの警告や提案を活用する
Visual Studioでは、文法エラーだけでなく、未使用変数、nullの可能性、簡略化できるコード、命名や書式に関する提案も表示されます。
赤い下線だけでなく、警告や提案にも目を通しましょう。表示された内容を機械的に修正するのではなく、「なぜこの提案が出たのか」を確認すると、規則を効率よく学べます。
9-3. コードフォーマッターを使って書式を整える
フォーマッターを使うと、インデント、空白、改行、波かっこの位置などを自動的に整えられます。
Visual Studioでは、ドキュメントのフォーマットやコードクリーンアップを利用できます。手作業だけに頼らず、保存時やコミット前に書式を整える習慣を付けましょう。Visual Studioのコードスタイル設定は、EditorConfigと組み合わせて管理できます。
9-4. EditorConfigでチームの規約を統一する
.editorconfigファイルをプロジェクトに配置すると、インデントや命名、varの使用方針などを共有できます。
簡単な設定例は次のとおりです。
root = true[*.cs]indent_style = spaceindent_size = 4end_of_line = crlfinsert_final_newline = true
dotnet_naming_rule.interfaces_should_be_prefixed_with_i.severity = suggestion
EditorConfigは個人のIDE設定ではなく、コードベースに関連付けて管理できます。リポジトリへ含めることで、参加者全員に同じ規約を適用しやすくなります。
9-5. サンプルコードを写して規則に慣れる
良質なサンプルコードを実際に入力すると、セミコロン、波かっこ、命名、インデントなどを自然に覚えられます。
ただし、コピーして動かすだけでは十分ではありません。変数名を変更する、条件を追加する、別の型に置き換えるなど、小さな変更を加えて動作を確認しましょう。
9-6. 小さなプログラムを作りながら学ぶ
規則だけを暗記するより、実際に小さなプログラムを作るほうが身につきます。
初心者向けの題材としては、次のようなものがあります。
数値を入力して合計を表示する
年齢から成人かどうかを判定する
商品一覧を
foreachで表示する簡単な成績判定を作る
ユーザー情報をクラスで管理する
作成後に、命名、インデント、null処理、メソッドの長さを見直しましょう。
9-7. 命名規則と基本構文から優先して覚える
最初からすべての規則を暗記する必要はありません。まずは次の順番で学ぶと効率的です。
セミコロン、波かっこ、大文字と小文字
変数宣言と型
if、for、foreachクラスとメソッド
PascalCaseとcamelCase
インデントと改行
nullチェックと例外処理
EditorConfigやアナライザー
基本構文を身につけた後で、設計や高度なコーディング規約へ進みましょう。
10. C#の規則に関するよくある質問
10-1. C#の命名規則は必ず守らないといけない?
命名規則の多くは文法上の必須条件ではありません。
例えば、ローカル変数をPascalCaseで書いても、通常はコンパイルできます。
int UserCount = 10;しかし、一般的なC#コードと異なるため、読み手が変数の種類を判断しにくくなります。特別な理由がなければ、.NETで広く使われている命名規則に合わせましょう。
チーム開発では、プロジェクトで定められた規約を優先します。
10-2. 変数名に日本語は使える?
C#の識別子にはUnicode文字を使用できるため、日本語の変数名も記述できます。
int 商品数 = 10;decimal 合計金額 = 5000m;ただし、入力環境、外部ツール、海外メンバーとの共同作業、公開APIの利用者などを考えると、英語名のほうが扱いやすいことが一般的です。日本語を使う場合は、チーム内で方針を統一しましょう。
また、C#の予約語を名前に使う場合は、先頭に@を付けられます。
string @class = "A";ただし、読みづらくなるため、通常は予約語を避けた名前を選びます。C#識別子の有効な文字や命名方法は、公式の識別子命名規則で定義されています。
10-3. privateフィールドの先頭にアンダースコアは必要?
文法上は必要ありません。次のコードも有効です。
private string name;ただし、Microsoftのサンプルや多くの.NETプロジェクトでは、privateインスタンスフィールドに_nameのような形式が使われます。
private readonly string _name;引数やローカル変数と区別しやすいのが利点です。既存プロジェクトに規約がある場合は、その規約に従いましょう。
10-4. varは使わないほうがいい?
varを避ける必要はありません。右辺から型が明らかな場合は、コードを簡潔にできます。
var users = new List<User>();ただし、メソッド名だけでは戻り値の型が分かりにくい場合、明示的な型のほうが読みやすいことがあります。
User? user = FindById(userId);varか明示的な型かを機械的に決めるのではなく、可読性とプロジェクト規約を基準にします。
10-5. コーディング規約と文法エラーの違いは?
文法エラーは、コンパイラがコードを正しく解釈できない状態です。
int count = 10コーディング規約違反は、コンパイルできても、プロジェクトで推奨される書き方から外れている状態です。
int Count_Value = 10;ただし、アナライザーやEditorConfigの設定によっては、命名規則や書式の違反を警告またはエラーとして扱うこともできます。
10-6. C#初心者はどの規則から覚えるべき?
最初は、コンパイルと実行に直接関係する規則を優先します。
セミコロン、波かっこ、大文字と小文字、変数の型、if文、繰り返し処理を理解した後、PascalCaseやcamelCaseなどの命名規則を覚えましょう。
高度な設計規則を最初から完璧に覚えるより、短いコードを書き、警告やレビューを通じて少しずつ改善するほうが効果的です。
10-7. UnityのC#でも同じ規則を使える?
基本構文や一般的な命名規則は、UnityのC#でも利用できます。
ただし、UnityではMonoBehaviourを継承したクラス、StartやUpdateなどのイベント関数、Inspectorへ公開するフィールド、シリアライズなど、Unity固有の仕組みがあります。
public class PlayerController : MonoBehaviour{[SerializeField]private float _moveSpeed = 5f;private void Update(){Move();}private void Move(){// 移動処理}
}
基本的にはC#の規則を守りつつ、Unity公式の推奨事項や既存プロジェクトの規約も確認しましょう。
10-8. 最新のC#でも基本的な規則は変わらない?
C#には新しい構文や機能が継続的に追加されていますが、変数、型、クラス、メソッド、条件分岐、命名といった基本的な考え方は引き続き重要です。
2026年6月時点の最新安定版はC# 14で、.NET 10と組み合わせて利用できます。C# 15は.NET 11向けのプレビュー段階です。新しいバージョンではファイルベースアプリなどの選択肢も増えていますが、従来のプロジェクト形式、クラス、Mainメソッドも引き続き利用できます。
言語バージョンはプロジェクトやSDKによって決まります。latestを指定すると環境によって使用バージョンが変わり、ビルドの再現性が下がる可能性があるため、チーム開発ではSDKや言語バージョンを適切に固定することが大切です。
まとめ
C#の規則は、次の3種類に分けて考えると理解しやすくなります。
コンパイルに必要な基本構文
名前を統一するための命名規則
コードを読みやすくするコーディング規約
初心者は、セミコロン、波かっこ、大文字と小文字、変数の型といった基本構文から学びましょう。その後、クラス名やメソッド名にはPascalCase、変数名や引数名にはcamelCaseを使う習慣を身につけます。
さらに、スペース4つのインデント、意味の伝わる名前、適切なnullチェック、短く役割が明確なメソッドを意識すると、読みやすく保守しやすいC#コードを書けるようになります。
すべての規則を一度に暗記する必要はありません。Visual Studioの警告、コードフォーマッター、EditorConfig、公式ドキュメントを活用し、小さなプログラムを作りながら繰り返し身につけることが大切です。

