動くコード図鑑
$ ls -1 /library | wc -l → 619
触って動く、検証済みの正解集。
公開記事から抽出した全コードブロックを 1 つずつページ化。 ▶ ボタンで 実行ログを再生し、 さも今動いてるかのように出力を流す。

この図鑑の使い方
言語で絞る
C# / SQL / TypeScript / PowerShell / Bash でフィルタ。
▶ で実行
事前収録の出力を 1 行ずつ再生。 ぱっと結果が見える。
記事と接続
各 snippet は出典記事へのリンク付き。 文脈ごと読める。
絞り込み
snippet 一覧
619 件//罠:Convert.ToInt32(DBNull.Value)は0を返す int amount = Convert.ToInt32(row["amount"]); // row["amount"] がDBNullだとamount = 0になる //「金額0円」と「未入力」を区別したい業務系では事故の元
イディオム2: Convert.IsDBNull + ??演算子のシンプルパターン
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#f6d9581c23a1
using (var conn = new SqlConnection(connStr)) using (var cmd = new SqlCommand("SELECT id, name, amount FROM customers", conn)) { conn.Open(); using (var reader = cmd.ExecuteReader())
イディオム3: DataReader.IsDBNull(i)で読み取り時に分岐
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#5206497a1ab8
//拡張メソッド化すると行が圧縮できる public static class SqlReaderExtensions { public static T? GetNullable<T>(this SqlDataReader reader, int ordinal) where T : struct
イディオム3: DataReader.IsDBNull(i)で読み取り時に分岐
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#13fb96000b24
using System.Data; DataRow row = dt.Rows[0]; //値型→ Nullable<T>で受ける
イディオム4: DataRow.Field<T>()でNullable<T>受け(業務系最強)
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#94099dc30e09
foreach (DataRow row in dt.Rows) { var customer = new CustomerVm { Id = row.Field<int>("id"), // NOT NULL
イディオム4: DataRow.Field<T>()でNullable<T>受け(業務系最強)
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#ea618bbdf2b0
public class Customer { public int Id { get; set; } // NOT NULL public string Name { get; set; } // NULL許容 public int? Amount { get; set; } // NULL許容
イディオム5: EF CoreでNullable<T>プロパティに自然マップ
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#d967b68affd7
//罠:null比較がSQLに翻訳される時の挙動 var noBikou = await context.Customers .Where(c => c.Bikou == null) .ToListAsync();
イディオム5: EF CoreでNullable<T>プロパティに自然マップ
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#2f47b99c64c7
//罠:DBNullが空文字に化ける string bikou = Convert.ToString(row["bikou"]); // row["bikou"] がDBNullの場合、bikouは""(空文字)になる //「未入力」と「空文字」を区別したい画面で表示が崩れる
Convert.ToString(DBNull.Value)の挙動
SQL Server の DBNull を C# で安全にハンドリングする5つのイディオム未収録#cb498d48eb9d
// ✅パターン1: +演算子(少数結合) string greeting = "Hello, " + userName + "さん。今日もよろしくお願いします。"; string filePath = baseDir + "\\" + fileName;
パターン1: +演算子—静的な少数結合の本命
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#d77b30cce8dc
// ❌ NG:ループで+=は性能爆発 string result = ""; foreach (var row in dt.Rows.Cast<DataRow>()) { result += row["Name"] + "," + row["Amount"] + "\n"; // 1万件で画面固まる
パターン1: +演算子—静的な少数結合の本命
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#6dedf46f8327
// ✅パターン2: String.Concat / String.Join string[] parts = { "Hello", ", ", userName, "さん。" }; string greeting = String.Concat(parts); // CSVの1行を組み立てる時の本命
パターン2: String.Concat / String.Join —配列を一発で結合
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#c0352c6eb408
// ✅パターン3: StringBuilder(ループ向き) var sb = new StringBuilder(); foreach (var row in dt.Rows.Cast<DataRow>()) { sb.Append(row["Name"]);
パターン3: StringBuilder —ループ・可変長の正解
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#c688eae43693
// ✅パターン4: String.Format(フォーマット指定向き) string template = "{0}さん、{1:yyyy/MM/dd}の請求は{2:N0}円です。"; string message = String.Format(template, userName, dueDate, amount); // → "鈴木太郎さん、2026/06/30の請求は12,500円です。"
パターン4: String.Format —フォーマット指定向き
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#820dcac33498
// ✅パターン5:文字列補間(C# 6以降) string message = $"{userName}さん、{dueDate:yyyy/MM/dd}の請求は{amount:N0}円です。"; // → "鈴木太郎さん、2026/06/30の請求は12,500円です。" //複雑な式も入れられる
パターン5:文字列補間$"..." — C# 6以降の本命
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#db4711ab2df6
// ✅パターン6: Stopwatchで性能比較(10万回ループ) const int N = 100_000; var data = Enumerable.Range(0, N).Select(i => $"row{i}").ToArray(); // +演算子(NGパターン)
▶ 実行可
性能比較— 10万回ループのStopwatch実測
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)#c95994787d0a
// ✅パターン7: StringBuilder容量初期値(再アロケート抑制) // 1万行×平均50文字= 50万文字を見越して先に確保 var sb = new StringBuilder(500_000); foreach (var row in dt.Rows.Cast<DataRow>()) {
小ネタ: StringBuilder容量初期値で更に速くする
C# 文字列結合のパフォーマンス完全比較(+ / Concat / StringBuilder / Format / 補間)未収録#fdb962bddf1b
// これが本番で刺さるやつ foreach (var line in csvLines) { try { var amount = int.Parse(line[2]); // 空欄 / 全角数字 / カンマ入りで FormatException // 業務処理
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり#bbe08af2f511
// 正解 foreach (var line in csvLines) { if (int.TryParse(line[2], out var amount)) { // 業務処理 } else {
▶ 実行可
なぜ Parse + try/catch が業務系で刺さるのか
C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり#2a821b7d5eed
string[] inputs = { "1234", "0", "-5", "", "abc", "123", "1,000", null! }; foreach (var s in inputs) { if (int.TryParse(s, out var value)) { Console.WriteLine($" '{s}' → OK ({value})");
▶ 実行可
パターン1: int.TryParse — 数値変換は bool 戻り値 + out var
C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり#acdf00b7b5e4
using System.Globalization; string[] inputs = { "2026/05/19", "2026-05-19", "2026/5/19", "05/19/2026" }; // NG パターン: DateTime.TryParse — ロケール依存
▶ 実行可
パターン2: DateTime.TryParseExact + InvariantCulture — ロケール事故をゼロに
C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり#c52514aef32b
public enum Status { Active = 1, Inactive = 2, Pending = 3 } string[] inputs = { "Active", "active", "Pending", "Unknown", "0", "99", "" }; // NG パターン: Enum.TryParse 単独 (数字文字列が定義外でも true になる)
▶ 実行可
パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる
C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり#b310074d2048
// 形① using ステートメント using (var reader = new StreamReader("data.txt")) { var line = reader.ReadLine(); Console.WriteLine(line);
▶ 実行可
そもそも using とは何をしているのか
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け#27097f842757
using System; using System.Data.SqlClient; class Program {
形態①: using ステートメント (C# 1.0+ 全環境 OK)
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#8a7bb6c44be6
using System; using System.Data.SqlClient; class Program {
形態②: using 宣言 (C# 8+ / 関数末尾まで自動 Dispose)
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#9b8516083882
static void ProcessOrders() { using var conn = new SqlConnection(connStr); conn.Open();
using 宣言の落とし穴: スコープが関数末尾になる
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#dde7cce30ede
using System; using System.IO; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore;
形態③: await using (C# 8+ / IAsyncDisposable)
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#747285980e0f
// ❌ ピラミッド (using ネスト 3 段) using (var conn = new SqlConnection(connStr)) using (var cmd = conn.CreateCommand()) using (var reader = cmd.ExecuteReader()) {
入れ子の解消パターン
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#fc33e16750d0
// ✅ using 宣言 (C# 8+) using var conn = new SqlConnection(connStr); using var cmd = conn.CreateCommand(); using var reader = cmd.ExecuteReader(); while (reader.Read()) { /* ... */ }
入れ子の解消パターン
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#d29d41340c01
static void Main() { using var a = new ResourceA(); // 1番目に作る using var b = new ResourceB(); // 2番目に作る using var c = new ResourceC(); // 3番目に作る
罠③: using 宣言の Dispose 順序は宣言の逆順
C# using の3形態 — using ステートメント / using 宣言 / await using で業務SE が踏む使い分け未収録#47f37db24a57
let target = document.getElementById('main'); target.addEventListener('click',function () { target.textContent = 'HelloWorld' })
JavaScriptファイルの作成
CSSやJavaScriptの外部ファイル作成方法とその読み込み方法!未収録#af8886c50aa7