07/08/31 15:44:47
>>148
line に CP932 に属さない文字があるんじゃない?
153:デフォルトの名無しさん
07/08/31 16:27:52
Action<T>のメソッドを可変に指定することは出来ないの?
154:デフォルトの名無しさん
07/08/31 16:35:47
質問の意味が分かりません。
155:デフォルトの名無しさん
07/08/31 17:45:35
・Action<T1, T2>を自分で定義する
・Action<object>を使う
・Action<string> action = delegate(string x){};などとして引数にactionを渡す
自分の想像力の範囲で挙げてみた
156:デフォルトの名無しさん
07/08/31 17:59:05
>148
private void button1_Click(object sender, EventArgs e)
{
using (StreamWriter stream = new StreamWriter(@"c:\hage.txt", false, Encoding.GetEncoding(932))) {
for (int i = 0; i < 100000000; i++) {
stream.WriteLine("12345678901234567890123456789012345678901234567890\n");
}
}
}
を実行したら2G書いたところでで落ちた
Encoder.Resetのヘルプ見たらなんとなく理由は分かった気がするけど解決法はシラネ
157:デフォルトの名無しさん
07/08/31 18:11:29
一気に書き込まずに、時々ストリームを閉じてappendで追記すればOK。
158:デフォルトの名無しさん
07/08/31 18:34:19
スーパーバイザーコールはCPU占有するから、処理を一気に行うのは良くない。
159:デフォルトの名無しさん
07/08/31 18:53:46
ご存知の方いたらよろしくおながいします。
【開発環境】
visual studio 2005 、言語はC#です
【やりたいこと】
・「クラス名」を変数として、newしたい
(newする対象となるクラスを可変にしたい、ということです)
【例:正しいコードではないけど、やりたいことのイメージ】
// newしたいクラス名を引数として、newしたクラスインスタンスを返す関数
object getCreatedClass(string iClassName) {
return new iClassName();
}
ClassExample1 ex = getCreatedClass("ClassExample1 "); // ClassExample1 を作る
ClassExample2 ex = getCreatedClass("ClassExample2 "); // ClassExample2 を作る
※ 「ClassExample1 ex = new ClassExample1()」でダメなの?と思われるかもしれませんが、
上の関数はあくまで簡潔にした例で、実際にはgetCreatedClass内で
new以外にも、クラス名を使った処理をしたいのです。
160:デフォルトの名無しさん
07/08/31 18:59:46
リフレクションでググれ
161:デフォルトの名無しさん
07/08/31 19:20:56
またそれか
Activator.CreateInstance
そんなことそんなに頻繁に行われることなの?
やるとしてもちゃんとわかってる人がやるものじゃないの?
162:デフォルトの名無しさん
07/08/31 19:59:49
いまの現場にいるオレよりキャリア長いけどよく分かってない人はリフレクション大好きだぜ
163:148
07/08/31 20:42:26
>>152
156さんの例もあるので、CP932絡みの問題ではないようです。
>>156
やはり落ちましたか。
根本的な解決ではないですが、とりあえずファイルを分割して
最後にDOSコマンドで連結する事で逃げることにしました。
>>157
なるほど。その発想はありませんでした。試してみます。
164:デフォルトの名無しさん
07/08/31 20:47:44
ネイティブのDLLから、バイナリ列を取得したいのですが、
バイト配列のマーシャリングは、どうすればよいのでしょうか?
BOOL native_func(LPBYTE pBuff, DWORD dwBuffSize, LPDWORD lpByteReturned);
文字列や構造体のサンプルはいくつか見つけたのですが。。
165:デフォルトの名無しさん
07/08/31 21:06:31
面倒なときはメモリ確保してIntPtrで渡して帰ってきたらMarshal.Copy
166:デフォルトの名無しさん
07/08/31 21:09:31
>>164
MSDNライブラリ読んで理解できないのなら(まあ、君は最初から読んでなさそうだけど)
やらない方がいいんじゃないの?
人に聞くような難解な話とも俺には思えないから言うんだけど。
でないと危険だと思うけどね。
それとも、分からないことや意図しない動作に遭遇する度にいちいち人に聞くつもり?
167:デフォルトの名無しさん
07/08/31 21:17:12
unsafeでもいいならfixedでできたっけ
168:164
07/08/31 21:24:24
>166
ありがとう。
System.Array で受けようとしてはまっていました。
Blittable型は、特別なコーディングいらないってことなので、
[DllImport("LargeBuffer.dll")]
private extern static bool native_func(
byte[] pBuff,
uint dwBuffSize,,
out uint lpByteReturned
);
で、
とりあえず、大きな 領域を new byte[] して取得してから、
Arrayにセットするようにしました。
169:デフォルトの名無しさん
07/08/31 21:24:33
bool native_func(byte[] pBuff, int dwBuffSize, [out] int lpByteReturned);
で良いんじゃなかったっけ?
170:デフォルトの名無しさん
07/08/31 21:25:23
おっと、失礼。
171:デフォルトの名無しさん
07/08/31 21:31:56
>>166
おまえはそんなことを言うためにこのスレにきてんの?
172:デフォルトの名無しさん
07/08/31 21:37:49
当然だろ。
173:デフォルトの名無しさん
07/08/31 21:40:11
マーシャリングは適当にググると各々やり方が微妙に違ってたりするんだよな
俺はよく迷う
まぁMSDNみろよって話に収束するんだけどさ
174:デフォルトの名無しさん
07/08/31 21:46:31
正解が一つじゃないからな
175:デフォルトの名無しさん
07/08/31 23:46:03
COMインターフェイスの定義もね。。
引数がCOMインターフェイスへのポインタの場合、
objectで汎用的にしてるとか
IntPtrにしてほっとかれてるときとか
特定のインターフェイスに決め打ちしてるときとか。。
176:デフォルトの名無しさん
07/09/01 00:48:21
ネット上の共有フォルダにおいてあるmdbファイルにJetでアクセスするツールをC#で作って、何ヶ月も放置
していたのだけど、久しぶりに使ったら、エラーになって使えなくなってました。
読み取りはできるのだけど、書き込みでエラーになります。
mdbファイルをローカルにおいてもだめでした。
他のPCからだと、同じexeとmdbで、正常に動いているので、Windowsの設定や環境のせいだと思うのだけど、
なにか心当たりのある人いませんか?
177:デフォルトの名無しさん
07/09/01 01:39:12
>>176
MDBを修復してみる
178:デフォルトの名無しさん
07/09/01 15:31:49
C#でアプリ作ってます。
今、NumericUpDownコントロールの値を増減すると、その値でフォントの大きさを増減するプログラムを
作りたいと考えています。
この場合、全コントロールのフォントサイズを一括で増減させるようなプログラムって
可能なのでしょうか?
一つ一つフォントサイズを指定しなおさないといけないのでしょうか?
179:デフォルトの名無しさん
07/09/01 15:34:49
君がc#やドトネトのライブラリの作者なら、そんな特殊な需要を満たすための
foolproofな方法をわざわざ用意するだろうか?
180:デフォルトの名無しさん
07/09/01 15:48:23
コントロールのFontプロパティはアンビエントプロパティだから
いっちゃん親のFontを変えれば
特別にフォントが指定されてないコントロールは同じになるよ
181:デフォルトの名無しさん
07/09/01 15:53:39
>>179
よう、fool
182:178
07/09/01 16:27:40
>>180
早速ぐぐってみます。
ありがとうございます。
183:デフォルトの名無しさん
07/09/01 19:22:51
>179
foolproofってなんて意味?
184:デフォルトの名無しさん
07/09/01 19:41:35
どなたか Gilma (=ILMerge のGUIツール) および ILMerge を使ってる方が
居たら教えてください。
スレリンク(tech板:853-854番)
で質問していたのですが、お答え得られず。こちらでどなたかわかる方いたら
お願いしたく。よろしく。
185:デフォルトの名無しさん
07/09/01 21:20:28
>>183
Google使えないのか?
186:デフォルトの名無しさん
07/09/01 22:56:47
>185
使える
>179に答えて欲しいだけ
187:デフォルトの名無しさん
07/09/02 00:16:53
C#などのIRCって今稼動してるのないのかな?
海外みたく、活発な交流をして色々な知識を吸収したいと思っているんだが
188:デフォルトの名無しさん
07/09/02 00:54:59
>>187
すいません、海外ってどんなところで活発に交流しているのですか?
よかったらおしえてください
189:デフォルトの名無しさん
07/09/02 00:56:03
特定のフォルダから、特定のフォルダにコピーしたいんだけど、
なんか手っ取り早くGUIで残り何秒とか表示する方法ないかな。
エクスプローラのコピーコマンドとかあるかなっておもったが、
explorer.extって特定のフォルダを表示するしか出来ないのね・・・
190:デフォルトの名無しさん
07/09/02 00:56:23
>>180
ところで、アンビエントプロパティで親から引き継がれてるか、
個別に設定されてるかを確認する方法ってないんかな?
191:デフォルトの名無しさん
07/09/02 00:59:53
>>189
Microsoft.VisualBasic.FileIO.FileSystem でも使ってればいいんじゃない
192:デフォルトの名無しさん
07/09/02 01:01:32
>>176
エラーの内容くらい書けバカ
193:デフォルトの名無しさん
07/09/02 01:03:58
>>189
SHFileOperation使う。
でもVBのライブラリ参照したらその機能あった気がするのでそっちのがいいかな?
194:デフォルトの名無しさん
07/09/02 01:04:31
>>192
そこまで書いてるんだから
エラーの内容くらい想像しろバカ
195:187
07/09/02 01:05:49
>>188
URLリンク(d.hatena.ne.jp)
こちらのブログを見ていただければわかるかと。
196:189
07/09/02 01:06:45
>>191 マジありがとう
調べてみるよ
197:デフォルトの名無しさん
07/09/02 01:10:38
.NETで書かれた商用アプリってありますか?
どうも、.NETでかかれたものを金出してまで使おうとは思えん
198:デフォルトの名無しさん
07/09/02 01:18:38
あるよ
199:189
07/09/02 01:31:54
ありがとう。 やりたいことは
Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory(
@"C:\test\", @"e:\", UIOption.AllDialogs
でいけそうだ。
でも、このメソッド、ダイアログを表示して、かつ自動的に上書きという
引数はないんですね・・・
上書きだけか、ダイアログを表示するだけか、しかない
出来れは自動的に上書きして、進行状況がわかればうれしいんですが…
200:デフォルトの名無しさん
07/09/02 01:39:16
>>197
コピペ?
201:デフォルトの名無しさん
07/09/02 01:47:38
>197
そう思う理由を教えてくれ
202:デフォルトの名無しさん
07/09/02 02:20:21
1.1のFormsで書かれた商品なら動かしたことがあるが、
リストに毎回描画するから糞重たくてむかついたことはある。
結局、最終的にアプリの出来はスキルで待ったく別物が出来上がるんだと
つくづく感じた。
203:デフォルトの名無しさん
07/09/02 02:22:49
PCがしょぼいんだろ
204:デフォルトの名無しさん
07/09/02 08:31:16
ユーザー固有のスタートメニューのフォルダは
Environment.GetFolderPath(Environment.SpecialFolder.StartMenu))
で取得できますが、
全ユーザー共通のスタートメニューのフォルダを
取得するメソッドは用意されていないのでしょうか?
ユーザー固有のスタートメニューのパスに含まれるユーザー名を
All Usersに置き換えればいいような気もしますが、
あらゆる環境で動くかどうか心配なので、
できれば、あらかじめ用意されている方法を使いたいと思っています。
205:デフォルトの名無しさん
07/09/02 11:07:38
SpecialFolder列挙体には含まれてないやつがあるし
実行時にenumの範囲チェックしやがるので
SHGetFolderPathを直に使うしかないと思う
206:デフォルトの名無しさん
07/09/02 16:25:56
インストーラ自作?
207:デフォルトの名無しさん
07/09/02 17:40:56
.NETで書かれたSDJEditorを使ってみたが、.NETの先が見えた気がした
EmEditorに比べるとほんと鼻くそ
やっぱ.NETで有名なネイティブアプリに勝つなんて無理でしょうか?
208:デフォルトの名無しさん
07/09/02 17:42:10
工作員必死だな
209:デフォルトの名無しさん
07/09/02 18:44:52
比較対象がEmEditorなんだ。
秀丸と比べるとほんと鼻くそだよね>Em
210:デフォルトの名無しさん
07/09/02 18:50:27
逆だな
211:デフォルトの名無しさん
07/09/02 20:07:14
サクラが一番
212:デフォルトの名無しさん
07/09/02 20:17:19
エディタなんてVisual Studioでいいじゃん
213:デフォルトの名無しさん
07/09/02 20:32:23
コーディングはVSでやってるけど
.txtなんかはEmEditorに関連付けてる
214:デフォルトの名無しさん
07/09/02 20:57:01
WebBrowserコントロールでMouseUpイベントを取ることは出来ないんですかね。
MouseDownは取れます。以下はVBですが。
URLリンク(homepage1.nifty.com)
Spy++で見てもLBUTTONUPとか表示されないので、そもそもムリなんですかねぇ。
215:デフォルトの名無しさん
07/09/02 21:42:12
>>207
アプリ&開発者が違うのに、開発ツールを比較するか?w
216:デフォルトの名無しさん
07/09/02 23:39:06
>>197
.net framework + 在庫管理や工程管理でぐぐったら出てくるよ。
217:デフォルトの名無しさん
07/09/02 23:46:12
>>197
これとか。
URLリンク(www.microsoft.com)
218:デフォルトの名無しさん
07/09/03 00:03:57
でも、おそいねw
正規表現をつかったらperlに負けた
スクリプトに負けますか・・・
219:デフォルトの名無しさん
07/09/03 00:05:51
Cの基本的な文法については勉強して次は実際にSourceForgeでオープンソースの
プログラムを読もうと思っていたのですが難しすぎて分かりません
みなさんはある程度文法の勉強をしてからどのようにして勉強していきましたか?
220:デフォルトの名無しさん
07/09/03 00:06:26
ここはC#スレです
221:デフォルトの名無しさん
07/09/03 00:15:02
>>218
正規表現エンジンの質やI/Oが主要なボトルネックになる類のプログラムでは
言語の差など微々たるもんだ
書き方にも拠るが、C++で書こうが普通にスクリプトのが速かったりする
222:デフォルトの名無しさん
07/09/03 00:33:11
>>218
毎回正規表現をコンパイルするコードなんて書いてないだろうな?
223:デフォルトの名無しさん
07/09/03 00:37:25
>>218
正規表現の処理がスクリプトで書かれてんじゃないだろw
224:デフォルトの名無しさん
07/09/03 00:39:59
.NETの正規表現エンジンは遅くて困るというほどでは無いにしろ、
そんなに速くないだろ
スクリプトの場合は、それがCで書かれているだろうしな
225:デフォルトの名無しさん
07/09/03 00:45:34
Regex のコンストラクタでオプションに RegexOptions.Compiled つけてる?
226:デフォルトの名無しさん
07/09/03 00:46:51
>>219
文法しかわからない奴が、SourceForge等で公開されているソースを読めるわけないだろ
227:デフォルトの名無しさん
07/09/03 00:48:28
俺も実験したことがあるが、正規表現をコンパイルしとくのは当然の話として、
C#で正規表現の性能を競ったらPerlやらPythonやらに普通に勝てんよ
そういう競争なら、相手はスクリプトではなくて、実質的にはCでカリカリに
チューンされたモジュールになる
勝てるわけが無いだろ
228:デフォルトの名無しさん
07/09/03 00:57:08
>>227
だったら、C#の存在意義ってなに?
229:デフォルトの名無しさん
07/09/03 01:01:45
>>228
さあ
無いと思えば無いんじゃね
性能はネイティブにゃ勝てんし
スクリプトみたいに手軽じゃないし
Javaみたいにwrite once, run anyware標榜してるわけでもねぇし
230:デフォルトの名無しさん
07/09/03 01:06:02
正規表現ならTcl最強説
231:デフォルトの名無しさん
07/09/03 01:16:10
>>228
一応言っとくが、自分で計算処理する分にはC#のがスクリプトよりは
格段に速いぞ
ネイティブのがさらに速いがw
自分の計算が主要なボトルネックになるタイプのプログラムかどうかが
一つのポイントだな
そうでないようなケースは案外多い
232:デフォルトの名無しさん
07/09/03 01:24:44
エミュレートされた仮想CPU上で動いてる訳でもなし、C#ではそもそも
記述できない低水準の処理以外の部分でネイティブコードと速度に差なんて出ようがないと思うが。
233:デフォルトの名無しさん
07/09/03 01:25:22
普通速度なんか気にする必要ないだろ
体感できるほど遅くなるアプリなら最初からネイティブしか選択肢ないし
そんなんめったに書くことない
234:デフォルトの名無しさん
07/09/03 01:25:22
そもそもさぁ
早いとか、遅いとかって言ってる奴は、証拠のソースを出せよ
だってさ
PerlもPythonも、コンパイル時に正規表現のコンパイルと最適化をしている
C#やJavaは実行時
どうやってコンパイルと最適化に消費する処理時間を考慮するの?
235:デフォルトの名無しさん
07/09/03 01:27:24
>>233
速いことより、遅い方がいいことってあるのかしらん?
236:デフォルトの名無しさん
07/09/03 01:27:52
実行時にネイティブにコンパイルされるといったって
C#は安全性を気にして余計な処理をしてるだろ
Cとかと比べたらどうしたって遅くなる
237:デフォルトの名無しさん
07/09/03 01:28:44
>>235
速度の違いが体感出来ないならC#使ってもデメリットはない
プログラミングが楽になるからC#使った方がいいというわけだな
238:デフォルトの名無しさん
07/09/03 01:29:28
>>232
そりゃJITだけどCにゃ負けるようだよ
URLリンク(shootout.alioth.debian.org)
これはMonoだが、Java Server VMの性能が参考になるだろう
239:デフォルトの名無しさん
07/09/03 01:32:20
そもそも.NETで不満になるようなアプリってどれぐらいあるんだ?
大体.NETは実行スピードと生産性のバランスの中のひとつの解に過ぎないだろ
240:デフォルトの名無しさん
07/09/03 01:34:25
.NETは計算速度はそんなに遅くねぇけど
起動がのろいのとGUIもっさりはどうしようもねぇな
241:デフォルトの名無しさん
07/09/03 01:36:40
ソース出ないね
やっぱり法螺吹きか
242:デフォルトの名無しさん
07/09/03 01:37:14
>>234
CLIランタイムをロードする時間に比べりゃ、正規表現のコンパイルにかかる時間など
微々たるもんだろw
243:デフォルトの名無しさん
07/09/03 01:38:13
Win32のBitbltとか呼んでももっさりするかね?GDI+よりは早い。
244:243
07/09/03 01:38:59
すまん。最後は疑問系です・・・(ノД`)
245:デフォルトの名無しさん
07/09/03 01:41:19
>>243
DDBのblitはGDI+の10倍は速いらしいな
その時点でWinFormsだめぽ
246:デフォルトの名無しさん
07/09/03 01:45:05
>>241
そんなに気になるんなら自分でためせばいいのに
以前俺が実験したソースをあげるよ
URLリンク(www.borujoa.org)
青空文庫のテキストを適当に置換するプログラム
inputというフォルダにサンプルの入力ファイルがあるが、300K程度の
サイズだから、気になるならデカくしてみるんだね
247:デフォルトの名無しさん
07/09/03 01:53:14
>>239
それはあくまで作る側の屁理屈
使う側からすれば、生産性なんてどうでもいい
あなたが、よく使うアプリケーションが次バージョンから.NETで書かれたらどう思う?
LightWaveが.NETなんかで書かれたら俺は間違いなくMAXへ移行する
248:デフォルトの名無しさん
07/09/03 01:57:26
>>247
えーとね、生産性悪くなるとコストがかかるんだよ。
それは製品価格に反映されたり、次バージョンで実装される機能が少なくなったりすることになるんだよ。
249:デフォルトの名無しさん
07/09/03 02:05:21
>>247
なんでアセンブラでつくらねーんだっていってみろ。
250:デフォルトの名無しさん
07/09/03 02:06:39
まあ、問題は、場合によっては普通にLL言語にさえ後れを取る
C#がバランス上最適解かどうかだろうなw
251:デフォルトの名無しさん
07/09/03 02:06:52
製品の値段に直結するぞ。
機能も少なくなるぞ。
品質が下がることもあるぞ。
252:デフォルトの名無しさん
07/09/03 02:07:02
けど、C#が使えないのは事実
C#しかつかないやつはVC++で開発してる部署に行ったらほぼ終わり
253:デフォルトの名無しさん
07/09/03 02:07:34
>場合によっては普通にLL言語にさえ後れを取る
絶対にLL言語に遅れをとらない言語ってなんだよw
254:デフォルトの名無しさん
07/09/03 02:09:30
VC++しかつかないやつは他の言語で開発してる部署に行ったらほぼ終わり
255:デフォルトの名無しさん
07/09/03 02:14:15
>>246
・300kのIO速度の計算をスルー
・300kのSJISから内部コードの変換(UTF-16やutf8)コストもスルー
・(C#)2000行の無駄なnew StringBuilderとToString、+演算子置き換えで高速化
正規表現のベンチになってないよ
256:デフォルトの名無しさん
07/09/03 02:17:16
>>255
うん、正確な正規表現のベンチのつもりで書いたのではないよ
それが求めるものなら自分でやってくれ
IO処理は「どの言語でも」やっている
ユニコードへの変換も「どの言語でも」やっている
オーバーヘッドの大きそうなフォーマット処理も、PerlやPythonでもやっている
概ね、カリカリに書かずに適当に同じレベルで「普通に」書きなぐったものだ
特に何かをひいきしたつもりは無い
そうやって書いたものが、スクリプトが案外速かった(C#より速い)ってのが
重要ね。
257:256
07/09/03 02:28:23
ちなみにC++も三種類書いてみたが大して速くなかったね。
ソースを見れば分かるが、LL言語で書くよりずっと複雑でトリッキーで
エラーを産みがちなコードになるというのに。
こんな仕事はLL言語向きだ。他の解は馬鹿げている。そう思ったよ。
そして、そういう仕事は案外多いのだと思う。
258:デフォルトの名無しさん
07/09/03 02:37:29
プロセスの生成負荷も考慮されてない…
C#、C++、Perl、Pythonではエンジンの起動時間は大きく違うし、
いくらなんでも、これで決めつけるのは早計だと思うが。
俺のPCでは、C#の方がPerlより速かったり遅かったりだった。
一瞬すぎて測れない。
Core 2 Duo E6600, 2GB, Win Vista
Super Fetchがどこまで効いているかはわからない。
明日kwsk調べようかな。
259:デフォルトの名無しさん
07/09/03 02:45:50
正規表現の処理の話をしてるときにこれはない
260:デフォルトの名無しさん
07/09/03 02:46:28
つうか試してないけどコンパイルしないほうが早かったりしてよw
261:256
07/09/03 02:54:56
>>258
入力ファイルデカくしてみそ
二回目以降はキャッシュが効くし、入力が十分デカければ起動時間は誤差の範疇に
持ち込めると思うが
ちなみに俺の環境はXP、Pentium M(1.7GHz), RAM 500Mだからずっとショボい
>>259
純粋に正規表現エンジンの性能を計りたいんなら、そうだね
俺がやったのは、正規表現を用いた典型的なPerlの使い捨てスクリプトレベルの
仕事を各種の言語で書いてみた、それだけのことで、やっている仕事自体は
どの言語でも同じだよ
262:デフォルトの名無しさん
07/09/03 03:15:34
せめてマッチ対象文字列は、メモリに確保しておかないとベンチにならんだろw
263:デフォルトの名無しさん
07/09/03 05:29:41
起動が早い言語の勝負じゃないからな
264:デフォルトの名無しさん
07/09/03 09:15:08
>161
ご回答ありがとうございます。
そんなことを頻繁にするかどうかは知らんよ。
俺がちゃんとわかってる人かどうかは
あんたが決めることじゃねえよ。スキルチェックでもしてくれ。
265:デフォルトの名無しさん
07/09/03 10:34:36
プログラマーなんだから、C++とC#両方使えるようになろうや。
266:デフォルトの名無しさん
07/09/03 11:35:59
C++なんぞ使ってると脳みそが腐るぜ
267:デフォルトの名無しさん
07/09/03 11:39:14
C++使ってる奴がまだ居たなんて・・・
268:デフォルトの名無しさん
07/09/03 12:30:18
C++は使えませんが、C++でできています。
269:デフォルトの名無しさん
07/09/03 12:58:35
C++はC++でできています
270:デフォルトの名無しさん
07/09/03 13:29:49
gccがgccでコンパイルできるようになりました、というのは結構画期的なことだったらしいが
271:デフォルトの名無しさん
07/09/03 14:01:15
foreachループ変数が書き込み禁止だってことを今更ながら知ったのだが・・・
なんでこんな制限があるんだ?
コレクションに変更を加えるわけじゃないし問題ないと思うんだけど。
272:デフォルトの名無しさん
07/09/03 15:49:14
C#で変数名に変数を使うやり方ってどうやるんですっけ?
test_i(i=1,2,3・・・)みたいな。
273:デフォルトの名無しさん
07/09/03 15:54:20
配列を使いましょう
274:デフォルトの名無しさん
07/09/03 16:06:14
>>271
たとえば
string[] strArray = new str[]{"a","b","c"]
foreach(string str in strArray)
{
s="d"
}
ってやってもstrArrayには反映されない。
foreachの列挙子はIEnumerableの実装いかんによっては、何を
参照しているのか全く保障されない。
IEnumeratorは上記の例のようにコピーを返してくるかも知れない。
あと、IEnumuratorの実装クラスは「列挙」できればよく、要素の概念
を持たないものだってあるからね。
MSDNのIEnumerableのサンプルをみてみそ。
275:デフォルトの名無しさん
07/09/03 16:30:21
>>271
「変数の使いまわし」ができないようにするのが最近の流行だから。
バグが減ると信じられてる。
276:デフォルトの名無しさん
07/09/03 16:36:34
foreachって実際は
while(strEnumerator.MoveNext())
{
string str = strEnumerator.Current;
...
}
こんな感じでしょ
代入しても無意味というか、元が配列だったりすると
書き換えられるという錯覚を与えかねない
というか配列のforeachは
for(int i = 0; i < strArray.Length; ++i)...
に置き換える最適化がされるらしいから
実際に書き換えられちゃうんでそうするとforeachの意味が変わっちゃう
277:271
07/09/03 16:55:47
>>274
>>276
foreach変数ってIEnumeratorの実装に関わらずスタック上に置かれるものでは。
構文上もそこで宣言してるわけだし、直接書き換えられると誤解される余地もないと思うけど。
>>275
それで余分な変数を導入する方が場合によっては可読性が落ちると思うんだけどなあ。
というかforeach変数だけ禁止しても意味がないような・・・
278:デフォルトの名無しさん
07/09/03 17:01:33
>>277
たしか、usingとかfixedとかで宣言した変数も使いまわしできないな。
279:デフォルトの名無しさん
07/09/03 17:55:02
むしろforが例外か
280:デフォルトの名無しさん
07/09/03 19:45:58
>>271は単に参照型と値型の区別がついてないというか、データがメモリにどう
配置されるかのイメージがつかめてないだけの気がする。
>>275は意味不明だと思う。
繰り返し変数はもとの変数のビットイメージのコピーであってもとの変数そのものではない。
これが理解できていれば271はそもそも愚問であって、こんな疑問は抱きようがないんじゃないか?
281:デフォルトの名無しさん
07/09/03 19:55:24
その後の流れをちゃんと読めよw
271はforeachでコレクションの内容を変更したいんじゃなくて、例えば
//引数に与えられた値+2を返すメソッド
int Plus2(int value){
value += 2;
return value;
}
みたいなことをforeachの繰り返し変数でもやりたいんだろ
282:デフォルトの名無しさん
07/09/03 20:13:55
int Plus2(int value){
return value + 2;
}
でいいじゃん
283:デフォルトの名無しさん
07/09/03 20:20:09
なんという正論
284:デフォルトの名無しさん
07/09/03 20:20:50
>>282 頭悪そうだな・・・
285:デフォルトの名無しさん
07/09/03 20:22:57
まあ281の例えも悪いよ。
変に例える必然性なんて全然ないのにね。
286:デフォルトの名無しさん
07/09/03 20:24:32
というか、+2と決めうちなのにメソッド作る意味があるか?
287:デフォルトの名無しさん
07/09/03 20:26:09
281の方が頭悪そうだ
288:デフォルトの名無しさん
07/09/03 20:26:40
>>271
あるいは逆にコレクションに変更を加えようとしてミスるプログラマが出るのを予防するためだな。
D言語ではforeachの制御変数には明示的にrefキーワードをつけないと、代入できないようになってる。
289:デフォルトの名無しさん
07/09/03 20:30:55
それどんな感じで列挙子を実装するの?
290:デフォルトの名無しさん
07/09/03 20:33:54
>>288
そんなアホグラマは正直無視でいい・・・
と思うのは俺だけ?
だってそんなこといったら仮引数だって変更不可にするべきじゃん
291:デフォルトの名無しさん
07/09/03 20:42:45
>>289
int opApply(int delegate(ref T));というメンバ関数を実装する。
URLリンク(www.kmonos.net)
>>290
Dでは仮引数にinキーワード(あるいは、finalキーワード)を追加することによって、仮引数への代入が制限されますよ。
要するに、最近は酔っ払いでも使えるような言語設計が流行っているのだ。
292:デフォルトの名無しさん
07/09/03 20:50:44
フェイルセーフがあるのは結構な事じゃないか
293:デフォルトの名無しさん
07/09/03 21:01:28
いつも酔っぱらってこーでぃんぐしてるからありがたい
294:デフォルトの名無しさん
07/09/03 21:45:38
参照型の場合
foreach (Hoge h in Hoges) {
h = new Hoge(); // はダメでも
h.Member = 123; // は全然OKだから
あまりガードにはなってないよね。
295:デフォルトの名無しさん
07/09/03 21:55:27
…なんか勘違いしてないか?
296:デフォルトの名無しさん
07/09/03 22:11:00
>>295
なんかって何?一言主さん
297:デフォルトの名無しさん
07/09/03 22:13:01
フェイルセーフがいいならC++のconstなんか真っ先に導入しなきゃダメだろ
キャッチしなきゃいけない例外も必要だろ
C#はそういうのが意図的に外されてるんだな
意味ないから
298:デフォルトの名無しさん
07/09/03 22:15:50
VC++(2005)のMS拡張構文ではconstのあるなしで調整できるようだ。
// cl /EHsc
#include <vector>
#include <iostream>
int main() {
std::vector<int> v;
v.push_back(1); v.push_back(3); v.push_back(5);
for each(int r in v) {
r++; // OK
std::cout << r << std::endl;
}
for each(const int r in v) {
r++; // Error
std::cout << r << std::endl;
}
}
299:デフォルトの名無しさん
07/09/03 22:18:01
>>297
いや、チェック済み例外は明らかに設計ミス。
300:デフォルトの名無しさん
07/09/03 22:21:40
しかしネットワークなんかだと、
絶対に間違いが起きる可能性がある処理はあるわけじゃない
そういうのをどうやって実装すればいいの
301:デフォルトの名無しさん
07/09/03 22:27:25
そんなのインテリセンスなりナンチャラペットの水準でサポートすれば
済むことじゃないの?
まあ、それ以前にドキュメントをちゃんとして欲しいよねw
302:デフォルトの名無しさん
07/09/03 23:09:05
constもチェック済み例外も問題の根は同じ。不必要に実装に結び付く(透けて
見せる)シグニチャである点。
303:デフォルトの名無しさん
07/09/03 23:15:15
>>277
あんた、単なる素朴な疑問かと思ってたけど
真正のあほだな
304:デフォルトの名無しさん
07/09/03 23:16:10
VC# ExpressEditionダウンロードしたんだけど
オフラインでMSDN見ることってできないんですか?
305:デフォルトの名無しさん
07/09/03 23:21:54
ふらっとに行くべき
306:デフォルトの名無しさん
07/09/03 23:31:16
>>302
意味がよくわからないから詳しく説明してくれ
307:デフォルトの名無しさん
07/09/04 01:41:01
>>290に同意。費用対効果の低いフェースセーフ要らないぽ
constだので縛ってもバグは斜め上からやってくるね。
sealedつけてたのにsealed外されるとか。
foreachといえば、配列に関してはfor文と同等の速度が出ますが、こういう情報はどこにあるのでしょうか?
パフォーマンスガイドラインに重いループではforeachよりforって書いてあったので
わざわざ変えたのに・・悲しい。
308:デフォルトの名無しさん
07/09/04 02:21:04
英語だけどパフォーマンスの話題はここが詳しいかな
URLリンク(msdn2.microsoft.com)
1.1に基づいてるからまだforが速いって書かれてはいるが・・・
URLリンク(msdn2.microsoft.com)
ここにもパフォーマンスの記事が結構たくさんあるね
特にKnow What Things Costは命令ごとのコスト表が載ってて面白いかも
309:デフォルトの名無しさん
07/09/04 02:52:52
>>307
2.0だとforeachのほうが若干早くなってますね。
foreach (int v in ar) csum += v;
for (int i=0; i < 10000; i++) csum += ar[i];
これを下のように書くとforeachと同じスピードになるからそういう最適化をしてるのでしょう。
fixed (int *sp = &ar[0]) {
int *ep = sp + 10000;
for (int *p = sp; p < ep; p++) csum += *p + j;
}
ただ、foreachの制御変数が読み取り専用なのは、フェイルセーフのためなのか、
最適化のためなのかは判断がつきません。
310:デフォルトの名無しさん
07/09/04 07:54:38
アンセーーーーーフ!!
なるほど、「処理を直接記述されると最適化できないが
抽象度を高くすると最適化しやすい」というやつか
forよりforeachの方が早い
LINQも早くなるという
しかしループ変数への代入を許すとこの最適化が出来なくなるわけか
311:デフォルトの名無しさん
07/09/04 09:28:17
アンマネージドのコードと同期をとりたく、
EventWaitHandle.Handle プロパティで
ネイティブのハンドルを取得しようと思ったのですが、
「古い形式です」と起こられてしまいます(警告)。
新しい形式ではどのように書くのでしょうか?
312:デフォルトの名無しさん
07/09/04 09:37:04
>>311
MSDNにずばり書いてあるから、まず自分で調べるくせをつけろ。
313:デフォルトの名無しさん
07/09/04 09:37:06
あ、
EventWaitHandle.SafeWaitHandle.DangerousGetHandle()
でいいみたい。
Safeなんだか、Dangerousなんだか。
314:デフォルトの名無しさん
07/09/04 10:15:09
>>313
DangerousGetHandle()は必要?
MSDNでは、
>このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを
>識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに
>渡すことができます。
となってるし、使用例にあるWindowsAPIの呼び出しサンプル見ても、IntPtrの代わりに使ってる。
というか従来のIntPtrの代わりに使うべきもののように見える。
DangerousGetHandle()はデバッグのためにハンドル値を16進でダンプしたいとかの特殊用途のために
残してあるんじゃないか。
315:デフォルトの名無しさん
07/09/04 11:08:29
>>314
なるほど。ほんとだ。
ハンドルは、PVOIDだろ、と、
[DllImport("native.dll")]
public static extern void NativeFunc(System.IntPtr hHandle);
して、Handleプロパティから渡していたので、、
替わりにSafeWaitHandle使えと言われても、型が違ってこまってました。
[DllImport("native.dll")]
public static extern void NativeFunc(SafeWaitHandle hHandle);
こうすればいいんですね。
316:デフォルトの名無しさん
07/09/04 12:42:53
デンジャラスなんてついてるメソッド使いたくないお
317:デフォルトの名無しさん
07/09/04 13:35:00
IntPtrで問題が発生したら泣き寝入りするお
318:デフォルトの名無しさん
07/09/04 18:41:40
>>316-317
正直、「ボキュはキモヲタだお」って言ってるようにしか聞こえない。
そういうの気色悪いと思わない自分を気色わるいと感じるべきだ。
319:デフォルトの名無しさん
07/09/04 18:48:43
どうか、次のVBをC#に直して下さい。
Label1.Text = Replace(Session("body"), vbCrLf, "<br />")
-----------------------------------------------
VBの本の中にソースが載っていたのですが、
この1文が、どうにもわかりません。
そのコード意味は、どうやらセッションというデーター内の改行を
HTMLの改行に変換するっぽいのですが・・・。(推測)
ちなみに、他の行は自力で調べましたが肝心のこのコードが分りませんし、
C#でどう書けば良いのか分りません。
賢者の方々、どうか愚者の私にご指導をお願い申し上げます
320:デフォルトの名無しさん
07/09/04 18:54:20
>>319
少しはググるとか努力しろよ
VB.NET固有の関数をC#で使用するには?
URLリンク(www.atmarkit.co.jp)
でも、それただの部分文字列の置換でしょ?
String.Replaceか正規表現で代用できるでしょ。
321:デフォルトの名無しさん
07/09/04 18:54:33
>>319
URLリンク(zoosir.hp.infoseek.co.jp)
C#だと省略可能引数(Optional)が無いから、全部書く必要があるらしい。
322:デフォルトの名無しさん
07/09/04 21:35:51
>304
MSDNも普通にフリーとして公開されてなかったか?
323:デフォルトの名無しさん
07/09/04 21:54:39
csc.exeやvbc.exeって開発環境がなくてもインストールされるものなんですか?
C:\windows\Microsoft.NET\framework\以下にあるのでそんな気がしますが。
324:デフォルトの名無しさん
07/09/04 21:57:13
はい。実行時に使用する場合もあるので、全ての環境に含まれています
325:デフォルトの名無しさん
07/09/04 22:03:35
>>324
おお、そうだったんですか。
これで安心してCodeDomが使えます。
326:デフォルトの名無しさん
07/09/04 22:17:14
標準添付はcsc/vbc/jscの三つ、だったかな確か clは非標準だよね
標準なのにドマイナーなのがひとつ
327:デフォルトの名無しさん
07/09/05 00:09:57
Control.Invoke系のメソッド呼ぶとどっかで内部的にファイナライザが必要になるっぽいな。
ループの中から呼んだりして大丈夫なんだろうか。
何千何万って呼んだらなんか嫌なことになりそうな気がする。
328:デフォルトの名無しさん
07/09/05 00:15:47
ここは散文を書くところではない。
説明調の、他人に意味がちゃんと通じる文章書けよ
329:デフォルトの名無しさん
07/09/05 00:23:22
え、ファイナライザのコストが高いことを説明しろってこと?
それは説明するまでもないと思ったけど。
何が通じてないのかわからん。
Invoke系のメソッドってのはInvoke、BeginInvokeのことだよ
それらを呼んだら内部的に生成されるオブジェクトでファイナライザが呼ばれるっぽいんで嫌だなって話。
330:デフォルトの名無しさん
07/09/05 00:37:10
何をみてそう思ったの?
331:デフォルトの名無しさん
07/09/05 00:38:28
>何が通じてないのかわからん。
読む側の立場に立って自分の文章推敲できない人間はたいていそうだ。
ついでに、ファイナライザのコスト?
意味がわからない。
デリゲートを処分するコストがそんなかかるのかね?
仮にかかるとして、コストとは「時間当たりのCPUの使用量」のことだと思うが、
どのみちmsのオーダーでInvokeとか不可能だから意味がないだろう。
332:デフォルトの名無しさん
07/09/05 00:39:31
>それは説明するまでもないと思ったけど。
いったいどんな頻度でControl.Invokeなんかを実行する気だ?
333:デフォルトの名無しさん
07/09/05 00:44:23
>>327
再描画を伴わないControl.Invokeの使い道って
あんまり思いつかないんだけどどうだろ?
経験上、何千何万って単位でControl.Invokeを呼ぶと
再描画コストが恐ろしいことになる。
WinFormsなら1秒間に10回ぐらいの更新でいいんじゃないかね?
まあそれ言い出すとTimerでいいじゃんて話も多いんだけど。
334:デフォルトの名無しさん
07/09/05 00:44:31
>>330
CLR Profilerで見れるよ。
>>331
URLリンク(msdn.microsoft.com)
この辺でも読んでくれ。
なんでデリゲートが出てくるのかわからんが・・・
>>332
別スレッドでなんかの処理中にUIを更新するために呼んだりしない?
まあ何万は言いすぎかも。
335:デフォルトの名無しさん
07/09/05 01:04:23
>>322
ヘルプから見れるキーワードとか目次がMSDNなんですか?
336:デフォルトの名無しさん
07/09/05 01:05:13
>>334
読んでくれって、どこにもお前さんが主張しているような類のことは書いてないだろw
337:デフォルトの名無しさん
07/09/05 01:10:27
>334 CLR Profilerで見れるよ。
Control.Invokeを使ったらファイナライザが実行されたってこと?EndInvokeしてても?
338:デフォルトの名無しさん
07/09/05 01:13:32
ファイナライザのコストが高い(高くなりうる)ということ自体はわかるが、
Control.Invokeで実行されるというファイナライザを持つオブジェクトが内包するオブジェクトとか。
Control.Invokeを実行する通常の頻度とかから考えて、それが問題になるほどコストが高いとは思えん
ということだよ。
「ファイナライザのコストが高い」という表現自体をそのまま疑ってるんじゃない。
ついでにEndInvokeしたらファイナライザは実行されないんじゃないの?普通に考えて。
と思っただけで、まあこれはプロファイラで確認してそうなってるってんならそうなのかもしれん。
339:デフォルトの名無しさん
07/09/05 01:17:46
>>335
VS2005 Expressのヘルプに標準で何が入っているかは知らないが、MSDNライブラリはこれ。
URLリンク(www.microsoft.com)
2.5Gバイトほどあるから注意してくれ。
340:デフォルトの名無しさん
07/09/05 01:22:22
ファイナライザはそれを行わなければならないものが一つでもあると
GCを二回行わなければならず単純計算でGCにかかる時間が倍になるんじゃなかったか
341:デフォルトの名無しさん
07/09/05 01:27:36
>>337
>>338
EndInvokeしても呼ばれるみたい。
やっぱgen0でちゃちゃっと回収されるから問題が少ないってことなのかな?
具体的にはControl.ThreadMethodEntryってオブジェクトだけど
ファイナライザの処理自体はシンプルだけど他のオブジェクトへの参照は割とごっそり保持してるみたいだな。
まあ他に代替手段があるわけじゃなしどうこういっても仕方ないんだけどね。
342:デフォルトの名無しさん
07/09/05 01:42:58
おお?なんだこの意味なしFinalizeはw
いらねーじゃねーかよ。
343:デフォルトの名無しさん
07/09/05 01:48:44
>他のオブジェクトへの参照は割とごっそり保持してるみたいだな。
そんなに困らないオブジェクトが多いけどな。
まあ引数とか戻り値はクリアしてほしいところだが
344:デフォルトの名無しさん
07/09/05 01:58:26
だいたい、GEN1までで回収できたら、負荷的にはまあそんなに大きくはならないようだな。
GUIアプリだし、特にControl.Invokeなんて同期実行なんだから、まあ普通はまずGEN1ですべて回収できるだろう。
345:デフォルトの名無しさん
07/09/05 02:05:06
SuppressFinalizeを書き忘れてるんじゃないか
346:319
07/09/05 11:20:12
>>321賢者
一応、下記ソースに変更出来ました。
的確な助言、ありがとうございました。
if ((string)(Session["Body"]) == null)
{
Label1.Text = "<br />";
} else {
Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}
347:デフォルトの名無しさん
07/09/05 11:24:43
暇があったら as 演算子を調べとくといいよ
348:319
07/09/05 11:45:52
>>347 神へ
ご助言の通り、as演算子をしらべました。
お陰でたまに出るエラーがなくなりました。
さすがは神ですね。
即レスにも関わらず、100%的中でした。
なぜ、私がたまに出る意味が理解できないエラーで苦労している所を
お察し出来たのか愚民にはわかりませんが、
貴方の英知で、救われました。
再びお礼を申し上げます。
string s = (string)(Session["Body"]) as string;
if (s == null)
{
Label1.Text = "<br />";
} else {
Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}
349:319
07/09/05 12:08:38
※すみません。下記に訂正しました。
string s = (string)(Session["Body"]) as string;
if (s == null)
{
LabelBody.Text = "<br />";
} else {
LabelBody.Text = s.Replace("\r\n", "<br />") + "<br />";
}
350:デフォルトの名無しさん
07/09/05 12:18:23
まだキャストしてんじゃん。
string s = Session["Body"] as string;
じゃないとエラーでるっしょ
351:319
07/09/05 12:22:14
>>350
いいえ。
今の所、何もエラーがでませんが?
でも、助言ありがとう。
352:デフォルトの名無しさん
07/09/05 12:39:14
>351
エラーは出ないけど
string m = ((string)"Hello")
とはやらないだろって事じゃない?
353:デフォルトの名無しさん
07/09/05 12:59:04
>>352
うん。私もそう思ったので、助言どおりに直しました。
だから、「助言ありがとう」とカキコしたよ。(^^
354:デフォルトの名無しさん
07/09/05 13:34:37
foreachを書き込みしたいっていう人は具体的に何をしたいの?
1. foreachのループの中でコレクションの書き換えをしたい。
2. foreachのループ変数を書き換えることによって、ループの制御をしたい
1.なら foreachのループ変数はコレクションの要素とは無関係な場合もある。
そもそも、IEnumerableには「要素」の概念はないし、arrayみたいにIListを実装した
インデックスを通じて要素にアクセスできるコレクションとは限らない。
2なら、ループのカウンタはIEnumerableの内部でループ変数とは別に
管理されているから、無駄(というか、おそらく何も起きない)。
だと思うんだけれど、ほかに何か書き込み許容するといいことってありますかね?
355:デフォルトの名無しさん
07/09/05 13:54:18
今更その話か
ちゃんと読めとしか言いようがないが、1でも2でもない(つーか2は意味がわからんが)
あえて例を出すならこんなことがしたいんでしょ
foreach (string str in input)
{
str = str.Trim().ToLower();
if (str.Length == 0) throw new exception("Invalid");
Console.WriteLine(str);
}
356:デフォルトの名無しさん
07/09/05 14:15:34
>>355
なるほど、そういうことか。全然議論が見えてなかった。
Console.WriteLine(str.Trim().ToLower());
でも書き込み禁止だとエラー出るのかな???
355さんの例みたいに条件分岐したいような場合は
たとえ書き込み禁止じゃなくても、可読性のために仮変数おいたほうが
いいとおもうけど…。
357:デフォルトの名無しさん
07/09/05 14:15:34
>>353
object o = 1;
string s = (string)o as string;
358:デフォルトの名無しさん
07/09/05 14:29:43
えーっとだな…
それはなんだ?
359:デフォルトの名無しさん
07/09/05 15:28:55
C#からC++のクラスライブラリを利用するには、
URLリンク(www.atmarkit.co.jp)
のように、publicメンバすべてをラップしか、方法ありませんか?
360:デフォルトの名無しさん
07/09/05 15:30:10
dt=$.split(' \n');dt[dt.length]='';for(i=0;undefined!=dt[i];i+=2){write(dt[i-i%2+1].replace('jp.','').replace('www.',''));br();write(dt[i-i%2]);br();}
361:デフォルトの名無しさん
07/09/05 15:36:46
>>359
使うメンバだけラップすれば良いよ。
COM 化するって手もある。
362:359
07/09/05 15:53:00
>>361
なるほどCOMって手も。。
説明まちがえた。
すべてのメンバか使うメンバだけって、ところが問題じゃなく、
いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。
ラップするのはここではC++/CLIだが、
直接C#でラッパを書いて、マネージドのクラスライブラリを作ることは
可能ですか?
363:デフォルトの名無しさん
07/09/05 16:01:12
>>362
C++/CLI でラッパを書く、C++ で COM 化するのいずれも避けるには?ってことですか。
ヘッダファイルとオブジェクトファイル(あるいはソースコード)で供給されるような普通の
良くあるクラスライブラリの場合、そもそもライブラリ側のコードを呼び出す手段が無い
ですよね。
dllexport されているクラスなら MSVC の ABI に従って呼び出してあげれば動くでしょうけど、
そういうライブラリはあまりないし、割に合わないような気がする。
364:デフォルトの名無しさん
07/09/05 16:34:36
今ハードウェアとやりとりをしなければならないので、PInvoke を使って DLL にアクセスしています。
この DLL の Open 関数を構造体を引数として呼んであげると、この構造体の中にデータが入って
返ってくるというものです。
で問題はこの構造体のメンバに構造体の配列が入っており、この構造体の配列を取得することが
できません。( 構造体の他の int のメンバは取得できています。以下でいうところの ID )
このような構造体下の構造体を取得することはできないのでしょうか。
struct Parent
{
public int ID;
public Data[];
}
struct Data
{
public int RawData;
public int Length;
}
365:359
07/09/05 16:38:33
>>363
すみません、最後の、
dllexport されているクラスなら(snip)動くでしょうけど、
について、もすこし教えてください。dllexportすれば、
C#から直接呼べますか?
366:デフォルトの名無しさん
07/09/05 16:59:15
>>365
exportする側は
URLリンク(msdn2.microsoft.com)(VS.80).aspx
あたりを参照
メンバ関数がどういう名前でexportされるかはコンパイラ依存。
dll 生成時の出来る lib を見て自分で調べる。
仮想メンバ関数は vtbl 経由でアドレスを取得。
MSVC の 呼び出し規約は基本 __cdecl ですが this を ecx に入れて呼ばなきゃないので、
そこだけは C++ というかアセンブラの補助が必要ですね・・・
367:デフォルトの名無しさん
07/09/05 17:00:01
あなたがCでDLLExportされたC++クラスのコンストラクタを起動し、
vtblに格納されているか少なくとも名前マングリングされたthisコールの
メンバ関数を起動し、スローされた例外を上手いこと取り扱い、最後に
デストラクタを起動して破棄できるのなら、C#でもきっと出来るだろう。
368:デフォルトの名無しさん
07/09/05 18:36:48
大人しくEXEキックしてコンソールで取り込めば?
369:359
07/09/05 19:13:34
>>366 367 368
みなさん。ありがとうなんとなく理解した。
[DllImport("native.dll")] extern static void Hoge()で、
C#から、Cの関数は呼べる仕組みがあるし(マーシャリングもあるし)、
マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、
なので、C#からC++/Nativeにアクセスできる方法も実はあるんじゃないかと、
ちょっと期待して質問してました。
370:デフォルトの名無しさん
07/09/05 21:11:06
>369
これはマジレス
キャストやアンマネージDLLを使うならVB.NETがいい。
VBFixedArrayにDECLAREで処理するDLLをC#で呼ぶ。
アンマネージVBが噛むと処理が激重だから、処理が軽いもの限定だけど。
FORTRAN
C
C++
で構造体処理するDLLも一発でいくよ
371:デフォルトの名無しさん
07/09/05 21:12:58
VB 使うくらいなら俺は C++/CLI を選ぶぜ
372:デフォルトの名無しさん
07/09/05 21:29:01
エクセルとか操るならVBの方がずっと楽だと思うけど、
アンマネージdllの関数呼ぶ手間はあんまり変わらないんじゃない?
373:デフォルトの名無しさん
07/09/05 21:32:03
>371
C++/CLIでやるのもありだな。2003ですまない
374:デフォルトの名無しさん
07/09/05 21:34:15
>372
それはVB.NETじゃなくないか?
375:359
07/09/05 21:38:27
>>370
ラッパをVBで書く?
>>371
私もなんとなく同意。
やりたいことは、ネイティブなC++クラスライブラリを、
マネージド(C#)から使えるクラスライブラリにしたい。です。
結局C++/CLIでくるむ方法を取ることになりそうで検討中ですが、、
publicなクラス → ラッパクラス
interface → ??
publicなメンバ関数 → 全部ラッパ
publicなメンバ変数 → プロパティ
#define定数 → static const な定数
struct → ??
enum → ??
どのように書き換えたらいいか、わからないとこ満載だ。
どなたか、??のところを教えてください。
376:デフォルトの名無しさん
07/09/05 21:41:15
バイナリーを読む場合ポインタTOストラクチャを使うC#に対してVBは一発で入るよ?
同じかな?
377:デフォルトの名無しさん
07/09/05 21:43:47
>375
それなら2005を買ってみな。
ヘッダ読めばそのまま動く
378:デフォルトの名無しさん
07/09/05 21:48:34
すまない、ちょっと言葉が足りなかった
使いたいライブラリをC++でインクルード
コンパイル
C#で参照設定
.NETプロジェクト
これで全部使える
379:デフォルトの名無しさん
07/09/05 21:52:49
VB.NETでラッピングする場合は、DECLAREで定義。引数は全てVARIANTのFIXEDARRAY
(OBJECTだと通らないから注意)
で、きちんとした型をCTYPEで渡せば動作する
楽じゃないか?
380:デフォルトの名無しさん
07/09/05 21:56:22
>>375
>マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、
ネイティブのライブラリは実はCのランタイムライブラリが裏で色々サポートしているので
newの部分だけ見てても混乱するよ。
内部でCRTヒープ使ってるかもしれないし、
atexitみたいなコールバックに依存しているかもしれない。
一般論として、Cのライブラリは静的リンクなり動的リンクなりのCRTを必要とする。
そのCRTとの連携無しに、C#から
直接Cのコード使おうってのはちょっと無謀じゃないかな。
相手がDLLの場合、LoadLibraryされたときに自分でCRTの初期化やるから
その辺気にする必要はないんだけど。
381:デフォルトの名無しさん
07/09/05 23:44:08
んん? そのためのC++/CLIなんだから、CRTのルールを守らず
アセンブリをロードするとは思えんけど。
URLリンク(msdn2.microsoft.com)(VS.80).aspx
382:デフォルトの名無しさん
07/09/05 23:50:54
>>381
C++/CLIはそれでOK。そこは同意。
よく分からないのは359が言うところのクラスライブラリが
どんなファイル形式なのかかな?
1) *.h 単体 (テンプレートライブラリ)
2) *.h+*.lib
3) *.h+*.obj
4) *.h+*.dll
5) *.h+*.cpp
>>>359 は
>いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。
とか書いている割に、どんな形態で配布されているライブラリなのか
未だに明かしていないみたいだけど。
383:359
07/09/06 01:46:34
>>382
わかりにくくてすんません。一番最初にあげたurlの記事の内容そのまんまで、
WIN32で書いてあるスタティックのライブラリ。
2) *.h+*.lib
ってことになります。
URLリンク(www.atmarkit.co.jp)
で、このとおりやってみようと思ったのだが、
>>375
で書いたとおり、メンバ関数をラップするだけじゃ足りなくて、
その他もろもろ細かいところすべて書き換えなきゃならなくなって。。。
ホントにこれが普通の方法なのか?もっとエレガントな方法があるのでは。
と、思ったのでした。
ちなみに、すべてではないですが、
4) *.h+*.dll
の形にしたものもあります。
MFC,ATL,stlは使っていなく、CRTは使っているものとそうでないものが。
>>380 >>381
Nativeと.NET、両方が扱える言語は、C++/CLIだけで、
っていうか、C++/CLIはそのために存在している。ので、いまこそ使うときだ。
ってことですかね。
384:359
07/09/06 02:01:14
>>370 >>379
VB.NETはまったく未開の地だ。ちょっとみてみる。ありがとう。
>>377 >>378
ん。COMの話?
385:デフォルトの名無しさん
07/09/06 11:42:05
どうもデリゲートの使いどころがわからないんですが
イベントのメソッドはわかるんですが
おーデリゲートってすげー!!!
っというような使用法ってどういうのですかね
386:デフォルトの名無しさん
07/09/06 11:48:38
//List<int> list;
list.Sort(delegate(int x, int y){return y.CompareTo(x);});//逆順ソート
387:デフォルトの名無しさん
07/09/06 12:18:08
>>385
そもそもイベントはdelegateのシンタックスシュガー似すぎな一ツーの
388:デフォルトの名無しさん
07/09/06 12:40:05
>>386
それって匿名メソッドスゲーの例じゃないの。
389:デフォルトの名無しさん
07/09/06 12:46:03
C#2.0になってジェネリックや暗黙のインスタンス作成や匿名メソッドが付いて
デリゲートが使いやすくなったけど、その前は単体ではあんまり積極的に使われなかったような
390:デフォルトの名無しさん
07/09/06 13:00:11
イベントとか意味わかんねえ
+=と-=しかできないし
なんに使うんだよ
391:デフォルトの名無しさん
07/09/06 13:01:53
>>390
イベントのハンドリングだとおもう。
392:デフォルトの名無しさん
07/09/06 13:04:04
普通にdelegate使った方が入れ替えられて便利じゃん
無駄なフェイルセーフだぜ
393:デフォルトの名無しさん
07/09/06 13:08:04
一応プロパティと同じように実装の変更もできる
394:デフォルトの名無しさん
07/09/06 13:08:20
>>390
IDEによるポトペタ
395:385
07/09/06 13:17:22
>>386>>388
そうですね匿名メソッドですね
>>387
そうですか…なんかイベントの話になってきてますね
んーデリゲートでこんな風にしたらすっごい便利!
とかいう話ないですかね
396:デフォルトの名無しさん
07/09/06 13:45:38
void Hoge() { list.ForEach(Print); }
void Print(int x){ Console.WriteLine(x); }
コレクション関係以外にないかなあ
397:デフォルトの名無しさん
07/09/06 13:58:02
>>395 処理のインジェクションしたいところにはdelegateばんばん使ってます。
クラスの生成時とかにそのシチュエーションに併せて動作を変えたいとき便利。
398:デフォルトの名無しさん
07/09/06 14:00:41
インターフェースを実装したクラスを作るよりも楽>delegate
399:デフォルトの名無しさん
07/09/06 14:55:19
Action<T>は
interface IHoge<T>
{
void Method(T arg);
}
とだいたい同等で
class A
{
public Action<Foo> Action;
}
class A
{
public IHoge<Foo> Action;
}
これもだいたい同等
a.Action = delegate(Foo foo){
....
};
これと
class FooHoge : IHoge<Foo>{ ... }
a.Action = new FooHoge(...);
これも大体同等
匿名メソッドなら直接かけるから一々定義したクラスを読まなくてすむので見やすい
ラムダ式になるともっと便利になる
匿名メソッド使わなくても、引数さえ合えばどんなメソッドでもはまるから、
いちいちinterface実装したクラスを作らなくて済む分楽
でもやっぱり真価は匿名メソッドで出てくる
400:デフォルトの名無しさん
07/09/06 15:04:40
interfaceでは大げさすぎる場合も多いし、例えばイベントハンドラを
インタフェースとして実装した場合、同じWidgetを複数個持とうとするとに
インタフェースが衝突する、といった問題が生じる。Javaではこれを解決
するのに一々ゴテゴテと無名クラスを記述する羽目になり、実に馬鹿馬鹿しい限りだ。
ラムダ式が無くとも、delegateであれば上記の問題は普通に解決することが
出来る。
まあ、処理を汎用化したり(例えば描画ルーチンに、PixelをPutする
ルーチンだけdelegateとして与えられるようにすれば、汎用になる)、
テーブルジャンプっぽく使ったり(メニュー等のindexとdelegateの配列を
結びつけたりする)、意思決定と実行のタイミングが分かれている場合に、
意思決定→delegate変数に保存→delegateを用いて実行といったことをやったり
(実行が何度も行われる際に、無駄な条件分岐を完全に取り除くことが出来る)、
色々と応用範囲は多い。
401:デフォルトの名無しさん
07/09/06 15:17:17
delegate使うとエディットコンティニューでやり直しになるのがデメリット
402:デフォルトの名無しさん
07/09/06 17:37:05
久々にThreadPool.GetMaxThreads()を実行してみたらワーカースレッドが500、I/Oスレッドが1000になってた。
前はもっと少なかった気がするんだけど・・・なぜでしょうか?
403:385
07/09/06 19:32:29
なるほどーみなさんいろいろ使ってますね
デリゲート道、精進します
ありがとうございました
404:デフォルトの名無しさん
07/09/06 20:04:16
>402
前は少なすぎたせいでスレッドプールが一杯になって例外が起きるケースがあったのでので.NET2.0から事実上無制限といえる値に増やされた。
なにげに呼んだクラスが内部でスレッドプールを使っててスレッドプールの上限で例外吐かれたりしても対処しようがないじゃん。
405:デフォルトの名無しさん
07/09/06 20:10:45
ClassAのイベントにメソッドを紐付けしてるClassBがシリアル化可能じゃないと
ClassAまでシリアル化できなくなっちゃうけど、これって何か回避方法ないかな?
あと、デリゲートにインスタンスメソッド登録するということは、
デリゲートに参照を持たれる(つまりGCが働かない)こととやっぱり等価になるの?
406:デフォルトの名無しさん
07/09/06 20:20:37
当たり前
っていうかイベント結びつけたままシリアライズしたいって
いったいどんなときなの?
407:デフォルトの名無しさん
07/09/06 20:22:28
ああひょっとしてシリアライズさせない方法が分からないってことか?
メンバにつける属性で制御できるよ
408:デフォルトの名無しさん
07/09/06 20:43:28
でもNonSerializedAttributeってイベントには付けられないと思うんですが。。
409:デフォルトの名無しさん
07/09/06 20:56:27
>>405
デリゲートを明示的に宣言してそのデリゲートにNonSerializedつければいいらしい。
↓参照
URLリンク(www.thescripts.com)
410:409
07/09/06 21:01:10
[field: NonSerialized]でもできるみたいだな
こっちのほうがスマートか。
411:デフォルトの名無しさん
07/09/06 21:09:45
>>409-410
ありがと。
しかし、そんなマンマの回答よく短時間に見つけられるもんだね関心しちゃうよ
412:デフォルトの名無しさん
07/09/06 21:44:51
部下にほしいね。
すみません師匠にほしいです。
413:デフォルトの名無しさん
07/09/06 21:56:13
このスレには結構、神クラスのスキルのひとがいるいよね。
どんな立場の人なのかきになるわ。マイクロソフト直々のサポート部隊が
書き込んでいるんじゃないかと思ってしまうくらいだ。
414:デフォルトの名無しさん
07/09/06 21:59:52
やまだはぷろぐらむの天才だ。
きょうもすごいぷろぐらむをつくる。
int i = new int()
あれ、なにかへんだぞ。
intはたしか・・・
Int16
やまだくんはまだ満足しない。
iというなまえはかぶるかもしれないからあんぜんじゃない!
Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER
完璧なソースコードの誕生だ!
415:デフォルトの名無しさん
07/09/06 22:02:31
>>413
そのクラスの人間なんて見たときねーよ
416:デフォルトの名無しさん
07/09/06 22:02:47
すみません。どれが自作自演でしょうか?
417:デフォルトの名無しさん
07/09/06 22:03:48
やまだだけどなんでもそうだんにのるよ!!
418:デフォルトの名無しさん
07/09/06 22:05:47
>>414
jが必要になったらどうする。
419:デフォルトの名無しさん
07/09/06 22:06:12
やまだくんはネームスペースをだな
420:デフォルトの名無しさん
07/09/06 22:06:28
田中は山田のイヂワルな上司だ。
今日も嫌がらせを部下達にして楽しむ。
「iというなまえはかぶるかもしれないからあんぜんじゃない!
「Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER
「完璧なソースコードの誕生だ!
あれ、山田が何か楽しそうだぞ。
イヂワルしてやれ!
「山田君、このメソッドの名前は[_USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER]にしてくれ
会議で決まったのだ!
421:デフォルトの名無しさん
07/09/06 22:06:31
>416
じえんはないけどえいえんはあるよ!
422:デフォルトの名無しさん
07/09/06 22:12:35
たなかさんめそっどめいのせんすないからきらいだ!
そうだ。こういうときは・・・おーばーろーどがあるじゃないか!
やまだはそっとたなかのめそっど名のぷれふぃっくすに
OVERROAD_
をつけたした。
これでなまえがかぶることはない。
423:デフォルトの名無しさん
07/09/06 22:15:09
スレが壊れだした
424:デフォルトの名無しさん
07/09/06 22:15:21
>418
よくじつにまわすか、ぷれふぃっくすにSTATIC_とかつければかいけつだよ(^^)
425:デフォルトの名無しさん
07/09/06 22:17:18
>423
すまない。ガチでこんなコードの修正依頼にイラついて書いてしまった。
後悔はしていない
426:デフォルトの名無しさん
07/09/06 22:19:11
マでやれ
427:デフォルトの名無しさん
07/09/06 22:22:43
for(LOOPCOUNTER_[LOOPCOUNTER_1,LOOPCOUNTER_2]=58;END==TRUE;LOOPCOUNTER_1**)
{
}
やまだすごくね?
428:デフォルトの名無しさん
07/09/06 22:23:33
名前空間の無い言語はきついな
429:デフォルトの名無しさん
07/09/06 22:24:51
END==TRUEってなんぞ
430:デフォルトの名無しさん
07/09/06 22:25:40
>>428
どちらかというとセンスのないプロ…
431:デフォルトの名無しさん
07/09/06 22:33:45
ちなみに言語はC#だぜW
432:デフォルトの名無しさん
07/09/06 22:35:04
ENDがTRUEの間ループをまわすの?
普通に発狂するわ
433:デフォルトの名無しさん
07/09/06 22:39:10
もっとやまだのコードがみたい
434:デフォルトの名無しさん
07/09/06 22:39:56
ディフォルトTRUE
スイッチFALSEとコメントある。
わからない事もない
435:デフォルトの名無しさん
07/09/06 22:44:32
ディフォルトって何?
436:デフォルトの名無しさん
07/09/06 22:45:54
マでやれ
437:デフォルトの名無しさん
07/09/06 22:48:14
やまだソース今度ZIPであげるわ
438:デフォルトの名無しさん
07/09/06 22:48:38
なんで大文字なんだろ
439:デフォルトの名無しさん
07/09/06 22:49:42
小文字だと予約語などにぶち当たるからだろ。
それかOLD BASICの名残。
440:デフォルトの名無しさん
07/09/06 23:08:58
まだLOOP==TRUEの方が理解できる
441:デフォルトの名無しさん
07/09/06 23:56:29
ブレークポイント設定してもデバッグができなくなる現象が突然でました。
どの辺確認すればいいのでしょう?構成はDebugでやってますが
442:デフォルトの名無しさん
07/09/07 00:01:03
ブレークポイントまでいってない説
443:デフォルトの名無しさん
07/09/07 00:08:40
リビルドすれば治る説
444:デフォルトの名無しさん
07/09/07 00:10:56
ブレークポイントはForm_Load内なので、到達してるんです。
性格にはブレークポイントに到達して、デバッグモードになるのに凄い時間がかかって
デバッグモード後はF10で1ステップ進ませると、デバッグモード解除されてしまいます
445:デフォルトの名無しさん
07/09/07 00:21:14
Form_Loadのブレークポイントの後に続く文があるのに
デバッグモード解除されるんだったら、
多分VSがぶっ壊れてるんだと思うよ
再インスコじゃね
446:デフォルトの名無しさん
07/09/07 00:31:52
不思議なことに、あるプロジェクトでしか現象出ないんだけど、
とりあえず朝一で再インストールしてみます
447:デフォルトの名無しさん
07/09/07 00:37:35
>444
デバッグのオプションのネイティブのチェックを外して.NETのみをデバッグするようにしたらどうなる?
448:デフォルトの名無しさん
07/09/07 00:40:18
>>447
すんません。ソースが会社なんで、明日やってみます。thx
449:デフォルトの名無しさん
07/09/07 01:27:48
「~~~は開始されませんでした」みたいなエラーメッセージがでて
デバッグ開始が異常に遅くなるときあるよね。
450:デフォルトの名無しさん
07/09/07 13:13:13
>>378
kwsk
451:デフォルトの名無しさん
07/09/07 15:01:14
ソリューションのクリーンとか試してみた?
452:デフォルトの名無しさん
07/09/07 16:39:10
怪しいアプリに邪魔されてた事とかあるな
453:デフォルトの名無しさん
07/09/07 19:05:00
質問です。
TextBoxコントロールの枠線の色は変更できますか?
できそうにない感じなのですが、そうすると自分で線を描くしかないかと
思うのですが、
Graphics g = this.CreateGraphics();
と取得してコレに対してDrawLineをしてみているのですが、
線が表示されません。
アプローチが間違っているのか、足りないおまじないがあるのか…。
どなたかお知恵をお貸しいただければ幸いです。
454:デフォルトの名無しさん
07/09/07 19:49:42
>453
まずその描画はOnPaintでやるべき。
なんとなく、Panelとかの上にTextBoxを載っけてPanelとかに枠線描いた方が楽じゃない?
455:デフォルトの名無しさん
07/09/07 19:59:40
>>453
いわゆるオーナードローっぽいことがやりたいのならControlPaintを使うようだから
詳細はMSDNを見るといい
が、>>454に同意だな
456:デフォルトの名無しさん
07/09/07 20:19:15
>>454
> まずその描画はOnPaintでやるべき。
TextBoxBase 以下は OnPaint が無視されたような気がする。
457:デフォルトの名無しさん
07/09/07 20:52:07
>450
2003までのCPPはマネージとアンマネージはクラス分けされ、同一コード内にはかけても、そこからメモリへの受け渡しが辛かった。
2005はマネージとアンマネージを並べてかける。
つまり
int A=42
printf(A.Tostring());
みたいな事ができる。
458:デフォルトの名無しさん
07/09/07 20:56:41
何かしょぼいが解る人にはマジで!と叫ぶようなコード。
459:デフォルトの名無しさん
07/09/07 21:15:38
>>453
やってみると意外と面倒だね。
枠の幅が1でよければ、BorderStyle =BorderStyle.FixedSingleにしておいて
WM_PAINT捕まえてそこで枠を描画すればできる。
460:デフォルトの名無しさん
07/09/07 21:44:08
public string フィールドしかないクラスから、全フィールドを連結した
文字列をこさえたい。リフレクション使えばできるかと思ったら、
Type.GetFileds() はフィールドの宣言順を保証しないと言う。
どうすればできる? あきらめるしかない?
461:デフォルトの名無しさん
07/09/07 21:44:35
>453
ピクチャボックスに色を塗る。
テキストをフラット枠線無しにしてピクチャの上に載せる
これが一番時間がかからない。
グラフィックで書くのも良いけど、速度は体感できない程度しか変わらない
462:デフォルトの名無しさん
07/09/07 21:47:44
>>460
そもそもCILにコンパイルされた時点で宣言順なんて保証されないと思うが。
まああきらめた方がいいと思うよ(仮にできたとしても)。
463:デフォルトの名無しさん
07/09/07 21:50:44
>>461
ぴったり1ピクセル分ずらすのって、むずかしくない?
464:デフォルトの名無しさん
07/09/07 21:55:20
>>460
Order属性とか自分で定義して全部のフィールドに[Order(2)]みたいに付けといて
その順番で連結すれば?
それなら余計なメンバを増やしたり動作をいじったりせずにリフレクションだけでできるよ
465:デフォルトの名無しさん
07/09/07 21:58:07
>463
サイズプロパティに打つんだよ。
マウスだとちょっとズレるかもだから
466:デフォルトの名無しさん
07/09/07 22:01:35
>460
ヒント
IList
delegate
467:デフォルトの名無しさん
07/09/07 22:07:41
>>466
そんなめんどくさいことするくらいなら初めから連結メソッドを定義するだろw
468:460
07/09/07 22:10:44
>>464
カスタム属性か。まあ今も Excel から自動生成してるクラスなんで、
それならできそうです。
>>466
plz one more.
469:デフォルトの名無しさん
07/09/07 22:12:06
>462
確かに宣言順は保証されないんだが、
宣言順に初期化されるという保証があるので事実上宣言順に並んしまうという状態。
それを利用してリフレクションを使って順番通りに文字列をなんかするなんてソースが会社に大量にあって動いている困った状態。
どうにかして宣言順に並んでいないケースって意図的に作れないかな?
順番は保証されてないから動かない可能性があるって言っても動いてるからって理由で修正を拒まれて困ってる。
470:デフォルトの名無しさん
07/09/07 22:14:45
>468
自動生成クラスなら文字列連結メソッドも自動生成した方がいい。
自動生成クラスが何かのケースで実際に動かして動かないことが発覚するリフレクションより
コンパイル時に動かないコードになってることが分かる方がいいよ。
471:460
07/09/07 22:56:31
>>470
んんん。良くわからんのだが、リフレクションは信用ならないということ?
連結メソッドにしろリフレクションしろ、コンパイルを通した上で、テスト
ケースもこなすと思うのだが。
472:453
07/09/07 23:33:24
>>454
やっぱり重ねるのが楽でしょうか…。
ありがとうございました^^
>>455
了解しました、MSDN見てみます。
ありがとうございました^^
>>456
な!?
マジですか!?
処理追ってみます。
>>459
おお、その方法よさそうですね、試してみます^^
ありがとうございました^^
>>461
やはり載せる案多数ですね…。
ありがとうございます^^
とりあえず今日は退勤してまいりましたので、明日にでもいろいろやってみようかと思います。
みなさんありがとうございました^^
473:デフォルトの名無しさん
07/09/07 23:36:50
リフレクションは保障されてない
メソッドは保障されてるってことだろ?
わざわざリフレクション使う内容かどうかわからないし。
474:デフォルトの名無しさん
07/09/07 23:47:59
でもこの場合属性を連番で付けるだけなら失敗のしようがないだろ
475:デフォルトの名無しさん
07/09/08 00:00:35
このスレ見てるとC#おもしろそうですね。
アセンブリしかできませんが、挑戦してみようかな
476:デフォルトの名無しさん
07/09/08 00:03:32
君見る目があるね
477:デフォルトの名無しさん
07/09/08 00:05:03
>>475
今の流れはどちらかと言うと不毛な話ばっかりだと思ったが。
どこらへんが面白かったか教えてちょ!
正直c#は面白い。
478:デフォルトの名無しさん
07/09/08 00:08:33
F#はもっと面白いよ(´・ω・`)
479:デフォルトの名無しさん
07/09/08 00:42:40
>471
ある日、誰かがメンテをしてそのクラスを手でちょっとだけ修正を入れて
何気なくフィールドを追加しただけなのに挙動が変わったなんてことが起きるかもしれない。
せっかくの連番の属性も意味もわからないままコピペされて番号が重複したりするかもしれない。
そういうときに限ってテストケースの存在も無視される。
普通のメソッドになってれば少なくともそのメソッドの挙動は直接メソッド自体を書き換えられないと変わらないだろ。
マクロで普通のコードを生成できるのに、
リフレクションで処理しやすいようなクラスを用意するってのは本末転倒だろ。
C#のリフレクションはJavaなんかより割と速いけど普通にメソッドを叩くよりかは明らかに遅くなるだろうし。
480:デフォルトの名無しさん
07/09/08 01:09:54
DataGridVewに行を追加したいのですがどうすればいいのでしょうか?
481:デフォルトの名無しさん
07/09/08 01:46:22
asciiファイルからshift-jisで読み込んで、dataGridViewに表示させてるんですが、
この表示された値(2バイト文字)をコピーしてエクセルに貼り付けると文字化けしています。
(テキストファイルなどへのコピーは平気)
エクセルへのコピーも問題なく行うにはどうればいいのでしょう?
482:480
07/09/08 02:55:09
自己解決しました
483:デフォルトの名無しさん
07/09/08 03:42:07
そのくらい自己解決してもらわないと困る
484:460
07/09/08 08:26:15
>>479
自動生成クラスを手でいじったり NUnit かけずに済ます文化がこちらには
ないんだが、言わんとしてることはわかった。ありがとう。
485:デフォルトの名無しさん
07/09/08 10:06:40
dictionaryのキーとして専用の構造体を使うとき、
等値比較演算子を自分で実装しないといけないの?
試してみたら自動でやってくれてるみたいだけど
486:デフォルトの名無しさん
07/09/08 10:59:15
リフレクション使うのでかなり遅いけど、それでもいいのなら
487:デフォルトの名無しさん
07/09/08 13:14:24
構造体なら値比較?
488:デフォルトの名無しさん
07/09/08 13:37:18
>>487
デフォルトだとValueType.Equalsが使われる。
ValueType.Equalsだが、プリミティブ型のみから構成される構造体なら
ビット比較を使うっぽい。
参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
これが遅いと言われている。
スレリンク(tech板:161-185番)
489:デフォルトの名無しさん
07/09/08 13:41:43
>>488
>参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
いまのCLRならその部分をLCGで実行時生成して
キャッシュしておくこともできそうだな。
キャッシュの寿命管理が面倒そうだけど、
直近の16エントリぐらい保持しておけばそこそこヒットしそうだ。
490:デフォルトの名無しさん
07/09/08 14:01:32
素直に IEqualityComparer 実装しようよ
491:デフォルトの名無しさん
07/09/08 14:09:10
自作の構造体なら、わざわざDictionaryなんかに頼らなくても
自分とペアになるオブジェクトをプロパティで持たせた方が簡単で早いじゃん。
・・・・・・と俺は思っちゃうんだが、これってやっぱり単細胞過ぎる発想かな。
492:デフォルトの名無しさん
07/09/08 14:10:11
>>491
肝心のハッシュテーブルはどうするんだw
493:492
07/09/08 14:12:39
ああ、ごめん無視して
俺のほうが単細胞だったようだorz
494:デフォルトの名無しさん
07/09/08 18:57:52
>>488
ValueType.Equalsを使うならボクシングが発生するよね
それならプリミティブ型のみでもやっぱり自分で比較した方が速いのかな
495:デフォルトの名無しさん
07/09/08 23:48:32
comboboxにあるクラスのインスタンスを設定したいのですがどうすればいい?
496:デフォルトの名無しさん
07/09/08 23:51:32
ComboBox.Tag を使いなはれ
497:デフォルトの名無しさん
07/09/08 23:51:33
ValueTypeにそのクラスを設定すればいいだけじゃん
その程度のこともしらない人がつくったアプリなんて使いたくも無いw
498:デフォルトの名無しさん
07/09/09 01:41:29
>>494
JITでボクシングの部分はたいてい取り除かれているらしい。
さらにインラインかもありえるらしい。
ただJITの結果は調べられないからほんとかどうかは知らない。
499:デフォルトの名無しさん
07/09/09 01:59:44
>>498
>ただJITの結果は調べられないからほんとかどうかは知らない。
ボクシングが起きてるかどうかはCLR Profilerで分かるんじゃない?
GCヒープにその値型が確保されてればどっかでボクシングは起きてるてことで。
500:デフォルトの名無しさん
07/09/09 02:10:22
デバッガでアタッチしたら見えるんじゃねーの。
ってか取り除かれるのはかなり限定された状況だけじゃない?
501:デフォルトの名無しさん
07/09/09 05:03:43
>>469
問題が起きたら直すでおk
世の中そんなもんだ。
502:デフォルトの名無しさん
07/09/09 11:42:40
文字列に記述したプログラムを解析して結果を返したいけどいい方法はない?
jscript.netのevalはNGです。
自分で書いた独自のメソッドを呼べないので。。
public string myMethod(string s)
{
return "hoge";
}
文字列に
if(myMethod("hoge")=="hoge") "あ","い")
としておき
結果の
"あ"
を返す方法
文字列中にmyMethodがいつ来るかはわからないです。
503:デフォルトの名無しさん
07/09/09 12:23:16
まあやっぱりJScript.NETのevalだな
myMethodは静的にすれば元アセンブリ参照で呼べるだろ
504:デフォルトの名無しさん
07/09/09 12:36:05
>>502
IronPython
505:デフォルトの名無しさん
07/09/09 12:37:51
教えてください。
ArrayList で foreach を使う事について
ループ内部でIndexof を使用してIndexを求める場合、
foreach を使用せずに最初からインデックスを指定して回すやり方が普通なのかどうか
常識的に考えると後者が普通だと思うのですが
foreach を使用したほうが、コードが若干短くなるし、
コード上では多少効率が割るそうですが、オプティマイズされたCLRが吐かれるような気もしますし
506:デフォルトの名無しさん
07/09/09 12:45:06
ArrayListの中身を変更したいんならindexで回す
参照オンリーならforeachでいいんじゃないのか
Array<T>やList<T>ならForEachメソッドなんてのもある
507:デフォルトの名無しさん
07/09/09 13:05:00
>>506
ありがとうございます
ところで、2003 にはList<T>は無いみたいです...
508:デフォルトの名無しさん
07/09/09 13:08:21
ペイント系のアプリを書こうと思ってとりあえずPaint.NETを
使ってみたが、とてもじゃないが金を取れるソフトではありませんね
やはり、商用だとC/C++がいいのですかね
509:デフォルトの名無しさん
07/09/09 13:18:51
そりゃ金とってないソフトだ品
510:デフォルトの名無しさん
07/09/09 13:35:56
>>508
おまいさんは金を取ることの意味を勘違いしてるな。
The Old New Thingsでも立ち読みしてこい。
URLリンク(www.amazon.co.jp)
511:デフォルトの名無しさん
07/09/09 13:57:37
>>508
みたソフトが悪い
あれはMITのヲタク学生が書いた駄作だよ
512:デフォルトの名無しさん
07/09/09 14:05:24
またまたArrayListについて教えてください
ArrayListにオブジェクトをセットして
セットするオブジェクト: int Key, string Name1, string Name2, ...
そのArrayListに対して、例えば、Key = 3 は何番目なのかを
メソッドだけで、処理できますか?
Contain と IndesOf と、比較用のメソッドをオーバーライド?すればできそうな気もしていますが
良くわかりません
513:デフォルトの名無しさん
07/09/09 14:26:55
なにを言っているんのかよく分からんが
IndexOfでとれるだろ。。unboxingされて値が同じなやつが返るだろうけど
514:512
07/09/09 14:29:21
>>513
比較の際に、同一オブジェクトではなく、プロパティのKeyのみで比較したいのです
515:デフォルトの名無しさん
07/09/09 14:33:23
>>512
EqualsとGetHashCodeをoverrideする。またはHashtableでも使え。
それがいやならC#2.0のList<T>にはFindメソッドとかあるぞ。
516:デフォルトの名無しさん
07/09/09 14:35:30
ますます何を言ってるのかわからん
intなら値で比較されるだろ
もしかして
key1, string1_1, string1_2,
key2, string2_1, string2_2,
...
みたいな構造をArrayListで作ろうとしてるの?
HashTable使えよ。。。
517:デフォルトの名無しさん
07/09/09 14:42:57
>>512
こういうことがしたいの?
public class Item
{
public int Key;
public string Name1;
public string Name2;
public string Name3;
}
ArrayList al = new ArrayList();
// 入力
int index = 0;
foreach (Item item in al)
{
if( item.Key == 3 ) break;
++index;
}
if (index == al.Count)
Console.WriteLine("みつかりませんでした");
else
Console.WriteLine("{0}番目", index);
518:デフォルトの名無しさん
07/09/09 14:44:43
孔子は言った。
考えるだけで学ぶことをしようとしない人間は間違いを犯しやすい。
519:512
07/09/09 14:58:56
ちょっとだけ違います。
ArrayList al = new ArrayList(); // 入力
Item addOrReplaeceItem = new Item(); // 追加または、更新しようとする要素(オブジェクト)
addOrReplaceItem.Key = 2;
addOrReplaceItem.Name1 = "new name1";
int index = 0;
foreach (Item item in al)
{
if( item.Key == addOrReplaceItem.Key ) ;
{
((Item)al[index]).Name1 = addOrReplaceItem.Name1; // あれば、入れ替え
break;
}
++index;
}
if (index == al.Count)
{
Console.WriteLine("みつかりませんでした");
al.Add (addOrReplaceItem); // 無ければ、追加
}
こんな感じです。
宜しくお願いします。
520:デフォルトの名無しさん
07/09/09 14:59:19
>>505
あほなこと言ってないで素直にインデックスで回すか、
自前でインデックスカウントしとけ。
同じ値とか複数あったらどうすんだ?
無いとしても効率悪くなるだけ。
そんな器用な最適化ができるわけなかろう。
521:デフォルトの名無しさん
07/09/09 15:01:13
いっそDataSet/DataTableを使ったらどうだ。
522:デフォルトの名無しさん
07/09/09 15:01:30
ふらっと逝け
523:デフォルトの名無しさん
07/09/09 15:22:45
>>519
「メソッドだけで」とか難しいこと考えずに
全部書くか自分でメソッド作ることをおすすめする。
どうせList<T>使えるようになったら組み直しなんだし。
難しいことやるのは慣れてからでいいよ。
524:512
07/09/09 16:11:52
ありがとうございます。
525:デフォルトの名無しさん
07/09/10 02:22:48
DataGridViewでコントロール+Cを押したときのクリップボードに
値を渡すのを防ぎたいんですがどうすればいいでしょう?
526:デフォルトの名無しさん
07/09/10 02:24:53
clipboardcopymode = Disable
でできました。。どうもです。
527:デフォルトの名無しさん
07/09/10 03:46:34
SDJEditorを使ってみた
やはり、.NETではこの程度が限界か?
528:デフォルトの名無しさん
07/09/10 06:36:45
>>503
すみません
この発言読み飛ばしてました。
静的にすればアセンブリ参照で呼べるというのを解釈すると
new をしないようなstaticなメソッドにしてDLLとして作成。
呼び出し元プログラム側で、参照の設定をしてあげるという
のでしょうか?
この静的にするということは、タイプセーフではないという
ことになりますか?今回ASP.NETで作成したいのですが。。
>>509
IronPaython
は動的言語ということで私も考えたのですが
具体的にどうすればよいのかが浮かびませんでした。
それにC#から呼び出したいのでオーバヘッドが発生する気がします。
529:デフォルトの名無しさん
07/09/10 08:55:33
組み込みスクリプト感覚で使うつもり?
それ危なくない?
530:デフォルトの名無しさん
07/09/10 12:46:34
> 静的にするということは、タイプセーフではないということになりますか?
なんで?
> C#から呼び出したいのでオーバヘッドが発生する気がします。
eval とか言ってるのにオーバーヘッドw
まあ全体に ASP.NET でやるには怖すぎる処理だわな
531:デフォルトの名無しさん
07/09/10 13:01:49
限定された構文でよかったら自分でインタープリタを作る手もあるし、
その手のライブラリもあるだろう。
evalと同等とかC#の関数で出来ることを全部やりたいなら、
CodeDOMやらそれなりに危険なことをしないと無理。
話はそれるがC#3.0のExpression<Func<>>の仕組みをつかって、
eval的なことが出来そうな気がする。
いまのところDLinq用だが、どう見てもLispのクォートを狙ってるとしか思えない。
532:デフォルトの名無しさん
07/09/10 18:43:40
>>531
本題とはずれるけど、C# 3.0 のラムダ式の話、
C# 3.0 は F# からいろいろ輸入したって話らしいから、
F# の(大元をたどればもちろん LISP の) quote 由来だろうね。
LISP だと、データとプログラムを区別しないってのを、
.NET Framework だと、ラムダ式を
デリゲートに代入したときはプログラムとして、
Expression 型に代入したときはデータとして扱う
というコンセプトみたい。
533:デフォルトの名無しさん
07/09/10 18:49:29
>>532
DLRも見てみると面白いよ。
ASTからILへの汎用変換エンジンになりつある。
CodeDOMは死相が出ちゃったけど
DLRはRubyとPythonという目標がある以上、
ある程度のところまで作り込むんじゃないかな。
ちなみにExpression Treeの裏話。
URLリンク(d.hatena.ne.jp)
ま た D o n B o x か !
534:デフォルトの名無しさん
07/09/10 23:55:38
すんません。
HTML中で16進形式(5桁:ex."𠮟")で指定されたサロゲートペア文字を
正しく変換する楽な方法ってないですか?
HttpUtility.HtmlDecodeだと、下位4桁までしか認識しないようで、困っております。
string s = HttpUtility.HtmlDecode("𠮟");
foreach (char c in s)
Console.WriteLine(string.Format("{0:X4}",(int)c));
--出力(こんな値が入ってて欲しい)--
D842
DF9F
--出力(でもこうなっちゃってる orz)--
0B9F
535:デフォルトの名無しさん
07/09/11 00:07:19
正規表現使えば
536:デフォルトの名無しさん
07/09/11 00:19:54
ども。"&amp;"とかも"&"として取得したいんで、
できればメソッド一発でできたらなぁ、と思ったんですが、
やっぱそこだけ別に処理するしかないスかね。
537:デフォルトの名無しさん
07/09/11 00:29:04
数値文字参照だけ置換してあとはHttpUtilityに任せる
というのをひとつのメソッドにすればメソッド一発だよ
538:デフォルトの名無しさん
07/09/11 00:54:18
気になったのでざっと調べた感じ、HTML4.01の扱える文字集合はISO/IEC 10646-1らしい。
いわゆるUCS-4なんだが、-1はBMPしか扱わないそうな。-2がそれ以外の文字。
539:デフォルトの名無しさん
07/09/11 01:32:11
BitmapオブジェクトがDispose()されたことをBitmapオブジェクトの外部から知ることはできるでしょうか。
ローカルメモリオブジェクト内のDIBをもとに作成したBitmapオブジェクトが破棄されるまではローカルメモリオブジェクトを解放せずにおき、Bitmapオブジェクトが破棄された段階でローカルメモリオブジェクトを解放するようにしたいのです。
DIBをマネージメモリにコピーしてからImage.FromStream()でImageオブジェクトを生成し、すぐさまローカルメモリオブジェクトを解放する、という方法なら安全確実なのですが、いかんせん遅いのです。
540:デフォルトの名無しさん
07/09/11 05:44:01
>>503
>まあやっぱりJScript.NETのevalだな
>myMethodは静的にすれば元アセンブリ参照で呼べるだろ
やってみたけど無理でしたよ!
やっぱりできないのでは?
DLL側に
public class MultiplyClass
{
public static long Multiply(long x, long y)
{
return (x * y);
}
}
としてコンパイル、それを呼び出し側で参照の追加。
string exp = "MultiplyClass.Multiply(10, 5)";
Microsoft.JScript.Vsa.VsaEngine ve =
Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
long result =
(long)Microsoft.JScript.Eval.JScriptEvaluate(
exp, ve);
そうすると
変数 'MultiplyClass' が宣言されていません。
結局、作成したクラスはスコープの範囲外でした。
541:デフォルトの名無しさん
07/09/11 07:22:54
>>538
なるほど。HttpUtility.HtmlDecodeのバグというわけではないわけですね。
わざわざありがとうございます。