UnitsNet ライブラリの概要

`UnitsNet` は強力な .NET ライブラリで、物理的な単位の処理を簡素化するために設計されています。このライブラリは豊富な単位タイプとその変換機能を提供し、開発者がコード内で物理的な単位間の変換や計算、表示を容易に行えるようにします。`UnitsNet` は長さ、質量、体積、温度、速度、面積などの様々な分野の物理単位をサポートし、開発効率とコードの可読性を大幅に向上させます。科学計算やエンジニアリングプロジェクト、そして正確な単位変換を必要とするアプリケーション開発において、`UnitsNet` は理想的な選択です。

### UnitsNet がサポートする単位タイプ

以下の表に示すのは、`UnitsNet` がサポートする主な物理単位カテゴリとその一部の例です：

| カテゴリ | 例示単位 |
|----------|----------|
| 加速度 | メートル毎秒平方, インチ毎秒平方 |
| 角度 | 度, ラジアン, グラディアン |
| 面積 | 平方メートル, 平方キロメートル, エーカー |
| 密度 | キログラム毎立方メートル, ポンド毎立方フィート |
| 電流 | アンペア, ミリアンペア |
| エネルギー | ジュール, カロリー, キロワット時 |
| 力 | ニュートン, ポンド力, ダイン |
| 周波数 | ヘルツ, キロヘルツ, メガヘルツ |
| 長さ | メートル, キロメートル, マイル |
| 質量 | グラム, キログラム, ポンド |
| 電力 | ワット, キロワット, 馬力 |
| 圧力 | パスカル, バール, ポンド毎平方インチ |
| 速度 | メートル毎秒, キロメートル毎時, マイル毎時 |
| 温度 | 摂氏度, 華氏度, ケルビン |
| 時間 | 秒, 分, 時間 |
| 体積 | リットル, ミリリットル, 立方メートル |

### 簡単な例：

```csharp
using System.Globalization;
using UnitsNet;

var janpese = new CultureInfo("ja-JP");
var russian = new CultureInfo("ru-RU");
var chinese = new CultureInfo("zh-CN");
var oneKg = Mass.FromKilograms(1);

Thread.CurrentThread.CurrentCulture = russian;
Console.WriteLine(oneKg.ToString());
Thread.CurrentThread.CurrentCulture = chinese;
Console.WriteLine(oneKg.ToString());
```

#### 中国と日本の面積単位拡張例

`UnitsNet` は国際的に広く使用されている単位を網羅していますが、一部の地域の単位は含まれていません。例えば、中国の「亩」や日本の伝統的な面積単位「坪（つぼ）」などです。このような単位をカバーするためには、`UnitsNet` を拡張してカスタム単位を定義できます。以下にその例を示します。

##### 示例 1：中国面積単位拡張（亩）

中国では面積単位「亩」が非常に一般的で、特に農業分野でよく使用されます。1亩は666.67平方メートルに相当します。以下のように、`UnitsNet` の拡張メソッドを使用してこの単位をサポートします：

```csharp
using System;
using UnitsNet;

public static class AreaExtensions
{
    private const double MuToSquareMeters = 666.67;

    // 面積単位の拡張「亩」
    public static double Mu(this Area area)
    {
        return area.SquareMeters / MuToSquareMeters;
    }

    public static Area FromMu(double mu)
    {
        return Area.FromSquareMeters(mu * MuToSquareMeters);
    }
}

class Program
{
    static void Main()
    {
        Area area = Area.FromSquareMeters(1000);
        Console.WriteLine($"1000平方米等于{area.Mu():0.00}亩");

        Area areaFromMu = AreaExtensions.FromMu(1.5);
        Console.WriteLine($"1.5亩等于{areaFromMu.SquareMeters:0.00}平方米");
    }
}
```

この例では、`Area` クラスを拡張し、`Mu` メソッドを定義して、面積を平方メートルから亩に変換します。そして、`FromMu` メソッドで亩を平方メートルに変換します。このような拡張性により、`UnitsNet` にはデフォルトライブラリにない単位を簡単に追加でき、異なる地域のニーズに応じることができます。

