C#サンプル集|初心者がつまずく基本文法から実務で使えるコード例までわかりやすく解説
はじめに
C#を学び始めたばかりの人にとって、文法書や公式ドキュメントを読むだけでは「実際にどう書けばいいのか」が分かりにくいことがあります。そんなときに役立つのが、実際に動かせるC#サンプルです。
この記事では、初心者がつまずきやすい基本文法から、実務でよく使うファイル操作、例外処理、JSON、HTTP通信、非同期処理まで、幅広いC#サンプルをまとめて解説します。
単にコードをコピペするだけでなく、「何をしているコードなのか」「どこを変更すれば応用できるのか」が分かるように説明していきます。
1. C#サンプルを使う前に知っておきたい基礎知識
C#サンプルを学ぶ前に、まずはC#で何ができるのか、サンプルコードを見るときに何を確認すべきかを押さえておきましょう。
同じC#のコードでも、コンソールアプリ、Webアプリ、Unity、業務システムでは書き方や使うライブラリが変わります。サンプルコードが動かない原因の多くは、文法ミスではなく「実行環境が違う」ことにあります。
1-1. C#でできること:Webアプリ・デスクトップアプリ・ゲーム開発・業務システム
C#は、さまざまな分野で使われているプログラミング言語です。
代表的な用途には、次のようなものがあります。
C#では、ASP.NET Coreを使ってWebアプリやWeb APIを作成できます。企業の予約システム、管理画面、ECサイトのバックエンドなどでもよく使われます。
Windows FormsやWPFを使えば、Windows向けのデスクトップアプリを作成できます。社内ツールや業務支援アプリなどで利用されることが多いです。
UnityではC#が主要なスクリプト言語として使われています。ゲーム開発を目的にC#を学ぶ人も多くいます。
また、業務システムでは、データベースアクセス、CSV処理、帳票出力、API連携、バッチ処理などでC#がよく使われます。
つまり、C#サンプルと一口に言っても、目的によって必要なコードは大きく変わります。初心者はまずコンソールアプリで基本文法を学び、そのあと目的に応じてWeb、デスクトップ、Unityなどに進むと理解しやすくなります。
1-2. 初心者が「C#サンプル」で検索する主な目的
初心者が「C# サンプル」で検索する目的は、主に次のようなものです。
まず多いのは、基本文法を確認したいケースです。変数、if文、for文、配列、メソッド、クラスなどを、実際のコードで見たいという目的です。
次に多いのは、エラーを解決したいケースです。サンプル通りに書いたのに動かない、エラー文の意味が分からない、Visual Studioで実行できないといった悩みがあります。
また、実務で使う処理を探している人も多いです。CSVファイルを読み込みたい、ログを出力したい、JSONを扱いたい、APIを呼び出したいなど、実際の開発でそのまま応用できるコードを求めている場合です。
この記事では、こうした目的に合わせて、基本から実務寄りのC#サンプルまで順番に紹介します。
1-3. サンプルコードをコピペする前に確認すべき実行環境
C#サンプルを試す前に、次の点を確認してください。
まず、.NET SDKがインストールされているか確認します。ターミナルやコマンドプロンプトで次のコマンドを実行します。
Bashdotnet --version
バージョン番号が表示されれば、.NET SDKが利用できます。
次に、どの種類のプロジェクトで実行するかを確認します。この記事の多くのサンプルは、コンソールアプリで動かすことを前提にしています。
コンソールアプリを作る場合は、次のように実行できます。
Bashdotnet new console -n SampleApp
cd SampleApp
dotnet run
Visual Studioを使う場合は、「コンソールアプリ」のテンプレートを選べば問題ありません。
Visual Studio Codeを使う場合は、C#拡張機能を入れたうえで、ターミナルからdotnet runを実行すると分かりやすいです。
1-4. 古いC#サンプルと最新の書き方の違い
C#のサンプルを検索すると、古い書き方と新しい書き方が混在しています。
古いサンプルでは、次のようにProgramクラスとMainメソッドを書く形式がよく使われます。
C#using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
}
}
一方、比較的新しいC#では、トップレベルステートメントを使って、次のように短く書けます。
C#Console.WriteLine("Hello World");
どちらも間違いではありません。ただし、初心者が学ぶ場合は、最初は短いトップレベルステートメントで動かし、クラスやメソッドを学ぶ段階でMainメソッドの書き方も理解するとよいでしょう。
古いC#サンプルが動かない場合は、使用している.NETのバージョン、プロジェクトの種類、必要なusing、ライブラリの有無を確認してください。
1-5. この記事で扱うC#サンプルの前提
この記事では、基本的にコンソールアプリで動かせるC#サンプルを扱います。
多くのコードは、Program.csにそのまま貼り付けて実行できます。トップレベルステートメント形式を中心に紹介しますが、クラスやオブジェクト指向の章では、クラス定義も含めたサンプルを掲載します。
ファイル操作やHTTP通信など、一部のサンプルでは追加のusingが必要です。その場合は、コード内に必要なusingも含めています。
2. まず動かすC#の基本サンプル
最初に、C#で文字を表示するだけの簡単なサンプルから始めましょう。
プログラミング学習では、まず「書いたコードが実行される」感覚をつかむことが重要です。難しい文法を覚える前に、画面に文字を表示するところから確認します。
2-1. Hello Worldを表示するサンプル
C#で最も基本的なサンプルは、Hello Worldを表示するコードです。
C#Console.WriteLine("Hello World");
実行結果は次のようになります。
Hello World
Console.WriteLineは、コンソール画面に文字列を表示して改行する命令です。
"Hello World"のようにダブルクォーテーションで囲んだ部分は文字列として扱われます。
2-2. Console.WriteLineで文字列や数値を表示するサンプル
Console.WriteLineでは、文字列だけでなく数値や計算結果も表示できます。
C#Console.WriteLine("C#のサンプルです");
Console.WriteLine(100);
Console.WriteLine(10 + 20);
Console.WriteLine(3.14);
実行結果は次のようになります。
C#のサンプルです
100
30
3.14
文字列は"で囲みますが、数値は囲みません。
C#Console.WriteLine("100"); // 文字列
Console.WriteLine(100); // 数値
表示結果はどちらも100ですが、プログラム上の意味は異なります。計算に使う値は数値として扱う必要があります。
2-3. コメントを書くサンプル
コメントは、プログラムの説明を書くためのものです。コメントに書かれた内容は実行されません。
C#// これは1行コメントです
Console.WriteLine("コメントのサンプル");
// 複数行コメント
/*
ここに書いた内容は
複数行でもコメントになります
*/
Console.WriteLine("処理が実行されます");
コメントは、コードの意図を残すために使います。
ただし、コードを読めば分かることをそのまま書くよりも、「なぜこの処理が必要なのか」を書くと実務で役立ちます。
悪いコメントの例です。
C#// priceに100を代入する
int price = 100;
よいコメントの例です。
C#// キャンペーン対象商品の固定価格
int price = 100;
2-4. Mainメソッドとトップレベルステートメントの違い
C#のエントリーポイントは、プログラムの開始地点です。
以前は、次のようにMainメソッドを書くのが一般的でした。
C#using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Mainメソッドから実行");
}
}
現在は、簡単なコンソールアプリであれば次のように書けます。
C#Console.WriteLine("トップレベルステートメントで実行");
トップレベルステートメントは、初心者にとって余計な記述が少ないため分かりやすい書き方です。
ただし、クラスやメソッドの構造を理解するためには、Mainメソッドの形も知っておく必要があります。
実務では、簡単なツールやサンプルではトップレベルステートメント、本格的なアプリではクラス構成を明確にした書き方が使われることが多いです。
2-5. よくあるエラーと解決方法:実行できない・文字が表示されない
C#サンプルを実行するとき、初心者がよく遭遇するエラーがあります。
まず、セミコロン;の付け忘れです。
C#Console.WriteLine("Hello")
このコードはエラーになります。正しくは次のように書きます。
C#Console.WriteLine("Hello");
次に、ダブルクォーテーションの閉じ忘れです。
C#Console.WriteLine("Hello);
正しくは次のとおりです。
C#Console.WriteLine("Hello");
また、プロジェクトの作成場所を間違えている場合もあります。dotnet runを実行する場所に.csprojファイルがあるか確認してください。
Bashdir
またはmacOSやLinuxでは次のように確認します。
Bashls
.csprojファイルがあるフォルダでdotnet runを実行することが大切です。
3. C#の基本文法サンプル
ここからは、C#の基本文法をサンプルコードで確認していきます。
変数、型、文字列、演算、定数、nullなどは、どの種類のC#アプリでも必ず使う基本です。
3-1. 変数と型のサンプル:int・double・string・bool
変数は、値を入れておく箱のようなものです。C#では、変数に型があります。
C#int age = 25;
double height = 170.5;
string name = "田中";
bool isActive = true;
Console.WriteLine(age);
Console.WriteLine(height);
Console.WriteLine(name);
Console.WriteLine(isActive);
それぞれの型の意味は次のとおりです。
intは整数を扱います。
C#int count = 10;
doubleは小数を扱います。
C#double rate = 1.08;
stringは文字列を扱います。
C#string message = "こんにちは";
boolは真偽値を扱います。値はtrueまたはfalseです。
C#bool isLogin = false;
型を間違えるとエラーになります。
C#int number = "100"; // エラー
文字列の"100"を数値にしたい場合は、変換が必要です。
C#int number = int.Parse("100");
Console.WriteLine(number + 50);
3-2. varを使った型推論のサンプル
C#では、varを使うと右辺の値から型を推論できます。
C#var age = 25;
var name = "佐藤";
var price = 1200.5;
var isMember = true;
Console.WriteLine(age);
Console.WriteLine(name);
Console.WriteLine(price);
Console.WriteLine(isMember);
この場合、C#は自動的に次のように判断します。
C#var age = 25; // int
var name = "佐藤"; // string
var price = 1200.5; // double
var isMember = true; // bool
varは便利ですが、何の型か分かりにくくなる場合があります。
初心者のうちは、型を理解するためにintやstringを明示して書くのもおすすめです。
C#int age = 25;
string name = "佐藤";
型が明らかな場合はvarを使っても読みやすいです。
C#var names = new List<string>();
3-3. 文字列結合と文字列補間のサンプル
文字列を組み合わせるには、+を使う方法があります。
C#string name = "山田";
int age = 30;
Console.WriteLine(name + "さんは" + age + "歳です。");
実行結果です。
山田さんは30歳です。
ただし、文字列結合が多くなると読みにくくなります。
C#では、文字列補間を使うと分かりやすく書けます。
C#string name = "山田";
int age = 30;
Console.WriteLine($"{name}さんは{age}歳です。");
$"..."の中で{変数名}を書くと、変数の値を文字列に埋め込めます。
実務でも、ログ出力やメッセージ作成では文字列補間がよく使われます。
C#string product = "ノートPC";
int price = 120000;
Console.WriteLine($"商品名: {product}, 価格: {price}円");
3-4. 四則演算と余りを求めるサンプル
C#では、数値の計算に演算子を使います。
C#int a = 10;
int b = 3;
Console.WriteLine(a + b); // 足し算
Console.WriteLine(a - b); // 引き算
Console.WriteLine(a * b); // 掛け算
Console.WriteLine(a / b); // 割り算
Console.WriteLine(a % b); // 余り
実行結果です。
13
7
30
3
1
int同士の割り算では、小数点以下が切り捨てられます。
C#int result = 10 / 3;
Console.WriteLine(result); // 3
小数として計算したい場合は、doubleを使います。
C#double result = 10.0 / 3.0;
Console.WriteLine(result); // 3.333...
余りを求める%は、偶数・奇数の判定などでよく使います。
C#int number = 7;
if (number % 2 == 0)
{
Console.WriteLine("偶数です");
}
else
{
Console.WriteLine("奇数です");
}
3-5. 定数constとreadonlyの使い分けサンプル
変更しない値には、constやreadonlyを使います。
constはコンパイル時に決まる定数です。
C#const double TaxRate = 0.1;
int price = 1000;
double tax = price * TaxRate;
Console.WriteLine($"税額: {tax}");
constは、数値や文字列など、あらかじめ決まっている値に使います。
一方、readonlyはコンストラクタで設定したあと変更できないフィールドです。
C#class Product
{
private readonly string _name;
public Product(string name)
{
_name = name;
}
public void ShowName()
{
Console.WriteLine(_name);
}
}
var product = new Product("マウス");
product.ShowName();
readonlyは、実行時に値が決まるが、その後は変更したくない場合に使います。
簡単にまとめると、固定値にはconst、オブジェクト作成時に決まる値にはreadonlyを使うと考えると分かりやすいです。
3-6. nullとNullable型のサンプル
nullは「値がない」ことを表します。
C#string? name = null;
if (name == null)
{
Console.WriteLine("名前が設定されていません");
}
else
{
Console.WriteLine(name);
}
string?の?は、nullになる可能性があることを表します。
数値型も、通常はnullを入れられません。
C#int age = null; // エラー
数値にnullを入れたい場合は、Nullable型を使います。
C#int? age = null;
if (age.HasValue)
{
Console.WriteLine(age.Value);
}
else
{
Console.WriteLine("年齢が未設定です");
}
より簡単に書くこともできます。
C#int? age = null;
Console.WriteLine(age ?? 0);
??は、左側がnullなら右側の値を使う演算子です。この例では、ageがnullなので0が表示されます。
4. 条件分岐のC#サンプル
条件分岐は、条件によって処理を変えるための文法です。
ユーザーの入力、点数、ログイン状態、ファイルの有無など、実務でもあらゆる場面で使います。
4-1. if文で条件によって処理を分けるサンプル
if文は、条件が成り立つ場合だけ処理を実行します。
C#int score = 80;
if (score >= 60)
{
Console.WriteLine("合格です");
}
score >= 60がtrueの場合、Console.WriteLineが実行されます。
条件が成り立たない場合は、何も表示されません。
C#int score = 50;
if (score >= 60)
{
Console.WriteLine("合格です");
}
この場合、score >= 60はfalseなので、ブロック内の処理は実行されません。
4-2. else if・elseを使うサンプル
複数の条件を判定したい場合は、else ifやelseを使います。
C#int score = 75;
if (score >= 90)
{
Console.WriteLine("評価A");
}
else if (score >= 70)
{
Console.WriteLine("評価B");
}
else if (score >= 60)
{
Console.WriteLine("評価C");
}
else
{
Console.WriteLine("不合格");
}
このサンプルでは、scoreが75なので評価Bが表示されます。
if文は上から順に判定されます。最初に一致した条件の処理だけが実行されます。
そのため、条件の順番は重要です。
C#int score = 95;
if (score >= 60)
{
Console.WriteLine("合格");
}
else if (score >= 90)
{
Console.WriteLine("高得点");
}
このコードでは、95点でも最初のscore >= 60に一致するため、高得点は表示されません。
4-3. 比較演算子と論理演算子のサンプル
条件式では、比較演算子を使います。
C#int x = 10;
Console.WriteLine(x == 10); // 等しい
Console.WriteLine(x != 5); // 等しくない
Console.WriteLine(x > 5); // より大きい
Console.WriteLine(x >= 10); // 以上
Console.WriteLine(x < 20); // より小さい
Console.WriteLine(x <= 10); // 以下
複数の条件を組み合わせる場合は、論理演算子を使います。
C#int age = 25;
bool hasTicket = true;
if (age >= 18 && hasTicket)
{
Console.WriteLine("入場できます");
}
&&は「かつ」を意味します。両方の条件がtrueの場合だけ全体がtrueになります。
C#bool isAdmin = false;
bool isOwner = true;
if (isAdmin || isOwner)
{
Console.WriteLine("操作できます");
}
||は「または」を意味します。どちらか一方がtrueなら全体がtrueになります。
C#bool isDeleted = false;
if (!isDeleted)
{
Console.WriteLine("表示対象です");
}
!は真偽値を反転します。falseはtrueに、trueはfalseになります。
4-4. switch文で複数条件を判定するサンプル
値によって処理を分ける場合は、switch文が便利です。
C#int day = 3;
switch (day)
{
case 1:
Console.WriteLine("月曜日");
break;
case 2:
Console.WriteLine("火曜日");
break;
case 3:
Console.WriteLine("水曜日");
break;
default:
Console.WriteLine("不明な曜日");
break;
}
dayが3なので、水曜日が表示されます。
C#では、switch式を使ってより短く書くこともできます。
C#int day = 3;
string dayName = day switch
{
1 => "月曜日",
2 => "火曜日",
3 => "水曜日",
_ => "不明な曜日"
};
Console.WriteLine(dayName);
_はどの条件にも一致しない場合を表します。
4-5. 三項演算子で短く書くサンプル
単純な条件分岐は、三項演算子で短く書けます。
C#int score = 80;
string result = score >= 60 ? "合格" : "不合格";
Console.WriteLine(result);
三項演算子は次の形で書きます。
C#条件 ? trueの場合の値 : falseの場合の値
if文で書くと次のようになります。
C#int score = 80;
string result;
if (score >= 60)
{
result = "合格";
}
else
{
result = "不合格";
}
Console.WriteLine(result);
三項演算子は便利ですが、条件が複雑になると読みにくくなります。
C#int score = 85;
bool passed = score >= 60;
string message = passed ? "次の試験に進めます" : "再試験です";
Console.WriteLine(message);
4-6. 条件分岐で初心者がつまずきやすいポイント
初心者がよく間違えるのは、代入の=と比較の==です。
C#int number = 10;
if (number = 10) // エラー
{
Console.WriteLine("10です");
}
比較には==を使います。
C#int number = 10;
if (number == 10)
{
Console.WriteLine("10です");
}
また、文字列比較では大文字・小文字や空白に注意が必要です。
C#string input = "yes";
if (input == "yes")
{
Console.WriteLine("はい");
}
ユーザー入力では、前後に空白が入ることがあります。
C#string input = " yes ";
input = input.Trim();
if (input == "yes")
{
Console.WriteLine("はい");
}
条件式が複雑になったら、変数に分けると読みやすくなります。
C#int age = 20;
bool hasLicense = true;
bool canDrive = age >= 18 && hasLicense;
if (canDrive)
{
Console.WriteLine("運転できます");
}
5. 繰り返し処理のC#サンプル
繰り返し処理は、同じ処理を何度も実行するために使います。
一覧データの処理、集計、検索、ファイルの行読み込みなど、実務でも非常によく使います。
5-1. for文で指定回数繰り返すサンプル
for文は、回数が決まっている繰り返しに向いています。
C#for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
実行結果です。
0
1
2
3
4
for文は次の形です。
C#for (初期化; 条件; 更新)
{
繰り返す処理
}
1から5まで表示したい場合は、次のように書きます。
C#for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
配列の要素を順番に表示することもできます。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
for (int i = 0; i < fruits.Length; i++)
{
Console.WriteLine(fruits[i]);
}
5-2. while文で条件を満たす間繰り返すサンプル
while文は、条件を満たしている間、処理を繰り返します。
C#int count = 0;
while (count < 3)
{
Console.WriteLine(count);
count++;
}
実行結果です。
0
1
2
while文は、繰り返し回数が明確でない場合に使われます。
C#int number = 1;
while (number <= 100)
{
Console.WriteLine(number);
number *= 2;
}
このサンプルでは、numberが100以下の間だけ表示されます。
5-3. do while文のサンプル
do while文は、条件判定より先に処理を1回実行します。
C#int count = 5;
do
{
Console.WriteLine(count);
count++;
}
while (count < 3);
この場合、最初からcount < 3はfalseですが、処理は1回実行されます。
実行結果です。
5
ユーザー入力を最低1回受け取りたい場合などに使えます。
C#string? input;
do
{
Console.WriteLine("yesと入力してください:");
input = Console.ReadLine();
}
while (input != "yes");
Console.WriteLine("終了します");
5-4. foreach文で配列やリストを処理するサンプル
foreach文は、配列やリストの要素を順番に処理するときに便利です。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
Listでも同じように使えます。
C#List<int> numbers = new List<int> { 10, 20, 30 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
要素数を意識せずに処理できるため、配列やリストの中身をすべて処理したい場合はforeachが読みやすいです。
ただし、インデックス番号が必要な場合はfor文のほうが向いています。
C#string[] names = { "田中", "佐藤", "鈴木" };
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine($"{i}: {names[i]}");
}
5-5. breakとcontinueのサンプル
breakは、繰り返し処理を途中で終了します。
C#for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
Console.WriteLine(i);
}
実行結果です。
1
2
3
4
continueは、現在の回だけスキップして次の繰り返しに進みます。
C#for (int i = 1; i <= 5; i++)
{
if (i == 3)
{
continue;
}
Console.WriteLine(i);
}
実行結果です。
1
2
4
5
実務では、条件に合わないデータをスキップするときにcontinueがよく使われます。
C#List<int> scores = new List<int> { 80, -1, 90, 70 };
foreach (int score in scores)
{
if (score < 0)
{
continue;
}
Console.WriteLine($"有効な点数: {score}");
}
5-6. 無限ループを防ぐための注意点
while文では、条件がずっとtrueのままだと無限ループになります。
C#int count = 0;
while (count < 5)
{
Console.WriteLine(count);
// count++を忘れると無限ループになる
}
正しくは、繰り返しの中で条件が変わるようにします。
C#int count = 0;
while (count < 5)
{
Console.WriteLine(count);
count++;
}
意図的に無限ループを使う場合もありますが、その場合は必ず終了条件を用意します。
C#while (true)
{
Console.WriteLine("終了するには q を入力してください");
string? input = Console.ReadLine();
if (input == "q")
{
break;
}
}
6. 配列・List・DictionaryのC#サンプル
複数のデータを扱うには、配列、List、Dictionaryなどのコレクションを使います。
実務では、商品一覧、ユーザー一覧、CSVの行データ、APIから取得したデータなどを扱う場面でよく使います。
6-1. 配列を作成して値を取り出すサンプル
配列は、同じ型の複数の値をまとめて扱う仕組みです。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
Console.WriteLine(fruits[0]);
Console.WriteLine(fruits[1]);
Console.WriteLine(fruits[2]);
配列のインデックスは0から始まります。
fruits[0] → りんご
fruits[1] → みかん
fruits[2] → バナナ
配列の要素数はLengthで取得できます。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
Console.WriteLine(fruits.Length);
配列の中身をすべて表示するには、foreachを使うと簡単です。
C#string[] fruits = { "りんご", "みかん", "バナナ" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
6-2. Listに要素を追加・削除・検索するサンプル
List<T>は、要素を追加・削除しやすいコレクションです。
C#List<string> names = new List<string>();
names.Add("田中");
names.Add("佐藤");
names.Add("鈴木");
foreach (string name in names)
{
Console.WriteLine(name);
}
要素を削除するには、Removeを使います。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
names.Remove("佐藤");
foreach (string name in names)
{
Console.WriteLine(name);
}
要素が含まれているか確認するには、Containsを使います。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
if (names.Contains("田中"))
{
Console.WriteLine("田中さんが含まれています");
}
条件に合う要素を探すには、Findも使えます。
C#List<int> scores = new List<int> { 55, 70, 85, 90 };
int result = scores.Find(score => score >= 80);
Console.WriteLine(result);
6-3. Dictionaryでキーと値を管理するサンプル
Dictionary<TKey, TValue>は、キーと値の組み合わせでデータを管理します。
C#Dictionary<string, int> prices = new Dictionary<string, int>();
prices["りんご"] = 120;
prices["みかん"] = 80;
prices["バナナ"] = 100;
Console.WriteLine(prices["りんご"]);
存在しないキーを直接指定するとエラーになります。
C#Console.WriteLine(prices["ぶどう"]); // キーがなければエラー
安全に取り出すには、TryGetValueを使います。
C#Dictionary<string, int> prices = new Dictionary<string, int>
{
{ "りんご", 120 },
{ "みかん", 80 },
{ "バナナ", 100 }
};
if (prices.TryGetValue("ぶどう", out int price))
{
Console.WriteLine(price);
}
else
{
Console.WriteLine("価格が登録されていません");
}
すべてのキーと値を表示するには、foreachを使います。
C#foreach (var item in prices)
{
Console.WriteLine($"{item.Key}: {item.Value}円");
}
6-4. 配列とListの違い
配列とListはどちらも複数の値を扱えますが、使いどころが異なります。
配列は、要素数が固定の場合に向いています。
C#int[] scores = new int[3];
scores[0] = 80;
scores[1] = 90;
scores[2] = 70;
一方、Listは要素数が変わる場合に向いています。
C#List<int> scores = new List<int>();
scores.Add(80);
scores.Add(90);
scores.Add(70);
scores.Add(100);
初心者が迷った場合は、要素数があとから増減するならList、固定なら配列と考えるとよいでしょう。
実務では、データ件数が変わることが多いため、Listを使う場面が多くあります。
6-5. LINQでデータを絞り込むサンプル
LINQを使うと、コレクションから条件に合うデータを簡単に取り出せます。
C#List<int> scores = new List<int> { 55, 70, 85, 90, 40 };
var passedScores = scores.Where(score => score >= 60);
foreach (int score in passedScores)
{
Console.WriteLine(score);
}
Whereは、条件に合う要素だけを取り出します。
文字列のListでも使えます。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木", "田村" };
var results = names.Where(name => name.StartsWith("田"));
foreach (string name in results)
{
Console.WriteLine(name);
}
並び替えにはOrderByを使います。
C#List<int> numbers = new List<int> { 30, 10, 20 };
var sorted = numbers.OrderBy(n => n);
foreach (int number in sorted)
{
Console.WriteLine(number);
}
合計を求めるにはSumを使えます。
C#List<int> prices = new List<int> { 100, 200, 300 };
int total = prices.Sum();
Console.WriteLine(total);
6-6. コレクション操作でよく出るエラー
配列やListでよくあるエラーは、範囲外のインデックスを指定することです。
C#string[] fruits = { "りんご", "みかん" };
Console.WriteLine(fruits[2]); // エラー
この配列には、fruits[0]とfruits[1]しかありません。
安全に処理するには、要素数を確認します。
C#string[] fruits = { "りんご", "みかん" };
if (fruits.Length > 2)
{
Console.WriteLine(fruits[2]);
}
else
{
Console.WriteLine("指定した要素は存在しません");
}
Listでも同じです。
C#List<string> names = new List<string>();
if (names.Count > 0)
{
Console.WriteLine(names[0]);
}
else
{
Console.WriteLine("データがありません");
}
Dictionaryでは、存在しないキーを参照しないようにContainsKeyやTryGetValueを使いましょう。
C#Dictionary<string, int> ages = new Dictionary<string, int>
{
{ "田中", 30 }
};
if (ages.ContainsKey("佐藤"))
{
Console.WriteLine(ages["佐藤"]);
}
else
{
Console.WriteLine("佐藤さんの年齢は登録されていません");
}
7. メソッド・関数のC#サンプル
メソッドは、処理をひとまとまりにする仕組みです。
同じ処理を何度も書かずに済み、コードを読みやすくできます。実務では、処理を適切にメソッドへ分けることが非常に重要です。
7-1. メソッドを定義して呼び出すサンプル
メソッドは、次のように定義します。
C#void SayHello()
{
Console.WriteLine("こんにちは");
}
SayHello();
SayHelloというメソッドを定義し、そのあとSayHello();で呼び出しています。
トップレベルステートメントでは、呼び出しより下にメソッドを書くこともできます。
C#SayHello();
void SayHello()
{
Console.WriteLine("こんにちは");
}
メソッドを使うと、同じ処理を何度も呼び出せます。
C#SayHello();
SayHello();
SayHello();
void SayHello()
{
Console.WriteLine("こんにちは");
}
7-2. 引数を渡すサンプル
引数を使うと、メソッドに値を渡せます。
C#void Greet(string name)
{
Console.WriteLine($"{name}さん、こんにちは");
}
Greet("田中");
Greet("佐藤");
実行結果です。
田中さん、こんにちは
佐藤さん、こんにちは
複数の引数を渡すこともできます。
C#void ShowProfile(string name, int age)
{
Console.WriteLine($"{name}さんは{age}歳です");
}
ShowProfile("山田", 28);
引数の型と順番は、定義と呼び出しで一致している必要があります。
C#ShowProfile("山田", 28); // OK
ShowProfile(28, "山田"); // エラー
7-3. 戻り値を受け取るサンプル
戻り値があるメソッドでは、処理結果を呼び出し元に返せます。
C#int Add(int a, int b)
{
return a + b;
}
int result = Add(10, 20);
Console.WriteLine(result);
returnで値を返します。
消費税を計算するサンプルです。
C#int CalculateTaxIncludedPrice(int price)
{
double taxRate = 0.1;
return (int)(price * (1 + taxRate));
}
int total = CalculateTaxIncludedPrice(1000);
Console.WriteLine(total);
戻り値があるメソッドは、「入力を受け取って結果を返す処理」に向いています。
7-4. voidメソッドのサンプル
voidは、戻り値がないメソッドを表します。
C#void PrintLine()
{
Console.WriteLine("----------------");
}
PrintLine();
Console.WriteLine("メニュー");
PrintLine();
画面表示、ログ出力、ファイル書き込みなど、「結果を返すより処理を実行すること」が目的の場合にvoidを使います。
C#void ShowError(string message)
{
Console.WriteLine($"エラー: {message}");
}
ShowError("入力値が不正です");
ただし、実務ではテストしやすさを考えて、計算や判定ロジックは戻り値のあるメソッドにすることが多いです。
C#bool IsAdult(int age)
{
return age >= 18;
}
if (IsAdult(20))
{
Console.WriteLine("成人です");
}
7-5. オーバーロードのサンプル
オーバーロードとは、同じ名前のメソッドを引数の違いで複数定義することです。
C#void Print(string message)
{
Console.WriteLine(message);
}
void Print(int number)
{
Console.WriteLine(number);
}
Print("こんにちは");
Print(100);
引数の数を変えることもできます。
C#int Add(int a, int b)
{
return a + b;
}
int Add(int a, int b, int c)
{
return a + b + c;
}
Console.WriteLine(Add(1, 2));
Console.WriteLine(Add(1, 2, 3));
オーバーロードを使うと、似た処理を同じ名前で扱えるため、コードが分かりやすくなります。
ただし、増やしすぎると逆に分かりにくくなるため注意が必要です。
7-6. ref・outを使うサンプル
refを使うと、メソッド内で変更した値を呼び出し元にも反映できます。
C#void AddTen(ref int number)
{
number += 10;
}
int value = 5;
AddTen(ref value);
Console.WriteLine(value); // 15
outは、メソッドから複数の値を返したい場合などに使います。
C#bool TryDivide(int a, int b, out int result)
{
if (b == 0)
{
result = 0;
return false;
}
result = a / b;
return true;
}
if (TryDivide(10, 2, out int answer))
{
Console.WriteLine(answer);
}
else
{
Console.WriteLine("割り算できません");
}
実務では、int.TryParseのようなメソッドでもoutが使われます。
C#string input = "123";
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません");
}
7-7. メソッドを分けるメリット
メソッドを分けるメリットは、コードが読みやすくなることです。
例えば、すべての処理を一か所に書くと、何をしているのか分かりにくくなります。
C#int price = 1000;
double taxRate = 0.1;
int total = (int)(price * (1 + taxRate));
Console.WriteLine($"税込価格: {total}円");
メソッドに分けると、処理の意味が明確になります。
C#int CalculateTaxIncludedPrice(int price)
{
const double TaxRate = 0.1;
return (int)(price * (1 + TaxRate));
}
void PrintPrice(int price)
{
Console.WriteLine($"税込価格: {price}円");
}
int total = CalculateTaxIncludedPrice(1000);
PrintPrice(total);
メソッドを分けることで、再利用しやすくなり、テストもしやすくなります。
実務では、「1つのメソッドが長すぎる」「複数の役割を持っている」と感じたら、メソッド分割を検討します。
8. クラスとオブジェクト指向のC#サンプル
C#はオブジェクト指向プログラミングを前提とした言語です。
クラス、インスタンス、プロパティ、コンストラクタ、継承、interfaceなどを理解すると、実務コードを読み書きしやすくなります。
8-1. クラスを作成するサンプル
クラスは、データと処理をまとめる設計図です。
C#class Person
{
public string Name { get; set; } = "";
public void SayHello()
{
Console.WriteLine($"{Name}です。こんにちは。");
}
}
このPersonクラスには、Nameというプロパティと、SayHelloというメソッドがあります。
クラスだけでは実行されません。次に紹介するインスタンスを作成して使います。
8-2. インスタンスを生成するサンプル
クラスを使うには、newでインスタンスを生成します。
C#Person person = new Person();
person.Name = "田中";
person.SayHello();
class Person
{
public string Name { get; set; } = "";
public void SayHello()
{
Console.WriteLine($"{Name}です。こんにちは。");
}
}
実行結果です。
田中です。こんにちは。
同じクラスから複数のインスタンスを作れます。
C#Person person1 = new Person();
person1.Name = "田中";
Person person2 = new Person();
person2.Name = "佐藤";
person1.SayHello();
person2.SayHello();
class Person
{
public string Name { get; set; } = "";
public void SayHello()
{
Console.WriteLine($"{Name}です。こんにちは。");
}
}
クラスは設計図、インスタンスは実体と考えると分かりやすいです。
8-3. フィールドとプロパティのサンプル
フィールドは、クラスの中に持つ変数です。
C#class Person
{
private string name = "";
public void SetName(string value)
{
name = value;
}
public void ShowName()
{
Console.WriteLine(name);
}
}
プロパティは、外部から値を読み書きするための仕組みです。
C#class Person
{
public string Name { get; set; } = "";
}
使い方は次のとおりです。
C#Person person = new Person();
person.Name = "山田";
Console.WriteLine(person.Name);
class Person
{
public string Name { get; set; } = "";
}
実務では、フィールドはprivateにし、外部に公開する値はプロパティにすることが多いです。
読み取り専用のプロパティも作れます。
C#class Product
{
public string Name { get; }
public int Price { get; }
public Product(string name, int price)
{
Name = name;
Price = price;
}
}
8-4. コンストラクタのサンプル
コンストラクタは、インスタンス生成時に実行される特別なメソッドです。
C#Person person = new Person("田中", 30);
person.ShowProfile();
class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public void ShowProfile()
{
Console.WriteLine($"{Name}さんは{Age}歳です");
}
}
コンストラクタを使うと、必要な値を必ず設定した状態でインスタンスを作れます。
次のように、初期値がないと困るクラスでは特に有効です。
C#class Order
{
public string OrderNumber { get; }
public Order(string orderNumber)
{
if (string.IsNullOrWhiteSpace(orderNumber))
{
throw new ArgumentException("注文番号は必須です");
}
OrderNumber = orderNumber;
}
}
8-5. 継承のサンプル
継承を使うと、既存のクラスの機能を引き継いだ新しいクラスを作れます。
C#Dog dog = new Dog();
dog.Name = "ポチ";
dog.Eat();
dog.Bark();
class Animal
{
public string Name { get; set; } = "";
public void Eat()
{
Console.WriteLine($"{Name}が食べています");
}
}
class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name}が吠えています");
}
}
Dog : Animalは、DogがAnimalを継承していることを表します。
継承元のクラスを基底クラス、継承先のクラスを派生クラスと呼びます。
共通処理を基底クラスにまとめることで、重複を減らせます。
ただし、継承を使いすぎると設計が複雑になるため、実務ではinterfaceや委譲を使うことも多いです。
8-6. interfaceのサンプル
interfaceは、クラスが実装すべき機能の形を定義するものです。
C#IPrinter printer = new ConsolePrinter();
printer.Print("こんにちは");
interface IPrinter
{
void Print(string message);
}
class ConsolePrinter : IPrinter
{
public void Print(string message)
{
Console.WriteLine(message);
}
}
IPrinterは、Printメソッドを持つことを約束しています。
別の出力方法に差し替えることもできます。
C#interface ILogger
{
void Log(string message);
}
class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"LOG: {message}");
}
}
class App
{
private readonly ILogger _logger;
public App(ILogger logger)
{
_logger = logger;
}
public void Run()
{
_logger.Log("アプリを開始しました");
}
}
var app = new App(new ConsoleLogger());
app.Run();
interfaceを使うと、処理の差し替えがしやすくなり、テストしやすい設計になります。
8-7. クラス設計で初心者が混乱しやすいポイント
初心者が混乱しやすいのは、「クラス」と「インスタンス」の違いです。
クラスは設計図です。
C#class Person
{
public string Name { get; set; } = "";
}
インスタンスは、設計図から作られた実体です。
C#Person person = new Person();
person.Name = "田中";
また、staticの有無もつまずきやすいポイントです。
staticメソッドは、インスタンスを作らずに呼び出せます。
C#class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
int result = Calculator.Add(10, 20);
Console.WriteLine(result);
一方、インスタンスメソッドはnewで作ったオブジェクトから呼び出します。
C#class Counter
{
public int Count { get; private set; }
public void Increment()
{
Count++;
}
}
Counter counter = new Counter();
counter.Increment();
Console.WriteLine(counter.Count);
状態を持たない処理はstatic、オブジェクトごとの状態を持つ処理はインスタンスメソッドと考えると理解しやすくなります。
9. 例外処理とエラー対応のC#サンプル
プログラムでは、予期しないエラーが発生することがあります。
ファイルが存在しない、文字列を数値に変換できない、nullを参照してしまうなど、さまざまな原因があります。
例外処理を理解すると、プログラムが突然停止するのを防ぎ、原因を分かりやすく扱えるようになります。
9-1. try-catchで例外を処理するサンプル
try-catchを使うと、例外が発生したときの処理を書けます。
C#try
{
int number = int.Parse("abc");
Console.WriteLine(number);
}
catch (FormatException)
{
Console.WriteLine("数値に変換できません");
}
int.Parse("abc")は数値に変換できないため、FormatExceptionが発生します。
例外の詳細を表示したい場合は、例外オブジェクトを受け取ります。
C#try
{
int number = int.Parse("abc");
Console.WriteLine(number);
}
catch (FormatException ex)
{
Console.WriteLine($"エラー内容: {ex.Message}");
}
複数の例外を分けて処理することもできます。
C#try
{
string? text = null;
Console.WriteLine(text.Length);
}
catch (NullReferenceException)
{
Console.WriteLine("nullを参照しました");
}
catch (Exception ex)
{
Console.WriteLine($"予期しないエラー: {ex.Message}");
}
9-2. finallyを使うサンプル
finallyは、例外が発生してもしなくても必ず実行されます。
C#try
{
Console.WriteLine("処理を開始します");
int number = int.Parse("123");
Console.WriteLine(number);
}
catch (FormatException)
{
Console.WriteLine("変換エラーです");
}
finally
{
Console.WriteLine("処理を終了します");
}
ファイルやデータベース接続など、後片付けが必要な処理で使われます。
ただし、C#ではusingを使うことで、リソース解放をより安全に書ける場合も多いです。
C#using StreamWriter writer = new StreamWriter("sample.txt");
writer.WriteLine("こんにちは");
この場合、処理が終わると自動的にStreamWriterが解放されます。
9-3. throwで例外を発生させるサンプル
throwを使うと、自分で例外を発生させられます。
C#void CheckAge(int age)
{
if (age < 0)
{
throw new ArgumentException("年齢は0以上で入力してください");
}
Console.WriteLine($"年齢: {age}");
}
try
{
CheckAge(-1);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
不正な値が渡されたとき、処理を続けると危険な場合は、例外を発生させて呼び出し元に知らせます。
実務では、メソッドの前提条件を満たしていない場合にArgumentExceptionやArgumentNullExceptionを使うことがあります。
C#void RegisterUser(string name)
{
if (string.IsNullOrWhiteSpace(name))
{
throw new ArgumentException("名前は必須です", nameof(name));
}
Console.WriteLine($"{name}さんを登録しました");
}
9-4. FormatException・NullReferenceExceptionの対処サンプル
FormatExceptionは、文字列の形式が正しくないときによく発生します。
C#string input = "abc";
try
{
int number = int.Parse(input);
Console.WriteLine(number);
}
catch (FormatException)
{
Console.WriteLine("数値形式ではありません");
}
実務では、例外を出す前にTryParseを使うほうが安全です。
C#string input = "abc";
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値を入力してください");
}
NullReferenceExceptionは、nullの変数に対してメンバーを呼び出したときに発生します。
C#string? name = null;
// Console.WriteLine(name.Length); // NullReferenceException
対処方法は、nullチェックをすることです。
C#string? name = null;
if (name != null)
{
Console.WriteLine(name.Length);
}
else
{
Console.WriteLine("名前がありません");
}
null条件演算子も使えます。
C#string? name = null;
Console.WriteLine(name?.Length);
nameがnullの場合、name?.Lengthはnullになります。
9-5. エラー文の読み方と原因の探し方
C#でエラーが出たときは、まずエラー文をよく読みます。
例えば、次のようなエラーが出たとします。
IndexOutOfRangeException: Index was outside the bounds of the array.
これは、配列の範囲外にアクセスしたという意味です。
原因の例です。
C#int[] numbers = { 10, 20, 30 };
Console.WriteLine(numbers[3]); // エラー
配列のインデックスは0から始まるため、最後の要素はnumbers[2]です。
エラーを探すときは、次の順番で確認するとよいです。
まず、エラーが発生した行を確認します。Visual StudioやVS Codeでは、エラー行が表示されます。
次に、変数の値を確認します。Console.WriteLineで値を出力するだけでも原因が分かることがあります。
C#Console.WriteLine($"配列の長さ: {numbers.Length}");
Console.WriteLine($"指定したインデックス: 3");
最後に、前提条件を確認します。nullではないか、空ではないか、範囲内か、形式が正しいかを見ます。
9-6. 実務で意識したい例外処理の書き方
実務では、すべてのエラーを雑にcatchするのは避けたほうがよいです。
よくない例です。
C#try
{
int number = int.Parse("abc");
}
catch
{
Console.WriteLine("エラーです");
}
これでは、何が原因か分かりません。
改善例です。
C#try
{
int number = int.Parse("abc");
}
catch (FormatException ex)
{
Console.WriteLine($"数値変換エラー: {ex.Message}");
}
想定できる例外は具体的に処理し、想定外の例外はログに残すのが基本です。
C#try
{
Execute();
}
catch (FormatException ex)
{
Console.WriteLine($"入力形式が不正です: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"予期しないエラーが発生しました: {ex}");
}
void Execute()
{
int number = int.Parse("abc");
}
例外を握りつぶさず、原因を追跡できる情報を残すことが重要です。
10. ファイル操作のC#サンプル
C#では、テキストファイル、CSVファイル、ディレクトリなどを簡単に操作できます。
業務システムでは、ログ出力、CSV取込、設定ファイル読込、帳票データ作成などでファイル操作がよく使われます。
10-1. テキストファイルを書き込むサンプル
テキストファイルに文字を書き込むには、File.WriteAllTextを使います。
C#using System.IO;
string path = "sample.txt";
string content = "こんにちは、C#のファイル書き込みサンプルです。";
File.WriteAllText(path, content);
Console.WriteLine("ファイルを書き込みました");
複数行を書き込む場合は、WriteAllLinesが便利です。
C#using System.IO;
string path = "lines.txt";
string[] lines =
{
"1行目です",
"2行目です",
"3行目です"
};
File.WriteAllLines(path, lines);
Console.WriteLine("複数行を書き込みました");
既存ファイルに追記したい場合は、AppendAllTextを使います。
C#using System.IO;
File.AppendAllText("log.txt", "ログを追記しました\n");
10-2. テキストファイルを読み込むサンプル
テキストファイルを読み込むには、File.ReadAllTextを使います。
C#using System.IO;
string path = "sample.txt";
if (File.Exists(path))
{
string content = File.ReadAllText(path);
Console.WriteLine(content);
}
else
{
Console.WriteLine("ファイルが存在しません");
}
行ごとに読み込む場合は、ReadAllLinesを使います。
C#using System.IO;
string path = "lines.txt";
if (File.Exists(path))
{
string[] lines = File.ReadAllLines(path);
foreach (string line in lines)
{
Console.WriteLine(line);
}
}
大きなファイルを1行ずつ処理したい場合は、ReadLinesが便利です。
C#using System.IO;
foreach (string line in File.ReadLines("large.txt"))
{
Console.WriteLine(line);
}
10-3. CSVファイルを読み込むサンプル
CSVファイルは、カンマ区切りのテキストファイルです。
簡単なCSVであれば、Splitを使って読み込めます。
C#using System.IO;
string path = "users.csv";
if (File.Exists(path))
{
foreach (string line in File.ReadLines(path))
{
string[] columns = line.Split(',');
string name = columns[0];
int age = int.Parse(columns[1]);
Console.WriteLine($"{name}さんは{age}歳です");
}
}
CSVの内容例です。
田中,30
佐藤,25
鈴木,40
ただし、実務のCSVでは、値にカンマが含まれる場合やダブルクォーテーションで囲まれる場合があります。
"田中,太郎",30
このようなCSVを正しく扱うには、CSV専用ライブラリを使うほうが安全です。学習用の単純なCSVならSplitで十分ですが、実務では仕様を確認しましょう。
10-4. ファイルの存在チェックをするサンプル
ファイルが存在するか確認するには、File.Existsを使います。
C#using System.IO;
string path = "sample.txt";
if (File.Exists(path))
{
Console.WriteLine("ファイルがあります");
}
else
{
Console.WriteLine("ファイルがありません");
}
ファイルがないのに読み込もうとするとエラーになります。
C#string content = File.ReadAllText("notfound.txt"); // ファイルがないとエラー
そのため、読み込み前に存在チェックをすると安全です。
C#string path = "notfound.txt";
if (!File.Exists(path))
{
Console.WriteLine("対象ファイルが見つかりません");
return;
}
string content = File.ReadAllText(path);
Console.WriteLine(content);
10-5. ディレクトリを作成・削除するサンプル
ディレクトリを作成するには、Directory.CreateDirectoryを使います。
C#using System.IO;
string directoryPath = "output";
Directory.CreateDirectory(directoryPath);
Console.WriteLine("ディレクトリを作成しました");
すでに存在していてもエラーにはなりません。
ディレクトリが存在するか確認するには、Directory.Existsを使います。
C#using System.IO;
string directoryPath = "output";
if (Directory.Exists(directoryPath))
{
Console.WriteLine("ディレクトリがあります");
}
else
{
Console.WriteLine("ディレクトリがありません");
}
ディレクトリを削除するには、Directory.Deleteを使います。
C#using System.IO;
string directoryPath = "output";
if (Directory.Exists(directoryPath))
{
Directory.Delete(directoryPath);
Console.WriteLine("ディレクトリを削除しました");
}
中にファイルがあるディレクトリを削除する場合は、第2引数にtrueを指定します。
C#Directory.Delete("output", true);
ただし、誤って重要なファイルを削除しないように注意してください。
10-6. ファイル操作で起きやすい権限エラーの対処法
ファイル操作では、権限エラーが起きることがあります。
例えば、書き込み権限がない場所にファイルを作ろうとするとエラーになります。
C#using System.IO;
try
{
File.WriteAllText(@"C:\Windows\sample.txt", "test");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"権限がありません: {ex.Message}");
}
対処法としては、書き込み可能なフォルダを使うことです。
アプリの実行フォルダや、ユーザーフォルダ配下のフォルダを使うと安全です。
C#using System.IO;
string folder = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"CSharpSample"
);
Directory.CreateDirectory(folder);
string path = Path.Combine(folder, "sample.txt");
File.WriteAllText(path, "書き込みテスト");
Console.WriteLine(path);
パスを文字列結合で作るより、Path.Combineを使うとOSに依存しにくくなります。
C#string path = Path.Combine("output", "result.txt");
11. 日付・時刻・数値処理のC#サンプル
日付、時刻、数値処理は、業務システムで頻繁に使われます。
現在日時の取得、日付の表示形式、経過時間の計算、数値の丸め、文字列からの変換などをサンプルで確認しましょう。
11-1. DateTimeで現在日時を取得するサンプル
現在日時を取得するには、DateTime.Nowを使います。
C#DateTime now = DateTime.Now;
Console.WriteLine(now);
現在の日付だけを取得するには、DateTime.Todayを使います。
C#DateTime today = DateTime.Today;
Console.WriteLine(today);
UTC時刻を取得するには、DateTime.UtcNowを使います。
C#DateTime utcNow = DateTime.UtcNow;
Console.WriteLine(utcNow);
ログやシステム間連携では、タイムゾーンを意識することが重要です。
11-2. 日付を指定フォーマットで表示するサンプル
日付は、ToStringで表示形式を指定できます。
C#DateTime now = DateTime.Now;
Console.WriteLine(now.ToString("yyyy/MM/dd"));
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss"));
Console.WriteLine(now.ToString("MM月dd日"));
よく使うフォーマットです。
C#DateTime now = DateTime.Now;
string dateText = now.ToString("yyyyMMdd");
string dateTimeText = now.ToString("yyyyMMddHHmmss");
Console.WriteLine(dateText);
Console.WriteLine(dateTimeText);
ファイル名に日時を付ける場合にも便利です。
C#DateTime now = DateTime.Now;
string fileName = $"log_{now:yyyyMMddHHmmss}.txt";
Console.WriteLine(fileName);
文字列補間でもフォーマットを指定できます。
C#DateTime now = DateTime.Now;
Console.WriteLine($"現在日時: {now:yyyy/MM/dd HH:mm:ss}");
11-3. 日付の加算・減算をするサンプル
日付に日数を足すには、AddDaysを使います。
C#DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);
DateTime yesterday = today.AddDays(-1);
Console.WriteLine(tomorrow);
Console.WriteLine(yesterday);
月を足すにはAddMonthsを使います。
C#DateTime today = DateTime.Today;
DateTime nextMonth = today.AddMonths(1);
Console.WriteLine(nextMonth);
年を足すにはAddYearsを使います。
C#DateTime today = DateTime.Today;
DateTime nextYear = today.AddYears(1);
Console.WriteLine(nextYear);
期限日を計算するサンプルです。
C#DateTime orderDate = DateTime.Today;
DateTime dueDate = orderDate.AddDays(7);
Console.WriteLine($"注文日: {orderDate:yyyy/MM/dd}");
Console.WriteLine($"期限日: {dueDate:yyyy/MM/dd}");
11-4. TimeSpanで経過時間を計算するサンプル
TimeSpanは、時間の間隔を表します。
C#DateTime start = new DateTime(2026, 1, 1);
DateTime end = new DateTime(2026, 1, 10);
TimeSpan span = end - start;
Console.WriteLine(span.Days);
処理時間を測ることもできます。
C#DateTime start = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
// 何らかの処理
}
DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;
Console.WriteLine($"経過時間: {elapsed.TotalMilliseconds}ミリ秒");
より正確に処理時間を測る場合は、Stopwatchを使います。
C#using System.Diagnostics;
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++)
{
// 何らかの処理
}
stopwatch.Stop();
Console.WriteLine($"経過時間: {stopwatch.ElapsedMilliseconds}ミリ秒");
11-5. 数値を丸めるサンプル
数値を丸めるには、Math.Roundを使います。
C#double value = 123.456;
Console.WriteLine(Math.Round(value));
Console.WriteLine(Math.Round(value, 2));
切り上げにはMath.Ceilingを使います。
C#double value = 123.456;
Console.WriteLine(Math.Ceiling(value)); // 124
切り捨てにはMath.Floorを使います。
C#double value = 123.456;
Console.WriteLine(Math.Floor(value)); // 123
小数点以下を単純に切り捨てて整数にする場合は、キャストも使えます。
C#double value = 123.456;
int result = (int)value;
Console.WriteLine(result); // 123
金額計算では、丸め方によって結果が変わるため、仕様を確認することが重要です。
11-6. 文字列を数値や日付に変換するサンプル
文字列を数値に変換するには、int.Parseを使います。
C#string text = "123";
int number = int.Parse(text);
Console.WriteLine(number + 10);
変換できない可能性がある場合は、TryParseを使います。
C#string text = "abc";
if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値に変換できません");
}
文字列を日付に変換するには、DateTime.Parseを使います。
C#string text = "2026/01/01";
DateTime date = DateTime.Parse(text);
Console.WriteLine(date);
安全に変換するには、DateTime.TryParseを使います。
C#string text = "2026/01/01";
if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date.ToString("yyyy-MM-dd"));
}
else
{
Console.WriteLine("日付に変換できません");
}
決まった形式の日付を変換する場合は、ParseExactを使います。
C#using System.Globalization;
string text = "20260101";
DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);
Console.WriteLine(date);
12. 実務で使えるC#サンプル集
ここからは、実務でよく使うC#サンプルを紹介します。
入力値チェック、ログ出力、CSV集計、設定ファイル読み込み、HTTP通信、JSON、非同期処理など、アプリ開発で頻繁に登場する処理です。
12-1. 入力値チェックのサンプル
入力値チェックは、ユーザー入力や外部データを扱うときに重要です。
C#string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("名前を入力してください");
}
else
{
Console.WriteLine($"{name}さん、こんにちは");
}
数値入力をチェックするサンプルです。
C#Console.WriteLine("年齢を入力してください:");
string? input = Console.ReadLine();
if (!int.TryParse(input, out int age))
{
Console.WriteLine("年齢は数値で入力してください");
}
else if (age < 0)
{
Console.WriteLine("年齢は0以上で入力してください");
}
else
{
Console.WriteLine($"年齢: {age}");
}
メールアドレスの簡易チェックです。
C#string email = "sample@example.com";
if (email.Contains("@"))
{
Console.WriteLine("メールアドレス形式です");
}
else
{
Console.WriteLine("メールアドレス形式ではありません");
}
実務では、より厳密なチェックが必要な場合もあります。入力値チェックは、画面側だけでなくサーバー側でも行うことが大切です。
12-2. ログ出力のサンプル
簡単なログ出力は、ファイル追記で実装できます。
C#using System.IO;
void WriteLog(string message)
{
string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {message}";
File.AppendAllText("app.log", logMessage + Environment.NewLine);
}
WriteLog("アプリを開始しました");
WriteLog("処理を終了しました");
エラー発生時にログを出すサンプルです。
C#using System.IO;
try
{
int number = int.Parse("abc");
}
catch (Exception ex)
{
WriteLog($"エラー発生: {ex}");
}
void WriteLog(string message)
{
string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} {message}";
File.AppendAllText("error.log", logMessage + Environment.NewLine);
}
実務では、ログレベルを分けることもあります。
C#void WriteLog(string level, string message)
{
string logMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} [{level}] {message}";
File.AppendAllText("app.log", logMessage + Environment.NewLine);
}
WriteLog("INFO", "処理を開始しました");
WriteLog("WARN", "設定値が未指定です");
WriteLog("ERROR", "エラーが発生しました");
本格的なアプリでは、標準のロギング機能やログライブラリを使うことが一般的です。
12-3. CSVを読み込んで集計するサンプル
CSVファイルを読み込んで、金額を集計するサンプルです。
CSVの内容例です。
商品A,100
商品B,200
商品C,300
C#コードです。
C#using System.IO;
string path = "sales.csv";
int total = 0;
foreach (string line in File.ReadLines(path))
{
string[] columns = line.Split(',');
string productName = columns[0];
int price = int.Parse(columns[1]);
total += price;
Console.WriteLine($"{productName}: {price}円");
}
Console.WriteLine($"合計: {total}円");
エラーに強くするなら、列数や数値変換をチェックします。
C#using System.IO;
string path = "sales.csv";
int total = 0;
foreach (string line in File.ReadLines(path))
{
string[] columns = line.Split(',');
if (columns.Length < 2)
{
Console.WriteLine($"列数が不足しています: {line}");
continue;
}
if (!int.TryParse(columns[1], out int price))
{
Console.WriteLine($"金額が不正です: {line}");
continue;
}
total += price;
}
Console.WriteLine($"合計: {total}円");
実務では、正常データだけでなく異常データをどう扱うかも重要です。
12-4. 設定ファイルを読み込むサンプル
簡単な設定ファイルを読み込むサンプルです。
設定ファイルsettings.txtの例です。
AppName=SampleApp
MaxCount=10
C#コードです。
C#using System.IO;
Dictionary<string, string> settings = new Dictionary<string, string>();
foreach (string line in File.ReadLines("settings.txt"))
{
string[] parts = line.Split('=', 2);
if (parts.Length == 2)
{
settings[parts[0]] = parts[1];
}
}
Console.WriteLine(settings["AppName"]);
Console.WriteLine(settings["MaxCount"]);
存在しないキーに備えるなら、TryGetValueを使います。
C#if (settings.TryGetValue("AppName", out string? appName))
{
Console.WriteLine(appName);
}
else
{
Console.WriteLine("AppNameが設定されていません");
}
JSON形式の設定ファイルを使う場合は、System.Text.Jsonを使う方法もあります。
C#using System.Text.Json;
string json = """
{
"AppName": "SampleApp",
"MaxCount": 10
}
""";
AppSettings? settings = JsonSerializer.Deserialize<AppSettings>(json);
Console.WriteLine(settings?.AppName);
Console.WriteLine(settings?.MaxCount);
class AppSettings
{
public string AppName { get; set; } = "";
public int MaxCount { get; set; }
}
12-5. HTTP通信でAPIを呼び出すサンプル
HTTP通信には、HttpClientを使います。
C#using System.Net.Http;
using HttpClient client = new HttpClient();
string url = "https://example.com";
string response = await client.GetStringAsync(url);
Console.WriteLine(response);
APIを呼び出す場合は、例外処理も入れると安全です。
C#using System.Net.Http;
using HttpClient client = new HttpClient();
try
{
string url = "https://example.com";
string response = await client.GetStringAsync(url);
Console.WriteLine(response);
}
catch (HttpRequestException ex)
{
Console.WriteLine($"HTTP通信エラー: {ex.Message}");
}
ステータスコードを確認したい場合は、GetAsyncを使います。
C#using System.Net.Http;
using HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("https://example.com");
if (response.IsSuccessStatusCode)
{
string body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}
else
{
Console.WriteLine($"エラー: {response.StatusCode}");
}
実務では、タイムアウト、リトライ、認証ヘッダー、APIキーなども考慮します。
12-6. JSONをシリアライズ・デシリアライズするサンプル
C#でJSONを扱うには、System.Text.Jsonが使えます。
オブジェクトをJSON文字列に変換することをシリアライズといいます。
C#using System.Text.Json;
User user = new User
{
Name = "田中",
Age = 30
};
string json = JsonSerializer.Serialize(user);
Console.WriteLine(json);
class User
{
public string Name { get; set; } = "";
public int Age { get; set; }
}
JSON文字列をオブジェクトに変換することをデシリアライズといいます。
C#using System.Text.Json;
string json = """
{
"Name": "佐藤",
"Age": 25
}
""";
User? user = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(user?.Name);
Console.WriteLine(user?.Age);
class User
{
public string Name { get; set; } = "";
public int Age { get; set; }
}
整形されたJSONを出力したい場合は、オプションを指定します。
C#using System.Text.Json;
User user = new User
{
Name = "鈴木",
Age = 40
};
var options = new JsonSerializerOptions
{
WriteIndented = true
};
string json = JsonSerializer.Serialize(user, options);
Console.WriteLine(json);
class User
{
public string Name { get; set; } = "";
public int Age { get; set; }
}
12-7. async/awaitで非同期処理を書くサンプル
asyncとawaitを使うと、時間のかかる処理を待ちながら、プログラムを効率よく動かせます。
簡単な非同期処理のサンプルです。
C#Console.WriteLine("開始");
await WaitAsync();
Console.WriteLine("終了");
async Task WaitAsync()
{
await Task.Delay(1000);
Console.WriteLine("1秒待ちました");
}
ファイルを非同期で読み込むサンプルです。
C#using System.IO;
string content = await File.ReadAllTextAsync("sample.txt");
Console.WriteLine(content);
HTTP通信でも非同期処理が使われます。
C#using System.Net.Http;
using HttpClient client = new HttpClient();
string result = await client.GetStringAsync("https://example.com");
Console.WriteLine(result);
複数の非同期処理をまとめて待つには、Task.WhenAllを使います。
C#Task task1 = Task.Delay(1000);
Task task2 = Task.Delay(2000);
await Task.WhenAll(task1, task2);
Console.WriteLine("すべて完了しました");
実務では、ファイル操作、データベースアクセス、API通信など、待ち時間が発生する処理でasync/awaitがよく使われます。
13. C#サンプルコードを理解して応用するコツ
C#サンプルは、コピペして動かすだけでも学習になります。
しかし、実力をつけるには、コードの意味を理解し、自分で変更して試すことが大切です。
13-1. コピペで終わらせず処理の流れを読む
サンプルコードを見たら、上から順に何が起きているかを読んでみましょう。
例えば、次のコードです。
C#int price = 1000;
double taxRate = 0.1;
double tax = price * taxRate;
double total = price + tax;
Console.WriteLine(total);
処理の流れは次のようになります。
まず、priceに1000を入れます。次に、taxRateに0.1を入れます。その後、税額を計算してtaxに入れます。最後に、税込価格をtotalに入れて表示します。
このように、1行ずつ役割を確認すると理解しやすくなります。
13-2. 変数名や値を変えて動作を確認する
サンプルコードを理解するには、値を変えて試すのが効果的です。
C#int score = 80;
if (score >= 60)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
このコードのscoreを変えてみます。
C#int score = 50;
すると、表示結果が変わります。
また、条件も変えてみましょう。
C#if (score >= 70)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
少しずつ変更して動作を確認することで、文法の意味が身につきます。
13-3. エラーが出たらまず確認するポイント
C#サンプルが動かないときは、焦らず次の点を確認します。
まず、エラーが出ている行を見ます。エディタ上で赤い波線が出ている場所や、エラーメッセージに表示されている行番号を確認します。
次に、セミコロン、カッコ、ダブルクォーテーションの閉じ忘れを確認します。
C#Console.WriteLine("Hello";
このコードは)が足りません。
正しくは次のとおりです。
C#Console.WriteLine("Hello");
変数名の打ち間違いもよくあります。
C#int score = 80;
Console.WriteLine(scroe); // scoreの打ち間違い
また、必要なusingが不足していないかも確認します。
C#using System.IO;
ファイル操作では、パスが正しいか、ファイルが存在するかも重要です。
13-4. サンプルコードを小さく分けて試す
長いサンプルコードが動かない場合は、小さく分けて試しましょう。
例えば、CSVを読み込んで集計する処理がある場合、いきなり全体を動かすのではなく、まずファイルが読めるか確認します。
C#foreach (string line in File.ReadLines("sales.csv"))
{
Console.WriteLine(line);
}
次に、カンマで分割できるか確認します。
C#foreach (string line in File.ReadLines("sales.csv"))
{
string[] columns = line.Split(',');
Console.WriteLine(columns[0]);
}
最後に、数値変換や集計処理を追加します。
このように段階的に確認すると、どこで問題が起きているか分かりやすくなります。
13-5. 実務コードに使う前に確認すべき品質ポイント
サンプルコードを実務で使う前には、いくつか確認すべきポイントがあります。
まず、異常系に対応しているか確認します。ファイルが存在しない、入力値が空、数値変換に失敗する、API通信に失敗するなどのケースです。
C#if (!File.Exists("data.csv"))
{
Console.WriteLine("ファイルが存在しません");
return;
}
次に、エラー内容をログに残しているか確認します。
C#catch (Exception ex)
{
Console.WriteLine(ex);
}
また、処理が長すぎないか、メソッドに分けられるかも確認します。
セキュリティ面も重要です。外部から受け取った値をそのまま使っていないか、認証情報をコードに直接書いていないかを確認しましょう。
悪い例です。
C#string apiKey = "xxxxxxxx";
実務では、環境変数や設定ファイル、安全なシークレット管理の仕組みを使います。
14. C#サンプルに関するよくある質問
ここでは、C#サンプルを探している初心者が疑問に感じやすい点をまとめます。
14-1. C#初心者はどのサンプルから学べばいい?
C#初心者は、まずコンソールアプリのサンプルから学ぶのがおすすめです。
最初に学ぶ順番は、次の流れが分かりやすいです。
まず、Console.WriteLineで文字を表示します。次に、変数と型を学びます。その後、if文、for文、配列、List、メソッド、クラスへ進みます。
いきなりWebアプリやUnityに進むと、C#の文法以外にも覚えることが多くなります。
まずは小さなC#サンプルを動かして、基本文法に慣れましょう。
14-2. Visual StudioとVisual Studio Codeのどちらを使うべき?
初心者がC#を学ぶなら、Visual Studioは使いやすい選択肢です。
プロジェクト作成、実行、デバッグ、エラー確認などが画面上で分かりやすくできます。
一方、Visual Studio Codeは軽量で、さまざまな言語を扱う人に向いています。ただし、C#拡張機能や.NET SDKの設定が必要です。
初心者でWindowsを使っているならVisual Studio、軽量なエディタで学びたいならVisual Studio Codeがよいでしょう。
どちらを使っても、この記事の多くのC#サンプルはコンソールアプリとして実行できます。
14-3. Unity向けのC#サンプルとは何が違う?
Unity向けのC#サンプルは、通常のコンソールアプリとは書き方が異なります。
例えば、コンソールアプリでは次のように表示します。
C#Console.WriteLine("Hello");
Unityでは、次のようにログを出力します。
C#Debug.Log("Hello");
また、UnityではMonoBehaviourを継承したクラスを使います。
C#using UnityEngine;
public class Player : MonoBehaviour
{
void Start()
{
Debug.Log("ゲーム開始");
}
void Update()
{
// 毎フレーム実行される
}
}
通常のC#サンプルで基本文法を学ぶことはUnityでも役立ちます。ただし、Unity固有のライフサイクルやAPIは別途学ぶ必要があります。
14-4. 古いC#のサンプルコードはそのまま使える?
古いC#サンプルでも、基本文法は現在でも使えることが多いです。
例えば、if文、for文、クラス、メソッドなどは大きく変わっていません。
ただし、プロジェクト形式、ライブラリ、推奨される書き方は変わっている場合があります。
古いサンプルでは、次のような書き方が多く見られます。
C#class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
}
}
現在のコンソールアプリでは、次のように短く書けます。
C#Console.WriteLine("Hello");
古いコードが動かない場合は、.NETのバージョン、プロジェクトの種類、必要なパッケージ、usingの有無を確認しましょう。
14-5. C#のサンプルコードが動かないときはどうすればいい?
C#サンプルコードが動かないときは、まずエラーメッセージを確認します。
次に、次のポイントを見直します。
セミコロン;が抜けていないか、カッコ()や{}が対応しているか、ダブルクォーテーション"が閉じているかを確認します。
変数名のスペルミスもよくあります。
C#int count = 10;
Console.WriteLine(cout); // countのつもりがcoutになっている
ファイル操作の場合は、ファイルの場所を確認します。data.csvが実行フォルダにあるかを確認してください。
必要なusingがない場合もエラーになります。
C#using System.IO;
using System.Text.Json;
using System.Net.Http;
また、サンプルがコンソールアプリ向けなのか、Unity向けなのか、ASP.NET Core向けなのかも確認しましょう。
14-6. 実務レベルになるにはどんなサンプルを作ればいい?
実務レベルを目指すなら、単発の文法サンプルだけでなく、小さなアプリを作るのがおすすめです。
例えば、次のようなサンプルを作ると実務力がつきます。
CSVファイルを読み込んで集計し、結果を別ファイルに出力するアプリです。ファイル操作、文字列処理、数値変換、例外処理を学べます。
ログイン風の入力チェックアプリです。条件分岐、メソッド分割、入力値チェックを学べます。
APIからJSONを取得して一覧表示するアプリです。HTTP通信、JSONデシリアライズ、非同期処理を学べます。
商品一覧をListで管理し、検索や並び替えを行うアプリです。List、Dictionary、LINQ、クラス設計を学べます。
重要なのは、サンプルを少しずつ改造することです。最初は小さく作り、あとから機能を追加していくと、実務に近い考え方が身につきます。
まとめ
C#サンプルを使って学習すると、文法の意味を実際の動きで確認できます。
最初は、Console.WriteLineで文字を表示するだけの簡単なコードから始めるのがおすすめです。その後、変数、条件分岐、繰り返し、配列、List、Dictionary、メソッド、クラスへ進むと、無理なく理解できます。
実務でC#を使うには、基本文法だけでなく、例外処理、ファイル操作、日付処理、ログ出力、CSV処理、HTTP通信、JSON、非同期処理なども重要です。
サンプルコードは、コピペして終わりではなく、変数名や値を変えて動かし、処理の流れを読むことが大切です。エラーが出た場合も、エラーメッセージ、行番号、変数の値、実行環境を順番に確認すれば、多くの問題は解決できます。
C#は、Webアプリ、デスクトップアプリ、ゲーム開発、業務システムなど幅広い分野で使える言語です。この記事のC#サンプルを土台にして、自分の目的に合わせたコードへ少しずつ応用していきましょう。

