質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1430閲覧

複数から選択を書くのも使うのも楽に

meshkit

総合スコア72

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/02/14 00:23

前提・実現したいこと

VisualStudio2015proで、C#のソフトを開発しています。

複数のモードの選択と取得を楽にしたいです。
A)enumは、使うときに、
if(NowMode==eModeModel.Amode)
とNowModeとの比較が必要。
登録は、NowMode=eModeModel.Bmode;
常にNowModeとenumを意識する必要あり。
設定は比較的簡単。

B)Propertyは、使うときに、
if(IsAmode)
とシンプル。
登録は、IsBmode=true;
だけでよい。
設定は数が増えると大変。設定のためのメソッドを書きたくなる。

どちらがよいか、もっといい方法があるか、ご示唆ください。
Combobox.SelectedChangedとかみたいなのをコードだけで書けたらいいと思っています。

みなさま、こういうときって、どうなさってます?

該当のソースコード

C#

1A)enum 2 public enum eModeModel 3 { 4 Amode = 0, 5 Bmode = 1, 6 Cmode = 2 7 } 8 9 public static eModeModel NowMode { get; set; } = eModeModel.Amode; 10

C#

1B)bool(Property) 2 public static bool IsAmode 3 { 4 get 5 { 6 return isAmode; 7 } 8 set 9 { 10 isAmode = value; 11 isBmode = !value; 12 isCmode = !value; 13 } 14 } 15 private static bool isAmode = true; 16 public static bool IsBmode 17 { 18 get 19 { 20 return isBmode; 21 } 22 set 23 { 24 isAmode = !value; 25 isBmode = value; 26 isCmode = !value; 27 } 28 } 29 private static bool isBmode = false; 30 public static bool IsCmode 31 { 32 get 33 { 34 return isCmode; 35 } 36 set 37 { 38 isAmode = !value; 39 isBmode = !value; 40 isCmode = value; 41 } 42 } 43 private static bool isCmode = false; 44

補足情報(FW/ツールのバージョンなど)

Visual Studio 2015 pro

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/02/14 02:28

こういう場合、二つの方法のメリット・デメリットを比較するのですが、方法 A のデメリットがよくわかりませんでした。B はソースが煩雑になるという明確な欠点がありますが、何を悩んでいるのでしょうか?
meshkit

2018/02/14 05:28

常にNowModeとenumを意識する必要あり
Zuishin

2018/02/14 05:31

意味がわかりません。モードが違うなら意識するのは当然です。B でも意識する必要があります。
meshkit

2018/02/14 05:37

単純にNowMode==と書くのがいや、ということです。
Zuishin

2018/02/14 05:38

わからないけどわかりました。
meshkit

2018/02/14 05:53

ありがとうございます。すみません。
guest

回答3

0

具体的にその列挙体やプロパティで何をしたいかによります。
ざっくり分けると、次のように大別できるのではないでしょうか。

処理を丸ごと切り替えるような用途であればポリモーフィズム
オプションフラグ(複数のフラグの組合せ)のような用途であればビットフラグ

<ビットプラグの例>
例えば System.Windows.Forms 名前空間に AnchorStyles という列挙体があります。
これはコントロールのアンカーの方向を意味する列挙体ですが、これはビットフラグになっています。
右上は Right | Top で表すことができます。
ビットフラグでない場合、「右上」も一つの列挙値として定義することになりますが、「右が指定されているかどうか」を判断するときには「右」または「右上」であるかのようなロジックが必要になります。このような複数の値の組合せを表現したい場合はビットフラグが適しています。

投稿2018/02/14 02:41

編集2018/02/14 03:39
masa_n

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/02/14 06:27

ありがとうございます。情報を整理していただいて、ポリモーフィズムとビットフラグの基礎的な知識を整理できました。勉強になりました。 感謝します。
guest

0

クラスにモードを持たせるより、モードでクラスを分けてインターフェースを作った方が扱いやすいかと思います。(ポリモーフィズム)

C#

1 2interface IClassWithMode 3{ 4 // モードで分岐させたい処理 5 void PrintName(); 6} 7 8class AModeClass : IClassWithMode 9{ 10 public void PrintName() => Console.WriteLine("Amode!"); 11} 12 13class BModeClass : IClassWithMode 14{ 15 public void PrintName() => Console.WriteLine("Bmode!"); 16} 17 18class CModeClass : IClassWithMode 19{ 20 public void PrintName() => Console.WriteLine("Cmode!"); 21} 22 23class NullModeClass : IClassWithMode 24{ 25 // 何もしない 26 public void PrintName(){} 27} 28 29static class ClassWithModeFactory 30{ 31 // インスタンス生成時に分岐させる 32 static public IClassWithMode Create(string str) 33 { 34 if (str == "A") 35 { 36 return new AModeClass(); 37 } 38 else if (str == "B") 39 { 40 return new BModeClass(); 41 } 42 else if (str == "C") 43 { 44 return new CModeClass(); 45 } 46 47 return new NullModeClass(); 48 } 49} 50 51class MainClass 52{ 53 static void Main(string[] args) 54 { 55 var line = Console.ReadLine(); 56 57 // 文字列に応じたインスタンスを生成 58 IClassWithMode classWithMode = ClassWithModeFactory.Create(line); 59 60 // インスタンスに応じた処理をやってくれる 61 classWithMode?.PrintName(); 62 } 63} 64

投稿2018/02/14 01:38

YamakawaJunichi

総合スコア630

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/02/14 06:25

ありがとうございます。今回使っているプロジェクトで、まさにモードでクラスをわけて作っています。 とても勉強になりました。 今回の場合は単にビットフラグで足りました。 感謝します。
guest

0

ベストアンサー

Combobox云々は良くわからないですが、ビットフラグを使用したほうがスッキリすると思います。

C#

1public static class Hoge 2{ 3 public enum eModeModel 4 { 5 Amode = 1 << 0, 6 Bmode = 1 << 1, 7 Cmode = 1 << 2 8 } 9 10 public static eModeModel NowMode { get; set; } = eModeModel.Amode; 11 12 public static bool IsAmode 13 { 14 get { return (NowMode & eModeModel.Amode) == eModeModel.Amode; } 15 } 16 public static bool IsBmode 17 { 18 get { return (NowMode & eModeModel.Bmode) == eModeModel.Bmode; } 19 } 20 public static bool IsCmode 21 { 22 get{ return (NowMode & eModeModel.Cmode) == eModeModel.Cmode; } 23 } 24}

C#

1Hoge.NowMode = Hoge.eModeModel.Amode; 2//Hoge.IsAmode == true 3 4Hoge.NowMode = Hoge.eModeModel.Bmode; 5//Hoge.IsBmode == true 6 7Hoge.NowMode = Hoge.eModeModel.Cmode; 8//Hoge.IsCmode == true 9 10//ビットフラグなので、同時もOK 11Hoge.NowMode = Hoge.eModeModel.Amode | Hoge.eModeModel.Bmode; 12// Hoge.IsAmode == true, Hoge.IsBmode == true 13 14//直接比較してももちろんOK 15if( Hoge.NowMode == Hoge.eModeModel.Amode ) 16{ 17}

投稿2018/02/14 01:31

ebiryo

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meshkit

2018/02/14 06:22

ありがとうございます。A,Bふたつを組み合わせていただいた感じですね。 今回は、単にビットフラグであればよいので、こちらをベストアンサーにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問