C#
#7
TIOBE#5
PYPL#5
GitHub#15
RedMonk#5
IEEESpectrum#7
JetBrains#9
プログラミング言語
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エコシステムでのエンタープライズ開発を中心に、現代的な機能と高い生産性を提供するプログラミング言語です。