C# は、Microsoftが開発したオブジェクト指向プログラミング言語で、直感的な構文と豊富な機能を備えており、初心者からプロフェッショナルまで幅広い開発者に支持されています。
この言語は、デスクトップアプリケーション、Web アプリケーション、ゲーム開発、クラウドサービスなど、さまざまな用途で利用されています。特に、堅牢性と柔軟性を兼ね備えた設計により、開発効率を向上させるための多彩なツールやライブラリが揃っています。
本記事では、C# を使った開発をより効率的かつ快適にするためのテクニックを10個ピックアップして紹介します。これらの機能を活用することで、コードの簡潔さや可読性を大幅に向上させることができますので、ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
テクニック10選
usingステートメント
リソース管理を簡単に行うための構文です。外部リソース(ファイルやデータベース接続など)の利用後、自動的にリソースの解放を行うことで、リソースリークを防ぎます。
従来の書き方
var stream = new StreamWriter("example.txt");
stream.WriteLine("Hello, World!");
stream.Dispose();
この場合、Dispose
メソッドの記述を忘れてしまうとリソースワークが発生します。
usingステートメントを使用した書き方
using (var stream = new StreamWriter("example.txt"))
{
stream.WriteLine("Hello, World!");
}
using ステートメントを用いることで、using を抜ける際に自動的にリソースを解放してくれます。そのため、Dispose
メソッドの記述をする必要がなく、人為的なバグを削減することが可能になります。
更に、C# 8.0からは以下のように、変数宣言時にusing
をつけることで更なる簡略化ができるようになりました。
using var stream = new StreamWriter("example.txt");
stream.WriteLine("Hello, World!");
Null条件演算子
Null条件演算子?.
を用いることで、オブジェクトがNull
かどうかを簡単にチェックして、安全にアクセスできるようにする機能です。
従来の書き方
var name = null;
if (person != null)
{
name = person.Name;
}
Console.WriteLine(name ?? "Name is null");
Null条件演算子を使用した書き方
var name = person?.Name;
Console.WriteLine(name ?? "Name is null");
Null合体演算子
Null合体演算子??
を用いることで、値がNull
の場合にデフォルト値を簡単に設定できる機能です。
従来の書き方
var message = string.Empty;
if (input != null)
{
message = input;
}
else
{
message = "デフォルトメッセージ";
}
Console.WriteLine(message);
Null合体演算子を使用した書き方
var message = input ?? "デフォルトメッセージ";
Console.WriteLine(message);
式形式のメンバー
クラスのプロパティやメソッドを簡潔に記述するための構文です。
従来の書き方
public class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
public double Area
{
get { return Math.PI * Radius * Radius; }
}
}
式形式のメンバーを使用した書き方
public class Circle
{
public double Radius { get; }
public Circle(double radius) => Radius = radius;
public double Area => Math.PI * Radius * Radius;
}
パターンマッチング
オブジェクトの型チェックや条件分岐をより簡単に記述できるようにする機能です。
従来の書き方
object obj = 42;
if (obj is int)
{
int number = (int)obj;
Console.WriteLine(number * 2);
}
パターンマッチングを使用した書き方
object obj = 42;
if (obj is int number)
{
Console.WriteLine(number * 2);
}
LINQ (Language-Integrated Query)
コレクションやデータ操作を簡潔に記述できるクエリ言語です。
従来の書き方
var numbers = new[] { 1, 2, 3, 4, 5 };
var evenNumbers = new List<int>();
foreach (var n in numbers)
{
if (n % 2 == 0)
{
evenNumbers.Add(n);
}
}
foreach (var number in evenNumbers)
{
Console.WriteLine(number);
}
LINQを使用した書き方
var numbers = new[] { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var number in evenNumbers)
{
Console.WriteLine(number);
}
async/await (非同期)
非同期処理を直感的に記述するための構文です。UIの応答性を保ちながらバックグラウンドタスクを実行できます。
従来の書き方
public Task DownloadFile(string url)
{
using (var client = new HttpClient())
{
var data = client.GetStringAsync(url).Result;
Console.WriteLine(data);
}
}
async/awaitを使用した書き方
public async Task DownloadFileAsync(string url)
{
using var client = new HttpClient();
var data = await client.GetStringAsync(url);
Console.WriteLine(data);
}
タプル
複数の値を簡単にまとめて返すことができるデータ構造です。
従来の書き方
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person GetPerson()
{
return new Person { Name = "Masao", Age = 30 };
}
var person = GetPerson();
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
タプルを使用した書き方
(string name, int age) GetPerson() => ("Masao", 30);
var person = GetPerson();
Console.WriteLine($"Name: {person.name}, Age: {person.age}");
レコード型
データモデルを簡潔かつ明確に表現するための新しい型です。
従来の書き方
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"Name: {Name}, Age: {Age}";
}
}
var person = new Person("Masao", 30);
Console.WriteLine(person);
レコード型を使用した書き方
public record Person(string Name, int Age);
var person = new Person("Masao", 30);
Console.WriteLine(person);
名前付き引数
メソッド呼び出し時に引数を明示的に指定し、コードの可読性を向上させます。
従来の書き方
Person("Masao", 30);
void Person(string name, int age)
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
名前付き引数を使用した書き方
Person(name: "Alice", age: 30);
void Person(string name, int age)
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
まとめ
この記事では C# を扱う上で知っておきたいテクニックについて紹介しました。
C# には、開発を効率化するための便利な機能が豊富に用意されています。これらの機能を積極的に活用することで、コードの可読性や保守性を向上させることができます。
ぜひ日々の開発に取り入れてみてください!
以上、最後まで読んでいただきありがとうございました。