C#でUUID(GUID)を生成する方法|Guid.NewGuidの使い方と文字列変換まで解説

はじめに

C#で一意なIDを作成したいときによく使われるのが、UUIDまたはGUIDです。ユーザーID、注文ID、ファイル名、APIのリクエストID、データベースの主キーなど、C#で開発していると「重複しにくい識別子」が必要になる場面は多くあります。

C#では、UUIDを扱うためにGuid型が用意されています。特に新しいUUIDを生成する場合は、Guid.NewGuid()を使うのが基本です。

C#
Guid id = Guid.NewGuid();
Console.WriteLine(id);

実行すると、次のような値が出力されます。

0f8fad5b-d9cb-469f-a165-70867728950e

この記事では、C#でUUID(GUID)を生成する方法から、Guid.NewGuidの使い方、文字列への変換、ハイフンなし形式、Guid.ParseGuid.TryParseによる変換、実務で使うときの注意点まで解説します。

1. C#におけるUUID(GUID)とは

1-1. UUIDとGUIDの違い

UUIDは「Universally Unique Identifier」の略で、世界中で一意になることを目的とした識別子です。一般的には、次のような32桁の16進数をハイフンで区切った形式で表されます。

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

一方、GUIDは「Globally Unique Identifier」の略で、Microsoft系の技術でよく使われる呼び方です。C#や.NETでは、UUIDに相当する値をGuid型として扱います。

厳密には仕様や呼び方の背景に違いはありますが、C#で開発するうえでは「UUIDとGUIDはほぼ同じもの」と考えて問題ありません。検索するときは「c# uuid」と調べる人も多いですが、C#のコード上ではUUID型ではなくGuid型を使います。

1-2. C#ではGuid型を使う

C#でUUIDを扱う場合は、System.Guid構造体を使います。Guid型は.NETに標準で用意されているため、追加ライブラリをインストールする必要はありません。

C#
using System;

Guid id = Guid.NewGuid();
Console.WriteLine(id);

Guidは値型の構造体です。文字列ではなくGUIDそのものを表す型なので、プログラム内部ではGuid型として保持し、表示や保存が必要なときに文字列へ変換するのが基本です。

C#
Guid userId = Guid.NewGuid();      // Guid型
string userIdText = userId.ToString(); // string型

1-3. UUID(GUID)が使われる主な場面

C#でUUID(GUID)が使われる代表的な場面は次のとおりです。

C#
Guid userId = Guid.NewGuid();
Guid orderId = Guid.NewGuid();
Guid requestId = Guid.NewGuid();

たとえば、WebアプリケーションではユーザーIDや注文ID、ログの追跡IDとして使われます。ファイルアップロード機能では、同じファイル名による上書きを防ぐためにUUIDをファイル名に含めることもあります。

C#
string fileName = $"{Guid.NewGuid()}.jpg";

また、複数のサーバーやシステムで同時にIDを生成する場合でも、UUIDは重複しにくいため扱いやすい識別子として利用されます。

2. C#でUUID(GUID)を生成する基本方法

2-1. Guid.NewGuidとは

Guid.NewGuid()は、新しいGUIDを生成するための静的メソッドです。Microsoft公式ドキュメントでも、新しいGuidオブジェクトを作成する方法として示されています。

基本的な使い方は非常にシンプルです。

C#
Guid guid = Guid.NewGuid();

new Guid()のようにコンストラクターを呼び出す方法もありますが、これは新しいランダムなGUIDを生成するわけではありません。

C#
Guid guid1 = Guid.NewGuid(); // 新しいGUIDを生成
Guid guid2 = new Guid(); // すべて0のGUID

new Guid()で作成される値は、次のような空のGUIDです。

00000000-0000-0000-0000-000000000000

そのため、C#でUUIDを生成したい場合は、基本的にGuid.NewGuid()を使います。

2-2. Guid.NewGuidでUUIDを生成するサンプルコード

以下は、C#でUUIDを生成してコンソールに表示する基本的なサンプルコードです。

C#
using System;

class Program
{
static void Main()
{
Guid uuid = Guid.NewGuid();

Console.WriteLine(uuid);
}
}

実行結果の例は次のようになります。