##### 示例 2：日本面積単位拡張（坪、畳、町、反、合）

日本には独自の面積単位のセットがあり、例えば「坪（つぼ）」は住宅の面積測定によく使われ、1坪は3.306平方メートルに相当します。また、「町（ちょう）」や「反（たん）」などは農業や土地面積測定で多く用いられます。`UnitsNet` を使用してこれらの単位を拡張する例を以下に示します：

```csharp
using System;
using UnitsNet;

public static class JapaneseAreaExtensions
{
    private const double SquareMetersPerTsubo = 3.306;
    private const double SquareMetersPerJo = 1.62;
    private const double SquareMetersPerCho = 9917;
    private const double SquareMetersPerTan = 991.7;
    private const double SquareMetersPerGo = 0.0331;

    // 坪 (Tsubo)
    public static double Tsubo(this Area area)
    {
        return area.SquareMeters / SquareMetersPerTsubo;
    }

    public static Area FromTsubo(double tsubo)
    {
        return Area.FromSquareMeters(tsubo * SquareMetersPerTsubo);
    }

    // 畳 (Jo)
    public static double Jo(this Area area)
    {
        return area.SquareMeters / SquareMetersPerJo;
    }

    public static Area FromJo(double jo)
    {
        return Area.FromSquareMeters(jo * SquareMetersPerJo);
    }

    // 町 (Cho)
    public static double Cho(this Area area)
    {
        return area.SquareMeters / SquareMetersPerCho;
    }

    public static Area FromCho(double cho)
    {
        return Area.FromSquareMeters(cho * SquareMetersPerCho);
    }

    // 反 (Tan)
    public static double Tan(this Area area)
    {
        return area.SquareMeters / SquareMetersPerTan;
    }

    public static Area FromTan(double tan)
    {
        return Area.FromSquareMeters(tan * SquareMetersPerTan);
    }

    // 合 (Go)
    public static double Go(this Area area)
    {
        return area.SquareMeters / SquareMetersPerGo;
    }

    public static Area FromGo(double go)
    {
        return Area.FromSquareMeters(go * SquareMetersPerGo);
    }
}

class Program
{
    static void Main()
    {
        Area area = Area.FromSquareMeters(1000);

        Console.WriteLine($"1000平方米等于{area.Tsubo():0.00}坪");
        Console.WriteLine($"1000平方米等于{area.Jo():0.00}畳");
        Console.WriteLine($"1000平方米等于{area.Cho():0.00}町");
        Console.WriteLine($"1000平方米等于{area.Tan():0.00}反");
        Console.WriteLine($"1000平方米等于{area.Go():0.00}合");

        Area areaFromTsubo = JapaneseAreaExtensions.FromTsubo(1.5);
        Console.WriteLine($"1.5坪等于{areaFromTsubo.SquareMeters:0.00}平方米");
    }
}
```

この例では、`UnitsNet` の `Area` クラスを拡張し、日本の伝統的な面積単位である坪、畳、町などを扱えるようにしました。このような拡張方法により、異なる単位のニーズに応じて `UnitsNet` をより柔軟に利用することができます。

### まとめ

`UnitsNet` ライブラリは、多くの国際標準単位のサポートを提供するだけでなく、ユーザー自身が簡単にカスタム単位を追加することができます。例えば、中国や日本の特有の面積単位「亩」や「坪」などは、簡単な拡張方法でサポートされます。この機能は、`UnitsNet` の使いやすさを向上させるだけでなく、異なる地域と状況において、より効率的かつ正確に単位の変換と計算を行えるようにします。そのため、正確な単位換算が必要な開発者から、科学計算やエンジニアリングプロジェクトで開発効率を向上させたいチームに至るまで、`UnitsNet` は非常にお勧めのツールです。

(Translated by GPT)