C#8でGUIDを操作する方法

アプリケーションで作業するときは、グローバル一意識別子(GUID)を使用する必要がある場合があります。SQLデータベースの主キーなどの一意の識別子により、顧客や請求書などの重要なオブジェクトが重複したり上書きされたりすることはありません。一意の識別子がなければ、データの損失を防ぎ、アプリケーションのデータの整合性を確保することはできませんでした。 

グローバル一意識別子またはGUIDは、巨大な識別番号を表します。これは、データベースのような単一のシステムだけでなく、複数のシステムや分散アプリケーション間で一意であることが数学的に保証されるほど大きい番号です。この記事では、GUIDが必要な理由と、C#8.0でGUIDを操作する方法について説明します。

この記事で提供されているコード例を使用するには、システムにVisual Studio2019がインストールされている必要があります。まだコピーをお持ちでない場合は、こちらからVisual Studio2019をダウンロードできます。 

VisualStudioでコンソールアプリケーションプロジェクトを作成します

まず、VisualStudioで.NETCoreコンソールアプリケーションプロジェクトを作成しましょう。Visual Studio 2019がシステムにインストールされていると仮定して、以下に概説する手順に従って、VisualStudioで新しい.NETCoreコンソールアプリケーションプロジェクトを作成します。

  1. Visual StudioIDEを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. 「新規プロジェクトの作成」ウィンドウで、表示されたテンプレートのリストから「コンソールアプリ(.NETCore)」を選択します。
  4. [次へ]をクリックします。
  5. 次に表示される[新しいプロジェクトの構成]ウィンドウで、新しいプロジェクトの名前と場所を指定します。
  6. [作成]をクリックします。

これにより、Visual Studio2019で新しい.NETCoreコンソールアプリケーションプロジェクトが作成されます。このプロジェクトを使用して、この記事の後続のセクションでGUIDを操作します。ここではC#8を使用するため、プロジェクトの言語バージョンを更新することをお勧めします。

なぜGUIDが必要なのですか?

モバイルアプリケーションでオンラインモードとオフラインモードの両方で利用できるPOSアプリケーションがあるとします。アプリケーションが1から自動的に生成されるID番号を提供するとします。接続が復元されたときにオフラインデータをマージするにはどうすればよいですか?ID番号が両方のモードで生成された場合はどうなりますか?衝突する可能性がありますよね?重複するID番号をどのように処理しますか?これは間違いなく処理できますが、多くのコードを作成する必要があります。これは、やりたいことではありません。

ここでGUIDが役に立ちます。GUIDは、128ビット長の巨大な数値であり、ほぼ一意です。なぜほとんどユニークなのですか?なぜそれがユニークであると言えないのですか?基本的に、可能なGUIDの数は非常に多いため、衝突の可能性は非常に低くなります。それにもかかわらず、衝突の可能性はゼロではありません。 

GUIDをデータベーステーブルの主キーにすることで、GUIDを利用できます。GUIDを使用すると、2つ以上のデータベースをマージするときにマージの競合を回避するのにも役立ちます。GUIDのもう1つの利点は、GUIDをオフラインで生成できることです。つまり、ネットワークやインターネットに接続する必要はありません。

GUIDはどのように表されますか?

以下はGUIDの例です。GUIDは通常128ビット長であり、16進数で表されることに注意してください。

eaa24756-3fac-4e46-b4bb-074ff4f5b846

GUIDは、8-4-4-4-12のチャンクにグループ化された32桁の16進数の明確に定義されたシーケンスとして編成されます。したがって、最大2 ^ 128のGUIDを持つことができます。

C#8でGUIDを作成する

このセクションでは、C#でGUIDを操作する方法を学習します。System名前空間の一部として使用可能なGuid構造体を使用して、.NETでGUIDを作成できます。C#でGUIDを生成する最も簡単な方法は次のとおりです。前に作成したプロジェクトのProgram.csファイルのMain()メソッドに次のコードを記述します。

Guid obj = Guid.NewGuid();

Console.WriteLine( "新しく作成されたGUIDは次のとおりです:" + obj.ToString());

Console.ReadKey();

C#8で空のGUIDを作成する

Guidは構造体であるため、値型であり、nullに設定することはできません。空のGuidを作成するには、次のコードを記述します。

Guid id = new Guid();

if(id == Guid.Empty)

Console.WriteLine( "GUIDが空です");

Guid.Emptyの値は00000000-0000-0000-0000-000000000000です。空のGUIDを利用して、それを別のGUIDオブジェクトと比較し、ゼロ以外であるかどうかを判断できます。次のコードスニペットはこれを示しています。 

if(guid!= Guid.Empty){ 

  // GUIDオブジェクトにゼロ以外の値が含まれています

}

そうしないと

{{

  // GUIDオブジェクトが空です

GUIDがGuid.Emptyであるかどうかを判断する簡単な拡張メソッドを次に示します。 

public static bool IsNullOrEmpty(this Guid guid)

{{

  return(guid == Guid.Empty);

次の拡張メソッドを使用して、null許容GUIDがnullかどうかを確認することもできます。 

public static bool IsNullOrEmpty(this Guid?guid)

{{

  if(guid.HasValue)

    if(guid == default(Guid))

        trueを返します。

    falseを返します。

}

default(Guid)はGuid.Emptyと同じであることに注意してください。

GUIDをC#8の文字列に変換する

GUIDを文字列に変換することもできます。次のコードスニペットは、空のGUIDを文字列に変換する方法を示しています。

文字列str = Guid.Empty.ToString();

Console.WriteLine(str);

GUIDを使用する際の主な注意点が1つあることに注意してください。衝突が発生する可能性があります。GUIDはある程度のスペースを占有し、順番に生成されないことにも注意してください。ただし、2つのULong値を使用して表すことができる128ビット整数を使用し、それを順次インクリメントすることにより、プログラムでGUIDを一意にすることができます。 

アプリケーションでは、GUIDを文字列に変換することがよくあります。GUIDデータをデータコントロールにバインドするため、またはGUIDをユーザーインターフェイスに渡すために、これを行う必要がある場合があります。GUIDオブジェクトを文字列に変換して、要件に応じてGUIDデータをフォーマットすることもできます。

GUIDはいくつかの異なる方法で作成できます。これらには、ランダム、時間ベース、ハードウェアベース、およびコンテンツベース(つまり、データのMD5またはSHA-1ハッシュ値に基づく)が含まれます。これらすべての方法とGUIDのその他の高度な機能については、今後の記事で説明します。

C#でより多くのことを行う方法

  • C#で抽象クラスとインターフェイスを使用する場合
  • C#でAutoMapperを操作する方法
  • C#でラムダ式を使用する方法
  • C#でAction、Func、およびPredicateデリゲートを操作する方法
  • C#でデリゲートを操作する方法
  • C#で簡単なロガーを実装する方法
  • C#で属性を操作する方法
  • C#でlog4netを操作する方法
  • C#でリポジトリデザインパターンを実装する方法
  • C#でリフレクションを操作する方法
  • C#でfilesystemwatcherを操作する方法
  • C#でレイジー初期化を実行する方法
  • C#でMSMQを操作する方法
  • C#で拡張メソッドを操作する方法
  • C#でラムダ式を使用する方法
  • C#でvolatileキーワードを使用する場合
  • C#でyieldキーワードを使用する方法
  • C#でポリモーフィズムを実装する方法
  • C#で独自のタスクスケジューラを構築する方法
  • C#でRabbitMQを操作する方法
  • C#でタプルを操作する方法
  • C#での仮想メソッドと抽象メソッドの調査