Flags()の意味は?

解決


ぽんた  2011-12-21 01:25:37  No: 147416

次のようなコードがあります。

<Flags()> Enum LanCmdFlag
    PenDown = (2 ^ 7)
    Calibration = (2 ^ 6)
    None = 0
End Enum

この中で、<Flags()>は何を意味するのでしょうか。
ネットで調べようとしましたが、調べ方が悪いのか
それらしき回答を引き出せませんでした。


魔界の仮面弁士  2011-12-21 03:27:31  No: 147417

> この中で、<Flags()>は何を意味するのでしょうか。
FlagsAttribute 属性は、その列挙値がビット単位のフラグ値として
利用されるものであることを意味します。

ビットフラグとして利用される列挙体は幾つかありますが、
ここでは AnchorStyles 列挙体を例に挙げてみます。

AnchorStyles は <Flags()> が付与されており、各メンバーは
  None = 0
  Top = 1
  Bottom = 2
  Left = 4
  Right = 8
です。

これらは、コントロールの Anchor プロパティで利用される値であり、
上記の値の組み合わせで、コントロールの固定位置を制御できます。

これらの整数値の組み合わせで考えてみると、
  0 => None
  1 => Top
  2 => Bottom
  3 => Top, Bottom
  4 => Left
  5 => Top, Left
  6 => Bottom, Left
  7 => Top, Bottom, Left
  8 => Right
  9 => Top, Right
 10 => Bottom, Right
 11 => Top, Bottom, Right
 12 => Left, Right
 13 => Top, Left, Right
 14 => Bottom, Left, Right
 15 => Top, Bottom, Left, Right
という 16 パターンになっているわけですね。

一方、<Flags()> が付かないものは、単一指定を目的としています。

たとえば Form の FormBorderStyle プロパティ(FormBorderStyle 列挙体)の場合、
複数の枠線が同時に適用されることはありえませんよね。このように、
排他指定的に使われるものに対しては、Flags が付きません。

実験のため、下記のようなコードを試してみてください。
  Dim x, y, z As LanCmdFlag
  x = LanCmdFlag.Calibration
  y = LanCmdFlag.PenDown
  z = x Or y

  Label1.Text = x.ToString()
  Label2.Text = y.ToString()
  Label3.Text = z.ToString()

  TextBox1.Text = CInt(x).ToString()
  TextBox2.Text = CInt(y).ToString()
  TextBox3.Text = CInt(z).ToString()

そして次に、Flags の属性を外した状態で実行して、
両者の違いを確認してみてください。Label3 に変化が現れるはずです。

なお、列挙型に英語の名前を付ける場合には、
Flags() が指定される場合に限り「複数形」を利用し、
それ以外のケースでは「単数形」で命名するのが一般的です。
http://msdn.microsoft.com/ja-jp/library/cc433257.aspx
http://msdn.microsoft.com/ja-jp/library/bb264486.aspx

すべてがこの命名パターンというわけではありませんが、
少なくとも FormBorderStyle と AnchorStyles では、
この複数形/単数形のルールに則っていることが分かりますね。

> それらしき回答を引き出せませんでした。
求める回答になっているかどうかは分かりませんが、関連情報として。
http://www.atmarkit.co.jp/fdotnet/dotnettips/1052enumflags/enumflags.html


ぽんた  2011-12-21 07:28:27  No: 147418

魔界の仮面弁士さん、早速のご回答ありがとうございます。
的確なご返答ありがとうございます。まさにこれです。

<Flags()>属性を付与することで、Enum型が
ビットフラグとして機能することが分かりました。
TextBox1.Text 01000000( 64)
TextBox2.Text 10000000(128)
TextBox3.Text 11000000(192)

所用のためVBを始めて触ることになったのですが、
ちょっと変なところに属性宣言があるなぁという違和感が残ります。

言語が持っている特有のクセだけは覚えないとないようですね。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加