C#基礎を初心者向けに完全解説|文法・環境構築・練習方法までわかる入門ガイド
はじめに
C#は、Webアプリ、デスクトップアプリ、ゲーム、業務システムなど、幅広い分野で利用されているプログラミング言語です。文法が比較的整理されており、開発環境や公式ドキュメントも充実しているため、初めて本格的なプログラミングを学ぶ人にも適しています。
一方で、C#の学習を始めると、変数や条件分岐だけでなく、.NET、クラス、インスタンス、継承など、多くの用語が登場します。最初からすべてを理解しようとすると、学習の全体像を見失いがちです。
本記事では、C#基礎を学びたい初心者に向けて、環境構築、基本文法、制御構文、配列、メソッド、オブジェクト指向、例外処理、練習方法まで順番に解説します。コード例を実際に入力して動かしながら、C#プログラミングの基本を身につけていきましょう。
1. C#基礎を学ぶ前に知っておきたい全体像
1-1. C#とは?Microsoftが開発したプログラミング言語の特徴
C#は、Microsoftが開発したプログラミング言語です。「シーシャープ」と読みます。
C#には、次のような特徴があります。
文法が整理されていて読みやすい
変数の型を明確に扱う静的型付け言語である
オブジェクト指向プログラミングに対応している
.NETの豊富な機能を利用できる
Web、デスクトップ、ゲームなど幅広い開発に使える
Visual Studioなどの高機能な開発環境が整っている
C#では、文字列、数値、日付、ファイル、ネットワーク通信などを扱うための機能が標準ライブラリとして用意されています。そのため、基本文法を覚えた後は、必要な機能を組み合わせて実用的なアプリを作れます。
また、C#はコンパイル時に多くの間違いを検出してくれます。たとえば、数値を入れる変数に誤って文字列を代入すると、実行前にエラーが表示されます。初心者にとっては、問題のある場所を早い段階で把握できる点がメリットです。
1-2. C#でできること|Webアプリ・デスクトップアプリ・ゲーム開発
C#は、特定の用途だけに限定された言語ではありません。代表的な開発分野は次のとおりです。
Webアプリ開発
ASP.NET Coreを利用すると、Webサイト、Web API、会員管理システム、予約システムなどを開発できます。サーバー側の処理をC#で記述し、データベースや外部サービスと連携させることも可能です。
デスクトップアプリ開発
WPFやWindows Formsを利用すると、Windows向けのデスクトップアプリを作成できます。社内ツール、在庫管理、データ入力、ファイル変換などの業務アプリ開発に向いています。
ゲーム開発
ゲームエンジンのUnityでは、ゲームの動作を制御するスクリプトにC#が使われます。キャラクターの移動、当たり判定、スコア計算、画面遷移などをC#で実装します。
クラウド・業務システム開発
C#は、クラウドサービスや企業向けシステムでも広く利用されています。認証、データ処理、API連携、バッチ処理など、信頼性が求められる処理にも対応できます。
コンソールアプリ開発
文字だけで操作するコンソールアプリは、C#基礎を学ぶ題材として適しています。画面設計を気にせず、変数、条件分岐、繰り返し、クラスなどの学習に集中できるためです。
1-3. C#と.NETの違いを初心者向けに解説
C#と.NETは一緒に登場することが多いため、同じものだと考えてしまう人もいます。しかし、両者の役割は異なります。
C#は、プログラムを書くための「言語」です。一方、.NETは、C#で作成したプログラムを動かしたり、便利な機能を提供したりするための開発プラットフォームです。
料理にたとえると、C#はレシピを書くための言葉、.NETは調理器具やキッチンに相当します。
.NETには、主に次の要素が含まれます。
C#コードを処理するコンパイラー
プログラムを実行するランタイム
文字列やファイルなどを扱う標準ライブラリ
アプリのひな形を作るコマンド
ビルドやテストを行う開発ツール
初心者の段階では、「C#でコードを書き、.NETの仕組みを使って実行する」と理解しておけば十分です。
1-4. C#基礎を学ぶメリットと将来性
C#基礎を学ぶメリットは、特定のアプリを作れるようになることだけではありません。変数、条件分岐、繰り返し、メソッド、クラスといった考え方は、ほかのプログラミング言語にも応用できます。
また、C#は小規模な学習用プログラムから、企業の大規模なシステムまで対応できる言語です。基礎を身につけた後も、Web、ゲーム、デスクトップ、クラウドなど、目的に応じて学習を発展させられます。
C#基礎を学ぶことで、次のような力が身につきます。
処理を順序立てて考える力
条件によって動作を変える考え方
重複した処理をまとめる設計力
データと処理をクラスとして整理する力
エラーの原因を調べて修正する力
将来どの分野へ進む場合でも、基礎文法を正確に理解し、自分で小さなプログラムを完成させる経験が重要です。
2. C#基礎学習に必要な環境構築
2-1. C#を始めるために必要なもの
C#の学習には、主に次のものが必要です。
Windows、macOS、Linuxのいずれかを搭載したパソコン
.NET SDK
コードを書くためのエディターまたは統合開発環境
基本的なコマンド操作の知識
.NET SDKは、C#プログラムの作成、ビルド、実行に必要な開発ツール一式です。コードを書くソフトとしては、Visual StudioまたはVisual Studio Codeがよく利用されます。
最初は高性能なパソコンでなくても、コンソールアプリを使ったC#基礎学習は可能です。大規模なゲームや複雑な開発環境を扱わない限り、一般的なパソコンで十分に始められます。
2-2. Visual StudioとVisual Studio Codeの違い
Visual Studioは、コード編集、実行、デバッグ、テスト、画面設計などの機能がまとまった統合開発環境です。主にWindowsでC#開発を行う場合に適しています。
Visual Studioのメリットは、C#プロジェクトを作成するための機能が最初から充実していることです。ボタン操作でプロジェクトを作成でき、エラー表示や入力補完も強力です。
一方、Visual Studio Codeは、軽量で拡張性の高いコードエディターです。Windows、macOS、Linuxで利用でき、必要な拡張機能を追加してC#の開発環境を整えます。
選び方の目安は次のとおりです。
Windowsで本格的なC#開発を行うならVisual Studio
軽量な環境で学びたいならVisual Studio Code
macOSやLinuxで学ぶならVisual Studio Code
WPFやWinFormsの画面設計を行うならVisual Studio
どちらを選んでもC#基礎は学べます。初心者がWindowsを使用している場合は、設定がまとまっているVisual Studioから始めると取り組みやすいでしょう。
2-3. .NET SDKのインストール方法
.NET SDKは、Microsoftの.NET公式サイトからダウンロードできます。基本的な手順は次のとおりです。
.NETの公式ダウンロードページを開く
使用しているOSに対応したSDKを選ぶ
インストーラーをダウンロードする
インストーラーを実行する
画面の案内に従ってインストールする
インストール後、ターミナルまたはコマンドプロンプトを開き、次のコマンドを実行します。
dotnet --versionバージョン番号が表示されれば、.NET SDKは正しく認識されています。
10.0.xxx実際に表示される番号は、インストールしたSDKによって異なります。エラーが表示された場合は、一度ターミナルを閉じて開き直してから再度確認してください。
2-4. Hello Worldで動作確認する手順
環境構築が完了したら、最初のC#プログラムを作成します。ターミナルで作業用フォルダーへ移動し、次のコマンドを実行してください。
dotnet new console -n CSharpBasicこのコマンドでは、「CSharpBasic」という名前のコンソールアプリを作成しています。続いて、作成されたフォルダーへ移動します。
cd CSharpBasicプログラムを実行します。
dotnet run画面に次のような文字が表示されれば成功です。
Hello, World!プロジェクト内のProgram.csを開くと、次のコードが記述されています。
Console.WriteLine("Hello, World!");Console.WriteLineは、文字列や数値をコンソールへ出力する命令です。文字列を書き換えて再実行してみましょう。
Console.WriteLine("C#基礎の学習を始めます");コードを保存してからdotnet runを実行すると、変更した内容が表示されます。
2-5. 環境構築でよくあるエラーと対処法
環境構築では、コードを書く前にエラーが発生することがあります。
「dotnetが見つからない」と表示される
.NET SDKがインストールされていないか、実行ファイルへのパスが認識されていない可能性があります。SDKをインストールした後、ターミナルやパソコンを再起動してください。
SDKではなくランタイムだけをインストールしている
ランタイムはプログラムを実行するためのもので、新しいプログラムを作成するにはSDKが必要です。ダウンロード時に「SDK」と書かれているものを選びます。
保存前のコードを実行している
エディターでコードを変更しても、保存しなければ実行結果へ反映されません。実行前にファイルを保存しましょう。
プロジェクト外でdotnet runを実行している
dotnet runは、通常、プロジェクトファイルがあるフォルダーで実行します。cdコマンドを使い、正しいフォルダーへ移動してください。
複数のSDKが入っていて動作が合わない
次のコマンドで、インストール済みのSDKを確認できます。
dotnet --list-sdksエラーメッセージは、原因を示す重要な手がかりです。すぐに閉じず、最初に表示されたエラーから確認する習慣をつけましょう。
3. C#の基本文法を初心者向けに解説
3-1. C#プログラムの基本構造
現在のコンソールアプリでは、次のような短いコードだけでもプログラムを実行できます。
Console.WriteLine("Hello, C#!");これはトップレベルステートメントと呼ばれる書き方です。クラスやMainメソッドの記述を省略できるため、初心者でもすぐにコードを実行できます。
従来の基本構造で書くと、次のようになります。
using System;namespace CSharpBasic{class Program{static void Main(string[] args){Console.WriteLine("Hello, C#!");}}}
主な要素の役割は次のとおりです。
using System;:System名前空間の機能を利用するnamespace:クラスを分類するclass Program:Programというクラスを定義するMain:プログラムの開始地点を定義するConsole.WriteLine:文字を出力する
最初はトップレベルステートメントで練習し、クラスを学ぶ段階で従来の構造も理解するとスムーズです。
3-2. 変数とデータ型
変数は、数値や文字列などのデータを一時的に保存するための入れ物です。
string name = "田中";int age = 25;Console.WriteLine(name);Console.WriteLine(age);
変数を宣言する基本形は次のとおりです。
データ型 変数名 = 値;よく使うデータ型には、次のようなものがあります。
| データ型 | 保存する値 | 例 |
|---|---|---|
int | 整数 | 100 |
long | 大きな整数 | 10000000000L |
double | 小数 | 3.14 |
decimal | 高精度な小数 | 1000.50m |
char | 1文字 | 'A' |
string | 文字列 | "C#" |
bool | 真偽値 | true、false |
C#では、変数へ代入できる値がデータ型によって決まります。
int score = 80;// score = "八十"; // int型へ文字列は代入できない型を明示せず、varを使うこともできます。
var language = "C#";var level = 1;この場合も型がなくなるわけではありません。右側の値から、languageはstring、levelはintと判断されます。
3-3. 文字列・数値・真偽値の扱い方
文字列は、ダブルクォーテーションで囲みます。
string message = "C#を学習しています";文字列同士は+で連結できます。
string firstName = "太郎";string lastName = "山田";Console.WriteLine(lastName + firstName);
変数を文字列の中へ埋め込む場合は、文字列補間が便利です。
string name = "山田";int age = 25;Console.WriteLine($"{name}さんは{age}歳です");
数値は計算に利用できます。
int price = 1200;int quantity = 3;int total = price * quantity;Console.WriteLine(total);
bool型には、trueまたはfalseを保存します。
bool isLoggedIn = true;bool hasPermission = false;真偽値は、条件分岐でよく使われます。
if (isLoggedIn){Console.WriteLine("ログイン済みです");}文字列を数値へ変換する場合は、int.Parseやint.TryParseを利用します。
string input = "100";int number = int.Parse(input);Console.WriteLine(number + 50);
入力内容が数値とは限らない場合は、安全に変換できるTryParseが適しています。
string input = "100";if (int.TryParse(input, out int number)){Console.WriteLine(number + 50);}else{Console.WriteLine("数値へ変換できません");}
3-4. 演算子の基本
演算子は、計算、比較、条件判定などを行うための記号です。
算術演算子の例を確認しましょう。
int a = 10;int b = 3;Console.WriteLine(a + b); // 加算:13Console.WriteLine(a - b); // 減算:7Console.WriteLine(a * b); // 乗算:30Console.WriteLine(a / b); // 除算:3Console.WriteLine(a % b); // 余り:1
int同士を割り算すると、小数部分は切り捨てられます。
Console.WriteLine(10 / 3); // 3Console.WriteLine(10.0 / 3.0); // 3.333...比較演算子は、2つの値を比較してtrueまたはfalseを返します。
int score = 80;Console.WriteLine(score == 80); // 等しいConsole.WriteLine(score != 80); // 等しくないConsole.WriteLine(score > 70); // より大きいConsole.WriteLine(score >= 80); // 以上Console.WriteLine(score < 90); // より小さいConsole.WriteLine(score <= 80); // 以下
論理演算子は、複数の条件を組み合わせます。
int age = 20;bool hasTicket = true;Console.WriteLine(age >= 18 && hasTicket); // 両方がtrueConsole.WriteLine(age >= 18 || hasTicket); // どちらかがtrueConsole.WriteLine(!hasTicket); // trueとfalseを反転
3-5. コメントの書き方
コメントは、コードへ説明を残すための記述です。プログラムの実行結果には影響しません。
1行だけコメントにする場合は、//を使います。
// 合計金額を計算するint total = 1000 * 3;複数行をコメントにする場合は、/と/で囲みます。
/*ここは複数行のコメントです。処理の目的や注意点を記述できます。*/コメントは、コードを読めば分かる内容を繰り返すのではなく、「なぜその処理が必要なのか」を説明すると役立ちます。
// 送料計算では1円未満を切り捨てるという業務ルールint shippingFee = (int)calculatedFee;コメントを書きすぎると、コードがかえって読みにくくなります。まずは、変数名やメソッド名を分かりやすくすることが大切です。
3-6. 入力と出力の基本
コンソールへ文字を出力するには、Console.WriteLineを使います。
Console.WriteLine("名前を入力してください");改行せずに出力する場合は、Console.Writeを使います。
Console.Write("名前:");ユーザーから文字列を受け取るには、Console.ReadLineを使います。
Console.Write("名前を入力してください:");string? name = Console.ReadLine();Console.WriteLine($"こんにちは、{name}さん");
Console.ReadLineの戻り値には、入力が取得できなかった場合を表すnullが含まれる可能性があります。そのため、string?と記述しています。
数値を入力させる場合は、TryParseと組み合わせると安全です。
Console.Write("年齢を入力してください:");string? input = Console.ReadLine();if (int.TryParse(input, out int age)){Console.WriteLine($"来年は{age + 1}歳です");}else{Console.WriteLine("整数を入力してください");}
4. C#の制御構文を理解しよう
4-1. if文による条件分岐
if文は、条件によって処理を切り替える構文です。
int score = 80;if (score >= 70){Console.WriteLine("合格です");}
条件が成り立たなかった場合の処理は、elseで記述します。
int score = 60;if (score >= 70){Console.WriteLine("合格です");}else{Console.WriteLine("不合格です");}
条件を複数に分ける場合は、else ifを使います。
int score = 85;if (score >= 90){Console.WriteLine("評価はAです");}else if (score >= 70){Console.WriteLine("評価はBです");}else if (score >= 50){Console.WriteLine("評価はCです");}else{Console.WriteLine("評価はDです");}
条件は上から順番に判定されます。そのため、範囲が重なる場合は、厳しい条件から先に書くのが基本です。
4-2. switch文の使い方
switch文は、1つの値に対して複数の分岐を作る場合に便利です。
int menuNumber = 2;switch (menuNumber){case 1:Console.WriteLine("新規登録を選択しました");break;
case 2:Console.WriteLine("一覧表示を選択しました");break;case 3:Console.WriteLine("終了します");break;default:Console.WriteLine("正しい番号を入力してください");break;
}
caseには、比較する値を書きます。どの値にも一致しなかった場合は、defaultが実行されます。
値を直接返したい場合は、switch式も利用できます。
int score = 85;string grade = score switch{>= 90 => "A",>= 70 => "B",>= 50 => "C",_ => "D"};
Console.WriteLine(grade);
単純な値の変換では、switch式を使うとコードを短く整理できます。
4-3. for文による繰り返し処理
for文は、回数が決まっている繰り返し処理に適しています。
for (int i = 0; i < 5; i++){Console.WriteLine(i);}for文の丸括弧内は、次の3つに分かれます。
for (初期化; 継続条件; 更新処理)先ほどの例では、iを0から始め、5未満の間だけ処理を続け、1回ごとにiを1増やしています。
1から5まで表示する場合は、次のように書きます。
for (int i = 1; i <= 5; i++){Console.WriteLine(i);}合計を求める処理にも利用できます。
int total = 0;for (int i = 1; i <= 10; i++){total += i;}
Console.WriteLine(total);
4-4. while文とdo-while文の違い
while文は、条件が成り立っている間、処理を繰り返します。
int count = 1;while (count <= 3){Console.WriteLine(count);count++;}
最初の時点で条件がfalseの場合、処理は一度も実行されません。
int count = 10;while (count <= 3){Console.WriteLine(count);}
一方、do-while文は、処理を実行した後に条件を判定します。そのため、条件が最初からfalseでも、処理が最低1回は実行されます。
int count = 10;do{Console.WriteLine(count);count++;}while (count <= 3);
メニューを一度表示してから継続するか判断する処理などでは、do-while文が適しています。
4-5. breakとcontinueの使い方
breakは、繰り返し処理を途中で終了します。
for (int i = 1; i <= 10; i++){if (i == 5){break;}Console.WriteLine(i);
}
このコードでは、iが5になった時点でループが終了するため、1から4までが表示されます。
continueは、現在の回だけ残りの処理を飛ばし、次の繰り返しへ進みます。
for (int i = 1; i <= 5; i++){if (i == 3){continue;}Console.WriteLine(i);
}
この場合、3だけが表示されません。
breakとcontinueは便利ですが、多用すると処理の流れが追いにくくなります。条件式を整理できないか検討したうえで使用しましょう。
5. C#基礎で必ず押さえる配列・リスト・メソッド
5-1. 配列の基本と使い方
配列は、同じデータ型の値を複数まとめて管理する仕組みです。
string[] fruits = { "りんご", "みかん", "バナナ" };各要素には、0から始まる番号でアクセスします。この番号をインデックスと呼びます。
Console.WriteLine(fruits[0]); // りんごConsole.WriteLine(fruits[1]); // みかん要素を書き換えることもできます。
fruits[1] = "ぶどう";配列の要素数は、Lengthで取得します。
Console.WriteLine(fruits.Length);配列の全要素を処理する場合は、foreach文が便利です。
foreach (string fruit in fruits){Console.WriteLine(fruit);}配列は、作成時に要素数が決まります。
int[] scores = new int[3];scores[0] = 80;scores[1] = 90;scores[2] = 70;
決まった数のデータを扱う場合には配列が適しています。
5-2. Listの基本と配列との違い
List<T>は、要素を後から追加したり削除したりできるコレクションです。Tの部分には、保存するデータ型を指定します。
List<string> names = new List<string>();names.Add("佐藤");names.Add("鈴木");names.Add("高橋");
新しい書き方では、次のように簡潔に記述できます。
List<string> names = new(){"佐藤","鈴木","高橋"};要素の削除にはRemoveを使います。
names.Remove("鈴木");要素数はCountで取得します。
Console.WriteLine(names.Count);全要素を表示する例は次のとおりです。
foreach (string name in names){Console.WriteLine(name);}配列とListの主な違いは、要素数を変更できるかどうかです。
配列:作成後に要素数を変更しにくい
List:要素を自由に追加・削除できる
データ数が固定されているなら配列、増減する可能性があるならListを選ぶとよいでしょう。
5-3. メソッドとは?処理を分けて書く考え方
メソッドは、複数の処理をひとまとまりにしたものです。
static void ShowMessage(){Console.WriteLine("C#基礎を学習中です");}定義したメソッドは、名前を指定して呼び出します。
ShowMessage();ShowMessage();メソッドを使う主なメリットは次のとおりです。
同じ処理を何度も書かずに済む
プログラムの流れを整理できる
修正箇所をまとめられる
処理単位でテストしやすくなる
たとえば、税込価格の計算が複数の場所で必要な場合、メソッドへまとめることで計算方法を一元管理できます。
5-4. 引数と戻り値の基本
引数は、メソッドへ渡す値です。
static void Greet(string name){Console.WriteLine($"こんにちは、{name}さん");}Greet("山田");Greet("佐藤");
複数の引数を指定することもできます。
static void ShowProfile(string name, int age){Console.WriteLine($"{name}さんは{age}歳です");}ShowProfile("山田", 25);
戻り値は、メソッドから呼び出し元へ返す値です。
static int Add(int a, int b){return a + b;}int result = Add(10, 20);Console.WriteLine(result);
戻り値がないメソッドではvoidを指定します。戻り値がある場合は、intやstringなど、返す値の型を指定します。
static string CreateGreeting(string name){return $"こんにちは、{name}さん";}string message = CreateGreeting("鈴木");Console.WriteLine(message);
「入力を引数として受け取り、処理結果を戻り値として返す」という形にすると、再利用しやすいメソッドになります。
5-5. スコープと変数の有効範囲
スコープとは、変数を利用できる範囲のことです。
if (true){string message = "ブロック内の変数";Console.WriteLine(message);}// Console.WriteLine(message); // スコープ外なのでエラー
messageはif文の波括弧内で宣言されているため、その外側では利用できません。
メソッドの引数やメソッド内の変数も、基本的にはそのメソッド内だけで有効です。
static void ShowTotal(int price, int quantity){int total = price * quantity;Console.WriteLine(total);}ここで使われているprice、quantity、totalは、ShowTotalメソッドの外側から直接参照できません。
変数のスコープは、必要な範囲に限定することが重要です。どこからでも変更できる変数が増えると、予期しない動作の原因になります。
6. C#のオブジェクト指向の基礎
6-1. クラスとインスタンスとは
クラスは、データと処理をまとめるための設計図です。インスタンスは、その設計図をもとに作られた実体です。
たとえば、人物を表すPersonクラスを定義します。
class Person{public string Name { get; set; } = "";public int Age { get; set; }public void Introduce(){Console.WriteLine($"私は{Name}です。{Age}歳です");}
}
このクラスからインスタンスを作成します。
Person person = new Person();person.Name = "山田";person.Age = 25;person.Introduce();
同じクラスから複数のインスタンスを作れます。
Person person1 = new Person();person1.Name = "山田";person1.Age = 25;Person person2 = new Person();person2.Name = "佐藤";person2.Age = 30;
person1とperson2は同じ設計図から作られていますが、それぞれ異なるデータを持っています。
6-2. フィールド・プロパティ・メソッドの違い
クラスの中には、主にフィールド、プロパティ、メソッドを定義します。
フィールド
クラス内部でデータを保持する変数です。
class Counter{private int count;}プロパティ
外部から値を取得・設定するための窓口です。
class Person{public string Name { get; set; } = "";}getは値の取得、setは値の設定を表します。
メソッド
クラスが行う処理を表します。
class Person{public string Name { get; set; } = "";public void Greet(){Console.WriteLine($"{Name}です");}
}
初心者の段階では、次のように整理すると理解しやすくなります。
フィールド:内部で保持するデータ
プロパティ:データを安全に読み書きする仕組み
メソッド:クラスが実行する処理
6-3. コンストラクターの基本
コンストラクターは、インスタンスを作成するときに呼び出される特別な処理です。主に、初期値の設定に使います。
class Person{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}public void Introduce(){Console.WriteLine($"私は{Name}です。{Age}歳です");}
}
インスタンスを作成するときに、必要な値を渡します。
Person person = new Person("山田", 25);person.Introduce();コンストラクターを使うと、名前や年齢が設定されていない不完全なインスタンスが作られるのを防ぎやすくなります。
コンストラクター名はクラス名と同じで、戻り値の型は書きません。
6-4. カプセル化の考え方
カプセル化とは、クラス内部のデータや処理を必要以上に外部へ公開せず、安全な操作方法だけを提供する考え方です。
たとえば、銀行口座の残高を外部から自由に変更できると、負の金額を設定される可能性があります。
class BankAccount{public decimal Balance { get; private set; }public void Deposit(decimal amount){if (amount <= 0){Console.WriteLine("入金額は0より大きくしてください");return;}Balance += amount;}
}
Balanceのsetをprivateにすることで、クラス外から残高を直接変更できなくしています。
BankAccount account = new BankAccount();account.Deposit(1000);Console.WriteLine(account.Balance);
// account.Balance = -5000; // 外部からは設定できない
データを直接変更させず、メソッドを通じてルールを適用することが、カプセル化の基本です。
6-5. 継承とポリモーフィズムの入門
継承は、既存のクラスの機能を引き継いで、新しいクラスを作る仕組みです。
class Animal{public string Name { get; set; } = "";public virtual void Speak(){Console.WriteLine("動物が鳴きます");}
}
Animalを継承してDogクラスを作成します。
class Dog : Animal{public override void Speak(){Console.WriteLine($"{Name}がワンと鳴きます");}}利用例は次のとおりです。
Dog dog = new Dog();dog.Name = "ポチ";dog.Speak();ポリモーフィズムは、共通の型として扱いながら、実際のインスタンスに応じて異なる処理を実行できる仕組みです。
class Cat : Animal{public override void Speak(){Console.WriteLine($"{Name}がニャーと鳴きます");}}List<Animal> animals = new(){new Dog { Name = "ポチ" },new Cat { Name = "タマ" }};foreach (Animal animal in animals){animal.Speak();}
変数の型はどちらもAnimalですが、実際にはDogとCatのSpeakがそれぞれ実行されます。
6-6. 初心者がオブジェクト指向でつまずきやすいポイント
オブジェクト指向は、文法だけを読んでも目的が分かりにくいことがあります。初心者がつまずきやすいのは、クラスを作ること自体が目的になってしまうためです。
クラスは、関連するデータと処理をひとまとまりにするために使います。たとえば、ToDo項目であれば、次の情報と処理をまとめられます。
タイトル
完了状態
期限
完了にする処理
すべての処理を無理にクラスへ分ける必要はありません。最初は、現実の対象やアプリ内の役割を1つ選び、そのデータと処理をクラスへまとめる練習から始めましょう。
また、継承を使えば必ず良い設計になるわけではありません。初心者のうちは、まずクラス、インスタンス、プロパティ、メソッド、コンストラクターを正しく使えることを優先してください。
7. C#基礎で覚えておきたい実践的な書き方
7-1. 例外処理の基本
例外とは、プログラムの実行中に発生する予期しない問題です。たとえば、存在しないファイルを開いたり、文字列を数値へ変換できなかったりすると例外が発生することがあります。
例外処理には、try、catch、finallyを使います。
try{Console.Write("数値を入力してください:");int number = int.Parse(Console.ReadLine()!);Console.WriteLine($"入力値は{number}です");
}catch (FormatException){Console.WriteLine("正しい整数を入力してください");}finally{Console.WriteLine("処理を終了します");}
try:例外が発生する可能性のある処理catch:例外が発生した場合の処理finally:例外の有無にかかわらず実行する処理
例外をすべて握りつぶすような書き方は避けましょう。
try{// 処理}catch{// 何もしない}何も記録せずに例外を無視すると、不具合の原因を追跡できなくなります。想定できる例外を具体的に処理することが大切です。
7-2. nullの扱い方と注意点
nullは、値が存在しない状態を表します。
string? name = null;通常のstringではなくstring?と書くことで、nullが入る可能性を明示しています。
nullの可能性がある値をそのまま使うと、実行時エラーにつながる場合があります。
string? name = Console.ReadLine();if (name != null){Console.WriteLine(name.Length);}
null条件演算子?.を使うと、値がnullでない場合だけ処理できます。
Console.WriteLine(name?.Length);null合体演算子??を使うと、値がnullだった場合の代替値を指定できます。
string displayName = name ?? "ゲスト";Console.WriteLine(displayName);!を付けると、コンパイラーへ「この値はnullではない」と伝えられます。
Console.WriteLine(name!.Length);ただし、実際にnullだった場合の危険はなくなりません。!を安易に使わず、条件分岐や??で安全に処理することを優先しましょう。
7-3. 名前空間とusingの役割
名前空間は、クラスを分類し、同じ名前のクラスが衝突するのを防ぐ仕組みです。
namespace MyApp.Models{class User{public string Name { get; set; } = "";}}別のファイルから利用する場合は、完全な名前を指定できます。
MyApp.Models.User user = new MyApp.Models.User();毎回長い名前を書く代わりに、usingを使います。
using MyApp.Models;User user = new User();
ConsoleやDateTimeなどは、System名前空間に含まれています。
using System;現在のプロジェクトでは、よく使う名前空間が暗黙的に読み込まれる設定になっていることもあります。その場合、using System;を書かなくてもConsoleを利用できます。
7-4. コーディング規約と読みやすいコードの書き方
動くだけのコードではなく、後から読み返しやすいコードを書くことが重要です。
C#では、一般的にクラス名、メソッド名、プロパティ名にPascalCaseを使います。
class UserService{public string UserName { get; set; } = "";public void SaveUser(){}
}
ローカル変数や引数にはcamelCaseを使います。
static int CalculateTotal(int unitPrice, int quantity){int totalPrice = unitPrice * quantity;return totalPrice;}変数名は、役割が分かる名前にします。
// 分かりにくいint x = 1200;int y = 3;// 分かりやすいint unitPrice = 1200;int quantity = 3;
1つのメソッドへ多くの役割を詰め込まず、処理を分けることも大切です。
static bool IsAdult(int age){return age >= 18;}static void ShowResult(bool isAdult){Console.WriteLine(isAdult ? "成人です" : "未成年です");}
インデントや空行も、コードの構造を伝えるために役立ちます。エディターの自動整形機能を利用し、書式を統一しましょう。
7-5. デバッグの基本操作
デバッグは、不具合の原因を調べる作業です。Visual StudioやVisual Studio Codeでは、コードを一時停止して変数の内容を確認できます。
基本的な操作は次のとおりです。
調べたい行へブレークポイントを設定する
デバッグ実行を開始する
ブレークポイントで処理を停止する
変数の値を確認する
1行ずつ処理を進める
想定と異なる値になった場所を特定する
たとえば、合計金額が正しくない場合、price、quantity、totalの値を順番に確認します。
int price = 1000;int quantity = 3;int total = price + quantity; // 本来は掛け算Console.WriteLine(total);
目でコードを眺めるだけでなく、実行中の値を確認すると、間違いを見つけやすくなります。
8. 初心者向けC#練習方法
8-1. 文法を覚えるだけでは上達しない理由
C#の解説を読むだけでは、自分でコードを書く力は身につきにくいものです。プログラミングでは、「分かった」と「自分で書ける」の間に大きな差があります。
たとえば、if文の書き方を理解していても、次の条件をコードへ変換するには練習が必要です。
80点以上なら「合格」と表示する
80点未満でも、出席率が90%以上なら「再試験」と表示する
それ以外は「不合格」と表示する
学んだ文法は、その日のうちに小さな問題で使ってみましょう。サンプルコードをコピーするだけでなく、数値、条件、変数名、出力内容を変更することが重要です。
8-2. C#基礎を定着させる練習問題
初心者向けの練習問題として、次の課題に取り組んでみましょう。
問題1:偶数・奇数の判定
整数を入力し、偶数なら「偶数」、奇数なら「奇数」と表示します。
Console.Write("整数を入力してください:");string? input = Console.ReadLine();if (int.TryParse(input, out int number)){if (number % 2 == 0){Console.WriteLine("偶数です");}else{Console.WriteLine("奇数です");}}else{Console.WriteLine("正しい整数を入力してください");}
問題2:1から100までの合計
int total = 0;for (int i = 1; i <= 100; i++){total += i;}
Console.WriteLine(total);
問題3:配列の最大値を求める
int[] numbers = { 12, 45, 8, 90, 33 };int max = numbers[0];foreach (int number in numbers){if (number > max){max = number;}}
Console.WriteLine($"最大値は{max}です");
問題4:名前の検索
List<string> names = new(){"山田","佐藤","鈴木"};Console.Write("検索する名前:");string? target = Console.ReadLine();
if (target != null && names.Contains(target)){Console.WriteLine("登録されています");}else{Console.WriteLine("登録されていません");}
最初は答えを見ながら書いても構いません。その後、コードを閉じて最初から書き直すと定着しやすくなります。
8-3. 電卓アプリで学ぶ基本処理
電卓アプリでは、入力、型変換、条件分岐、演算子、メソッドをまとめて練習できます。
Console.Write("1つ目の数値:");string? firstInput = Console.ReadLine();Console.Write("演算子(+、-、*、/):");string? operation = Console.ReadLine();
Console.Write("2つ目の数値:");string? secondInput = Console.ReadLine();
if (!double.TryParse(firstInput, out double firstNumber) ||!double.TryParse(secondInput, out double secondNumber)){Console.WriteLine("数値を正しく入力してください");return;}
double result;
switch (operation){case "+":result = firstNumber + secondNumber;break;
case "-":result = firstNumber - secondNumber;break;case "*":result = firstNumber * secondNumber;break;case "/":if (secondNumber == 0){Console.WriteLine("0では割れません");return;}result = firstNumber / secondNumber;break;default:Console.WriteLine("対応していない演算子です");return;
}
Console.WriteLine($"計算結果:{result}");
完成後は、次の機能を追加すると学習が深まります。
計算を繰り返せるようにする
入力履歴をListへ保存する
計算部分をメソッドへ分ける
余りを求める演算へ対応する
不正な入力時に再入力させる
8-4. ToDoリストで学ぶクラス設計
ToDoリストでは、クラス、インスタンス、List、メソッドを実践できます。
まず、ToDo項目を表すクラスを作成します。
class TodoItem{public string Title { get; }public bool IsCompleted { get; private set; }public TodoItem(string title){Title = title;}public void Complete(){IsCompleted = true;}public void Show(){string status = IsCompleted ? "完了" : "未完了";Console.WriteLine($"<span data-placeholder-token="true" class="text-token-text-primary cursor-text rounded-sm" style="background-color: color-mix(in srgb, var(--theme-user-selection-bg, var(--selection)) 30%, transparent); padding-top: 4px; padding-bottom: 4px;">[{status}]</span> {Title}");}
}
複数のToDo項目をListで管理します。
List<TodoItem> todoItems = new(){new TodoItem("C#の変数を復習する"),new TodoItem("if文の問題を解く"),new TodoItem("電卓アプリを作る")};todoItems[0].Complete();
foreach (TodoItem item in todoItems){item.Show();}
発展課題として、追加、削除、完了、一覧表示をメニューから操作できるようにしてみましょう。期限や優先度をプロパティとして追加するのも効果的です。
8-5. コンソールアプリから始める実践学習
C#基礎の学習では、最初から複雑な画面を持つアプリへ進むより、コンソールアプリから始めるのがおすすめです。
画面のボタンやレイアウトを作る作業がないため、次の要素へ集中できます。
入力と出力
変数とデータ型
条件分岐
繰り返し
配列とList
メソッド
クラス
例外処理
練習用の題材としては、次のようなアプリがあります。
数当てゲーム
じゃんけんゲーム
成績判定アプリ
家計簿アプリ
在庫管理アプリ
ToDoリスト
簡単な会員管理アプリ
1つの作品を完成させたら、機能を追加して改善します。ゼロから何本も作るだけでなく、既存のコードを整理する経験も重要です。
8-6. 学習サイト・公式ドキュメントの活用方法
C#を学ぶときは、入門教材と公式ドキュメントを役割に応じて使い分けましょう。
入門教材は、文法を順番に理解するために向いています。一方、公式ドキュメントは、特定のクラスやメソッドの正確な使い方を調べるときに役立ちます。
調べる際は、次の順番を意識してください。
エラーメッセージを読む
問題が起きている行を特定する
メソッド名やエラー文で検索する
公式ドキュメントで引数や戻り値を確認する
小さなコードで動作を試す
自分のプログラムへ反映する
すべてを暗記する必要はありません。必要な情報を調べ、試し、使えるようになる力が実務でも重要です。
9. C#基礎学習でよくある疑問
9-1. C#は初心者に難しい?
C#には、型、クラス、例外処理、オブジェクト指向など、多くの概念があります。そのため、非常に簡単な言語とはいえません。
ただし、文法には一貫性があり、開発環境の入力補完やエラー表示も充実しています。学習する順番を守れば、初心者でも十分に習得できます。
最初から高度な設計を理解しようとせず、次の順番で進めるとよいでしょう。
出力と入力
変数とデータ型
if文
for文とwhile文
配列とList
メソッド
クラスとインスタンス
例外処理
小さなアプリ制作
エラーが出ることは、学習が失敗しているという意味ではありません。エラーの原因を調べて直す作業も、C#基礎学習の一部です。
9-2. C#とJavaはどちらを学ぶべき?
C#とJavaは、どちらも静的型付けのオブジェクト指向言語で、文法にも似ている部分があります。どちらが優れているかではなく、作りたいものや目指す分野で選ぶことが重要です。
C#が向いている主な目的は次のとおりです。
Unityを使ったゲーム開発
ASP.NET Coreを使ったWeb開発
Windows向けデスクトップアプリ
Microsoft製品や.NETを活用する業務システム
Javaが向いているケースには、Javaを採用している企業システムや既存プロジェクトへの参加などがあります。
明確な目的がない場合は、学習教材、求人、身近な経験者の有無なども判断材料になります。どちらか一方の基礎を身につければ、もう一方を学ぶときにも多くの知識を応用できます。
9-3. Unityを使うならC#基礎はどこまで必要?
Unityを使い始めるだけなら、C#のすべてを理解している必要はありません。ただし、次の項目は早い段階で身につけておきましょう。
変数とデータ型
if文
for文とforeach文
メソッド
配列とList
クラスとインスタンス
フィールドとプロパティ
アクセス修飾子
継承の基本
nullの扱い
デバッグ
Unity固有の機能だけをコピーしていると、エラーが発生したときに原因を判断できません。キャラクター移動などのチュートリアルと並行して、コンソールアプリでC#基礎を練習する方法が効果的です。
9-4. C#基礎の習得に必要な学習時間は?
必要な時間は、プログラミング経験、学習頻度、目標によって異なります。
未経験者が変数、条件分岐、繰り返し、メソッド、クラスの基本を一通り学ぶ場合、50〜100時間程度が1つの目安です。ただし、教材を読むだけでなく、小さなプログラムを自力で作れるようになるには、さらに実践が必要です。
毎日1時間学ぶ場合は、次のように進められます。
1〜2週目:環境構築、変数、演算子、入出力
3〜4週目:条件分岐、繰り返し、配列、List
5〜6週目:メソッド、クラス、インスタンス
7〜8週目:例外処理、デバッグ、小さなアプリ制作
学習時間の合計だけでなく、一定の間隔で継続することが重要です。週末にまとめて学ぶより、短時間でも頻繁にコードを書くほうが定着しやすくなります。
9-5. 独学でもC#は習得できる?
C#は、独学でも習得可能です。公式ドキュメント、入門書、動画教材、学習サイトなど、多くの情報が提供されています。
独学を成功させるには、次の点を意識しましょう。
教材を何冊も同時に進めない
サンプルコードを必ず実行する
コードの一部を変更して結果を確認する
エラー文を読んでから検索する
毎週1つは小さな課題を完成させる
分からない内容を放置せず、簡単な例へ戻る
独学で停滞しやすい原因は、理解できないことよりも、何を作ればよいか分からなくなることです。最初に「電卓を作る」「ToDoリストを作る」など、短期間で達成できる目標を決めておきましょう。
10. C#基礎を学んだ後のステップ
10-1. ASP.NET CoreでWebアプリ開発に進む
Webアプリを作りたい場合は、ASP.NET Coreへ進みます。ASP.NET Coreでは、WebサイトやWeb APIをC#で開発できます。
次に学ぶ内容は次のとおりです。
HTTPの基本
HTML、CSS、JavaScriptの基礎
ルーティング
コントローラー
Razor PagesまたはMVC
Web API
依存性注入
認証と認可
データベース連携
最初の題材には、日記アプリ、在庫管理、書籍管理、タスク管理などが適しています。登録、一覧、編集、削除の機能を持つアプリを作ると、Web開発の基本的な流れを学べます。
10-2. Unityでゲーム開発に挑戦する
ゲーム開発に興味がある場合は、Unityを使ってC#を実践します。
最初は、次のような小規模なゲームがおすすめです。
2Dアクションゲーム
ブロック崩し
迷路ゲーム
クリックゲーム
簡単なシューティングゲーム
Unityでは、C#文法に加えて、ゲームオブジェクト、コンポーネント、シーン、物理演算、フレーム更新などの考え方を学びます。
複雑な3Dゲームをいきなり作るのではなく、移動、衝突、スコア、ゲームオーバーといった機能を1つずつ実装しましょう。
10-3. WPF・WinFormsでデスクトップアプリを作る
Windows向けのデスクトップアプリを作る場合は、WPFまたはWindows Formsを学びます。
Windows Formsは、ボタンや入力欄を配置しながら画面を作りやすく、比較的シンプルな業務ツールに向いています。
WPFは、XAMLを使って画面を定義します。データバインディングやMVVMなどを学ぶことで、画面と処理を分離した設計ができます。
最初の題材としては、次のようなアプリがあります。
メモ帳
ファイル検索ツール
CSV閲覧ツール
家計簿
在庫管理
画像整理ツール
画面を作る前に、処理部分をクラスやメソッドへ分けられるようになっておくと、コードを整理しやすくなります。
10-4. データベース連携を学ぶ
実用的なアプリでは、ユーザー情報、商品情報、注文履歴などを保存するためにデータベースを利用します。
C#では、SQLを直接実行する方法に加えて、Entity Framework Coreなどを使ってデータを操作する方法があります。
学習する主な内容は次のとおりです。
テーブル、行、列の考え方
主キー
SQLのSELECT、INSERT、UPDATE、DELETE
テーブル同士の関連
Entity Framework Core
データの検証
トランザクション
最初は、ユーザーや商品を登録し、一覧表示できるアプリを作ってみましょう。その後、検索、編集、削除、並び替えなどの機能を追加します。
10-5. ポートフォリオ作成で実務レベルに近づく
C#基礎を学んだ後は、知識を組み合わせて1つのアプリを完成させましょう。完成したアプリは、自分の技術を示すポートフォリオになります。
ポートフォリオでは、機能の多さだけでなく、次の点も重要です。
どのような問題を解決するアプリか
誰が利用するのか
どの技術を使用したか
コードが役割ごとに整理されているか
入力エラーへ対応しているか
操作方法が説明されているか
ソースコードを再現できるか
作品例として、次のようなアプリが考えられます。
ログイン機能付きToDo管理アプリ
書籍の貸出管理システム
売上データの集計アプリ
学習時間の記録アプリ
在庫管理Webアプリ
Unityを使った2Dゲーム
最初から完璧な作品を目指す必要はありません。小さな機能を完成させ、改善内容を記録しながら段階的に品質を高めていきましょう。
まとめ
C#基礎を身につけるには、環境構築から始め、変数、条件分岐、繰り返し、配列、List、メソッド、クラスの順に学ぶことが重要です。
特に押さえておきたいポイントは次のとおりです。
C#はプログラミング言語で、.NETは開発・実行のためのプラットフォーム
最初はコンソールアプリで基本文法へ集中する
条件分岐と繰り返しを使って処理の流れを作る
配列やListで複数のデータを管理する
メソッドを使って処理を役割ごとに分ける
クラスを使って関連するデータと処理をまとめる
例外、null、デバッグの基本も早い段階で学ぶ
文法を読むだけでなく、小さなアプリを完成させる
C#基礎は、一度読んだだけですべて覚えられるものではありません。コードを書き、エラーを直し、機能を追加する過程で少しずつ定着します。
まずはHello Worldを動かし、数値計算、条件分岐、繰り返しへ進んでください。その後、電卓やToDoリストなどのコンソールアプリを作れば、個別に学んだ文法がどのようにつながるのかを理解できるようになります。

