C#(シーシャープ)は、Microsoftが開発したプログラミング言語であり、現代のソフトウェア開発において欠かせない存在となっています。

デスクトップアプリケーションからWebサービス、モバイルアプリ、さらにはUnityを用いたゲーム開発まで、その活用範囲は非常に多岐にわたります。

C#は強力な型システム、メモリ管理を自動化するガベージコレクション、そして豊富な標準ライブラリを備えており、初心者にとっても学習しやすく、かつプロフェッショナルな現場でも通用する深みを持った言語です。

本記事では、C#の基礎から環境構築、そして実践的な文法までを網羅的に解説し、あなたがC#エンジニアとしての第一歩を踏み出すためのガイドを提供します。

C#とは何か?その特徴と魅力を知る

C#は、2000年にMicrosoftによって発表されたオブジェクト指向プログラミング言語です。

当初はWindows向けのアプリケーション開発が中心でしたが、現在では 「.NET」というクロスプラットフォームな実行基盤 の進化により、macOSやLinux上でも動作するアプリケーションを開発できるようになりました。

C#の主な特徴

C#がこれほどまでに普及した理由は、その設計の秀逸さにあります。

主な特徴として、以下の3点が挙げられます。

  1. オブジェクト指向であること:プログラムを「モノ(オブジェクト)」の集まりとして捉え、再利用性や保守性の高いコードを書くことができます。
  2. 型安全性が高いこと:コンパイル時にデータの種類(型)を厳密にチェックするため、実行時のエラーを未然に防ぎやすい設計になっています。
  3. 強力なライブラリとフレームワーク:.NETという巨大なエコシステムを利用することで、複雑な処理も短いコードで実装可能です。

なぜ今、C#を学ぶべきなのか

現代の開発シーンにおいて、C#を学ぶメリットは計り知れません。

特に、世界で最も利用されているゲームエンジンの一つである Unityのメイン言語 であることは大きな魅力です。

ゲーム業界を目指す方にとって、C#の習得は必須と言えるでしょう。

また、エンタープライズ向けのWebシステム(ASP.NET Core)や、スマートフォンアプリ(.NET MAUI)など、一つの言語を覚えるだけで多様なプラットフォームに対応できる点も、学習コストに対するリターンが非常に高い理由です。

C#の開発環境を構築する

プログラミングを始めるための第一歩は、コードを書き、実行するための環境を整えることです。

C#の開発には、Microsoftが提供する強力な統合開発環境 (IDE) である Visual Studio を使用するのが一般的です。

Visual Studioのインストール

Windowsユーザーであれば、Visual Studio 2022 の導入が最もスムーズです。

個人開発者であれば無料で利用できる「Communityエディション」が用意されています。

  1. 公式サイトからインストーラーをダウンロードします。
  2. インストーラーを起動し、ワークロードの選択画面で 「.NET デスクトップ開発」 にチェックを入れます。
  3. Unityでの開発も視野に入れている場合は「Unity によるゲーム開発」も選択しておくと良いでしょう。
  4. インストールボタンを押し、完了を待ちます。

Visual Studio Codeという選択肢

より軽量な動作を好む場合や、macOS/Linuxユーザーの場合は、Visual Studio Code (VS Code) も有力な選択肢です。

この場合、以下の手順が必要です。

  1. .NET SDK を公式サイトからインストールする。
  2. VS Codeに 「C# Dev Kit」 拡張機能を導入する。

VS Codeはシンプルですが、現在のC#開発においても非常に強力なツールとなっており、多くのプロフェッショナルに愛用されています。

C#の基本構造と「Hello World」

環境が整ったら、まずは画面に文字を表示させる簡単なプログラムを作成してみましょう。

C#の最新バージョンでは、トップレベルステートメント という簡略化された記述法が推奨されていますが、ここでは言語の構造を理解するために、伝統的な構造も交えて解説します。

最初のプログラムを記述する

Visual Studioで「コンソールアプリ」プロジェクトを新規作成し、以下のコードを入力してください。

C#
using System;

// 名前空間の定義
namespace HelloWorldApp
{
    // クラスの定義
    class Program
    {
        // プログラムの開始地点(メインメソッド)
        static void Main(string[] args)
        {
            // 標準出力にメッセージを表示
            Console.WriteLine("Hello, C# World!");
            
            // ユーザーの入力を待機(コンソールがすぐに閉じないようにするため)
            Console.ReadLine();
        }
    }
}
実行結果
Hello, C# World!