7c9e6679-7425-40de-944b-e07fc1f90ae7

Guid.NewGuid()を複数回呼び出すと、そのたびに異なるGUIDが生成されます。

C#
Console.WriteLine(Guid.NewGuid());
Console.WriteLine(Guid.NewGuid());
Console.WriteLine(Guid.NewGuid());

実行結果の例です。

b6f2a5f8-1b2e-4c8d-9b9a-2c3d4e5f6789
64c12b31-0f5a-4e60-a6b1-7f6a2d9a1234
a4e8d2c0-9c42-42f1-a0e9-5f9d8a7b6c10

このように、C#ではGuid.NewGuid()を呼び出すだけでUUID相当の識別子を簡単に生成できます。

2-3. 生成されるUUIDの形式

Guid.NewGuid()で生成した値をそのままConsole.WriteLineで表示すると、通常は次の形式で出力されます。

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

具体例は次のとおりです。

0f8fad5b-d9cb-469f-a165-70867728950e

これはGuid.ToString("D")と同じ形式です。D形式は、ハイフン付きの標準的なUUID文字列です。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString());
Console.WriteLine(guid.ToString("D"));

どちらも次のような形式になります。

0f8fad5b-d9cb-469f-a165-70867728950e

C#で「UUID文字列」と言う場合、多くのケースではこのハイフン付き形式を指します。

2-4. 毎回異なるUUIDが生成される仕組み

Guid.NewGuid()は、新しいGUID値を生成するメソッドです。現在の.NETでは、Version 4 UUIDを作成する便利なメソッドとして説明されています。

Version 4 UUIDは、基本的にランダム性を利用して一意性を確保する方式です。そのため、連番のように「1、2、3」と増えていくIDではありません。

C#
Guid id1 = Guid.NewGuid();
Guid id2 = Guid.NewGuid();

Console.WriteLine(id1);
Console.WriteLine(id2);

出力例です。

8b1a9953-c461-4f1b-8a02-f2c2b3c4d5e6
cd4f1a90-3f44-4b68-9a8d-123456789abc

このように、生成される値に規則的な連番はありません。大量のIDを分散環境で生成しやすい一方で、並び順や作成順をIDから判断する用途には向いていません。

3. 生成したUUID(GUID)を文字列に変換する方法

3-1. ToStringで文字列に変換する

Guid型の値を文字列として扱いたい場合は、ToString()メソッドを使います。

C#
Guid guid = Guid.NewGuid();
string text = guid.ToString();

Console.WriteLine(text);

実行結果の例です。

0f8fad5b-d9cb-469f-a165-70867728950e

Guid型のままでは、データベースのuniqueidentifier型やプログラム内部の値として扱うのに適しています。一方、JSONに含める、URLに含める、ログへ出力する、ファイル名に使うといった場合は文字列に変換する必要があります。

C#
Guid requestId = Guid.NewGuid();

string logMessage = $"RequestId: {requestId}";
Console.WriteLine(logMessage);

文字列補間を使った場合も、内部的にはToString()相当の形式で出力されます。

3-2. ハイフン付きUUID文字列に変換する

ハイフン付きの標準的なUUID文字列にしたい場合は、ToString()またはToString("D")を使います。

C#
Guid guid = Guid.NewGuid();

string uuid1 = guid.ToString();
string uuid2 = guid.ToString("D");

Console.WriteLine(uuid1);
Console.WriteLine(uuid2);

出力例です。

0f8fad5b-d9cb-469f-a165-70867728950e
0f8fad5b-d9cb-469f-a165-70867728950e

APIのレスポンス、ログ、設定ファイルなど、人が読んだり外部システムとやり取りしたりする場面では、ハイフン付きのD形式がよく使われます。

C#
var response = new
{
Id = Guid.NewGuid().ToString("D")
};

標準的な形式で出力しておくと、他の言語やツールでも扱いやすくなります。

3-3. ハイフンなしUUID文字列に変換する

ハイフンなしのUUID文字列にしたい場合は、ToString("N")を使います。

C#
Guid guid = Guid.NewGuid();

string uuid = guid.ToString("N");

Console.WriteLine(uuid);

出力例です。

0f8fad5bd9cb469fa16570867728950e

