C#

#7
TIOBE#5
PYPL#5
GitHub#15
RedMonk#5
IEEESpectrum#7
JetBrains#9
プログラミング言語オブジェクト指向.NETマイクロソフトエンタープライズ

プログラミング言語

C#(シーシャープ)

概要

C#は、Microsoftが開発したオブジェクト指向プログラミング言語です。.NETフレームワークと密接に連携し、Windows環境でのアプリケーション開発を中心に、Web開発、ゲーム開発、クロスプラットフォーム開発まで幅広く対応しています。

詳細

C#は2000年にMicrosoftのAnders Hejlsbergらによって開発され、JavaやC++の影響を受けつつ、より安全で生産性の高い言語として設計されました。.NET Frameworkの登場とともに成長し、現在は.NET Core/.NET 5+によりクロスプラットフォーム対応も実現しています。

ガベージコレクションによる自動メモリ管理、強力な型システム、LINQ(Language Integrated Query)、非同期プログラミング、ジェネリクスなどの機能により、安全で表現力豊かなコードを書くことができます。

書き方の例

Hello World

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

// C# 9.0以降のトップレベルプログラム
using System;

Console.WriteLine("Hello, World!");

クラスとオブジェクト

using System;

public 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}歳です。");
    }
    
    // 静的メソッド
    public static Person CreateAdult(string name)
    {
        return new Person(name, 20);
    }
}

class Program
{
    static void Main()
    {
        var person = new Person("太郎", 25);
        person.Introduce();
        
        var adult = Person.CreateAdult("花子");
        adult.Introduce();
    }
}

プロパティとアクセサ

public class BankAccount
{
    private decimal _balance;
    
    public string AccountNumber { get; }
    
    public decimal Balance 
    { 
        get => _balance;
        private set => _balance = value >= 0 ? value : throw new ArgumentException("残高は負の値にできません");
    }
    
    // 自動プロパティ
    public string AccountHolderName { get; set; }
    
    // 読み取り専用プロパティ
    public DateTime CreatedDate { get; } = DateTime.Now;
    
    public BankAccount(string accountNumber, string holderName)
    {
        AccountNumber = accountNumber;
        AccountHolderName = holderName;
        Balance = 0;
    }
    
    public void Deposit(decimal amount)
    {
        if (amount > 0)
            Balance += amount;
    }
    
    public bool Withdraw(decimal amount)
    {
        if (amount > 0 && amount <= Balance)
        {
            Balance -= amount;
            return true;
        }
        return false;
    }
}

LINQ (Language Integrated Query)

using System;
using System.Collections.Generic;
using System.Linq;

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Score { get; set; }
}

class Program
{
    static void Main()
    {
        var students = new List<Student>
        {
            new Student { Name = "太郎", Age = 20, Score = 85 },
            new Student { Name = "花子", Age = 19, Score = 92 },
            new Student { Name = "次郎", Age = 21, Score = 78 },
            new Student { Name = "恵子", Age = 20, Score = 88 }
        };
        
        // 高得点の学生を取得
        var highScoreStudents = students
            .Where(s => s.Score >= 85)
            .OrderByDescending(s => s.Score)
            .Select(s => new { s.Name, s.Score });
        
        foreach (var student in highScoreStudents)
        {
            Console.WriteLine($"{student.Name}: {student.Score}点");
        }
        
        // 平均点を計算
        var averageScore = students.Average(s => s.Score);
        Console.WriteLine($"平均点: {averageScore:F1}点");
        
        // 年齢でグループ化
        var groupedByAge = students
            .GroupBy(s => s.Age)
            .Select(g => new { Age = g.Key, Count = g.Count() });
        
        foreach (var group in groupedByAge)
        {
            Console.WriteLine($"{group.Age}歳: {group.Count}人");
        }
    }
}