コードの解説

  • using System;:これは「System」という名前空間(ライブラリのまとまり)を使用することを宣言しています。これにより、Console クラスなどを短い名前で呼び出せます。
  • namespace:コードを整理するためのフォルダのような役割を果たします。
  • class Program:C#のプログラムはすべて クラス という単位で構成されます。
  • static void Main:プログラムが実行されたときに最初に呼ばれる特別なメソッド(関数)です。

変数とデータ型

プログラム内で数値を計算したり、名前を保存したりするためには「変数」を使用します。

C#は 静的型付け言語 であるため、変数にどのような種類のデータを入れるかをあらかじめ決める必要があります。

代表的なデータ型

よく使われるデータ型を以下の表にまとめました。

型名用途
int整数10, -500
long大きな整数10000000000L
double浮動小数点数(小数)3.14, -0.01
decimal高精度な小数(金融計算用)100.50m
string文字列“Hello”, “C#”
bool真偽値true, false

変数の宣言と代入

変数を使う際は、型を指定して宣言を行います。

また、型推論キーワードである var を使うことで、コンパイラに型を自動判別させることも可能です。

C#
// 明示的な型指定
int age = 25;
string name = "Alice";
double height = 165.5;

// 型推論(初期値から自動的に型が決まる)
var country = "Japan"; // string型として扱われる
var score = 95.5f;     // float型として扱われる

Console.WriteLine($"{name}さんは{country}在住の{age}歳です。");
実行結果
AliceさんはJapan在住の25歳です。

定数 を定義したい場合は、型の前に const を付けます。

一度代入すると値を変更できなくなるため、消費税率などの固定値に利用します。

演算子の使い方

計算を行ったり、値を比較したりするために「演算子」を使用します。

算術演算子

数値の計算に使用します。

  • +(加算)
  • -(減算)
  • *(乗算)
  • /(除算)
  • %(剰余:あまり)

比較演算子と論理演算子

条件分岐でよく使用されます。

  • ==(等しい)
  • !=(等しくない)
  • >(より大きい)
  • &&(かつ:AND)
  • ||(または:OR)

制御構文:条件分岐と繰り返し

プログラムの流れを制御するために、条件によって処理を分ける「条件分岐」と、同じ処理を繰り返す「ループ」を学びましょう。

条件分岐(if文 / switch文)

特定の条件が成り立つときだけ処理を実行します。

C#
int score = 85;

if (score >= 90)
{
    Console.WriteLine("優秀です!");
}
else if (score >= 70)
{
    Console.WriteLine("合格です。");
}
else
{
    Console.WriteLine("不合格です。");
}

また、多くの選択肢がある場合は switch 文が便利です。

最新のC#では、より簡潔な switch式 も利用できます。

C#
string rank = score switch
{
    >= 90 => "A",
    >= 70 => "B",
    _ => "C" // デフォルト値
};
Console.WriteLine($"ランク:{rank}");

繰り返し処理(for文 / foreach文)

指定した回数や、データの集まりに対して処理を繰り返します。

特に foreach文 はC#で非常によく使われます。

C#
// for文:回数を指定して繰り返す
for (int i = 0; i < 3; i++)
{
    Console.WriteLine($"{i + 1}回目のループです。");
}

// foreach文:配列やリストの要素を順番に取り出す
string[] fruits = { "Apple", "Banana", "Cherry" };
foreach (var fruit in fruits)
{
    Console.WriteLine($"果物:{fruit}");
}
実行結果
1回目のループです。
2回目のループです。
3回目のループです。
果物:Apple
果物:Banana
果物:Cherry

オブジェクト指向の基礎

C#の本質はオブジェクト指向にあります。

これまでの手続き的な記述から一歩進み、「クラス」と「インスタンス」 という概念を理解しましょう。

クラスの定義とインスタンス化

クラスとは、オブジェクトの「設計図」です。

例えば「車」というクラスを作り、そこから具体的な「自分の車」「隣の車」という実体(インスタンス)を作成します。

C#
// 設計図(クラス)の作成
class Car
{
    // プロパティ(属性)
    public string Model { get; set; }
    public int Speed { get; private set; }