N形式では、32桁の16進数だけが出力されます。

ファイル名やURLの一部として使う場合、ハイフンを含めたくないケースがあります。そのような場合は、ToString("N")が便利です。

C#
string fileName = $"{Guid.NewGuid():N}.png";

Console.WriteLine(fileName);

出力例です。

0f8fad5bd9cb469fa16570867728950e.png

Replace("-", "")でハイフンを削除する方法もありますが、最初からToString("N")を使う方が簡潔です。

C#
string uuid = Guid.NewGuid().ToString("N");

3-4. 大文字・小文字を変換する方法

Guid.ToString()で出力される文字列は、通常は小文字の16進数になります。大文字にしたい場合は、ToUpper()またはToUpperInvariant()を使います。

C#
Guid guid = Guid.NewGuid();

string lower = guid.ToString("D");
string upper = guid.ToString("D").ToUpperInvariant();

Console.WriteLine(lower);
Console.WriteLine(upper);

出力例です。

0f8fad5b-d9cb-469f-a165-70867728950e
0F8FAD5B-D9CB-469F-A165-70867728950E

ハイフンなしで大文字にしたい場合は、次のように書けます。

C#
string uuid = Guid.NewGuid().ToString("N").ToUpperInvariant();

小文字に統一したい場合は、ToLowerInvariant()を使います。

C#
string uuid = inputGuid.ToString("D").ToLowerInvariant();

GUIDの比較自体はGuid型で行うのが安全です。文字列として保存・比較する場合は、大文字・小文字の揺れを避けるため、あらかじめ小文字または大文字に統一しておくと扱いやすくなります。

4. Guid.ToStringの書式指定

4-1. 「D」形式:標準的なUUID形式

D形式は、ハイフン付きの標準的なUUID形式です。Guid.ToString()の既定形式でもあります。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("D"));

出力例です。

0f8fad5b-d9cb-469f-a165-70867728950e

多くのAPI、ログ、設定ファイル、データの受け渡しでは、このD形式を使えば問題ありません。

C#
string id = Guid.NewGuid().ToString("D");

特に理由がなければ、C#でUUIDを文字列として扱うときはD形式を選ぶのがおすすめです。

4-2. 「N」形式:ハイフンなし形式

N形式は、ハイフンを含まない32桁の形式です。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("N"));

出力例です。

0f8fad5bd9cb469fa16570867728950e

ファイル名、URLのパス、短めに見せたい識別子など、ハイフンが不要な場面で使いやすい形式です。

C#
string fileName = $"upload_{Guid.NewGuid():N}.dat";

ただし、標準的なUUID表記として人が見慣れているのはハイフン付きのD形式です。外部システムと連携する場合は、相手がN形式を受け付けるか確認しておきましょう。

4-3. 「B」形式:波括弧付き形式

B形式は、D形式のGUIDを波括弧{}で囲んだ形式です。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("B"));

出力例です。

{0f8fad5b-d9cb-469f-a165-70867728950e}

古い設定ファイルやCOM関連の識別子などで、波括弧付きのGUIDが使われることがあります。通常のWebアプリケーションやAPIでは、B形式を使う機会は多くありません。

4-4. 「P」形式:丸括弧付き形式

P形式は、D形式のGUIDを丸括弧()で囲んだ形式です。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("P"));

出力例です。

(0f8fad5b-d9cb-469f-a165-70867728950e)

P形式も特殊な表示形式のひとつです。アプリケーション内部で必要になることは少ないですが、外部仕様で丸括弧付きGUIDが求められている場合に使用します。

4-5. 「X」形式:16進数表記形式

X形式は、GUIDを16進数の構造的な形式で表します。

C#
Guid guid = Guid.NewGuid();

Console.WriteLine(guid.ToString("X"));

出力例です。

{0x0f8fad5b,0xd9cb,0x469f,{0xa1,0x65,0x70,0x86,0x77,0x28,0x95,0x0e}}

X形式はかなり特殊で、通常のUUID文字列として扱う用途には向いていません。C#の日常的な開発では、ほとんどの場合D形式またはN形式を使えば十分です。

