- ベストアンサー
C#の仕様についての要約
- C#の仕様について初心者が疑問に思ったことについてまとめました。開発環境の反応やプログラムの規模に関して考えた際、アセンブリの分割やinternalの使用、DllImportの引数における初期化などについて解説しています。
- C#の仕様についての初心者の疑問について解説します。プログラムの規模が大きくなる場合、アセンブリの分割やinternalの使用が重要になります。またDllImportの引数における初期化方法についても詳しく説明しています。
- C#の初心者が疑問に思う仕様についてまとめました。プログラムの規模が大きくなる場合、アセンブリの分割やinternalの使用が考えられます。またDllImportの引数における初期化方法についても解説しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
昨日はガラケー(笑)からだったので今日はパソから‥ >今のところC#はマルチプラットフォームではないのと~、通常時でも実測値でネイティブC++がだいぶ早いという感じがあるのと~ そうですね。 私もC#など.NET部分を活用するのは主にGUI部分だけで、画像や音声処理は未だネイティブCでやってます。 ただ、.NET4にはparalellクラスというのがあって、普通ならマルチスレッドにしないとできないようなことを、 簡単に並列化できるのでなかなかおもしろい機能もありますよ。 >起動時に関してはやっぱり圧倒的な時間差があること~ これはどうしようもないですね。 >refだと表記上も書かないといけないですが~それでもそれ以前にすでに0初期化されるんですか。 申し訳ありません、これは私の指摘ミスです。 C#はローカル変数は暗黙の初期化はされなかったですね。(コンパイルエラーでインラインに出ますね) 最近は仕事の関係でもっぱらVB.NETだったもんでこんがらがってました。 >少なくともoutによる参照渡しとrefによる参照渡しでは ここも、out修飾子をout属性と勘違いして指摘してました。申し訳ありません。 >その辺はDllImportの場合(自分のアセンブリ内のことしか)関知しないってことでしょうか? う~ん、確かに、あんまり考えたことがなかったですが、そういうことでしょうね。 関与しないっていうか関与できないって感じですが。 普段あんまりoutを使わない(私の所ではoutに慣れない人も多いので基本refしか使わないです)ので あまり気にしたことがないです。 >>整数や浮動小数点数などの多くの値型は blittable 型なのでマーシャリングは必要ありません マーシャリングが必要無いというか、結果的にマーシャリングが必要ないように作られているという方が正しいと私は理解しています。 同じくMSDNですが、↓のページはマーシャリング時のメモリの概念が図解されていてわかりやすいです。 http://msdn.microsoft.com/ja-jp/library/23acw07k(v=vs.100).aspx >C#では値型はスタック上に確保されると聞きました。 >C++(あるいはC)でいうローカル変数が確保される時のそれと、まったく同じものと考えていいのでしょうか? スタックに関してはその理解で問題無いと思います。私も同じように理解しています。 >(3)のようなconstメンバ関数は、C#にはない ないですね。 >(5)も、ない(?) ないです。C#はメンバ変数にアクセスするのはドット演算子だけになっています。 >そんで、今分かんないのは(4)の用にconstポインタ或いは~ const参照の引数も無いです。 これに関しては「なにぃ!」という人が多いのですが 私はそんなに困ったことがないです(笑)
その他の回答 (1)
- osakanasensei
- ベストアンサー率47% (9/19)
>10万行規模の開発 今どき全く問題ありません。 >アセンブリの分割が必要か アセンブリの分割は設計によると思います。 静的ロードの場合、必要なDLLは起動時に読み込まれるので、 分割してようがしてまいがほとんど変わりはありません。 >internal 他のアセンブリに触られたくない場合に使用します。 ただし、厳密には他のアセンブリから絶対触れないようにすることを 保証しているわけではありません。 詳しく知りたければ、refrectionについて調べてみてください。 >C#は大規模向きではないか そんなことはありません。 大規模開発という意味ではむしろC#の方が通常のCより向いています。 ただし、単純な処理速度を比較した場合、C#は劣るので、 処理の重たい部分はCで書くことは今でも多いです。 ただ、今は個人PCでも2コア4コアが当たり前の時代ですから、 並列処理実装の容易さを考えると、 必ずしもCの方が有利とは言えない時代です。 >初期化なしでやりたい C#では数値型の場合、すでに0で初期化されています。 あと、out属性はBlittableでは意味がなかったと思います(う~ん、C#は違ったかも‥) 詳しくはマーシャリングについて調べてください。 >const readonly 参照渡し 全てC#でもありますが、参照渡しについてはCとやや概念が違います
お礼
ご回答ありがとうございます♪ おもにネイティブC++を使っているので その視点からの判断ですが >今どき全く問題ありません。 確かに、調べまくってみると 言語が「チェックする範囲」が狭く狭く で済む様な仕様になっている気がしてきました。 また、もしコンパイラ作るなら…という視点で考えてみると テキストが変更されたところだけ、内部構造の方に追加削除などのチェックを行えばいい気がするので 確かに今どきでは問題ないかもしれませんね。 >静的ロードの場合、必要なDLLは起動時に読み込まれるので、 >分割してようがしてまいがほとんど変わりはありません。 この部分に関しては開発時が気がかりだったので ということです。 >他のアセンブリに触られたくない場合に使用します。~詳しく知りたければ、refrectionについて調べてみてください。 ありがとうございます。 だいたいの予測は立ちましたが、具体的なとこを詳しく知るためにはそれなりの時間がかかるかもしれませんので、タイミングを見て調べていこうと思います。 >そんなことはありません。~必ずしもCの方が有利とは言えない時代です。 CとC#では開発効率は圧倒的にC#でしょうが C++とC#だと分かんないです。GUI的な部分でC#が若干得できるかもしれないけども、結局最終的にはネイティブにどんだけ触るかってとこで違ってくるでしょうね 今のところC#はマルチプラットフォームではないのと 少なくとも私の環境では いくらかの実験に於いて、通常時でも実測値でネイティブC++がだいぶ早いという感じがあるのと 起動時に関してはやっぱり圧倒的な時間差があること、等などにより メインではやはりC++を使うでしょうが 将来どうなるかわからないし、あるいは現状の状況把握もしたかったので C#もある程度触れてみようと思いました。 >C#では数値型の場合、すでに0で初期化されています。 refだと表記上も書かないといけないですが outで内部で代入した文書かないとエラーになるのに それでもそれ以前にすでに0初期化されるんですか。 >あと、out属性はBlittableでは意味がなかったと思います(う~ん、C#は違ったかも‥) >詳しくはマーシャリングについて調べてください。 少なくともoutによる参照渡しとrefによる参照渡しでは 初期値の代入の式が必要かどうかという違いはありますよね。 でもって >整数や浮動小数点数などの多くの値型は blittable 型なのでマーシャリングは必要ありません ってここ(MSDN)に書いてありました http://msdn.microsoft.com/ja-jp/library/0t2cwe11%28v=vs.80%29.aspx 確認しておきたいのですが C#では値型はスタック上に確保されると聞きました。 ここでいうスタックは C++(あるいはC)でいうローカル変数が確保される時のそれと、まったく同じものと考えていいのでしょうか? >全てC#でもありますが、参照渡しについてはCとやや概念が違います 相当色々調べてみたのですが、どういうキーワードが該当するのか分からず 発見出来ませんでした。 どういう風に書くと出来るのでしょうか? 一応確認ですが C++でいう class DATA { int a; const int b; //(1) enum { C_ = 777 }; //或いは static const int C_ = 777;(2) public: DATA( int b_ ) : b(b_){} void GetA() const { return a; } //(3) }; void func( const DATA* d ){ //(4) const int a = d->GetA(); //(5) ・ ・ ・ } (1)はC#ではreadonly&コンストラクタ内で { b = 何々; }に変えればいいですね。 (2)はC#では const int C_ = 777; でいいと思います。 (3)のようなconstメンバ関数は、C#にはない (5)も、ない(?) そんで、今分かんないのは(4)の用にconstポインタ或いは void func( const DATA& d ){ のように const参照として引数にとる方法です。 どう書けばOKなのでしょう?
お礼
>3なし、5なし >const参照の引数も無いです。 >これに関しては「なにぃ!」という人が多いのですが >私はそんなに困ったことがないです(笑) まさにですか それはもう 「なにぃ!」でしw C++で使いなれてると、constさえ見えれば、キャストとかがない限り変更可能性なんも考えんでいいので、逆にconstないと不安で仕方ないですよ~ まぁC#使うんなら それに慣れろってことなんでしょうね (またしてもMicrosoftちゃんにしてやられたtt(ry)) あとクロスプラットフォームのことに関してなんですが 「Mono」ってやつ使えば.NETない環境でも、それようにネイティブコードにコンパイル出来るとかいうんで、ある程度適応できるんですね。(よく知らなかった) >.NET4にはparalellクラスというのがあって、普通ならマルチスレッドにしないとできないようなことを、 >簡単に並列化できるのでなかなかおもしろい機能もありますよ。 それは使えるかもしれませんね! 流石に、自分で無駄なくネイティブでマルチスレッド作ったりGPUに委託した場合とかの「パフォーマンス」には及ばないんではないか、という予測はありますが その他のことについてもかなり納得出来ました! ご丁寧に、ありがとうございました♪