    // メソッド(動作)
    public void Accelerate(int amount)
    {
        Speed += amount;
        Console.WriteLine($"{Model}が加速しました。現在の速度:{Speed}km/h");
    }
}

// メイン処理での利用
class Program
{
    static void Main()
    {
        // インスタンスの作成
        Car myCar = new Car();
        myCar.Model = "プリウス";
        
        // メソッドの呼び出し
        myCar.Accelerate(20);
        myCar.Accelerate(30);
    }
}
実行結果
プリウスが加速しました。現在の速度:20km/h
プリウスが加速しました。現在の速度:50km/h

カプセル化とプロパティ

クラスの内部データを外部から勝手に書き換えられないように守ることを カプセル化 と呼びます。

C#では getset を使った「プロパティ」という仕組みでこれを実現します。

配列とコレクション

複数のデータをまとめて扱う場合、配列やリストを使用します。

Listクラスの活用

配列はサイズが固定ですが、実務ではサイズが可変の List<T> が多用されます。

C#
using System.Collections.Generic;

List<string> names = new List<string>();
names.Add("田中");
names.Add("佐藤");
names.Add("鈴木");

Console.WriteLine($"登録人数:{names.Count}");
foreach (var name in names)
{
    Console.WriteLine(name);
}

<T> の部分は「ジェネリクス」と呼ばれ、リストに入れるデータの型を指定します。

これにより、型安全に複数のデータを管理できます。

LINQ:C#の最強ツール

C#を学ぶ上で避けて通れないのが LINQ (Language Integrated Query) です。

これは、データの集合(リストや配列など)に対して、抽出や加工を驚くほど簡単に記述できる機能です。

LINQの使用例

例えば、数値リストから「50以上の数値だけを取り出し、昇順に並べる」という処理は、LINQを使うと以下のように書けます。

C#
using System.Linq;

int[] numbers = { 10, 80, 30, 95, 45, 60 };

// 50以上の数字を抽出してソート
var result = numbers
    .Where(n => n >= 50)
    .OrderBy(n => n);

foreach (var n in result)
{
    Console.WriteLine(n);
}
実行結果
60
80
95

このように、ループを回して if 文で判定するよりも、宣言的で読みやすいコードが書けるのがLINQの魅力です。

例外処理:エラーへの備え

プログラムの実行中に予期せぬエラー(ファイルが見つからない、ネットワークが切断されたなど)が発生することがあります。

これに対処するのが try-catch文 です。

C#
try
{
    int x = 10;
    int y = 0;
    int result = x / y; // 0で割るエラーが発生
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("エラー:0で割ることはできません。");
    Console.WriteLine(ex.Message);
}
finally
{
    Console.WriteLine("処理を終了します。");
}

finally ブロックは、エラーの有無に関わらず必ず実行されるため、ファイルのクローズ処理などに使用されます。

非同期処理 (async / await)

現代のアプリケーション開発において、ネットワーク通信や重い計算を行っている間に画面がフリーズしないようにすることは非常に重要です。

C#では async/await キーワードを使うことで、複雑な非同期処理を同期処理に近い感覚で記述できます。

C#
public async Task DownloadDataAsync()
{
    Console.WriteLine("ダウンロードを開始します...");
    
    // 擬似的な待ち時間(3秒)
    await Task.Delay(3000);
    
    Console.WriteLine("ダウンロードが完了しました。");
}

この仕組みを理解することで、ユーザー体験(UX)の高いスムーズなアプリケーションを作成できるようになります。

まとめ

C#は、その歴史の長さとMicrosoftによる強力なバックアップにより、極めて完成度の高い言語へと進化を続けています。

本記事で解説した 基本文法、オブジェクト指向、LINQ、そして非同期処理 は、C#をマスターするための核心部分です。

これから学習を進める上でのポイントは、座学だけでなく「実際に手を動かして何かを作ってみる」ことです。

まずはコンソールアプリで計算機を作ったり、Unityで簡単な3D空間を動かしてみたりすることから始めてみてください。

C#には豊富なドキュメントと巨大なコミュニティがあるため、壁にぶつかっても必ず解決策が見つかるはずです。

あなたがC#という強力な武器を手にし、素晴らしいアプリケーションやゲームを作り上げることを心より応援しています。