Guid.ToStringの書式指定には、NDBPXなどがあります。これらの形式は.NETの公式ドキュメントでも定義されています。

4-6. 用途別におすすめの書式

C#でUUIDを文字列化するときは、用途に応じて書式を選びます。

APIレスポンスやログに出すなら、標準的なD形式がおすすめです。

C#
string id = Guid.NewGuid().ToString("D");

ファイル名やURLの一部に使うなら、ハイフンなしのN形式が便利です。

C#
string fileName = $"{Guid.NewGuid():N}.jpg";

外部システムが波括弧付きGUIDを要求する場合は、B形式を使います。

C#
string id = Guid.NewGuid().ToString("B");

特に指定がない限りは、まずD形式を使うとよいでしょう。ハイフンなしにしたい明確な理由がある場合だけ、N形式を選ぶのが実務では扱いやすいです。

5. 文字列からUUID(GUID)に変換する方法

5-1. Guid.Parseの使い方

文字列で受け取ったUUIDをGuid型に変換するには、Guid.Parseを使います。

C#
string text = "0f8fad5b-d9cb-469f-a165-70867728950e";

Guid guid = Guid.Parse(text);

Console.WriteLine(guid);

Guid.Parseは、GUIDを表す文字列をGuid構造体に変換するメソッドです。公式ドキュメントでも、GUIDの文字列形式を等価なGuid構造体に変換するメソッドとして説明されています。

D形式だけでなく、ハイフンなしのN形式も変換できます。

C#
string text = "0f8fad5bd9cb469fa16570867728950e";

Guid guid = Guid.Parse(text);

Console.WriteLine(guid);

出力時は通常、ハイフン付きの形式で表示されます。

0f8fad5b-d9cb-469f-a165-70867728950e

5-2. Guid.TryParseで安全に変換する方法

ユーザー入力や外部APIから受け取った文字列をGUIDに変換する場合は、Guid.TryParseを使うのがおすすめです。

C#
string input = "0f8fad5b-d9cb-469f-a165-70867728950e";

if (Guid.TryParse(input, out Guid guid))
{
Console.WriteLine($"変換成功: {guid}");
}
else
{
Console.WriteLine("UUIDの形式が正しくありません。");
}

Guid.Parseは、変換できない文字列を渡すと例外が発生します。一方、Guid.TryParseは変換に成功した場合はtrue、失敗した場合はfalseを返します。失敗時のresultGuid.Emptyと等しくなることが公式ドキュメントに記載されています。

そのため、入力値が正しいと保証できない場合は、Guid.ParseよりもGuid.TryParseを使う方が安全です。

C#
public static bool IsValidGuid(string value)
{
return Guid.TryParse(value, out _);
}

5-3. 不正なUUID文字列を扱うときの注意点

不正なUUID文字列をGuid.Parseで変換しようとすると、例外が発生します。

C#
string input = "invalid-uuid";

Guid guid = Guid.Parse(input); // 例外が発生する

ユーザーがフォームに入力した値、URLパラメータ、HTTPヘッダー、外部サービスから受け取った値などは、必ずしも正しいUUID形式とは限りません。

そのため、実務では次のようにGuid.TryParseでチェックする方が安全です。

C#
string input = "invalid-uuid";

if (!Guid.TryParse(input, out Guid guid))
{
Console.WriteLine("不正なUUIDです。");
return;
}

Console.WriteLine(guid);

また、特定の形式だけを許可したい場合は、Guid.TryParseExactを使います。

C#
string input = "0f8fad5bd9cb469fa16570867728950e";

if (Guid.TryParseExact(input, "N", out Guid guid))
{
Console.WriteLine("N形式のUUIDです。");
}
else
{
Console.WriteLine("N形式ではありません。");
}

TryParseExactを使うと、D形式だけ、N形式だけといった厳密な判定ができます。

5-4. Guid.Emptyとの違い

Guid.Emptyは、すべての値が0のGUIDを表します。

C#
Console.WriteLine(Guid.Empty);

出力は次のとおりです。

00000000-0000-0000-0000-000000000000

Guid.Emptyは「値が未設定であること」を表すためによく使われます。Guid.NewGuid()で生成されるランダムなGUIDとは異なります。

C#
Guid id = Guid.Empty;

