🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

2回答

2766閲覧

C# コンストラクタの引数によってメソッドの内容を変える

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

.NET Framework 3.5

.NET Framework-3.5は、NET Framework 2.0にアセンブリを追加(3.0も含む)したものをベースにしています。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2019/11/03 04:02

コンストラクタの引数によってMethod()の内容を変えたいです。
条件分岐(Switch)を使うのとデリゲートを使う方法を考えたのですが、Method()は頻回(具体的には約100ms毎)に実行するのでできるだけ処理を早くしたいです。
どちらが速く処理できるのか、また他にいい方法があれば教えて下さい。よろしくお願いします。

c#

1//共通部分 2class Program 3 { 4 static void Main(string[] args) 5 { 6 Sample sample = new Sample(Type.B); //"BBB"と表示 7 sample.Method(); 8 Console.ReadLine(); 9 } 10 } 11public enum Type 12 { 13 A, B, C 14 }

c#

1//毎回switchで条件分岐 2public class Sample 3 { 4 public Sample(Type type) 5 { 6 this.type = type; 7 } 8 Type type; 9 public void Method() 10 { 11 switch (type) 12 { 13 case Type.A: 14 A(); 15 break; 16 case Type.B: 17 B(); 18 break; 19 case Type.C: 20 C(); 21 break; 22 } 23 } 24 public void A() 25 { 26 Console.WriteLine("AAA"); 27 } 28 public void B() 29 { 30 Console.WriteLine("BBB"); 31 } 32 public void C() 33 { 34 Console.WriteLine("CCC"); 35 } 36 }

c#

1//条件分岐は初回のみ、毎回デリゲート経由 2public class Sample 3 { 4 public Sample(Type type) 5 { 6 switch (type) 7 { 8 case Type.A: 9 Method = A; 10 break; 11 case Type.B: 12 Method = B; 13 break; 14 case Type.C: 15 Method = C; 16 break; 17 } 18 } 19 public Action Method; 20 public void A() 21 { 22 Console.WriteLine("AAA"); 23 } 24 public void B() 25 { 26 Console.WriteLine("BBB"); 27 } 28 public void C() 29 { 30 Console.WriteLine("CCC"); 31 } 32 }

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

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

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

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

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

m.ts10806

2019/11/03 04:23

処理速度って自分で計測できるのでは
guest

回答2

0

デリゲート経由の方が速い(はず)ですが、環境や中身によって異なるかも知れないので自分で検証してください

それより気になる点が一つ

ところで100回/msと書いてありますが、よほどの量のコードをコンストラクタに書かない限り、new演算子の速度の方が問題になると思いますが対策してますか?

new演算子は(勿論これも環境によりますが)滅茶苦茶重いです
かの負荷が大きいことで有名な除算演算子のスピードが無視できるほどですから相当です。

当然コンストラクタはnewと共に使うものですから、もしコンストラクタが重いと感じてこのような質問をしたならnewを極力減らすようにしてください。

投稿2019/11/03 04:26

編集2019/11/03 04:31
KanazawaKureha

総合スコア368

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

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

KanazawaKureha

2019/11/03 04:30

DRAM搭載かSRAM搭載かでも違うと思うので要検証ですが参考までに
退会済みユーザー

退会済みユーザー

2019/11/03 05:12

今回はnewを頻繁に実行するのではなくMethod()を頻繁に実行するものでしたが、覚えておいて気をつけるようにします。ありがとうございます!
KanazawaKureha

2019/11/03 05:26

勘違いしていました。すみません。
guest

0

ベストアンサー

ファクトリーを作れば良いのではないでしょうか。

C#

1using System; 2 3namespace ConsoleApp1 4{ 5 public enum ClassType 6 { 7 A, B, C 8 } 9 10 public abstract class SuperClass 11 { 12 public abstract void Method(); 13 14 public static SuperClass Create(ClassType type) 15 { 16 switch (type) 17 { 18 case ClassType.A: 19 return new SubClassA(); 20 case ClassType.B: 21 return new SubClassB(); 22 case ClassType.C: 23 return new SubClassC(); 24 default: 25 throw new ArgumentException(nameof(type)); 26 } 27 } 28 29 private class SubClassA : SuperClass 30 { 31 public override void Method() 32 { 33 Console.WriteLine("Class A"); 34 } 35 } 36 37 private class SubClassB : SuperClass 38 { 39 public override void Method() 40 { 41 Console.WriteLine("Class B"); 42 } 43 } 44 45 private class SubClassC : SuperClass 46 { 47 public override void Method() 48 { 49 Console.WriteLine("Class C"); 50 } 51 } 52 } 53 54 55 class Program 56 { 57 static void Main() 58 { 59 SuperClass.Create(ClassType.A).Method(); 60 SuperClass.Create(ClassType.B).Method(); 61 SuperClass.Create(ClassType.C).Method(); 62 Console.ReadKey(); 63 } 64 } 65}

投稿2019/11/03 04:22

Zuishin

総合スコア28669

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

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

Zuishin

2019/11/03 04:46

理論上は私の回答が最も速くなるはずですが、実測してみると有意な差は出ないんじゃないかと思います。
退会済みユーザー

退会済みユーザー

2019/11/03 05:09

思いつきませんでした。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問