IRONSOFTWAREHOME

C#フラグの理解

C# のバイナリ: 10 分以内でフラグを作成する

Tim Corey

8 分 32 秒

C#フラグは、開発者がビット演算を使用して権限やオプションを管理できる強力な機能ですが、見落とされがちです。 彼のビデオ"Binary in C#: Flags in 10 minutes or less"というビデオで、Tim Corey氏は、フラグがどのように機能し、C#でどのように効果的に活用できるかを簡潔明瞭に説明しています。 この記事では、C# フラグについて理解を深めるために、ティムの説明とビデオからの洞察を分解します。

フラグとは何ですか?

ティムは、フラグの概念を紹介することから始めます。 フラグを使うと、1つの変数に複数の値を割り当てることができるので、アプリケーションの権限管理に便利です。 これを説明するために、TimはSQL、WebServer、Redis、Azure、GitHub、BuildSystemのような様々な権限を含むSystemPermissionsという名前のenumを作成します。

Timは、Flagsがなければ、一つの変数に一度に一つの権限だけしか保持できないことを強調します。例えば、ユーザーにSystemPermissions.BuildSystemを同時に割り当てることはできませんが、これでは管理が煩雑になります。

フラグのない問題

この時点で、ティムは従来の列挙割り当ての限界を示す。 パーミッションを一度に1つずつ割り当てる場合、後でチェックするには配列を繰り返し処理する必要があり、非効率的でスケーラブルではありません。 これは、ティムが言うように、複数のパーミッションの管理が面倒になる"醜い"実装につながります。

フラグ属性の紹介

この問題を解決するために、Timはenumをビットフィールドとして扱うことができる[Flags]属性を紹介します。 彼は、各許可はビット単位のシフトを使用して一意のバイナリ値が割り当てられていることを説明します。

ティムは、0、1、2、3といった漸進的な数値を割り当てる代わりに、2の累乗を使用して値を割り当てます:

[Flags]
enum SystemPermissions
{
    None = 0,
    SQL = 1 << 0,       // 00000001
    WebServer = 1 << 1, // 00000010
    Redis = 1 << 2,     // 00000100
    Azure = 1 << 3,     // 00001000
    GitHub = 1 << 4,    // 00010000
    BuildSystem = 1 << 5 // 00100000
}

ティムは、ビットをシフトすることで、各パーミッションが重複することなく固有の値を持つようになり、複数のパーミッションを効率的に組み合わせることができるようになると説明しています。

フラグの割り当てと組み合わせ

その後、Tim はビット演算を使用して権限を割り当てたり組み合わせたりする方法を実演します。 彼は、ビットワイズOR(|)演算子を使用することで、ユーザーに複数の権限を割り当てることができると説明しています。

SystemPermissions timsPermissions = SystemPermissions.SQL | SystemPermissions.Redis | SystemPermissions.GitHub;

これはSQL、Redis、GitHubの権限をtimsPermissionsに割り当て、ビット演算を使用して一つの変数に格納します。

フラグで権限をチェックする

Flagsの主な利点の一つは、ビット単位のAND(&)演算子を使用して特定の権限が設定されているかどうかを確認できることです。 Timは、ユーザーが特定の権限を持っているかどうかを確認する方法を示します:

if ((timsPermissions & SystemPermissions.SQL) == SystemPermissions.SQL)
{
    Console.WriteLine("Tim has SQL access.");
}

Timは、このアプローチは配列をループするよりもはるかに効率的で、ビット単位の比較が素早くできることを強調しています。

パーミッションの削除

Timはまた、ビット単位のANDおよびNOT(~)演算子を使用して権限を削除する方法についても説明します。 SQL権限をtimsPermissionsから取り消す必要がある場合、次のように行います。

timsPermissions &= ~SystemPermissions.SQL;

他のパーミッションはそのままに、SQLパーミッションを効果的に削除します。

バイナリでのフラグの表示

Flags がどのように機能するかを視覚化するために、Tim は列挙値をバイナリ表現に変換することを提案します。 彼は、パーミッションのバイナリ値を表示するためにヘルパーメソッドを使用しています:

Console.WriteLine(Convert.ToString((int)timsPermissions, 2));

ティムは、enum内で個々のビットがどのように設定され、操作されているかを理解するのに役立つと説明しています。

なぜフラグを使用するのですか?

Timは最後に、なぜC#でFlagsが有用なのかを強調しています:

  • これらのツールは、1つの変数に複数の値を格納することができます。
  • これらのツールは、効率的な権限管理を可能にします。
  • このツールは、ビット演算を使用してパーミッションのチェックと変更を簡素化します。

また、Flagsは、ファイルパーミッション、ユーザーロール、アプリケーション設定などのシナリオで一般的に使用されることも指摘しています。

最終的な考え

ビデオを通して、ティム・コーリーは、C#フラグがどのように機能するかについて、明確かつ実用的なデモンストレーションを提供します。 [Flags]属性とビット演算を使用することで、複雑なデータ構造を必要とせず、複数の権限を効率的に管理できます。 複数の値を必要とする権限や設定を扱う場合、フラグは実装を簡素化する優れたツールです。

実践的な理解については、ティム・コーリーのビデオをご覧ください。ここでは、これらのコンセプトをステップごとに説明しています。フラグは最初は厄介に思えるかもしれませんが、そのバイナリ的な性質を理解すれば、C# 開発において信じられないほど便利な機能になります。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

OR
bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。