if (id == Guid.Empty)
{
Console.WriteLine("GUIDが未設定です。");
}

注意したいのは、Guid.EmptyGuid型としては有効な値である点です。「有効なGUIDかどうか」と「空のGUIDではないか」は別の判定になります。

C#
string input = "00000000-0000-0000-0000-000000000000";

if (Guid.TryParse(input, out Guid guid))
{
if (guid == Guid.Empty)
{
Console.WriteLine("空のGUIDです。");
}
}

6. UUID(GUID)を使う実践例

6-1. ユーザーIDや注文IDとして使う

C#では、ユーザーIDや注文IDとしてGUIDを使うことがあります。

C#
public class User
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}

新しいユーザーを作成するときに、Guid.NewGuid()でIDを設定します。

C#
User user = new User
{
Id = Guid.NewGuid(),
Name = "Taro"
};

注文IDの場合も同様です。

C#
public class Order
{
public Guid Id { get; set; }
public DateTime OrderedAt { get; set; }
}
C#
Order order = new Order
{
Id = Guid.NewGuid(),
OrderedAt = DateTime.UtcNow
};

複数のサーバーで同時にIDを生成するようなシステムでは、連番IDよりもGUIDの方が扱いやすい場合があります。

6-2. ファイル名にUUIDを使う

ファイルアップロード機能では、同じファイル名の衝突を避けるためにUUIDをファイル名に含めることがあります。

C#
string originalFileName = "image.png";
string extension = Path.GetExtension(originalFileName);

string savedFileName = $"{Guid.NewGuid():N}{extension}";

Console.WriteLine(savedFileName);

出力例です。

0f8fad5bd9cb469fa16570867728950e.png

ハイフンなしのN形式を使うと、ファイル名としてすっきり扱えます。

アップロード先のパスを作る場合は、次のように書けます。

C#
string uploadDirectory = "uploads";
string filePath = Path.Combine(uploadDirectory, savedFileName);

ただし、拡張子をそのまま信用すると危険な場合があります。実際のファイルアップロード処理では、許可する拡張子やMIMEタイプのチェックも行いましょう。

6-3. データベースの主キーとして使う

データベースの主キーとしてGUIDを使うこともできます。Entity Framework Coreでは、エンティティのIDにGuid型を指定できます。

C#
public class Product
{
public Guid Id { get; set; }
public string Name { get; set; } = "";
}

登録時にアプリケーション側でGUIDを設定します。

C#
var product = new Product
{
Id = Guid.NewGuid(),
Name = "Sample Product"
};

SQL Serverではuniqueidentifier型として扱われることが一般的です。

GUIDを主キーに使うメリットは、アプリケーション側でIDを生成できること、複数システムでIDを統合しやすいこと、連番IDのように件数を推測されにくいことです。

一方で、ランダムなGUIDをクラスター化インデックスのキーにすると、データの挿入位置が分散しやすく、インデックスの断片化やパフォーマンスに影響する場合があります。データベース設計では、GUIDを主キーにするか、連番IDと併用するかを検討することが大切です。

6-4. APIのリクエストIDやトレースIDとして使う

API開発では、リクエストごとにUUIDを発行してログに出力すると、障害調査がしやすくなります。

C#
Guid requestId = Guid.NewGuid();

Console.WriteLine($"RequestId: {requestId}");

ASP.NET CoreのミドルウェアでリクエストIDを設定する例です。

C#
app.Use(async (context, next) =>
{
string requestId = Guid.NewGuid().ToString("D");

context.Response.Headers["X-Request-Id"] = requestId;

Console.WriteLine($"RequestId: {requestId}");

await next();
});

ログ、レスポンスヘッダー、エラーメッセージなどに同じリクエストIDを含めると、ユーザーから問い合わせがあったときに該当するログを探しやすくなります。

C#
try
{
// 処理
}
catch (Exception ex)
{
Console.WriteLine($"RequestId: {requestId}, Error: {ex.Message}");
throw;
}

7. C#でUUID(GUID)を扱うときの注意点

7-1. Guid.NewGuidは完全な連番IDではない

Guid.NewGuid()で生成されるGUIDは、連番IDではありません。

