C++/CLI について語ろうぜ Part2

このエントリーをはてなブックマークに追加
945デフォルトの名無しさん:2008/03/18(火) 15:02:18
>>936
C#は標準でP/Invokeの呼び出しのたびにセキュリティチェックがかかるようになっている。
一方C++/CLIはデフォルトではチェックは発生しない。
C++/CLIで/CLRUNMANAGEDCODECHECKリンクオプションでC#と同等になる。
C#の方はSuppressUnmanagedCodeSecurity属性でチェックを無効に出来る。
双方の条件を合わせるとパフォーマンスの差はない。
946デフォルトの名無しさん:2008/03/18(火) 19:00:12
クラスに型と同名のプロパティーが在った場合、
その型を名前空間なしで使うとあいまいエラーがでるのね。
C#だと大丈夫なのに。
947デフォルトの名無しさん:2008/03/18(火) 22:24:57
それはそれは
948デフォルトの名無しさん:2008/03/19(水) 00:22:21
そんなもの作るなよ
949デフォルトの名無しさん:2008/03/19(水) 01:10:32
http://dobon.net/vb/dotnet/beginner/namingrules.html
プロパティには、その型と同じ名前をつけることができる。例えば、CacheLevel という名前の列挙型がある場合、その値を返すプロパティにも CacheLevel という名前を付けることができる。
950デフォルトの名無しさん:2008/03/19(水) 05:05:26
コンストラクタとも被るな
951デフォルトの名無しさん:2008/03/19(水) 07:57:12
>>949
そりゃ名前つけるのは自由でしょ
C++/CLIの場合は型名よりメンバ名が優先されるから不便なだけで
952デフォルトの名無しさん:2008/03/19(水) 10:17:32
.NETのクラスライブラリに普通にたくさんあるだろ型名と同じ名前のプロパティなんて
953デフォルトの名無しさん:2008/03/19(水) 10:36:50
それなんてアンチパターン?
954デフォルトの名無しさん:2008/03/19(水) 10:44:43
C#だとVSで型名が色分け表示されてるからわかりにくくはならない
955デフォルトの名無しさん:2008/03/19(水) 10:47:01
色分けしないと分からないソースコードw
956デフォルトの名無しさん:2008/03/19(水) 10:54:19
http://msdn2.microsoft.com/ja-jp/library/ms229012(VS.80).aspx
>プロパティには、その型と同じ名前を付けるようにしてください。
>列挙型に厳密に型指定されたプロパティを使用する場合は、
>プロパティの名前を列挙型の名前と同じにできます。
>たとえば、CacheLevel という名前の列挙型がある場合は、
>その値のいずれかを返すプロパティにも CacheLevel という名前を付けることができます。

こういう衝撃的なガイドラインがあるんだ
957デフォルトの名無しさん:2008/03/19(水) 10:56:13
それ、何て、要Option Explicit?
958デフォルトの名無しさん:2008/03/19(水) 13:12:03
文盲現る。
959デフォルトの名無しさん:2008/03/19(水) 13:24:55
C丼ダサダサ
960デフォルトの名無しさん:2008/03/19(水) 17:34:32
例えばフォーム等で Size を返すプロパティが Size なのはとても自然だと思うが。
961デフォルトの名無しさん:2008/03/19(水) 18:56:59
using System::Drawing;

ref class Hoge
{
public: property Size Size;
private: Size m_size; ←えらー
}

