Visual Studio User Group

   ホーム      
 | 
  
   イベント      
 | 
  
   フォーラム      
 | 
  
   VSUG キャスト      
 | 
  
   記事      
 | 
  
   About VSUG   
会員サービス
メンバー ログイン
新規会員登録はこちら
MENU
ホーム
イベント
VSUG アカデミー
VSUG Day
Bar VSUG
過去のイベント
フォーラム
初心者フォーラム
Visual Studio
.NET 開発
プラットフォーム運用
フリートーク・お知らせ
フォーラムの利用案内
VSUG キャスト
第 1 回 近藤 和彦 氏
第 2 回 長沢 智治 氏
記事
連載
コラム
About VSUG
VSUGとは
フォーラムリーダー紹介
ガジェット
スタッフ日記
フォーラムグループ
初心者フォーラム
初心者なんでも相談室
Visual Studio
Visual Studio 2005
Visual Studio 旧環境
.NET 開発
Visual Basic
Visual C#
Visual C++/CLI その他
Web アプリケーション
リッチクライアント・UI コントロール
データベース・データアクセス
モバイル・スマートクライアント
.NET Framework
開発プロセス
マイグレーション・COM 相互運用
Office 開発・VSTO
Web ホスティングアプリケーション
ライティング・セキュアコード
プラットフォーム運用
運用管理
フリートーク・お知らせ
談話室
VSUGからのお知らせ
フォーラムの利用案内
インフォメーション
会員規約
会員登録
プライバシーポリシー
リンクポリシー
著作権について
スポンサーについて
お問い合わせ
オンライン状態
オンライン状況 オンライン状態:
未登録ユーザー 未登録ユーザー: 218
登録ユーザー 登録ユーザー: 0
計 計: 218

オンライン中のユーザー オンライン中のユーザー:

 
  VSUG フォーラム  .NET 開発  Visual C#  enumについて
前へ 前へ
 
次へ 次へ
新しい投稿 2009/06/10 15:59
ユーザーはオフラインです。 InoFu
27件の投稿
ランキングデータがありません


enumについて 
言語:C# / Ver:2008 / プラットフォーム:Windows XP
お世話になります。

下記のようにenumを用いた場合、引数に渡したenumはどのように受け取れるかが、解りません。

enum DataList
{
  A,B,C
}
private void test(DataList data)
{
  //ここのDataListの引数が解らない
}

//実行
test(DataList.A & DataList.B);

これを実行した場合、test内での引数dataにて、DataList.AとDataList.Bを引数として渡したいのですが、
デバッグにて確認すると、引数dataにはDataList.Aのみ渡されています。

DataList.AとDataList.Bを取得する方法をご存じの方、ご教授願います。
 
新しい投稿 2009/06/10 16:30
ユーザーはオフラインです。 Hongliang
113件の投稿
dummy
10位


Re: enumについて 
修正者: Hongliang   2009/06/10 16:34:14)

組み合わせ可能な列挙体には、Flags 属性を付けるのが一般的です。

Flags 属性の解説のサンプルコードに各メンバの値の定義の仕方もありますが、Flags 属性だけではダメで、それぞれに値を設定しなければなりません。一般的には、2 の n 乗の値をそれぞれ設定します。0 は他の値と組み合わせることはできないため、None 的な項目に割り振ることが多いでしょう。

組み合わせ可能な列挙体 A と B を組み合わせることを指定するには、| ビット演算子を使用します。& 演算子は、「両者の各ビットが両方立っているビットだけ立てる」演算を行うので、2 進数 01 と 10 を & したら 0 が返ってしまいます。お試しのコードで DataList.A が渡されるのは、列挙体は特に指定しなければ 0 から値が割り振られること、および & 演算子の使用によるものですね(0 と任意の数値を & 演算したら必ず 0 になります)。

[追記] 組み合わされた列挙値に特定の値が含まれているかどうかを確認するのに、& 演算子が利用されます。

 
新しい投稿 2009/06/10 16:32
ユーザーはオフラインです。 Shinichi Aoyagi
99件の投稿
ランキングデータがありません


Re: enumについて 

とりあえず
http://msdn.microsoft.com/ja-jp/library/sbbt4032(VS.80).aspx
を読んでみてください。
もう、ほとんどそのまま答えが書いてあります。
なので、説明は省略しますが、以下のようになると思います。

[Flag]
enum DataList
{
  A = 1, B = 2, C = 4
}
private void test(DataList data)
{
    if ((data & DataList.A) != 0)
    {
        // A です
    }
    if ((data & DataList.B) != 0)
    {
        // B です
    }
}

ところで、
test(DataList.A & DataList.B);
じゃなくて
test(DataList.A | DataList.B);
ですよね?


青柳 臣一 (Shinichi Aoyagi)
 
新しい投稿 2009/06/10 17:03
ユーザーはオフラインです。 InoFu
27件の投稿
ランキングデータがありません


Re: enumについて 

Hongliang様、青柳様

早速のご回答ありがとうございます。

Flags属性を付けることで解決しました。

ありがとうございました。

 

 ところで、
test(DataList.A & DataList.B);
じゃなくて
test(DataList.A | DataList.B);
ですよね?

はい。間違えていました。
ご指摘ありがとうございます。

 

 
新しい投稿 2009/06/10 17:53
ユーザーはオフラインです。 Shinichi Aoyagi
99件の投稿
ランキングデータがありません


Re: enumについて 

 InoFu

Flags属性を付けることで解決しました。

便宜上、こう表現しただけだと思いますが、念のため。

http://msdn.microsoft.com/ja-jp/library/sbbt4032(VS.80).aspx
にあるとおり、Flags 属性は
「ビットごとの OR 演算と組み合わされている要素を含む列挙体に System.FlagsAttribute を適用すると、一部のツールで enum を使用するときに、その動作に属性が反映されます。」
というものです。
要するに、Flags を付けると一部のツールでうれしいことがあるかもしれない、というだけであって、Flags を付けたからと言ってビット演算ができるようになるわけではありません。
1, 2, 4, 8 といったビット演算できるような値にしたり、アンドやオアを取って正しくビット演算したりするのはコードを書く人の責任です。


青柳 臣一 (Shinichi Aoyagi)
 
 1/1ページ
前へ 前へ
 
次へ 次へ
  VSUG フォーラム  .NET 開発  Visual C#  enumについて
ログイン | © Visual Studio User Group. All rights reserved. 著作権について | プライバシーポリシー | リンクポリシー | お問合せ