C#
Console.WriteLine(Guid.NewGuid());
Console.WriteLine(Guid.NewGuid());

出力例です。

e1d2c3b4-a111-4f22-9a33-123456789abc
9f8e7d6c-b222-4a33-8b44-abcdef123456

このように、生成順に並ぶ値ではないため、IDを見ても作成順はわかりません。

作成順で並べたい場合は、CreatedAtのような日時カラムを別に持たせるのが一般的です。

C#
public class Item
{
public Guid Id { get; set; }
public DateTime CreatedAt { get; set; }
}

GUIDに作成日時の意味を持たせようとするのではなく、識別子と日時は別の項目として管理しましょう。

7-2. UUIDは重複しにくいが絶対ではない

UUIDは非常に重複しにくい識別子ですが、「数学的に絶対に重複しない」とまでは言い切れません。特にVersion 4 UUIDはランダム性に基づくため、理論上は衝突の可能性があります。

とはいえ、通常の業務システムでGuid.NewGuid()を使ってIDを生成する場合、重複を現実的に心配する場面は多くありません。

ただし、データベースの主キーやユニーク制約として使う場合は、必ずデータベース側にも一意制約を設定しましょう。

SQL
-- 例: SQL Serverのイメージ
CREATE UNIQUE INDEX IX_Users_Id ON Users(Id);

アプリケーション側で重複しにくいIDを作ることと、データベース側で一意性を保証することは別です。重要なデータでは、必ず保存先でも制約を持たせるべきです。

7-3. データベースのインデックス性能に注意する

GUIDをデータベースの主キーにするときは、インデックス性能に注意が必要です。

ランダムなGUIDをクラスター化インデックスのキーにすると、新しいデータがテーブルの末尾ではなくさまざまな位置に挿入される可能性があります。その結果、ページ分割やインデックス断片化が起きやすくなる場合があります。

対策としては、次のような方法があります。

C#
public class Entity
{
public long InternalId { get; set; } // DB内部用の連番ID
public Guid PublicId { get; set; } // 外部公開用のGUID
}

外部に見せるIDにはGUIDを使い、データベース内部の主キーには連番IDを使う設計です。

また、データベースによっては順序性のあるUUIDやシーケンシャルGUIDを利用できる場合もあります。高トラフィックなシステムや大量データを扱う場合は、GUIDを主キーにする影響を事前に検証しましょう。

7-4. セキュリティ用途で使う場合の注意点

GUIDは「重複しにくい識別子」として便利ですが、セキュリティトークンやパスワードリセットトークンとして安易に使うのは避けるべきです。

たとえば、次のような用途ではより慎重な設計が必要です。

C#
string token = Guid.NewGuid().ToString("N");

一時的な確認コード、認証トークン、パスワードリセットURLなど、セキュリティ上重要な値には、暗号学的に安全な乱数生成を使うことを検討しましょう。

.NETでは、RandomNumberGeneratorを使って安全なランダム値を生成できます。

C#
using System.Security.Cryptography;

byte[] bytes = RandomNumberGenerator.GetBytes(32);
string token = Convert.ToHexString(bytes).ToLowerInvariant();

Console.WriteLine(token);

GUIDはIDとしては便利ですが、「秘密情報」として扱う値には適していない場合があります。用途に応じて使い分けることが重要です。

7-5. 空のGUIDを判定する方法

空のGUIDかどうかを判定するには、Guid.Emptyと比較します。

C#
Guid id = Guid.Empty;

if (id == Guid.Empty)
{
Console.WriteLine("空のGUIDです。");
}

メソッドの引数でGUIDを受け取る場合も、未設定チェックとしてよく使います。

C#
public void UpdateUser(Guid userId)
{
if (userId == Guid.Empty)
{
throw new ArgumentException("userIdが空です。", nameof(userId));
}

// 更新処理
}

Guidは値型なので、通常のGuid変数にはnullは入りません。nullを許可したい場合は、Guid?を使います。

C#
Guid? id = null;

if (id == null)
{
Console.WriteLine("GUIDがnullです。");
}

Guid.Emptynullは別物です。未設定をGuid.Emptyで表すのか、Guid?nullで表すのかは、プロジェクト内でルールを統一しておくとよいでしょう。