非同期プログラミング

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("データを取得中...");
        
        // 複数のAPIを並列で呼び出し
        var task1 = FetchDataAsync("https://api.example1.com/data");
        var task2 = FetchDataAsync("https://api.example2.com/data");
        var task3 = FetchDataAsync("https://api.example3.com/data");
        
        var results = await Task.WhenAll(task1, task2, task3);
        
        for (int i = 0; i < results.Length; i++)
        {
            Console.WriteLine($"結果 {i + 1}: {results[i]}");
        }
    }
    
    static async Task<string> FetchDataAsync(string url)
    {
        using var client = new HttpClient();
        try
        {
            var response = await client.GetStringAsync(url);
            return response;
        }
        catch (Exception ex)
        {
            return $"エラー: {ex.Message}";
        }
    }
}

ジェネリクスとコレクション

using System;
using System.Collections.Generic;

public class Repository<T> where T : class
{
    private readonly List<T> _items = new List<T>();
    
    public void Add(T item)
    {
        if (item != null)
            _items.Add(item);
    }
    
    public T? GetById(int id) where T : IIdentifiable
    {
        return _items.FirstOrDefault(item => item.Id == id);
    }
    
    public IEnumerable<T> GetAll()
    {
        return _items.AsReadOnly();
    }
    
    public bool Remove(T item)
    {
        return _items.Remove(item);
    }
}

public interface IIdentifiable
{
    int Id { get; }
}

public class Product : IIdentifiable
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public decimal Price { get; set; }
}

class Program
{
    static void Main()
    {
        var productRepo = new Repository<Product>();
        
        productRepo.Add(new Product { Id = 1, Name = "ノートPC", Price = 80000 });
        productRepo.Add(new Product { Id = 2, Name = "マウス", Price = 3000 });
        
        var allProducts = productRepo.GetAll();
        foreach (var product in allProducts)
        {
            Console.WriteLine($"{product.Name}: {product.Price:C}");
        }
    }
}

レコード型(C# 9.0以降)

// レコード型の定義
public record Person(string FirstName, string LastName, int Age)
{
    public string FullName => $"{FirstName} {LastName}";
}

// 継承
public record Employee(string FirstName, string LastName, int Age, string Department) 
    : Person(FirstName, LastName, Age);

class Program
{
    static void Main()
    {
        var person1 = new Person("太郎", "田中", 30);
        var person2 = new Person("太郎", "田中", 30);
        
        // 値の等価性
        Console.WriteLine(person1 == person2); // True
        
        // with式を使った非破壊的更新
        var olderPerson = person1 with { Age = 31 };
        Console.WriteLine($"{olderPerson.FullName}, {olderPerson.Age}歳");
        
        var employee = new Employee("花子", "佐藤", 28, "開発部");
        Console.WriteLine($"{employee.FullName}, {employee.Department}");
    }
}

メリット・デメリット

メリット

  • 強力な型システム: コンパイル時のエラー検出により安全性が高い
  • 豊富な開発ツール: Visual Studioによる強力な開発環境
  • 自動メモリ管理: ガベージコレクションによるメモリリーク防止
  • クロスプラットフォーム: .NET Core/.NET 5+によりLinux/macOSでも動作
  • 豊富なライブラリ: .NETエコシステムの充実したライブラリ群
  • 高い生産性: LINQ、非同期処理、プロパティなどの機能

デメリット

  • Microsoftエコシステム依存: 主にMicrosoft技術スタックでの利用
  • ライセンス費用: Visual StudioやWindows Serverなどの商用ライセンス
  • パフォーマンス: ネイティブコードと比較して実行速度が劣る場合がある
  • 学習コスト: オブジェクト指向や.NETフレームワークの理解が必要

主要リンク

ランキング情報

  • 総合ランキング: 7位
  • TIOBE Index: 5位
  • PYPL PopularitY: 5位
  • GitHub使用率: 15位
  • RedMonk言語ランキング: 5位
  • IEEE Spectrum: 7位
  • JetBrains開発者調査: 9位

C#は、Microsoftエコシステムでのエンタープライズ開発を中心に、現代的な機能と高い生産性を提供するプログラミング言語です。