Sizeとだけ書くと全部Hoge::Size扱いになるよね。
962デフォルトの名無しさん:2008/03/19(水) 19:05:30
System::Drawing::Sizeと書けばよい
963デフォルトの名無しさん:2008/03/19(水) 19:15:16
俺はnamespace dr = System::Drawing;派。
C++でusingディレクティブは使うなって言われるけど、
C++/CLIだと使えないということをよく実感する。
964デフォルトの名無しさん:2008/03/20(木) 19:29:00
System::Collections::Generics::List<clr::autohandle<Apple>> apples;
で要素を削除しても、~Apple()は呼ばれないみたいです。
どうしますか?
965デフォルトの名無しさん:2008/03/20(木) 19:43:07
ファイナライザ書いたら?
966デフォルトの名無しさん:2008/03/20(木) 19:50:11
リストに入ってるうちに殺れば?
967デフォルトの名無しさん:2008/03/20(木) 20:21:52
Javaやってるとnewしたまんまほったらかしにするのは
道具をしまったりゴミをゴミ箱にまとめるのをサボってるようで
あまりいい気がしない。
968デフォルトの名無しさん:2008/03/20(木) 21:00:32
>>964
何で削除されないかと言えば、Listで要素を削除しても
Listは削除した要素のデストラクタを呼ぶわけではないから。
969デフォルトの名無しさん:2008/03/21(金) 02:32:09
>964
auto_handle による解放タイミングが GC での回収時なんじゃね?
970デフォルトの名無しさん:2008/03/21(金) 08:55:53
>>964
auto_handleがdeleteされないからAppleもdeleteされない。
971デフォルトの名無しさん:2008/03/21(金) 16:44:31
デストラクタやファイナライザはどうしても必要な場合でなければ書いてはいけない
特にファイナライザ
972デフォルトの名無しさん:2008/03/21(金) 17:06:32
ゲームとかヤバイ
973デフォルトの名無しさん:2008/03/23(日) 05:57:34
この言語って機能が多すぎて大人数でプログラム組むの大変じゃない?
974デフォルトの名無しさん:2008/03/23(日) 08:58:40
機能をアセンブリ化で分類して適切なスキルの人間に適切な言語で触らせればいい
問題になった場合、それができていないと言うこと
スキルがなければ、VB や C# で書けばいい。なにもかも、C++/CLI のみでやる必要はない
975デフォルトの名無しさん:2008/03/23(日) 10:13:59
CとC#の橋渡し以外は使う必要ないだろ
976デフォルトの名無しさん:2008/03/23(日) 10:38:33
o 取り込みたいネイティブライブラリがDLLでのエクスポートを考慮してくれていない
o 取り込みたいネイティブライブラリがクラスライブラリ
o C#で書こうとするとP/Invokeのための宣言や型定義がめんどくさそうな状況
o パフォーマンス上の理由でマーシャラの仕事が邪魔

こんな時に仕方なく使う言語ってところだな。
逆に言うと「こんな時」が多すぎて無いと困るんだけどさ。
.NETのネイティブとのダイレクトっぷりはJavaに対する優位性のひとつだと思うんだけど、
あんまりその文脈では語られないよなぁ。
むこうはそのために発生した複雑性が欠点と思ってるからかしら。
977デフォルトの名無しさん:2008/03/23(日) 10:56:06
ネイティブを全く考えないで良い状態が理想郷だからな
978デフォルトの名無しさん:2008/03/23(日) 11:25:20
/clr:pure
979デフォルトの名無しさん:2008/03/23(日) 12:18:59
中身を書かない property で set だけ protected: に出来ますか?
980デフォルトの名無しさん:2008/03/23(日) 12:22:28
できるよ
981デフォルトの名無しさん:2008/03/23(日) 12:47:37
むり
982デフォルトの名無しさん:2008/03/23(日) 13:20:49
中身書かないトリビアル・プロパティはアクセス指定書くところがないからな
983デフォルトの名無しさん:2008/03/23(日) 16:56:15
>>974
無駄に機能拡張しただけの印象を受ける
984デフォルトの名無しさん:2008/03/23(日) 17:07:07
>>983
具体的にどんなところが無駄だと思う?
達成目標がアクロバットすぎるので誰が作ってもこんなもんだと思ってるんだけど。
985デフォルトの名無しさん:2008/03/23(日) 17:44:35
一度Managed C++を経ているからずいぶん考えられていると思うが。
986デフォルトの名無しさん:2008/03/23(日) 19:38:42
STLのコンテナに入れたものは
削除した時点でつぶされますか?
987デフォルトの名無しさん:2008/03/23(日) 19:40:28
std::vector<T> v; として、
要素を削除した際、T のデストラクタは呼ばれる。

T がポインタで、そこに new したアドレスを入れているような場合、
それは delete されない。
その目的には boost::ptr_vector が使える。
988デフォルトの名無しさん:2008/03/23(日) 20:06:28
( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー~
989デフォルトの名無しさん:2008/03/23(日) 20:34:50
^付けないと入れられなかったorz
990デフォルトの名無しさん:2008/03/24(月) 01:51:39
いや、^ つけても、STLコンテナにマネージド・オブジェクト入れちゃ駄目だろ
そのための STL/CLR じゃまいか
991デフォルトの名無しさん:2008/03/24(月) 16:52:42
勝手に作られる関数
インデントおかしい。
インデント設定、もしくは、インデントをきれいにする方法ってありあすか?
992デフォルトの名無しさん:2008/03/24(月) 17:10:41
C++エディタにはそういうの一切無いよ。
たしかにC++/CLIのフォームデザイナの吐くコードは
ケンカ売ってるとしか思えないw
993デフォルトの名無しさん:2008/03/24(月) 18:30:08
コレクションの中身を自動変数風にすることは出来ないの?
994デフォルトの名無しさん
value class Hoge;
List<Hoge> hoges;