8. よくあるエラーと対処法

8-1. Guid.Parseで例外が発生する原因

Guid.Parseでよくあるエラーは、文字列がGUIDの形式になっていないことです。

C#
string input = "abc";

Guid guid = Guid.Parse(input); // 例外

GUIDとして有効な文字列は、たとえば次のような形式です。

0f8fad5b-d9cb-469f-a165-70867728950e
0f8fad5bd9cb469fa16570867728950e
{0f8fad5b-d9cb-469f-a165-70867728950e}
(0f8fad5b-d9cb-469f-a165-70867728950e)

不正な文字列を受け取る可能性がある場合は、Guid.ParseではなくGuid.TryParseを使います。

C#
if (Guid.TryParse(input, out Guid guid))
{
Console.WriteLine(guid);
}
else
{
Console.WriteLine("GUID形式ではありません。");
}

ユーザー入力、URLパラメータ、外部APIの値は必ず検証してから使いましょう。

8-2. UUID文字列の形式が違う場合の対処法

UUID文字列には、ハイフン付き、ハイフンなし、波括弧付き、丸括弧付きなど複数の形式があります。

0f8fad5b-d9cb-469f-a165-70867728950e
0f8fad5bd9cb469fa16570867728950e
{0f8fad5b-d9cb-469f-a165-70867728950e}
(0f8fad5b-d9cb-469f-a165-70867728950e)

Guid.TryParseは複数の形式を受け付けられるため、形式に多少の揺れがある場合に便利です。

C#
bool ok = Guid.TryParse(input, out Guid guid);

一方で、「必ずハイフンなしの32桁だけを許可したい」など、形式を厳密にしたい場合はGuid.TryParseExactを使います。

C#
if (Guid.TryParseExact(input, "N", out Guid guid))
{
Console.WriteLine("ハイフンなしUUIDです。");
}

標準のハイフン付き形式だけを許可したい場合は、Dを指定します。

C#
if (Guid.TryParseExact(input, "D", out Guid guid))
{
Console.WriteLine("標準形式のUUIDです。");
}

8-3. nullや空文字を変換するときの注意点

nullや空文字をGuid.Parseで変換しようとすると、例外の原因になります。

C#
string? input = null;

Guid guid = Guid.Parse(input!); // 例外

空文字の場合も同様です。

C#
string input = "";

Guid guid = Guid.Parse(input); // 例外

安全に変換するには、string.IsNullOrWhiteSpaceで事前にチェックするか、Guid.TryParseを使います。

C#
string? input = "";

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("UUIDが入力されていません。");
}
else if (Guid.TryParse(input, out Guid guid))
{
Console.WriteLine(guid);
}
else
{
Console.WriteLine("UUID形式が正しくありません。");
}

Guid.TryParseを使えば、nullや空文字に対しても例外を避けて判定できます。

C#
if (!Guid.TryParse(input, out Guid guid))
{
Console.WriteLine("変換できません。");
}

外部入力を扱う場面では、例外を前提にするよりも、TryParseで正常系と異常系を分ける方が実装しやすいです。

8-4. ハイフンなしUUIDが変換できるか確認する

C#のGuid.ParseGuid.TryParseでは、ハイフンなしのUUIDも変換できます。

C#
string input = "0f8fad5bd9cb469fa16570867728950e";

if (Guid.TryParse(input, out Guid guid))
{
Console.WriteLine(guid);
}
else
{
Console.WriteLine("変換できません。");
}

出力例です。

0f8fad5b-d9cb-469f-a165-70867728950e

ハイフンなしで受け取り、ハイフン付きで出力したい場合は、いったんGuid型に変換してからToString("D")を使います。

C#
string input = "0f8fad5bd9cb469fa16570867728950e";

Guid guid = Guid.Parse(input);
string output = guid.ToString("D");

Console.WriteLine(output);

逆に、ハイフン付きで受け取り、ハイフンなしで出力したい場合はToString("N")を使います。

C#
string output = guid.ToString("N");

Replaceでハイフンを削除するよりも、Guidとして正しく変換してから書式指定する方が安全です。

9. C#のUUID(GUID)に関するよくある質問

