C# チートシート — クイック リファレンス
C# 12(.NET 8 併用)の構文、OOP、LINQ、そして最もよく使う標準ライブラリを網羅したクイック リファレンス。日常の約 80% のシナリオをカバーします。
C# C# 12 (with .NET 8)
.NET (Core / 5+ / 8) · OOP、ジェネリック、関数型、並行 · 静的、強い型付け、名前的型付け
おすすめの学習パス
まず「Hello World とビルド環境」(dotnet new console)を動かす → 変数、型、制御フローに慣れる → コレクションと LINQ でデータを処理する → オブジェクト指向(class / インターフェース)を理解する → async / await を習得する → 最後に必要に応じてファイル、ネットワーク、正規表現、ビルド / デバッグを参照してください。FAQ セクションは後から戻って落とし穴を回避するのに役立ちます。
1.Hello World とビルド環境
.NET プログラムを一から作成・実行・構成します: トップレベル ステートメント、プロジェクト ファイル、名前空間、コマンドライン引数。
最小プログラム
C# 9+ はトップレベル ステートメントをサポートします。Program.cs に直接実行コードを書き、class や Main の定型句は不要です。Console.WriteLine で行を出力します。
作成と実行
dotnet CLI は .NET のコマンドライン エントリ ポイントです。dotnet new でプロジェクト作成、dotnet run でビルドと実行、dotnet build でビルドのみ。
コマンドライン引数
トップレベル ステートメントの args は string[] のコマンドライン引数で、args[0] からがユーザー引数です。従来の Main(string[] args) と同等です。
終了コード
トップレベル ステートメントでは return で終了コードを指定できます。0 は成功、それ以外はエラーの種類を表します。Environment.ExitCode も読み書き可能です。
名前空間
namespace は型を整理して名前の衝突を防ぎます。ファイル スコープ名前空間(C# 10)はセミコロンで宣言し、中括弧とインデントを省きます。
using ディレクティブ
using ディレクティブは名前空間をインポートし、完全修飾名を不要にします。GlobalUsings.cs のグローバル using でプロジェクト全体にインポートを共有できます。
トップレベル ステートメントの詳細
トップレベル ステートメントは Program クラスの Main メソッドにコンパイルされます。プロジェクト内に 1 つだけ存在でき、ヘルパー関数はローカル関数を使います。
csproj プロジェクト ファイル
csproj はプロジェクト構成です: TargetFramework で対象フレームワーク、ImplicitUsings で暗黙の using、Nullable で null 許容コンテキスト。
2.変数と定数
型推論、const/readonly、null 許容型、null 合体演算子、nameof、スコープ。
var 型推論
var は初期化子からコンパイラが型を推論します。ローカル変数には使えますが、フィールド/プロパティには使えません。初期化子の型が明確なときは var を使うと簡潔です。
const と readonly
const はコンパイル時定数(プリミティブ型)、readonly は実行時の読み取り専用フィールド(コンストラクタで代入可能)です。静的定数は static readonly を使うことが多いです。
null 許容型
Nullable<T>(int? など) で値型に null を許可でき、null 許容参照型(? サフィックス + Nullable enable)でコンパイラが null 参照を静的に解析します。
null 合体と null 条件演算子
?? は左辺が null のとき右辺を返し、?. は左辺が null のとき null で短絡評価します。?. をチェーンすると深いアクセスも null 安全に書けます。
nameof 式
nameof はシンボル名を文字列として返し、名前変更時に自動同期されます。引数の検証、プロパティ変更通知、ログ タグなどでよく使われます。
スコープ
C# は波括弧でブロック スコープを定義します。ローカル変数はフィールドと同名でもよいですが、シャドウは避けてください。using 宣言はリソースのスコープをブロック末尾までに制限します。
init とプロパティ初期化
init アクセサーはオブジェクト初期化子での代入を許可し、その後は読み取り専用になります。プロパティ初期化子は既定値を与え、set アクセサーは検証を追加できます。
分解
タプルと record は分解をサポートします。丸括弧で要素を複数の変数に展開します。Deconstruct メソッドで分解ロジックをカスタマイズできます。
3.データ型
組み込み型、null 許容、列挙型、構造体、ジェネリック、record、タプル、型変換。
組み込み型
int/long/double/bool などの組み込み型は System 型にマップされます。var は単なる推論で、実行時の型は変わりません。
null 許容型
int? は null 許容値型(Nullable<int>)で、HasValue / Value でアクセスします。Nullable enable 下では null 許容参照型がコンパイラによって静的にチェックされます。
列挙型
enum は名前を付けた整数定数を定義し、既定では int です。Flags 属性を付けるとビット組み合わせを HasFlag やビット演算で判定できます。
構造体
struct は値型です: 代入で全体がコピーされ、スタックに確保され、null にできません(null 許容にするとボックス化されます)。小さく不変なデータに向きます。
クラス(参照型)
class は参照型です: 代入で同じオブジェクトを共有し、GC がメモリを管理し、null にできます。可変状態には class を使います。
ジェネリック
ジェネリックは型をパラメータ化し、コンパイル時に強く型付けされたコードを生成するため、実行時のボックス化が発生しません。T は型パラメータ、where 句で制約を追加します。
record 型
record(C# 9)は値セマンティクスを持つ参照型です: 値の等価性、ToString、分解、with 式が組み込まれています。DTO や不変データに適しています。
タプル
タプルは複数の値をまとめて保持し、名前付き要素もサポートします。複数値の返却や簡易なデータ集約に便利で、一時的な用途にはタプル、長期には record を使います。
型変換
is は安全な型チェック、as は安全な変換(失敗時 null)、(T) は強制変換(失敗時例外)、Convert/Parse で明示的に解析します。
パターン マッチング
is / switch はパターン マッチングに使います: 型パターン、プロパティ パターン、位置パターン。大量の if とキャストを置き換え、意図を明確に表現できます。
4.参照と配列
値型と参照型、配列、Span、インデックスと範囲、ref/in/out、unsafe ポインタ。
値型 vs 参照型
値型(struct / 列挙型 / プリミティブ型)は代入でコピーされ、参照型(class / インターフェース)は代入で同じオブジェクトを共有します。これが C# の最も重要なメンタル モデルです。
配列
配列は固定長の参照型で、[] でインデックス アクセスします。多次元配列とジャグ配列は異なります: [,] は矩形、[][] はジャグ。配列では Count ではなく Length を使います。
インデックスと範囲
^ は末尾からのインデックス(^1 で最後)、.. は範囲を表します(1..^1 で先頭と末尾を除く)。配列 / List のサブセットを切り出すモダンな書き方です。
Span とメモリ
Span<T> は任意の連続メモリへの読み取りビューで、割り当てなしでスライスでき、高性能データ処理の中核です。スタック/ヒープのどちらのメモリも指せます。
ref / in / out パラメータ
ref は読み書き可能な参照渡し、in は読み取り専用の参照渡し、out は戻り値用(呼び出し前に初期化不要)です。参照渡しで値型のコピーを回避できます。
unsafe ポインタ
unsafe コンテキストでは本物のポインタ(int* など)を使えます。csproj で AllowUnsafeBlocks を有効化する必要があります。ネイティブ相互運用時のみ使い、通常のコードでは避けてください。
Memory とバッファ
Memory<T> は Span のヒープ セーフ版で、フィールドに保存でき async をまたいで使えます。ReadOnlyMemory は読み取り専用ビューです。非同期バッファ処理に使われます。
コピー セマンティクス
値型は既定で値渡し(大きな struct はコピー コストが発生)、オブジェクト(参照)は参照渡しです。オブジェクトをその場で変更したい場合は ref を使いません。
5.制御フロー
if/else、for/foreach/while、switch 式、break/continue、throw 式。
if / else
if / else は条件で分岐します。C# では比較に ==、短絡評価に && と || を使います。単一文では波括弧を省略できますが、残すことを推奨します。
for ループ
古典的な for: 初期化、条件、増分。インデックスが必要なときに使います。多くの場合は foreach の方が安全です。
foreach 反復
foreach はインデックスなしでコレクションを反復し、コンパイル時に安全です。var や LINQ と組み合わせてデータをチェーン処理するのが最も一般的です。
while / do-while
while は判定してから実行、do-while は少なくとも 1 回実行します。ストリームを EOF まで読むなど、ループ回数が不明な場面に適しています。
switch 式
switch 式(C# 8)は => で値を返し、長い if-else チェーンを置き換えます。型パターンと when ガードの組み合わせは強力です。
break と continue
continue は現在の反復をスキップして次へ、break はループを抜け、return はメソッドを抜けます。多重ループを抜けるには goto を使います。
三項演算子
cond ? a : b で if / else の代入を 1 行で書けます。分岐の式は互換性のある型(共通型に変換可能)でなければなりません。
throw 式
throw は式として ?? や ?: の右辺、メソッド本体 1 行で使うことができます。ArgumentNullException を投げて引数検証を簡潔に書けます。
6.関数とメソッド
メソッド シグネチャ、パラメータ渡し、オーバーロード、ローカル関数、ラムダ式、式本体メンバー。
メソッド定義
メソッド = 戻り型 + 名前 + パラメータ リスト + 本体です。void は戻り値なしを表します。アクセス修飾子で可視性を制御します。
パラメータ渡し
既定では値渡しです: メソッド内の変更は呼び出し元の変数に影響しません。オブジェクトは参照のコピーが渡されるため、メンバーを変更すると元のオブジェクトに影響します。
オプション引数と名前付き引数
オプション引数は既定値を持ち(パラメータ リストの末尾に置く必要があります)、名前付き引数で名前を基に渡し、中間のオプション引数をスキップできます。
ref / out / in
ref は読み書き可能な参照渡し、out は出力専用(呼び出し前に初期化不要)、in は読み取り専用の参照渡し(大きな値型のコピーを回避)。
メソッド オーバーロード
オーバーロード = 同じ名前のメソッドでパラメータ リストが異なる(数 / 型)。コンパイラが引数に基づき最適なバージョンを選びます。戻り型はオーバーロード解決に参加しません。
式本体メンバー
メソッド / プロパティ / コンストラクタが単一式の場合、=> で簡潔に書けます。ラムダと似ていますが、式本体メンバーは本物のメンバーです。
ローカル関数
メソッド内で定義した関数は外側の変数(クロージャ)へアクセスでき、再帰ヘルパーや反復子内部の処理でよく使われます。
ラムダ式
匿名関数: 引数 => 式。デリゲート / Func / Action と組み合わせて使い、LINQ の中心的な構文です。
デリゲート
デリゲートはメソッドの型です: シグネチャを宣言し、+= で複数のメソッドを購読、デリゲートを呼び出すと順番に発火します。イベントはデリゲートに基づきます。
7.文字列
文字列リテラル、補間、一般的メソッド、可変 StringBuilder、書式設定。
文字列リテラル
二重引用符の通常の文字列、@ の逐語的文字列(エスケープ処理なし)、$ の補間文字列、$$ の複合リテラル(C# 11)。
文字列補間
$ 接頭辞は {} 内の式の結果を文字列にインライン展開します。書式と配置も指定でき、+ 連結より読みやすい書き方です。
連結と比較
+ で連結、string.Concat で一括連結、string.Join で区切り文字付き連結。文字列の等価比較は ==(値比較)で行います。
一般的なメソッド
Length、Substring、Contains、StartsWith、IndexOf、Replace、Trim、Split、ToUpper/ToLower はほとんどの文字列処理をカバーします。
StringBuilder
大量の連結には StringBuilder を使い、文字列生成の繰り返しを避けます(文字列は不変で、+ は毎回新しいオブジェクトを生成)。ループ内での連結で特に顕著です。
文字 char
char は UTF-16 の単一文字です。char.IsDigit / IsLetter / IsWhiteSpace で種類を判定します。string は不変、char は反復可能。
書式設定
string.Format / $ 補間では書式指定子を使います: D 整数、F 小数、C 通貨、P パーセント、X 16 進数。
文字列の解析
Parse は文字列を数値に変換し(失敗で例外)、TryParse は安全(bool と out で結果を返します)。TryParse を優先します。
8.コレクションと LINQ
List/Dictionary/HashSet などの一般的なコレクション、IEnumerable、LINQ のチェーン クエリ。
List 動的配列
List<T> は可変長配列で、Add / Insert / Remove / IndexOf があり、インデックス アクセスは O(1)。foreach で反復します。
Dictionary 辞書
Dictionary<K,V> はキーから値へのマップで、キーで O(1) ルックアップ。TryGetValue で安全に取得し、KeyValuePair を反復します。
HashSet 集合
HashSet<T> は重複なしで O(1) の Contains 判定。UnionWith / IntersectWith / ExceptWith で集合演算(重複排除・マージ)を行います。
Queue と Stack
Queue<T> は FIFO(Enqueue / Dequeue)、Stack<T> は LIFO(Push / Pop)。タスク キューやアンドゥ スタックの処理に使います。
IEnumerable と遅延
IEnumerable<T> は読み取り専用のシーケンス インターフェースで、LINQ はこれに基づいて遅延評価を行います(反復時に計算)。配列 / List / Dictionary がすべて実装します。
LINQ フィルタと射影
Where はフィルタ、Select は射影(マップ)、OrderBy はソート、Distinct は重複除去。メソッド チェーンは読みやすく遅延評価です。
LINQ 集計
Count / Sum / Average / Min / Max で集計し、Any / All で判定、First / Single で要素を取得します(マッチなしで例外、FirstOrDefault は既定値を返す)。
GroupBy グループ化
GroupBy はキーでグループ化し、IGrouping のシーケンスを生成します。統計(カテゴリ別のカウント・合計)によく使われます。
LINQ クエリ構文
from / where / orderby / select のクエリ構文はメソッド チェーンの宣言的な書き方で、コンパイル後は等価です。可読性の好みの問題です。
9.メモリとリソース管理
GC による自動回収、IDisposable と using によるアンマネージ リソース解放、弱参照、オブジェクト プール。
GC ガベージ コレクション
C# のメモリは GC が自動管理します: ヒープ上のオブジェクトが参照されなくなると回収されます。世代別 GC(0 / 1 / 2)がパフォーマンスを最適化します。
IDisposable インターフェース
アンマネージ リソース(ファイル / ネットワーク / DB 接続)を保持するクラスは IDisposable を実装し、Dispose でリソースを解放します。
using 文と宣言
using はスコープ終了時に Dispose を保証します(finally セマンティクス)。using 宣言(C# 8)はブロック終了時にリソースを自動解放します。
ファイナライザ
デストラクタ ~Class() はファイナライザです: GC による回収前に呼ばれますが、タイミングは保証されません。アンマネージ リソースの解放のみに使用し、通常は Dispose パターンを採ります。
弱参照
WeakReference は GC によるターゲットの回収を妨げず、キャッシュ(重いオブジェクトの辞書キャッシュ、回収を許容する)に使われます。Target はいつでも null になり得ます。
オブジェクト プールと ArrayPool
大きな配列を頻繁に割り当てる場合は ArrayPool でバッファを再利用し、GC の負荷を減らします。ArrayPool<T>.Shared.Rent と Return はペアで使います。
stackalloc スタック割り当て
stackalloc はスタックにメモリを割り当て、高速で GC を発生させません。小さな一時バッファに適しますが、スタック領域は有限なので注意が必要です。
GC メモリ圧迫
大量のネイティブ メモリを割り当てる場合、GC.AddMemoryPressure で GC に通知し、マネージ オブジェクトを速やかに回収させてメモリ使用量の失控を防ぎます。
10.オブジェクト指向
クラス、プロパティ、コンストラクタ、継承、多態性、インターフェース、抽象クラス、アクセス修飾子。
クラスとオブジェクト
class はデータ型(参照型)を定義します。フィールドが状態を保持し、プロパティがアクセスを制御し、メソッドが振る舞いを定義し、コンストラクタが初期化します。
プロパティ
プロパティはフィールドへの安全なアクセサです: get で読み取り、set で書き込み。アクセス修飾子と検証ロジックを追加できます。コンパイラがバッキング フィールドを生成します。
継承
C# は単一継承です: class は : で 1 つの基底クラスを継承します。派生クラスは基底クラスの is-a です。private メンバーは継承されず、protected はアクセス可能です。
多態性
virtual と override で多態性を実現します: 基底クラスの参照から呼び出されたメソッドは実際の型にディスパッチされます。メソッドは virtual でないとオーバーライドできません。
抽象クラス
abstract クラスはインスタンス化できず、abstract メソッド(派生クラスが必ず実装)を保有できます。抽象メソッドには本体がありません。テンプレート基底クラスに使います。
インターフェース
interface は契約を定義します: メンバーは実装を持ちません。実装クラスはすべて提供します。C# は複数の interface 実装をサポートします(多重継承の代替)。
アクセス修飾子
public は公開、private は非公開、protected は派生クラスから可視、internal は同一アセンブリ内で可視。クラスは既定で private、メンバーは既定で private。
sealed と object メソッド
sealed クラスは継承不可、sealed override メソッドはそれ以上オーバーライドできません。すべてのクラスは暗黙的に object(ToString / Equals / GetHashCode)を継承します。
静的クラスと拡張メソッド
static class は静的メンバーのみを持ち、インスタンス化できません。拡張メソッドは静的クラス内の静的メソッドで、this パラメータによりインスタンスから呼び出せるようになります。
11.例外処理
try/catch/finally、例外型、カスタム例外、例外のコスト、ベスト プラクティス。
try / catch / finally
try には失敗し得るコードを置き、catch で捕捉して処理し、finally は成否に関わらず実行されます(リソースのクリーンアップ)。例外は上位へ伝播します。
複数の catch と例外フィルター
複数の catch は型でマッチし、具体的な例外を先に書きます。when でフィルタ条件を指定できます。変数を宣言しない catch は例外オブジェクトを無視します。
例外のスロー
throw new は例外を投げ、throw; は引数なしでそのまま再スローします(スタックを保持)。catch 内で new してから throw するとスタックがリセットされます。
カスタム例外
カスタム例外は Exception を継承し(慣例として Exception 接尾辞を付ける)、コンストラクタを提供し、内部例外を InnerException として保持します。
finally クリーンアップ
finally は try が例外を出すかどうかに関わらず、リソース解放 / 状態復元を保証します。return も finally を先に実行します。using はそのシンタックス シュガーです。
例外のコスト
例外のキャッチにはコストがかかるため、制御フローとして使ってはいけません。予期できるエラーはリターン コード / TryXxx / Result パターンで処理します。
グローバル例外処理
トップ レベルで try / catch を使って未処理例外を捕捉し、ログに記録します。ASP.NET ではミドルウェア(UseExceptionHandler)で一括処理します。
InnerException チェーン
例外をキャッチした後、新しい例外を投げ、元の例外を InnerException として渡すことで、完全なエラー チェーンを保持でき、ログ調査に有用です。
12.ファイルと I/O
File/Directory/Path の静的ユーティリティ、Stream の読み書き、非同期 I/O、バイナリ処理。
テキスト ファイルの読み書き
File.ReadAllText / WriteAllText は小さなファイルを一度に読み書きし、ReadAllLines は行ごとの配列を返します。大きなファイルには StreamReader を使います。
StreamReader 行ごと
大きなファイルは行ごとにストリーミング読み込みし、メモリを消費しません。StreamReader.ReadLine は null(EOF)までループします。
ディレクトリ操作
Directory はディレクトリの作成 / 削除 / 列挙、Directory.GetFiles / EnumerateFiles はファイル検索。再帰列挙には SearchOption を使います。
Path パス処理
Path はクロス プラットフォームのパス結合 / 解析を行います: Combine、GetExtension、GetFileName、ChangeExtension。パスの区切り文字を手書きしないでください。
非同期 I/O
async / await での I/O はスレッドをブロックしません: ReadAllTextAsync / WriteAllTextAsync / Stream 系メソッド。UI / サーバーの並行シナリオでは必須です。
バイナリ読み書き
BinaryWriter / BinaryReader は型ごとに読み書きし、MemoryStream はメモリ内ストリームです。ネットワークやファイルのバイナリ プロトコルで一般的に使われます。
コンソール I/O
Console.ReadLine は 1 行読み込み、ReadKey はキー入力を読み、WriteLine は出力します。Console.In / Out をリダイレクトしてテストできます。
ファイル情報
FileInfo / DirectoryInfo はファイルのメタデータとメソッドを提供し、File.Exists は存在を確認し、GetCreationTime はタイムスタンプを返します。
13.よくある落とし穴(FAQ)
C# 開発者が最も踏みやすい罠: 値型 vs 参照、文字列の等価性、LINQ の遅延、async/await のデッドロックなど。
文字列 == と Equal
C# の string == は値による比較を行います(Java と異なります)。ただし == は序数比較で、Equals は StringComparison を指定して大文字小文字を無視するなどの比較ができます。
値渡し vs 参照渡し
メソッド パラメータは既定で値渡しです: オブジェクトは参照のコピーが渡されるため、メンバーを変更すると元のオブジェクトに影響します。値型はコピーされます。これを忘れるのはよくあるバグです。
LINQ 遅延評価
LINQ クエリは遅延評価です: 列挙して初めて計算されます。IQueryable / IEnumerable を外へ渡してから列挙すると、副作用や古いデータが混じる可能性があります。
async void とデッドロック
イベント ハンドラーは async void でも構いませんが、通常のメソッドは Task を返す必要があります。sync コンテキスト(UI / WinForms)で .Result / .Wait() を使うとデッドロックします。
例外の飲み込みと再スロー
catch 後に処理しないと例外を握り潰し、throw ex はスタックをリセットして元の例外チェーンを失います。ログには必ず InnerException を残してください。
未解放リソース
Stream / HttpClient / DB 接続を解放しないとリソースがリークします。IDisposable は必ず using を使うか、使い終わったら Dispose します。
浮動小数点の比較
float / double は 2 進表現のため精度が不正確で、直接 == で比較すると想定外の結果になります。イプシロン許容差を使うか、正確な演算には decimal を使います。
反復中のコレクション変更
foreach 内でコレクションの Add / Remove を行うと InvalidOperationException が投げられます。削除対象の要素を収集し、反復後に削除してください。
null 許容と null 参照
Nullable を有効にすると、コンパイラが null 参照の検出を助けてくれます。null を直接返すと曖昧になるため、?? / ?. でフォールバックを提供してください。
ローカル時刻 vs UTC
保存 / 転送する時刻は UTC(DateTimeKind.Utc)を使い、表示時にローカルへ変換します。Kind を混在させると時刻計算が静かに間違います。
14.並行処理と非同期
Task ベースの非同期プログラミング、Parallel 並列処理、lock 同期、スレッド セーフ コレクション。
async / await
async メソッドは Task を返し、await はスレッドを解放して完了後に再開します。その間スレッドは他の作業に使えるため、ブロックしません。
Task と戻り値
Task は非同期操作を表し、Task<T> は戻り値を持ちます。Task.Run は同期処理をスレッド プールへ置き、ContinueWith でチェーンします。
Parallel 並列
Parallel.For / ForEach はスレッド プールを使い、独立した処理を並列実行します。CPU 集約型ではマルチコアを活用できますが、スレッド安全性と過剰並列化に注意してください。
lock 同期
lock は同時に 1 つのスレッドのみがクリティカル セクションへ入ることを保証します。ロック オブジェクトは通常 private readonly フィールドとし、this でのロックは避けてください。
Thread スレッド
Thread はスレッドを手動管理します: Start で開始、Join で待機。多くのシナリオでは Task / Parallel の方が適し、Thread は長時間のバックグラウンド タスクに使います。
CancellationToken
CancellationToken は協調的キャンセルです: トークンが IsCancellationRequested をトリガし、async メソッドは OperationCanceledException を投げます。
並行コレクション
スレッド セーフなコレクション: ConcurrentDictionary、ConcurrentQueue、ConcurrentBag。通常コレクションを手動でロックして読み書きする代わりに使えます。
非同期のベスト プラクティス
Async all the way: .Result でのブロックは避けてください。ライブラリ コードでは ConfigureAwait(false) を使い、sync コンテキストへ戻らないようにします。
15.ネットワークと HTTP
HttpClient によるリクエスト、JsonSerializer によるシリアライズ、WebSocket、Socket。
HttpClient 基本
HttpClient は HTTP リクエストを送ります。GetStringAsync は簡易テキスト取得、GetAsync は完全なレスポンス取得。HttpClient は長期間(シングルトンとして)再利用すべきです。
POST と JSON
PostAsJsonAsync は JSON を送信し、PostAsync はカスタム コンテンツを送信します。レスポンスは ReadAsStringAsync で読みます。シリアライズには JsonSerializer を使います。
ヘッダーとクエリ パラメータ
HttpRequestMessage で Headers(認証 / User-Agent)を設定し、URI でクエリ文字列を構築します。既定の User-Agent を拒否する API があることに注意してください。
System.Text.Json
JsonSerializer.Serialize / Deserialize で JSON をシリアライズします。JsonSerializerOptions で大文字小文字 / 列挙型 / null 無視などの設定を行います。
Web API の呼び出し
組み合わせ: リクエストを構築 → ステータスを検証 → デシリアライズ。HttpStatusCode チェック、ReadFromJsonAsync なら 1 行で完結します。
WebSocket
ClientWebSocket は全二重チャネルを確立し、SendAsync / ReceiveAsync で送受信します。リアルタイム配信(チャット、行情)に適しています。
DNS と Socket
Dns.GetHostAddresses はホスト名を解決し、Socket は下位層トランスポートです。ほとんどのアプリでは HttpClient で十分で、Socket はカスタム プロトコル向けです。
ダウンロードとストリーム処理
大きなファイルのダウンロードは Stream でストリーミング書き込みし、メモリ消費を抑えます。HttpCompletionOption.ResponseHeadersRead はストリームを即座に返します。
16.日付と時刻
DateTime と TimeSpan、タイムゾーンとオフセット、書式設定と解析。
DateTime 基本
DateTime は日付と時刻を表します: Now はローカル、UtcNow は UTC、Today は日付。AddDays / AddHours で日付演算を行います。
TimeSpan 時間間隔
TimeSpan は間隔を表します: 2 つの時刻の差分から取得し、FromDays / FromHours で構築、Days / Hours で成分に分解します。
DateTimeOffset
DateTimeOffset はタイム ゾーン オフセットを持ち、タイム ゾーンをまたぐシナリオで推奨されます。UTC と安全に変換でき、ローカル タイム ゾーンの曖昧さを避けられます。
DateTimeKind
DateTime には Kind があり、Unspecified / Local / Utc のいずれかです。Kind 未指定のローカル時刻を UTC へ変換すると誤動作するため、Utc で保存してください。
解析と書式設定
DateTime.Parse / ParseExact で解析、TryParse は安全です。書式指定子: yyyy / MM / dd、HH / mm / ss、ffff はミリ秒。
タイムゾーン変換
TimeZoneInfo でタイム ゾーン変換を行います: FindSystemTimeZoneById、ConvertTimeFromUtc。サーバーは通常 UTC で保存し、表示時にローカルへ変換します。
Stopwatch 計測
Stopwatch は高精度(ミリ秒単位)の時間計測を行います。Start / Stop / Elapsed / ElapsedMilliseconds はパフォーマンス測定の定番です。
DateOnly と TimeOnly
DateOnly は日付のみ、TimeOnly は時刻のみを表す型(C# 10)で、タイム ゾーンの負担がありません。誕生日、カレンダー、シフト スケジュールなどに向きます。
17.プロセスとシステム
外部プロセスの起動、環境変数、パス、システム情報。
プロセスの起動
Process.Start は外部プログラム(シェル コマンド、他の実行ファイル)を起動します。ArgumentList で引数を渡すと文字列連結によるインジェクションを防げます。
環境変数
Environment.GetEnvironmentVariable で読み取り、SetEnvironmentVariable で書き込み(プロセス レベル)。GetEnvironmentVariables で全部取得できます。
システム情報
Environment はシステム情報を提供します: OSVersion、MachineName、CurrentDirectory、ProcessorCount、TickCount。
コマンドライン解析
args にはコマンドライン引数が渡され、Environment.GetCommandLineArgs はプログラム名を含む完全なセットを取得します。CLI ツールでの引数解析に使います。
終了とシグナル
Environment.Exit(1) は即時終了、ExitCode は終了コードを設定します。AppDomain.ProcessExit イベントでクリーンアップを行います。
プロセスの列挙
Process.GetProcesses はシステム プロセスを列挙し、Id / ProcessName / WorkingSet64 などの情報を読み取れます。Kill でプロセスを終了します。
Windows レジストリ
Microsoft.Win32.Registry はレジストリ(Windows 限定)の読み書きを行います。GetValue / SetValue でキーにアクセスし、適切な権限が必要です。
アプリケーション パス
AppContext.BaseDirectory はプログラムの実行ディレクトリ、Environment.ProcessPath は現在のプロセス パスです。リソース ファイルの配置に使います。
18.正規表現
Regex によるマッチ、キャプチャ グループ、置換、一般的なパターン。
Regex 基本
Regex.IsMatch で判定、Matches ですべて取得、Match で最初の 1 件を取得します。@ の逐語的文字列を使うと二重エスケープを防げます。
キャプチャ グループ
丸括弧でサブ文字列をキャプチャし、Groups[1] でインデックス参照、名前付きグループ (?<name>...) は Groups["name"] で参照します。フィールド抽出に使います。
置換
Regex.Replace でパターン置換し、$1 / $2 でキャプチャ グループを参照します。フォーマット、マスキング、テキスト クリーンアップに利用できます。
RegexOptions
RegexOptions.IgnoreCase で大文字小文字を無視、Multiline で ^ / $ を行頭 / 行末にマッチ、Compiled でコンパイルして再利用を高速化。
一般的なパターン
メール、URL、IP、電話番号の一般的な正規表現です。注意: 複雑な検証(本当のメール判定など)には正規表現ではなく専用ライブラリを使ってください。
量指定子とアンカー
* は 0 回以上、+ は 1 回以上、? は 0 回または 1 回、{n,m} は指定回数。^ は行頭、$ は行末、\b は単語境界。
アサーションと先読み・後読み
ゼロ幅アサーションは文字を消費しません: (?<=...) は後読み、(?=...) は先読み、(?!...) は否定先読み。位置条件のマッチングに使います。
バックトラッキングと ReDoS
入れ子になった量指定子や選択肢分岐はバックトラッキングを引き起こし、悪意ある入力で指数時間マッチ(ReDoS)になることがあります。タイムアウト制限やバックトラッキング無効化が必要です。
19.ビルドとデバッグ
dotnet CLI、プロジェクト構成、デバッグ、ログ、条件付きコンパイル。
dotnet CLI
dotnet build はビルド、run は実行、test はテスト、publish は発行。--configuration Release でリリース構成を発行します。
csproj 構成
csproj はビルドを制御します: TargetFramework、Nullable、ImplicitUsings、PackageReference 依存関係、LangVersion。
デバッグとログ
Debug.WriteLine は Debug ビルドでのみ、Trace はすべてのビルドで動作します。ILogger はログ レベルを記録し、Console.WriteLine は一時的なデバッグに使います。
条件付きコンパイル
#if DEBUG / #elif / #endif でシンボルによりコードを切り替えます。プロジェクト レベルの DefineConstants でカスタム シンボルを定義します。
単体テスト
xUnit / NUnit / MSTest で動作をアサートします。[Fact] がテスト メソッド、Assert.Equal がアサーション。dotnet test で実行します。
NuGet パッケージ管理
dotnet add package で依存関係を追加し、restore で復元します。PackageReference が csproj にバージョンを記録します。
発行と単一ファイル
dotnet publish は本番バージョンを発行し、PublishSingleFile で単一ファイル化、SelfContained でランタイム不要にします。
静的アナライザー
Roslyn アナライザーはコンパイル時にコード品質と潜在的な欠陥をチェックし、警告をエラーに昇格させて問題のビルドをブロックできます。
このチートシートについて
このページは C# 12(.NET 8)の自己完結型クイック リファレンスで、言語の中核、BCL のよく使う型、そして実際のプロジェクトで日常の約 80% を占める非同期プログラミングを網羅しています。内容はモダンなイディオムに重点を置いています: プロパティと自動プロパティ、LINQ、async/await、record 型、パターン マッチング、null 許容参照型。C# は Anders Hejlsberg によって 2000 年に .NET プラットフォームと共に発表され、Windows エコシステム、Unity ゲーム開発、バックエンド サービスの中心言語として、型安全性と生産性の調和を重視しています。 19 のセクションはそれぞれ一つのトピックに焦点を当てます: 基本構文、変数、型と参照 / 値セマンティクス、制御フロー、関数、文字列、コレクション、メモリ管理(GC)、オブジェクト指向、エラー処理、I/O、よくある落とし穴、並行処理、ネットワーク、時間、プロセス、正規表現、ビルド ツール。各サブセクションには「コンセプト紹介 + そのままコピーできるコード スニペット」が付属しています。 すべてのコードとテキストはブラウザでローカルにレンダリングされ、データは一切デバイスを出ません。正確なリファレンスは Microsoft Learn の公式ドキュメントを参照してください。
バージョン 2.1.0