C#

【C#】null 許容参照型(nullable reference types)の基本

C# 8.0 以降では「null 許容参照型(nullable reference types)」が導入されました。これにより、参照型に null が代入可能かどうかをコンパイラが区別して扱えるようになります。null による実行時エラー(...
C#

【C#】target-typed new 式でコードを簡潔に書く方法

C# 9 以降では target-typed new 式が導入され、右辺に型を明示しなくても左辺の型から推論できるようになりました。これによりコードの冗長さを減らし、よりシンプルに記述できます。本記事では target-typed new ...
C#

【C#】global using の使い方とメリット

C# 10 では global using が導入され、全ファイル共通で利用できる using 宣言を簡単に定義できるようになりました。これにより、冗長な記述を減らし、プロジェクト全体で統一した using を管理しやすくなります。本記事で...
C#

【C#】非同期メソッドで戻り値を扱う方法(Task<T>の活用)

C# の非同期処理では async / await を利用するのが一般的です。その際、非同期メソッドから値を返すには Task<T> を使います。これにより「非同期に計算した結果を返す」ことが可能になります。本記事では Task<T> の基...
C#

【C#】設定ファイル(appsettings.json)を扱う方法|IOptionsパターン

C#/.NET アプリケーションでは、接続文字列や外部サービスのキーなどをソースコードに直書きせず、appsettings.json などの設定ファイルにまとめて管理するのが一般的です。さらに、IOptions パターンを使うことで、設定値...
C#

【C#】ログ出力の基本|ILoggerとSerilogの使い方

C#/.NET で開発を行う際、ログ出力はアプリケーションの動作確認やトラブルシューティングに欠かせません。.NET には標準で ILogger インターフェースが用意されており、柔軟にログを扱えます。また外部ライブラリの Serilog ...
C#

【C#】シングルトンパターンの実装方法と注意点

シングルトンパターンは「アプリケーション全体でインスタンスをひとつだけにする」デザインパターンです。設定値やロガー、接続管理などの「共有すべきオブジェクト」を管理する際によく利用されます。C# ではさまざまな方法でシングルトンを実装できます...
C#

【C#】非同期処理と並列処理の違い|TaskとParallelの使い分け

C# では Task を使った非同期処理と、Parallel クラスを使った並列処理を実装できます。一見似ている両者ですが、目的や動作の仕組みは異なります。違いを理解して適切に使い分けることで、効率的で無駄のないプログラムを構築できます。本...
C#

【C#】非同期処理と並列処理の違い|TaskとParallelの使い分け

C# では Task を使った非同期処理と、Parallel クラスを使った並列処理を実装できます。一見似ている両者ですが、目的や動作の仕組みは異なります。違いを理解して適切に使い分けることで、効率的で無駄のないプログラムを構築できます。本...
C#

【C#】依存性注入(DI)の基本と実装例

依存性注入(Dependency Injection, DI)は、クラスが必要とするオブジェクトを自分で生成せず外部から受け取る設計手法です。具体的には「new で直接作らない」「どの具象クラスを使うかを利用側が決めない」という二点を徹底す...
C#

【C#】init専用プロパティの使い方|イミュータブルなオブジェクト設計

C# 9.0 以降では init アクセサが導入され、オブジェクト初期化子でのみ値を設定できる「init専用プロパティ」を定義できるようになりました。これにより、オブジェクトの生成後は値を変更できない「イミュータブル(不変)」な設計を簡単に...
C#

【C#】タプル(Tuple / ValueTuple)の使い方と利点

C# では複数の値をひとまとめに扱いたいときに「タプル(Tuple)」が利用できます。クラスや構造体をわざわざ定義しなくても、一時的に複数の値を返す・渡すといった用途に便利です。C# 7.0 以降では ValueTuple が導入され、より...
C#

【C#】パターンマッチングの強化|switch式の活用

C# 8.0 以降ではパターンマッチング機能が大幅に強化され、従来の switch 文に加えて switch 式が利用できるようになりました。これにより、条件分岐をより簡潔に記述でき、可読性や保守性が向上します。本記事では switch 式...
C#

【C#】QueueとStackの違いと使い分け

C# には「Queue(キュー)」と「Stack(スタック)」という代表的なデータ構造が用意されています。どちらもデータを一時的に保存して順序に基づいて取り出すためのコレクションですが、取り出し方に大きな違いがあります。本記事では Queu...
C#

【C#】HashSetの使い方|重複を許さないコレクション

C# の HashSet<T> は、要素の重複を許さないコレクションです。リストのように順序は保証されませんが、高速な検索・追加・削除が可能です。集合演算(和・積・差)もサポートしており、数学的な集合操作をコードで簡単に表現できます。本記事...
C#

【C#】Dictionaryの基本操作|キーと値の扱い方

C# で頻繁に使われるコレクションのひとつが Dictionary<TKey, TValue> です。これは「キー」と「値」をペアで管理できるコレクションで、検索や追加・削除が効率的に行えます。本記事では Dictionary の基本操作を...
C#

【C#】属性(Attribute)の基礎とカスタム属性の作り方

C# には「属性(Attribute)」と呼ばれる仕組みがあり、クラスやメソッドなどにメタデータを付加することができます。属性を利用すると、ライブラリやフレームワークに追加情報を伝えたり、リフレクションを使って実行時に動的な処理を行ったりで...
C#

【C#】非同期タスクのキャンセル方法|CancellationTokenの基本

非同期処理を行うとき、ユーザーが操作を取り消した場合や一定時間を過ぎた場合に「処理を途中で止めたい」という場面があります。そのために用意されているのが CancellationToken です。これを利用すると、安全かつ効率的に非同期タスク...
C#

【C#】例外フィルター(when句)を使ったエラー処理の書き方

C# 6.0 以降では、例外処理に「例外フィルター(when句)」を使えるようになりました。これにより、catch ブロックに条件を付与して、特定の条件下でのみ例外を捕捉できます。複雑な条件分岐を catch 内で書く必要がなくなり、コード...
C#

【C#】レコード型(record)の基本とクラス/構造体との違い

C# 9.0 以降では「レコード型(record)」が導入されました。レコード型は主に「データを保持するための型」として設計されており、イミュータブル(変更不可)なオブジェクトや値の比較を簡潔に扱えるのが特徴です。本記事ではレコード型の基本...