- ベストアンサー
C# 定数定義
c#での定数定義についてですが、定数用のclassを定義したのですが この場合、定数を使用する各classで継承をしなくてはいけないですが、もっといいやり方等があれば教えてください。 public abstract class define { public const short NET_BUFF = 1024; } class testMain:define { : :
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なにかネットワークに対し送受信を行うようなプログラムを作成しているのでしょうか。 C言語の流儀をそのままC#やJAVAのようなオブジェクト指向言語に持ってこようとすると、クラス設計がいびつになるような気がします。 適当なベースクラスを用意して、実際に送受信を担当するクラスにのみ継承させてはいかがでしょうか。 C#は多重継承を許可していないので、汎化・特化の関係もないものにまで継承させるようにすると、無理が出てきます。 送受信の成否やデータの終了等を判別したいのであれば、担当するクラスに適当なプロパティを持たせるか、戻り値に判別できるような値を返してはいかがでしょう。 abstract class MyStream { const short BufferSize = 1024; abstract char[] Read(); abstract bool EndOfStream { get; } } class MyStreamA : MyStream { //abstractメンバの実装 } class MyStreamB : MyStream { //abstractメンバの実装 } MyStream stream = new MyStreamA(); while(!stream.EndOfStream) { char[] buf; buf = stream.Read(); //bufを使った処理 }
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
static public class define { public const short NET_BUFF = 1024; } class testMain { short a = define.NET_BUFF; : : でどうですか?
お礼
ご回答ありがとうございます。 当方も同じような方法も考えたのですが、 c言語の場合 #deinfe NET_BUFF 1024 short a = NET_BUFF; c言語のようにNET_BUFFのみにしたいのですがなにかいい方法はないでしょうか。
- chie65536
- ベストアンサー率41% (2512/6032)
#define NET_BUFF 1024 と書くのが普通。 貴方のコードでは「NET_BUFF」を参照するたびに、イミディエイト値をロードするコードが生成されず、変数から値がロードされるコードが生成される。 また「a = NET_BUFF + 1」とか書くと「変数から1024を取りだし、それに1を加算し、aにストアするコード」が生成される。 それ以前に char rcv_buf[NET_BUFF + 1]; って書いた時、コンパイル出来るんだろうか?コンパイルさえ出来ない気がする。 しかも、defineクラスの実体をどこかで生成しなければならず、それもコードが無駄。 もし「プログラミングで給料貰ってる人間」がこんなソース書いたら、上司から「給料半分返すか、それとも明日から永久に会社休むか、どっちが良い?」って言われると思う。 プリプロセッサ命令を1から勉強し直して来て下さい。
お礼
ご回答ありがとうございます。 初歩的な質問ですが、 c言語の場合 #define NET_BUFF 1024 とするのはわかりますが、c#の場合#defineでシンボルの後に数値等の 定義が出来ないと思うのですがそれは当方の勉強不足なのでしょうか。
お礼
ご回答ありがとうございます。 当方もいろいろ考えてみましたが、どうしてもC言語の考え方をしてしまいます。 やはり、hofuhofu様の様な方法が良いのかもしれません。 まだまだc#初心者ですがいろいろ検証してみたいと思います。