9-1. C#でUUIDを生成するには何を使えばいい?

C#でUUIDを生成するには、Guid.NewGuid()を使います。

C#
Guid uuid = Guid.NewGuid();

文字列として取得したい場合は、ToString()を呼び出します。

C#
string uuid = Guid.NewGuid().ToString();

ハイフンなしで取得したい場合は、ToString("N")を使います。

C#
string uuid = Guid.NewGuid().ToString("N");

C#にはUUIDという名前の標準型はなく、UUID相当の値はGuid型で扱います。

9-2. UUIDとGUIDは同じもの?

C#で開発するうえでは、UUIDとGUIDはほぼ同じものとして扱えます。

UUIDは一般的な仕様上の呼び方で、GUIDはMicrosoft系の技術でよく使われる呼び方です。.NETではSystem.Guid型を使ってUUID相当の値を表します。

C#
Guid id = Guid.NewGuid();

そのため、「C#でUUIDを生成したい」と思った場合は、Guid.NewGuid()を使えば問題ありません。

9-3. Guid.NewGuidで生成した値は重複する?

Guid.NewGuid()で生成される値は非常に重複しにくいですが、理論上は絶対に重複しないとは言い切れません。

通常のアプリケーション開発では、GUIDの重複を現実的に心配する場面は多くありません。ただし、重要なIDとして使う場合は、データベース側にユニーク制約を設定して一意性を保証するのが安全です。

C#
Guid id = Guid.NewGuid();

アプリケーション側ではGUIDを生成し、保存先では主キーやユニークインデックスで重複を防ぐ設計にしましょう。

9-4. UUIDをハイフンなしで取得するには?

UUIDをハイフンなしで取得するには、ToString("N")を使います。

C#
string uuid = Guid.NewGuid().ToString("N");

Console.WriteLine(uuid);

出力例です。

0f8fad5bd9cb469fa16570867728950e

ハイフン付きの標準形式にしたい場合は、ToString("D")を使います。

C#
string uuid = Guid.NewGuid().ToString("D");

用途に応じて、D形式とN形式を使い分けましょう。

9-5. Guid.Emptyとは何?

Guid.Emptyは、すべての値が0のGUIDを表す定数です。

C#
Guid empty = Guid.Empty;

Console.WriteLine(empty);

出力は次のようになります。

00000000-0000-0000-0000-000000000000

Guid.Emptyは、GUIDが未設定であることを表すためによく使われます。

C#
if (id == Guid.Empty)
{
Console.WriteLine("IDが設定されていません。");
}

ただし、Guid.EmptyGuid型としては有効な値です。新しいUUIDを生成したい場合は、Guid.EmptyではなくGuid.NewGuid()を使います。

まとめ

C#でUUIDを生成する場合は、Guid.NewGuid()を使います。

C#
Guid id = Guid.NewGuid();

文字列として扱いたい場合は、ToString()を使います。標準的なハイフン付き形式にしたい場合はToString("D")、ハイフンなし形式にしたい場合はToString("N")を使います。

C#
string uuidWithHyphen = Guid.NewGuid().ToString("D");
string uuidWithoutHyphen = Guid.NewGuid().ToString("N");

文字列からGuid型に変換する場合は、Guid.ParseまたはGuid.TryParseを使います。外部入力やユーザー入力を扱う場合は、例外を避けるためにGuid.TryParseを使うのがおすすめです。

C#
if (Guid.TryParse(input, out Guid guid))
{
Console.WriteLine(guid);
}

また、空のGUIDを判定したい場合はGuid.Emptyと比較します。

C#
if (guid == Guid.Empty)
{
Console.WriteLine("空のGUIDです。");
}

UUID(GUID)は、ユーザーID、注文ID、ファイル名、APIのリクエストID、データベースの主キーなど、さまざまな場面で利用できます。ただし、連番IDではないこと、理論上は重複の可能性があること、データベースのインデックス性能に影響する場合があること、セキュリティトークン用途には注意が必要なことも理解しておきましょう。

C#でUUIDを扱う基本は、Guid.NewGuid()ToString()Guid.TryParse()Guid.Emptyの4つです。これらを押さえておけば、実務でも安全にGUIDを扱えるようになります。