2 :
デフォルトの名無しさん :2007/11/13(火) 21:38:02
C# >>>>>>>>> C++ もはや、カルト言語となったC++に未来はない C#で幸せな生活を送りましょう では、幸せをもたらすC#, C♯, C#相談室 Part44、はじまりはじまりー
5 :
デフォルトの名無しさん :2007/11/13(火) 21:42:09
取りあえず Effective C# More effective C# Modern C# design ぐらいは読みましょう
6 :
デフォルトの名無しさん :2007/11/14(水) 00:04:44
i = 0; while (i < n); { n = ある数字; ++i; } という処理で、上記のようにすれば、nが定義されてないとエラーが出ます。 変数nに入った数字をwhileの()内で読めるようにするにはどうすればよろしいのでしょうか?
nの型 n = 初期値; をwhileより上に書く
評価順序考えれば、どこに書くべきかわかるだろう・・・ フラットいけよw
1000 名前:デフォルトの名無しさん[sage] 投稿日:2007/11/14(水) 00:46:44 1000でC#は世界を翔ける キタワァ*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・*
グローバルで宣言された2次元配列の内容をmemmove使わずに移動したい場合、 どうやって情報を移動すればいいですか? 2次元配列は結構大きいので、 ローカル変数に一時的に退避するのがどうも気持ち悪くて… array[1000][1000];
配列は参照型だから気にしなくていい int[][] local = array;でおk(ハンドルを渡してるだけ)
反射的に書いちゃったけど 「ここはC#スレですよ」 の方が正しい気がしてきた
おそるべきはVB6脳
VB6は関係ないだろ常識的に考えて Cスレと間違えて来る人はC#の存在を知らないんだろうな C++の人は間違えないと思うし
知らない人って宿題がんばる学生さんかねぇ?
質問よろしいでしょうか? 現在 Visual C# .NET を使ってDataGridにアクセスからのデータを表示と言うのをやっているのですが 普通にFormLoadに 〜Jet4.0で命令を入れて表示させる事はできるのですが TabControlを使って(3つ)各ページ毎に アクセスのテーブルを表示させる事が上手くいきません Formに命令を入れるとTab1にはテーブルが出てくるのですが2.3には何も出てきません Tab1Clickの欄に表示させたいテーブルを呼び出す命令を入れたら何も表示しないようになります。 そこで質問なのですが タブ毎に DataGridの表示をさせるには 表示させる命令はどこに入れればいいのでしょうか? 醜い文章かもしれませんが 分かる方みえましたら教えていただけませんでしょうか
タブページごとにデザイナでDataGrid貼れば
DataGridは貼れるのですが そこからページ毎に違うテーブルを読み込むことができない状態でいます。 DBとしては同じファイルなのですが テーブル毎に管理をしたいので TabPage毎に 表示させたいと思っています。 付け加えで質問なのですが その際に ページ毎にラベル・テキストボックスをテーブルの項目数分配置して //グローバル変数宣言 public System.Windows.Forms.Label[] arrlbl=new Label[配置した数]; public System.Windows.Forms.TextBox[] arrtxt=new TextBox[配置した数]; //ラベル名を発行 arrlbl[0] = label1; arrlbl[1] = label2; //テキストボックス内の取得 arrtxt[0]=textBox1; arrtxt[1]=textBox2; で自動でテーブルの項目名と先頭の項目内容を取得できるようにしているのですが TabPage1 ではFormLoadに命令を書き込んでいるせいか成功するのですが 他のページ分は成功しないのですが 良い方法はないでしょうか? 現在 自分でも色々突っ込んで試行錯誤中ですので アドバイスでもいいのでよろしくお願いします。
>//グローバル変数宣言 >//グローバル変数宣言 >//グローバル変数宣言 グ ロ ー バ ル 変 数 宣 言
何を 変数宣言すればいいのでしょうか? なんとか TabPage毎に テーブルの表示をすることができたのですが 残りの テーブルの項目毎にラベル・テキストボックスに表示がうまくいきません 先ほどの arrlbl arrtxt の後に for(i = 0;i<ds.Tables["お客テーブル"].Columns.Count;i++) { arrlbl[i].Text = ds.Tables["テーブル名"].Columns[i].ColumnName; arrtxt[i].Text=ds.Tables["テーブル名"].Rows[0][i].ToString(); } でテーブルにある項目数をラベルとテキストに読み込んでいます。 プログラムの知識が浅いため for〜TabPage1で出したいテーブル for〜TabPage2で出したいテーブル for〜TabPage3で出したいテーブル とTabPage3つ分繰り返していれている為なのか TabPage1にfor分の最後 つまりTabPage3で読み込みたい項目が出てきてしまいます。 なにかよい解決策を探しています。 何度も書き込み申し訳ないと思っていますが どうかお力添えよろしくお願いします。
Label と TextBox 使うってことは…… PropertyGrid を勧めておく
こんな馬鹿にPropertyGridを勧める君はもっと馬鹿だな
そんな実践的な課題に手を出すレベルじゃないと思う 悪いこと言わないからもうちょっと勉強してからのほうが結果的に早いよ
>23 教える気が無い奴が馬鹿って言っても何の魔力も無いな >22 もしかして for文を3つ分 コピペしてテーブルの中身だけ書き換えているとか言う 落ちじゃないよな?
VB6脳・・・にすら到達してなさそうだな。 来年はちゃんと講義聞けよ!
デリカシーもなにもないやん おもくそ上書きしてるやん
wankuma系はVB脳でしょ・・・
>>27 です
wankumaは すげぇお世話になってるところですね
まぁ俺のVB脳じゃないってとこかな。
>>21 に 気の利いた回答だしてもやれねぇよ
「VB.NETで書けって言われたけど初めて見たらなぜかC#だった」 のか?
VB9ってC#と同じように「ちゃんと解ってる人にだけ便利」な感じだなあ わからなくても使える言語を目指してると思ってた
ぶーん2等兵さんへ ステップでデバッグするか、内容をラベルに書かないでtextboxに順次書き出していったほうがいいよ。 回答は書かないけど、単純なのですぐわかると思う。
そんな言語は存在しない
36 :
デフォルトの名無しさん :2007/11/15(木) 11:02:10
InvokeやBeginInvokeを呼ぶときって Invoke(new defineddelegate(func),arg); って呼ぶ場合と defineddelegate dd = new defineddelegate(func); dd.Invoke(arg); で呼ぶ場合と何か違うのでしょうか?
上は this.Invoke(... 下は単に func( arg );
38 :
デフォルトの名無しさん :2007/11/15(木) 11:26:22
>>37 とInvokeを正しく使うとすると上ってこと?
挙動は同じだろう、Invoke関数でシグネチャをまとめて設定するのが特徴なだけだろ。
ありがと
上のほうはthisが省略されてるっつーか 多分Control.Invokeでしょうが…… 別スレッドで呼ばれてもControl作成スレッド上で動く 下はスレッド関係なく実行スレッドで動く
実行スレッドで動くInvokeは意味はあるのでしょうか?
C#で作成したプログラム foo.exe をずーっと実行させていると 1ヵ月〜2ヵ月ぐらいで、 Execption of the System.OutOfMemory Exception was throw というダイアログメッセージが出力されます。 ダイアログの詳細を見ると、mscorlib.dll で上記の例外が発生している様子です。 この時のシステムの状態は、Ctrl+ALT+DELでタスクマネージャーを起動しようとしても、 「アプリケーションを正しく初期化出来ませんでした 0xc000012d」 といった感じで、タスクマネージャも起動できません。 また、スタートメニューのアイコンが表示されなかったり、他のアプリケーションの起動も出来ません。 foo.exe をウィンドウメニューの×をクリックして終了させても、状況は変わりません。 foo.exeがメモリリークしているのであれば、foo.exeを終了させれば、その状態は回復する と思っているんですが、foo.exe を終了させているにも係わらず、タスクマネージャが起動出 来ない状況が変わらないため、何が起きているんだろうと、途方にくれています。 一旦この状態になったら、ウィンドウメニューの×でfoo.exeを終了させても、 メモリはシステムに返されない状態になってしまっているんでしょうか? それとも、foo.exeを終了させたつもりになっているだけで、実際?は、終了していないんでしょうか? また、こういった状況を調査するためには、なにを調べれば良いでしょうか。 すいませんが、知恵をお貸しください。 環境は、 WindowsXP SP2 .NET Framework 1.1 Hotfix(KB928366) です。
>>43 それだけ間隔が長期だとトラブルシューティングも大変そう。
OSのメモリ管理に何か不具合が起きて、foo.exeがOutOfMemoryになったり
タスクマネージャも起動できなくなったと考えたほうが自然だろう。
メモリやドライバやハードがらみの可能性が高いと思うけどな。
>>43 とりあえず普通にログ取れば?
OSのカウンタログとか、foo.exe自身のトレースログとか。
そんでわざとメモリの少ない環境で負荷テストとか。
10日とか半月くらい動かしたタイミングならなんらかの傾向は出てるんじゃない?
47 :
43 :2007/11/15(木) 19:42:40
>>44-46 レスありがとうございます。
一度カウンタログを取ってみた事はあるんですが、
数日程度では foo.exeがメモリリークしているんだか、
他のプログラムが悪さしているんだか良く分からなかったんです。
(少なくとも、目に見えて foo.exe がメモリをどんどん使っているという
様子ではありませんでした。)
foo.exe 以外の常駐タスクに対しても、カウンタログを取ってみることにします。
いや〜こんなん聞くと来月リリースするプログラムが気になるわ・・・
無償で性能のいいリファクタリングツールを教えてください。
プラグイン作ればいいだろう。
そんな無茶な・・
PerfMonでこんなに.netの分析ができるなんて知らなかった おもすれー Bytes in all Heaps が減らない……orz
>>53 使われてるサイズじゃなくて予約されてるサイズではなかろうか。
55 :
43 :2007/11/16(金) 12:02:52
>>48 おぉ、これは嬉しい情報です、助かります。
カウンタログ取るときに、なにを取れば良いのかが
良く分からなかったんですが、これでめぼしいプロセスの
ログを採取してみたいと思います。
ふと疑問に思ったんだけど、ラムダ式の => ってなんて言えばいいんだろう? 一応演算子らしいが。ラムダ演算子?
ってなんとなく思いついて最後に付け足したラムダ演算子で実際通ってるっぽいな。
みぎいけ。
オナラw
スルメ
にっこり
goes to
goto
GOT
gen0オブジェクトの回収のメカニズムを解説している記事やブログってありますか? gen2のメカニズムはいろんなところに書かれているんですが。
プログラミング .NET Framework 読め 図書館にもあるかもよ ちょっとした記事やブログだけ読んで理解するには大きすぎる 中途半端な知識で解放漏れしてるやつ大杉
GCしてるのに解放漏れとかwwww
さっそく中途半端が
さっそく釣られてる奴が
Disposeしてnull入れれば何の問題もないしwwwww
同意。 そんな数年後には意味無くなってるかもしれないinsideなテクに頼らず、基本に忠実にメモリ管理しろっーことだな。 GCに頼ってると複雑で巨大な相互参照してる類のオブジェクトの解放にドえらい時間かかるし。 手抜きの機能というか、メモリ管理においてのフェイルセーフ機能にしか過ぎないね、GCは。
フェイルセーフじゃなくてフールプルーフか?
マネージドなオブジェクトや配列は一切使わず、全部P/Invokeで確保・解放して C#からはハンドルだけ触るようにすればいいんじゃね
どM仕様
disposeした後でnullにする意味って何なの?
ローカル変数なら無いね フィールドなら参照切れる
>GCに頼ってると複雑で巨大な相互参照してる類のオブジェクトの解放 GCないと本気で死ねるだろ。
メンバにDisposeするのはたいていの場合親も破棄する時だろ。 親を破棄しないときなら別に解放とか関係なくnull入れるだろ。
自分が持ってるメンバのDisposeを呼ぶためにDisposeを実装するときは 「もうDisposeした」フラグとしてフィールドにnull代入するな
>>66 の本のGCとデバッグの話は読んでから怖くなった
二つ以上のListとかに一つのオブジェクトが入ってると それだけ削除するのが大変だな
>>82 親は長生きだけど子は短命なときはどうするのさ
特に親が子だくさんのとき。
とりあえずあなたの作るものは使いたくないな〜
とりあえず、objectクラスを継承したbaseClass作ってIDisposableを実装すれば良い。 それを継承したClassを使え。 もちろん、Control系は実装済みだからいらないぞ。
子の個々のメンバはdispose、null代入しなくても子をdisposeするだけでいいんだよね?
>>86 >>親を破棄しないときなら別に解放とか関係なくnull入れるだろ。
>親は長生きだけど子は短命なときはどうするのさ
>特に親が子だくさんのとき。
>とりあえずあなたの作るものは使いたくないな〜
どいうことだ?
馬鹿にしたいだけの馬鹿ってことか。 親はそのままで子だけを破棄するときには、 開放目的とか関係なく普通にnull入れるだろう って言ってるのに 親は長生きだけど子は短命なときはどうするのさ ってだからnull入れるって言ってんだろうがよ。
普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 何を難しく考えてるんだ。
>普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 違うと思うよ… っていうかリソース大量ってどういう意味で言ってるのん?
Dispose関連のリソースと言えばメモリ空間だろう。 結局、一番影響が多いものから対応するのが実質的なプログラミングだろう。 わざわざ、32bitしかリソース使ってないものを破棄することにベースクラスを遡って 対応なんてやらない。そのような多少なミスを許すためにGCがあるんだから。
どう違う?
>Dispose関連のリソースと言えばメモリ空間だろう。 なんでやねんw
Dispose と null 代入は全然違うだろ常考
>>96 例としてまず挙がるのがそれだと言いたいんだろ
>>>普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 >>っていうかリソース大量ってどういう意味で言ってるのん? >Dispose関連のリソースと言えばメモリ空間だろう。 >例としてまず挙がるのがそれだと言いたいんだろ そうはおもえんな。
んで何が言いたいの
いやなにか言いたいとかじゃなくて何いってんのかわからんぞっていってんだよ。
GCで消えるものにDisposeもクソもないだろ GCで消えないものをDisposeしなきゃならんのであって
>普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 >何を難しく考えてるんだ。 意味不明。 といいたかったわけだよようするに。
わからないで文句言ってるのか・・・
m9(^Д^)プギャー m9(^Д^)プギャー m9(^Д^)プギャー m9(^Д^)プギャー m9(^Д^)プギャー m9(^Д^)プギャー m9(^Д^)プギャー
意味不明なことを理解できるスキルは俺には無い。
108 :
デフォルトの名無しさん :2007/11/18(日) 01:05:41
晒しage
>わからないで文句言ってるのか・・・ わからないって文句言ってるのに…
>普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 >何を難しく考えてるんだ。 これをだれかが説明してくれればいいわけだ、うん。
まぁわかるようになったらまたおいで。 もしくはここで質問すれば。
ほんとにわかって無いと思われてんのな。 Disposeのもくてきなんぞちゃんとわかってる。 だ か ら こそ >普通にリソース大量に消費するクラスはDisposeメソッドを実装しておけばいいという話だろ。 >何を難しく考えてるんだ。 さらに >Dispose関連のリソースと言えばメモリ空間だろう。 てのが意味不明って言ってんだよ。 リソース大量って同意意味? ってわざわざ確認したのに >Dispose関連のリソースと言えばメモリ空間だろう。 ってんだから。 Disposeの意味理解してたら明らかにおかしいことわかるだろうに。
>リソース大量って同意意味? リソース大量ってそういういみ意味? の間違い。
じゃねー リソース大量ってどういう意味? だ。
もっと初心者向けを頼む。
メモリ空間の大量使用と言えば文句がないのか? とりあえず、説明するの疲れたからもう寝る。
結論。 メモリ空間の大量使用 する場合にはDisposeを実装すること。 あほか。
>日本語を母国語としない人に日本語の教育をするのが日本語学校です。 うーん残念だ。
あのー まともな反論してもいいんだよ?
使用するマネージ言語の種類にかかわらず、. NET Framework のガベージ コレクタは、 自動メモリ管理機能を提供します。ガベージ コレクタは、マネージオブジェクトに対するメモリの割り当てと解放を行い、 必要な場合には、アンマネージ リソースを正しくクリーンアップするために Finalize メソッドおよびデストラクタを使用します。 自動メモリ管理は、コードによるメモリ管理方式から生じる一般的なバグを除去することで、 開発を簡単にします。
つまりメモリを大量使用する場合にはDisposeを実装しろって 本気で言ってるということでいいのかな?
>>125 実装する必要がある場合はする
ファイルや画像を扱うクラスは実装されている理由がメモリ管理に与える影響が多いから
GCに任せて良いと判断できる程度のメモリ消費なら実装しない
>>126 今追いついたけど、何言ってっかわからんわw
ファイルや画像はアンマネージだからDisposeしなきゃならんのだろ
>>126 わかって書いてるのかわかって無いのかいまいち判断しにくい書き方だが、
わかってるならもうちょっと明確な書き方するだろうから多分わかって無いんだろう。
画像はともかくファイルに関して「実装されている理由がメモリ管理に与える影響が多い」
とは普通書かないだろうしな。
ほんとにおかしいことを書く ↓ 意味不明とか言ってることがわからんとか突っ込む ↓ わからないなら文句言うな、わからずに文句いってんのかw ↓ いやおかしいこと言ってるからわかりようが無いだろ、わかるやついるのか? ↓ わからないならここみて勉強して来い。 ↓ いやあのね… こういうのって多いんだぜ?
さっさと正解を書けばいいものをずいぶん引っ張るなぁ。 本当にわかってないんだろうなぁ。
133 :
デフォルトの名無しさん :2007/11/18(日) 02:06:44
言葉遊びを楽しみたいんだろ。
さて何人いることやらw
あれ?話をそらし始めた?
どっちに言ってるのかわからんw
おちんちんしこしこ
3.0言語仕様の日本語版はいつ出るの?
おととし
便乗質問させて下さい。 VC#2005でWindowsアプリケーションを新規作成します。 するとForm1.Designer.cs内に最初から下記のコードが書かれています。(必要な部分だけ抜粋しています。) private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { this.components = new System.ComponentModel.Container(); } しかし、Form1.cs[デザイン]を使ってButton等をポトペタすると、 this.components = new System.ComponentModel.Container(); という部分がコードから綺麗に消えてしまいます。 とても奇妙に思えるのですが、これは何を意味しているのでしょうか? そして最後までnullなthis.componentsと、 それを参照するDisposeメソッドは残しておく必要があるのでしょうか?
>>91 に代わって誰か説明してくれ
つーかコテ使えとは言わんが安価使おうよ・・・
>>140 確かデザイナの仕様だったキガス
必要になると勝手に復活するから気にしなくておk
ImageListとかContextMenuStripとか Form.Controlsに入らなくてコンストラクタにcontainerを引数として持つやつらが ポトペタされると復活して、そいつらの面倒見てくれて最後にDisposeしてくれる。 そいつらのコンストラクタでは、 public Soitsura( IContainer container) { ... container.Add(this); } みたいに自分をcomponentsにつっこむの
>>144 「リソース大量に消費するクラス」とは全然違う内容なんだけど・・・
お前あげ足とろうとしてるだけでまともに知ろうとしてないだろ?
>>146 >しかし、極めて限られた資源や、特別な特徴を持った資源は、使い終わったらすぐに解放してやらねば不都合が起きる場合がある
ここをどう解釈してる?
148 :
65 :2007/11/18(日) 07:07:01
なんか自分の書き込みがきっかけで関係ないことで荒れてたようで恐縮です。
>>70 ざっと読んでみたところPart2のほうで触れられていました。
どうやって古いオブジェクトからgen0オブジェクトへの参照を検出しているのか
疑問だったのですが、その疑問が解けました。
なんでもGetWriteWatch API関数でメモリへの書き込みを検出してるんだとか。
>>76 こちらの方にもうちょっと詳細な説明がありました。
>>71 こちらもそのうち読んでみたいと思います。
>>66 プログラミング.NET Frameworkは以前読もうとしたんですが近くの本屋に
なかったんですよね。図書館は盲点だったのでまた探してみたいと思います。
みなさんどうもありがとうございました。
結論、ちゃんと朝飯は食えよ!
ただのメモリにDispose使うとか言ってる人もいろいろ読むとよいよ 依存すべきじゃないトリビア Gen0 のサイズはCPUキャッシュのサイズ(なことが多い)
極めて限られた資源や、特別な特徴を持った資源は 具体的に言うとファイルやネットワーク等の資源 大量の資源を使うクラスに対するDispose呼び出しは VMの一定メモリ割り当て量超えた場合のパフォーマンス低下を防ぐため たとえば、少量の資源を使うクラスをDisposeしたりはしない string str = "A" + "B"; これの"A"と"B" はすぐに使えなくなるがDisposeしないでGCにまかせたりしてるのは 影響が少ないから。
その例で文字列定数使うなよw
>>152 初心者に一番わかりやすいだろ?
参照が関数から抜けると切れるし、strが参照型だと解る
なんか頭のおかしい人がいます
本気で言ってんの?… class HeavyObject:IDisposable{ int[] data; public HeavyObject(){data=new int[100000000]; public void Dispose(){/*これ実装してdataを解放してくれ*/} }
>大量の資源を使うクラスに対するDispose呼び出しは >VMの一定メモリ割り当て量超えた場合のパフォーマンス低下を防ぐため 具体的にパフォーマンス低下を防いでいる例を書いてくれ。
>これの"A"と"B" はすぐに使えなくなるがDisposeしないでGCにまかせたりしてるのは やっぱり意味不明だろどう考えても。
>>155 配列の開放って、具体的にはどうするの?
今まで意識してやってなかった。
>>155 は冗談で書いたんだよ
GCに任せるしかない
よっぽどすぐ削除したかったら参照切ってからGC.Collectとか考えられるけど、
Disposeでやることじゃない
data = null;
とでもいうつもりなのかな
>>151 は。
しかし問題はHeavyObject自身がどういう使われ方を想定してるかだ。
Disposeイコール普通はもう使わない、なんだから、
普通はDispose実装しても意味無いわな、ほっといても変わらん。
いやむしろDispose呼び出しのために開放が遅れる場合があるw
public class BaseResource: IDisposable { private IntPtr handle; private Component Components; private bool disposed = false; private int[] data public BaseResource() { data=new int[100000000]; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if(!this.disposed) { if(disposing)Components.Dispose(); CloseHandle(handle); handle = IntPtr.Zero; if(data != null)data = null; } disposed = true; } ~BaseResource() { Dispose(false); } }
?? それどう見てもdata=nullは一応ついでにやっといたほうがいい程度だし。 どう考えてもdataの開放は主目的とまったく違うし。 ついでっていうのは、Disposeされても参照が開放されない場合という、 どちらかというと特殊な状況でしか時再には意味無いけど、 せっかく開放のタイミングがあるんだから、一応ついでにやっとくべきだろう、 っていうレベルの話ってことね。
まあその前にSafeHandle使え。
ただのアンマネージメモリだったらGC.AddMemoryPressure
問題はそれじゃないだろ。 GC.SuppressFinalize(this); に指定されたオブジェクトがGCによって呼ばれないことによって >大量の資源を使うクラスに対するDispose呼び出しは >VMの一定メモリ割り当て量超えた場合のパフォーマンス低下を防ぐため をおこなってるんだろう。
DisposeしないでFinalizeにまかせたりしてるのは だったらまだ、この表現自体の意味はわかるが、 DisposeしないでGCにまかせたりしてるのは ってのはもはや意味不明
>>165 それって「でかいアンマネージメモリ確保しちゃったからマネージメモリ詰めといてね」だろ
>>166 表現のミスは認めるが、あげ足とり好きなやつが多すぎだな。
こういうのを揚げ足と思ってる時点でやっぱりわかって無いことがわかる。 じゃあFinalizeって意味で書いたのか? そんなわけ無いだろ、さらに意味不明だ。 >DisposeしないでFinalizeにまかせたりしてるのは >だったらまだ、この表現自体の意味はわかるが、 って書いたとおり、「この表現自体の意味」はわかるってだけ。 >string str = "A" + "B"; >これの"A"と"B" はすぐに使えなくなるがDisposeしないでFinalizeにまかせたりしてるのは >影響が少ないから。 これでどうだ、ますます意味不明だろ。
オブジェクトの解放にはDisposeを実装 VMによるパフォーマンス低下を防ぐにはSuppressFinalizeの呼出 参照型には安全に解放を行うためnull参照を設定 まとめたらこんな感じか?
言葉遊びに付き合えんわ
>表現のミスは認める 本当はこういう表現をしたかったのに ミスしてこう書いてしまった っていう風にを説明してみ、できるわけ無いが。
>オブジェクトの解放にはDisposeを実装 >VMによるパフォーマンス低下を防ぐにはSuppressFinalizeの呼出 >参照型には安全に解放を行うためnull参照を設定 >まとめたらこんな感じか? んーそりゃ無茶だw
ごめん、俺が悪かったから許してくれ!
176 :
140 :2007/11/18(日) 12:46:36
オブジェクトの解放はGC任せが基本 特別な終了処理を行いたかったらDisposeを実装 っていうだけのことなんだけどな
必要なタイミングで即時に開放する必要のあるリソースをメンバとして扱うクラスは Disposeを実装する。Disposeを実装してるメンバを持ってる場合も同じ。 アンマネージリソースを直に扱うクラスはFinalizeを実装する。 ただし、普通はSafeHandle使うべきだし、アンマネージリソースを直に扱うクラスなんて まずめったに無いから、Finalizeを実装するのは本当にまれ。 Finalizeを実装するなら、Diaposeも実装して、確定的なタイミングでの開放もできるようにする。 この場合はDisposeのタイミングでSuppressFinalizeを呼び出して、 もうFinalizeは呼び出さなくていいことを伝える。 でも普通はDisposeパターンを使うけど。 Disposeを実装する場合は、一応マネージドなメンバの参照もnullにしておけば、 もしDispose後すぐに参照が開放されない、ということがあった場合には効果がある。 まあ普通の使い方じゃそんなに無いけども。
もしかして釣られてるのか?
どれにいってるのん?
結論は179 Disposeの話題はおしまい
Dispose厨に釣られてる
まあDisposeはリソース開放とは別の意味合いで、 Before-Afterパターン的なことをするために会えて実装することはたまにある。 単にusingで簡潔かつ確実に書けるようにするってだけの目的だけど。 TransactionScopeなんかと同じ使い方だな、 何らかのスコープを定義したい場合に使うことが多い。
個人的には
>>184 の使い方がとっても好きなんだが。
列挙子を実装するときとかかな
ビフォーとアフターを確実にやりたいなら コードブロックを引数に取れよ
ビフォーアフターっていうよりは、スコープ定義、だな、 簡潔簡単にかつ間違えなずに使えるようにしとくってのが目的だからな、 コードブロック引数ってのはやりたくない(外向けには、内部ではやったりもするが)。 あと大きいのは、VBでも普通に使えなきゃ困るから、だ。
やっと終焉しましたね。
>>187 Rubyのように内部イテレータをメインに使う言語はそれでいい。
foreachで外部イテレータも多用されるC#では
foreachからの脱出時の軽量コールバックにDisposeが流用される。
ttp://www.okisoft.co.jp/esc/prolog/in-cs.html#4 そしてLINQのせいでますます外部イテレータ依存度が高くなった。
IEnumerator<T>.Disposeはもう殺せないよ。使われすぎてる。
例外が軽い言語だと、列挙の中断通知には例外を使う言語もあるけどね。
PythonとかECMAScript 4とか。
マウスカーソルの付近に、マウスカーソルの位置情報を表示するアイデアありますか? マウスを高速でぐりぐり動かしても表示がもったりしないような。 もちろんC#で。 具体的にはこんな感じで (100,230) ↑
C#でマウスと言ってるからFormsかい? 普通に、イベントはMouseMoveを取得、表示はカーソルを自分で作成する。
BorderStyle = Noneでラベルを乗せたフォームを表示して 親フォームのMouseMoveで位置とテキストを更新すれば
んなことしなくてもMouseMoveでツールチップテキストを更新するほうが お手軽かつ確実じゃないか。 まあ、一見便利そうで鬱陶しいUIの見本みたいになりそうだけど。 ステータスバーか、もしくは専用の表示スペース作って表示するのが普通に感じる
198 :
デフォルトの名無しさん :2007/11/18(日) 22:12:48
何ていうか........根本的に発想が間違ってる気がするよ。 まあデザイン時か実行時かはDesignModeプロパティで一応判別ができる。 MSDNライブラリよく読まないとハマる可能性があるけど
XPExplorerBar の中身に手をつけないで、デザイン時に特定のメソッドを呼び出したいんです。 デザイン時は親フォームの InitializeComponent しか呼び出されないので、その呼び出しをどうやって知ろうかな、と。
派生させればー?
>>195 IDropTargetHelperって簡単なんだな
今作ってるやつにちょこっと足したらできた
>>201 デバイスコンテキスト関連が面倒なんじゃないか?
GDIは癖があってあまり好きになれないんだよな。
>>202 DC関連てソースの話じゃね?
ターゲットの場合、ドラッグイメージの描画はOSつーかexplorerがやってくれるよ?
Vistaならあのでかいアイコンとコピー/移動だかのインジケータ含めて。
問題は下のウィンドウの描画みたいだけど、
Vistaなせいなのかホバーしたときの描画がたいしたことないせいなのか
IDropTargetHelper.ShowまわりはいじらなくてもOKだった
つーか訳ありでIDropTarget自前実装だから簡単だったわけだけど
204 :
デフォルトの名無しさん :2007/11/19(月) 13:17:58
ボタンに画像を貼り付けたいのですが、 画像を貼り付けて配置をmiddlecenterにしても 中央に表示されません。どうすれば上手く表示出来ますか?
>>204 それはふらっと向けの質問だな。
そのプロパティがどのプロパティと関連があるのかライブラリを見ておくこと。
>>205 ありがとうございます。まだ上手くいきませんが頑張ってみます。
レスありがとうございました。
EPS形式の画像をJpegやGifに変換するAPI、というかC#ライブラリってありますか?
>>208 なるほど、Susieですか。
GhostScriptを扱うAPIがあるといいんですけどねぇ。難しいのかな。
わざわざ直接C#でやらなくても変換ソフトはいくらでもあるんだから コマンドライン引数渡してプロセス動かせば良くね?
TcpListener 開始前に指定したポート番号が既に使われていないかどうか調べたいのですが、 そのようなメソッドはありますか?
使う前に未使用でも実際に使おうとしたときには使用中ということもある 素直に接続時の例外でチェックした方がいい、ぞ netstat みたいな事をしたいというんだったら別だが
質問です。 現在1024bitRSAを使用した通信のプログラムを作っているのですが・・・ 相手の公開鍵が判明してる場合 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); RSAParameters rsaParameters = new RSAParameters(); rsaParameters.Modulus = 相手の公開鍵(0x80byte) rsaParameters.Exponent = {1,0,1}; rsa.ImportParameters(rsaParameters); 暗号化済みデータ = rsa.encrypt(暗号化したいデータ,false); で、大丈夫なのでしょうか? いまいちRSAの使い方がわからないのでわかるかたいらっしゃいましたらお願いします。
開いたFormの領域いっぱいにTextBoxを配置したいんですがどうすればいいんでしょうか?
Dock=Fill
.NET Framework 2.0 にて、Form に MenuStrip を追加し、それに TextBox を追加したんですが、 TextBox に一度フォーカスを合わせると、以降 Form の MouseWheel イベントが呼ばれなくなります。 回避方法を教えてください。
再現したりしなかったりだけど、MenuStripとかToolStrip系は フォーカスまわりが怪しい挙動するときがあるよね toolStripTextBox.Leaveでform.Focus();したらどうか
219 :
デフォルトの名無しさん :2007/11/23(金) 03:57:38
C#2.0で作成したEXEを社内のファイルサーバに置いて 共有しようとしたのですがEXEを起動させたらすぐに異常終了 してしまいます。 これは何故でしょうか?クライアントに置いて起動すると 問題なく動きます。 VB6で全く同じ内容のEXEはファイルサーバ上でも 起動できたのに・・・
>>219 新規プロジェクトで作ったなにもコード書いてないexeでも?
221 :
デフォルトの名無しさん :2007/11/23(金) 04:23:48
>>220 何もコードを書いていないEXEでは今のところ試していません。
内容はあるファイルをある場所へコピーするだけのプログラムです。
>>219 ネットワーク上にあるファイルは制限ゾーンで実行される。
とくに設定をしなければInternetZone扱いで実行されるんでほとんどのプログラムは動かない。
動かしたければポリシーをいじって、\\server\hoge\* のは
FullTrustといったふうに設定することになる。
CASとか知らないんだろうね。 その辺から勉強した方がいいよ。
ポリシーいじるよりも署名したほうが楽じゃね?
分かってないなら書くなw
>>225 アンカーが無いと誰にレスしているのか分らない。
署名って厳密名つけるのとコード署名の2種類あるけど どっちにしても署名だけじゃ駄目だわな。
めんどうならクラス全体に属性つけて許可すればおkだろ
何のために.NETFrameworkのサンドボックス機能があると思っているのやら。
Clickワンコでいいじゃん
Array.ClearやArray.CopyってArray型を引数に取るからなんとなく遅そうなイメージがあったけど 試してみたらfor(int i=0;i<array.Length;i++)で回すより速いね どういう実装になってるんだろう
コード先頭のusing をアルファベット順に並べないと気が済まない
上から順に、 System名前空間のよく使う順(親階層が同じなら揃える) その他外部のライブラリの名前空間 自分で作った名前空間 俺はこんな感じ
usingの順序なんか気にする余裕があるプロジェクトでよかったね。
エディタで選択してソートして終わり
2008だと並べ替えしてくれる
using勝手に自動的に付けてくれたらいいのにな
Visual C# 2008 Express Edition beta2ってどんな感じ。バグバグだったりしない?
英語版はもう完成してるだろ
英語版出たからbataいつまでも使ってるなよw
日本語版じゃないといやなので。
ならあと1月待て
「すみません。C#2.0でお願いします。」 これからしばらくの間、このスレでしょっちゅう見かけるに違いない
varもLINQもラムダ式も使いたい放題だぜ 生産性あがるうううううう
namespaceを名前空間と訳すのに違和感を感じるな nameの意味を調べればこの違和感に気づくだろうが
「違和感を感じる」に違和感
岩漢
つーか、いまだ2.0ですら浸透したか、してないかなのに3.5は早すぎる
VS2008では.NET2.0ターゲットの開発もできるから安心です! LINQ以外は大体C#3.0の機能が使えます! 日本語版は開発完了が年内予定か 個人で買うには高いんだよなー…一応買うつもりだけど
2005年の終わりごろに出たのがVS2005で 2007年の終わりごろに出たのがVS2008なのはなんでだろう
>>253 WindowsServer、SQLServer、VisualStudioを
2008シリーズとして製品をそろえたかったから、
会社ではまだまだ3.5なんて使う機会当分ないが、家でも勉強する時間無く 禿しく置いてかれた感ある・・・。これでCLRが上がったりしたら、それこそヤル気でねえw
VB9.0に比べたら、C#3.0はそんな大した変化じゃないだろ VB専門ユーザーが付いてこられないこと請け合い
もうラムダ式をメインで使う時期に来てるんだよ Rubyが流行った原因もそれだしな
古いシステム構成をいつまでも引きずっていることが良いと 考えている日本企業が多いからな。 外資はすでにWPF実装やSilverLightの評価を始めてるよ。
少し枯れて安定したシステム構成が良いと全世界が思ってるよ。
まあ新し物好きの人柱さんはせっせと頑張ってけろ 俺は生き残った技術だけで十分だ 学ぶべきことは他にいくらでもある
いくら頑張って覚えても新技術はキリないからな・・
お兄様方、.NETのランタイム(Dotnetfx)をセットアッププロジェクトに含んで サイレントインストールしたいんだけど、やり方書いたサイトか方法教えて!!
サイレントインストールのインストールオプションを指定した セットアッププロジェクトを作成すれば良いと思うんだが?
dll内にあるアイコンを取り出す方法ってありますか?
そのDLLがアセンブリか否かによって手段は変わるが
266 :
デフォルトの名無しさん :2007/11/24(土) 23:26:34
shell32からフォルダ系のアイコンを取得したいんです。
ならExtractIconExが基本
>>267 やってみます。
ありがとうございました。
269 :
デフォルトの名無しさん :2007/11/25(日) 01:01:50
できました。 が、なんか見た目がアイコン抽出した時と違うんですが、 これはなんでですか? なんかにじんでるというか。 色がめっちゃ濃い部分があります。
>>269 読み込み時にヘマしてるか表示時にヘマしてるか
我々の予想の斜め上をいくところでヘマしてるか。
めっちゃ濃い部分に関しては単に透明色なだけかもね。
Explorer等は特定の色を描画時に透明として扱扱ってる。
まあまんべんなく調べてみれ。
>できました。
ちなみに世間ではそれを「できてない」という。
ImageListにつっこんでColorDepthが8bitのままとかじゃね (´−`).。oO(しかし、なんであれ8bitがデフォルトかね……
C#とF#のそれぞれのカッコイイ点、かっこ悪い点を比較して教えて。
ColorDepthがビンゴでした。
>>270 できてませんでした。
多分これで出来ていると思います。各環境ごとに違うのかもしれませんが。
vmかなんかで試してみます。
ありがとうございました。
>>271 ビンゴでした。
ありがとうございました。
>>272 C# : 普通のおにいさん。超有能でもないけど、まんべんなく、そつなくこなす
F# : ノムヒョン大統領。一部で大人気。
MSIL 逆アセンブラで不可視にできる無料ツール教えてちょ
そんなものはない。
C#3.0の新機能を解説した本とか出てないかね?
難読化ツール程度で我慢しろ。
再び質問ですいません。 アイコンの合成ってどうやるんでしょうか。
280 :
デフォルトの名無しさん :2007/11/25(日) 03:29:24
途中で送信してしまった。 具体的にはショートカットの矢印のアイコンとフォルダのアイコンの合成です。
SHGFI_LINKOVERLAY
>>277 2.0までちゃんと全部理解してるならwebで十分だろ
本一冊書けるほどの変化はないよ
284 :
デフォルトの名無しさん :2007/11/25(日) 14:31:31
Httpを使ってXmlを返すサービスについて質問です。
HttpRequestに対してサーバが簡単なXmlを返すものなんですが、クライアント側で受け取りに失敗します。(※(2)の箇所)
サーバ側で送出したメッセージを全て読み込むためには何を使うのが定石ですか?
//サーバ側のコード
[WebService(Namespace = "
http://tempuri.org/ ")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyHttpService : IHttpHandler{
public void ProcessRequest(HttpContext context){
HttpResponse res = context.Response;
res.ContentType = "text/xml";
res.Write("<xml>hoge</xml>");
res.Flush();
res.Close();//※(1) 接続を開放しなきゃ、と思いCloseを後から追加した。
}
}
//クライアント側のコード
private void btnMyHttpService_Click(object sender, EventArgs e){
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("
http://localhost:2779/MyHttpService.ashx ");
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
using (Stream stream = res.GetResponseStream()){
StreamReader reader = new StreamReader(stream);
//※(2) ここで「転送接続からデータを読み取れません: 接続は閉じられました。。」という例外発生
//クライアントまで到達している電文を最後まで取りたいだけなんですが・・
string content = reader.ReadToEnd();
stream.Close();
}
}
※(1)にHttpResponse.Close();を追加したところ、
※(2)でSystem.IO.IOException例外が発生するようになってしまった。
1.GetResponseStream()で得られたStreamに対してStreamReader.ReadToEndを使うのがよくない
2.Httpハンドラでは普通HttpResponse.Closeを呼ぶのがよくない
とかあるのでしょうか?
普通はCloseじゃなくてEndを呼ぶ
普通はWeb参照してObjectそのまま受け取るんじゃね?
287 :
284 :2007/11/25(日) 20:25:55
>>285 ,286 レスありがとうございます。
Endだと例外が発生してしまい、パフォーマンス的に問題があるようです。
SOAPじゃなくてREST型サービスを要求されているので、その方向で調査中です。
(相手がJavaとか.NET以外なので&SOAPは遅いとか言われている・・・)
Web参照型と単純なXmlを返すWebサービスでパフォーマンスを比較してみると
Response.Endを呼ぶと明らかに遅くなってしまいますのでResponse.Endは使いたくないです。
サーバ側でResponse.Closeを呼び出すことで
クライアントの呼び出しに依存せずにサーバ側から安全に接続を切りたいのですが
Closeした場合にクライアント側でサーバが送出したメッセージを読み込むことはできないのでしょうか?
ところでなんでCloseとかEndとかいるの?
開けたら閉めるって、ママに習わなかったのか?
あほかよ、HttpResponseの話だぞ。
>>289 君にはプログラミングの勉強の前に、情報処理の勉強をお願いしたい。
話の流れも読まずに脊髄反射しかしないボケどもめ。
(´・ω・`)しらんがな
なんで四則演算可能なプリミティブ型のためにICalculableみたいなインターフェイスを用意しなかったんだろう ジェネリッククラスが書き難い
>>295 俺もそれは思ったことあるけど、その方法って微妙なところもあるのよね。
class Rational : ICalculable // 有理数
と
class Galois2 : ICalculable // 位数2のガロア体
があったときに、
Rational p;
Galois2 q;
var r = p + q;
はどう扱えばいいのかとか。
左オペランドの側に合わせて、 p.Add(q) と解釈することにして、 Add の中で型チェックすればよさそうに思えるけど、 それだと今度、 class Real : ICalculable // 多倍長・任意精度の実数 みたいなのに対して、 double x; Real y; var z = x + y; // double と Real 間の演算は認めたい をどうするかで困る。 implicit なキャストと上記のルールで何とかならないでもないけど。
異なる型の間では演算がそもそも定義されない場合もあるし 同じ型同士でも乗算は定義されるけど除算は定義されないとかあるし
定義できる場合だけでも使えるようにすればいいと思うけどなぁ 定義できない場合は例外投げるようにするとか あと制約条件はなんでシールクラスはだめなんだろう
>あと制約条件はなんでシールクラスはだめなんだろう できたところで何の意味がある?w
>>300 制約条件にintやdoubleなんかを指定できるようになる
structでいいじゃん
intって書けばいいんじゃないか
?
Tの制約条件にintって書くならそのままintって書けばいいんじゃないのかと
特殊化が出来てほしいと思うこともある。 プライマリ制約別に特殊化って感じで。
コードで書いてみてくれんか
特殊化から出来ないからな まあ別に困らないけど
void Method<T>(T num) where T : int って書くなら void Method(int num) でいいんじゃないのかと
ああなるほど
値型なら実行時に特殊化されるけど
Close/Endを呼び出さないと Closeしないクライアントがサーバ側のリソースを無駄に消費してしまう ということはありませんか? Closeした方がブラウザで途中までレンダリングされるのが早いのでは? と思っていたのですが、簡単なサービス呼び出しで実験したところ特に有意な差はなかったです。 もしかして、Close/Endって必要ないですか?
HttpWebRequest は Close しても切断してくれなかったりとかあって時々困る
HttpWebRequestはCloseなんて持ってませんが…
人によってはCloseが見えたりするらしいよ。
間違えた。HttpWebResponse のほうの Close
1.0でRequestすればいいよ
そもそも接続キャッシュしてるし。 サーバ側で毎回Closeなんて普通遅くなるだけだし。 接続のオープンクローズの方が維持より重いし。 ページは処理完了しないとレンダリングできないから途中で書き出しなんかできないし。 サーバ側でCloseできるってことは全部書き終わってるタイミングだから結局ほとんど差なんて無いし。
リソース内のDll(ネイティブ)にアクセスする方法とかありますかね?
>>313 特殊な状況ではEndは使われるが
Closeなんかいつ使うんだよ。
勝手に要ると思い込んで遅くなるって
まずに自分の思い込みを疑え。
お初失礼します。 最近C#でアプリ開発を始めたのですが、配列の変換で悩んでいます。 Byte[,] Temp1 = new Byte[4096,4096]; と定義して、各種メソッドの引数であるByte[];へ Temp1[0,0]などとアドレスを渡したいのですが、 (例えば、Socket.BeginReceiveの引数1 byte[] の受信ポインタへ、 Temp[0,0]のアドレスを指定したい。) コンパイル時に変換エラーが出てしまいます。 どなたかよい方法をご存知ありませんでしょうか。
>>324 byte[,]じゃなくてbyte[][]使えば?
byte[][] temp = new byte[4096][];
for(int i=0;i<temp.Length;i++)
temp[i] = new byte[4096];
でバッファ確保してtemp[0]で0番目の配列がbyte[]として渡せる
配列は構造体、素直にジェネリクス使った方が分かりやすいよ。
>>326 何でジェネリクスが出てくる?
しかも配列は構造体じゃないぞ
324です。
>>325 さんの方式でコーディング続けてみます。
ありがとうございました!
>>324 C/C+;やってた人?
byte[,]は二次元配列。
byte[][]は配列の配列で二次元配列とは別物。
引数のbyte[]のとこではポインタ渡しじゃなくて配列の参照渡しをしてる。
330 :
デフォルトの名無しさん :2007/11/27(火) 15:22:11
何でtextbox内で全角小文字のjとかlは入力できませんか ちなみにkは入力できます
>>329 さん
324です。仰るとおりCプログラマでして、今回C#初挑戦です。
VBで簡単な開発はしたことあるので、C#も大丈夫だろうとタカを
くくってましたが、便利そうで不便なところもあり、
無駄なコードを書くことが多いなというのが感想でしょうか。
解説ありがとうございました!
jもlも入力できるよ
まぁそうけなすなよ 仲間が増えていい事じゃないか
ポインタ使いたければアンマネージコード
のこぎりしか使ったことの無いきこりがチェーンソーを手に入れた だが、使い方を知らないのでのこぎりのようにチェーンソーを使い、言った 「こんな使いにくいものよりのこぎりのほうが良く切れるぜ!」
>>338 うん
とりあえずこんなのを作った
public struct Number<T> :ICalculable<T>, IComparable, IComparable<T>
where T : struct, IComparable, IComparable<T>, IFormattable, IConvertible, IEquatable<T>
Tはbyte〜ulong、float、double
var hoge = new { Boke = new Hage( delegate( string msg ){ Console.WriteLine( msg ); } } はおkで、 var hoge = new { Boke = delegate( string msg ){ Console.WriteLine( msg ); } }はだめなのね(´・ω・`)
デリゲート型が推論できんからな。 var hoge = new { Boke = new Hage(msg => { Console.WriteLine(msg); }) };
戻り値なしは規定でAction,戻り値ありなら規定でFuncにしてくれれば済む話だとおもうんだがなあ
あれ?varってクラスメンバーの宣言には使えんの?(´・ω・`)
使えんなあ
>>342 Action/Funcなら引数の型の明示が必要なんでnew書くのと大して変わらなくなるな
var action = new Action<string>(msg => Console.WriteLine(msg)); var action = (string msg) => Console.WriteLine(msg); だいぶ違うと思うんだがなあ 型を<>の中に書くことが可読性をひどく低下させるような気がする
>>347 うーん、どっちも一長一短・・・
下の方が見やすいけど、
action の型が分かりにくくなるのは嫌だなぁ。
個人的に、右辺値を見れば型が明らかなときにだけ var 使いたい。
その場だと、
Action<string> action = msg => Console.Write(msg);
と書きたいかなぁ。
ああ、あと、LINQ がらみと匿名型が絡むときは var 使うけど。
>>348 lambdaはそもそも変数に代入せずにメソッド引数で使うのがいいと思うが。 あと左辺から型がわかるのでmsgは余計。 Action<string> action = Console.Write;
俺はもうvarで統一してる foreach(var match in regex.Matches(...)) って書けないのが死ぬほど気持ち悪い
あれ? コンストラクタで public Hoge(string name,int id,double val){ _name=name;_id=id;_val=val; } みたいなのをかかなくていい技なんかなかったっけ?
プロパティなら直接代入できる。 new Hoge{ _name = name, _id = id}; こんなんだったかな。 Fieldでは無理だったんじゃなかったか
むーんコンストラクタ以外でいじりたくないときは使えんな・・・ 暮らす面罵でvarがつかえなかったり、なんかこうかゆいところに手が届かない幹事。 LINQもターゲットが.NET3.5限定になるので使えないかもしれんし・・・
1つのEXEファイルで配布したいという要請に従って、EnterpriseLibraryのdllを内包した形で ビルドしてEXEを作ることって可能でしょうか? ELのソースを全部取り込むのは無しの方向で・・・。
C#は楽をさせることを第一に考えて作られた言語じゃないからな コンストラクタぐらい書けよという話なんだろう
自動プロパティとかは楽させるため以外の何者でもないやん 楽のさせ方が中途半端すぎ
>>355 static libraryのことか?
自動プロパティは匿名型との整合性を考えたんじゃないか? しかし中途半端で使いにくいのは確かだ 存在しないものと考えてコーディングした方がいいような気がする
暮らす面罵にvarとか言ってる奴ってvarを動的型と勘違いしてないか
>>361 お舞こそ型推論の仕組みを理解してなくないか?
var objList=new List<object>();
で暮らす面罵だろうがきっちり型推論できますが何か?
>>362 それが出来たところで別にうれしくないということだろ
暗号だらけだなあ 前はこんな状況じゃなかったのに… そのまえにアプリ作ってんのかお前ら?
最近はライブラリ作ってる
言語仕様自体の話が多いのはいいことだと思うけどな .NET Frameworkのクラスの使い方なんて大抵自分で調べたらすぐわかるだろ
だなあ 言語仕様の話おもしろい
で、結局それで何を作ったの?
アプリ作るより子を作れ
作り方の話ばかりしたいんだったらVB.NETスレに行くといいよ 必死な人たちが君の助けを待ってる
たまに見るけど「アプリ作ってんのか?」ってひょっとして煽りなの? んなもんみんな腐るほど作ってるだろうからいまいち意図が読めない。
すまん最近サボっている
アプリ=市販のパッケージアプリまたはフリーウェアまたはシェアウェア
世界のプログラムの90%以上はそれらに属さない
うっかり公開なんてしたらキチガイのサポートしなきゃいかんし
アプリ作りなんて大半は言語に関係ないゴミ作業なんだから わざわざ言語スレでやることもないだろ。
378 :
284 :2007/11/29(木) 06:52:37
PRB: Response.WriteFile は、大きなファイルはダウンロードできません。
http://support.microsoft.com/kb/812406/ >>323 Closeが使われているサンプル
>サーバ側でCloseできるってことは全部書き終わってるタイミング
なのにもかかわらず、クライアント側でStreamReader.ReadToEndが使えないのが??と思いました。
通常はCloseする必要が無いようですね。ありがとうございました。
>>376 逆に何やってんのw
テストコードしか書いてないとか。
まさかそんなことは。。。
>>377 ,379
妙な勘違いしてるうえにしつこいな。
面白い内部デザインや肝になるコーディングなんてアプリ作りの全作業量のせいぜい1割ぐらいだろ。
他のゴミみたいなルーチンワークがそんなに好きなのか?
私タイピストなのでわかりません><
・プログラミングは、できなさそうな処理を如何に実現するか ・時間かかる処理をどう高速化するか これが楽しい。仕様書作りとかは時間の無駄・・・
>>380 其処までまかせっきりに出来てうらやましいよ
続きはマ板にてお楽しみ下さい。 それではC#の話題をどうぞ。
>>380 君はFormsやASP.NETでイベント記述する程度のことしか作業したことがないんだね。
ソケット通信やスレッドを扱えばわかると思うが、ゴミどころかミスひとつで致命的な
エラーが発生するシステムも存在することをお忘れなく。
そこはどう考えても「肝」だろ つまらん見栄の張り合いはもういいっつの
XAMLソースをジェネレートしたり DataSetとUI、DBのマッピングフレームワーク作ったり。 最近の開発言語環境は、メタプログラミングができて楽しいぞ。 つまらないルーチンワークなんてのは、できる限りコンピュータにやらせるもんだ。
>>387 きわめて同意。これでソース-セマンティクス-ILへの相互変換フレームワークあればもっと面白かったのに。
CodeDOMとかExpressionとか微妙に中途半端
Formをそのまま拡大縮小することってできますか?エクセルとかでCtrl+ホイールを使ったときのようにそのままレイアウトを変えずに拡大・縮小。 AutoScalingModeとかの辺りを見てみたけどDPIにしてもなんか期待していた動作にならず。Control.Scaleなどもあるけれどこれも同じ。 コントロールが沸けわからない基準でレイアウトが変わってしまいます(´・ω・`)
WPFに期待しましょう
そういうことするのってWPFの領域なんじゃね? 無理やりやるならばAutoScaleModeをFontにして、 Formのフォントのサイズを変えるとアンビエントなままな子のフォントも追従して スケールが変わる 個別にフォント設定してたらだめだけど
Sizer For .NETとかいうコントロールがそれできるみたいだけどどうやってるんだろ。
なんだそのwxWidgets
すでに起動している自身のアプリケーションと通信するのってどうすればいいんでしょうか?
ソケット開く
それ以外になんかないっすか?
名前付パイプ
一つに制限しといて、複数起動してるように見せかけるとか
>>394 IpcChannel使うのが常道じゃない?
今ならWCFで…どうなんだろ触ったことないけど
WCFはただの通信規約のフレームワークだよ。 プロセス間通信も忘れないように。
AppDomain.AppendPrivatePathを使わずにPrivatePathを動的に追加する方法ってありませんか? AppDomainSetupを使おうにもすでに自分自身が起動しているので自分自身のAppDomain があるので意味ないし、AppDomain.AppendPrivatePathは切り捨てられてるし、 アプリケーション構成ファイルを毎回作るにしてもそのたびに再起動しなければいけないので だるいし… やっぱりAssemblyResolveを使うしかないですかね?
状況がまるで想定できない
>>403 プラグインなどを使用するときに、個々で設定ファイルを保存する場合はばらけないように
各プラグインでディレクトリを分けると思うんですが、そいつらをPrivatePathに入れるには
アプリケーション構成ファイルに予めパスを書いておくか、AppDomain.AppendPrivatePath
を使わないといけないので、どうしようかなと。
そもそもこういう使い方自体が間違ってるのかもしれませんが…
もうアセンブリ名のサブディレクトリでいいやん。
>>406 よくわからないのですが、アセンブリ名と同じディレクトリ作って
AssemblyResolveで読み込むってことですか?
ツリービュウー等のアイテムが追加された後に呼び出される イベントとかってないですか? ノード自身が親(ツリービュー)を見つけられる方法が欲しいんですが。
ふらっと向けの質問がこのごろ多すぎ。
そういやこことふらっととどう使い分ければいいの?
ふらっと=初心者 コントロールや基本的な言語仕様等 相談室=中上級者 ネットワーク、DB、スレッド、ネイティブやWin32API呼び出し等
なーるほど
質問内容よりもむしろ質問者自身が何がわからないのかわかってるかどうか
……なコントロールないですか? (´・ω・`)MSDN読んだらいいがな ……なイベントってないですか? (´・ω・`)MSDN読んだらいいがな なんかエラーがでます。どうしたらいいですか? (´・ω・`)しらんがな
初心者=MSDNに書いてあることを聞いてくる。 中級者=MSDNに書いてないことを聞いてくる。 上級者=WEB、本に書いてないことを聞いてくる。
初心者=MSDNに書いてあることを聞いてくる。 中級者=MSDNに書いてないことを聞いてくる。 上級者=WEB、本に書いてないことを聞いてくる。 ーーーーーーー素人の壁ーーーーーーーーーー プロ=WEB、本に書いてないことに答える。
コピペ君って馬鹿だな、まで読んだ。
初心者=MSDNに書いてあることを聞いてくる。 中級者=MSDNに書いてないことを聞いてくる。 上級者=WEB、本に書いてないことを聞いてくる。 −−−−−素人の壁−−−−− プロ=WEB、本に書いてないことに答える。 −−−−−プロの壁−−−−− エスパー=まともな質問でない、意味不明な質問、質問が支離滅裂な状態、でも答える。
下らん。 まあ何が上級者で何が初心者だか知らないが、 こういうくだらないことに血道を上げる奴が低能であることは自信をもって断言できるよ。
(2ch)初心者=ネタにマジレス (2ch)中級者=(ry
フォームなプログラムで稼働中のログを表示するために コンソール窓を後から表示することはできますか?
コンソールアプリをProcess.Createしてプロセス間通信
コンソールじゃなくても、テキストボックスとかにリダイレクトすればいいんじゃね TextBoxWriterでぐぐったらいろんな人が実装したのが見つかる
コンソールアプリで作ってフォーム足すとか
AllocConsole
Bitmap.FromHbitmap()についての質問なんですが、これってα付きのHBITMAPって 読めないのでしょうか? BITMAPV4HEADERから作った場合、bV4V4Compressionの値がBI_RGBの時は 成功するのですが、BI_BITFILEDにするとBitmap.FromHbitmap()実行時に ArgumentExceptionが発生します
自分で定義したオブジェクトをグリッドにバインドする方法ってどうやるの? stringだけのオブジェクトだとLengthって列しか表示されないです・・・orz
グリッドって具体的には何さ
外部DLL関数をdllimportで呼んで使ってるのですが、呼び出す関数が多すぎて 1つ1つに [DllImport("hoge.dll")]と書くのが面倒になってきました。 もっと簡単でスマートな方法ないでしょうか?
public static externを[DllImport("hoge.dll")]public static externに置換すれば
433 :
431 :2007/12/06(木) 23:59:07
ヘッダによっては頑張って置換しまくればちょっと手で直すだけで使えたりする
hage
インストーラーのVersionNTでOS限定したいんだが、この値はOSアップグレードした場合などは ちゃんと更新されるのですか?
すいませんでした。質問直後に自己解決しました。
439 :
デフォルトの名無しさん :2007/12/09(日) 01:00:29
他の言語にあってC#にはない有用な言語仕様がを挙げてください。 (例えば、C#に継続ってあるんでしたっけ?)
442 :
デフォルトの名無しさん :2007/12/09(日) 01:06:53
他の言語にあってC#にはない有用な言語仕様を挙げてください。 (例えば、C#に継続ってあるんでしたっけ?)
継続って何だろうな continueのこと?
444 :
デフォルトの名無しさん :2007/12/09(日) 01:09:45
Shemeの継続、実行コンテキストのことかな。
445 :
デフォルトの名無しさん :2007/12/09(日) 01:10:38
ないことが有用な仕様って
446 :
デフォルトの名無しさん :2007/12/09(日) 01:12:42
他の言語にあってC#にはない「有用な言語仕様」を挙げてください。 あってもうれしくない無用な言語仕様を挙げる必要はありません。 (例えば、C#に継続ってあるんでしたっけ?)
なんか質問のしかたが、はてなとかgooみたいだな。
449 :
デフォルトの名無しさん :2007/12/09(日) 01:16:06
おい、おまいら、他の言語にあってC#にはない「有用な言語仕様」をおしえれ。
聞いてどうする? ヘジか?
451 :
デフォルトの名無しさん :2007/12/09(日) 01:17:23
ヘジって何?
ヘジを知らんのか あんまりC#やってない人?
453 :
デフォルトの名無しさん :2007/12/09(日) 01:19:20
あんまりやってない。
デストラクタがないな。 スコープはずれたタイミング呼び出されるメソッド。
ここで聞くよか、C#否定派に聞いたほうが出てくるんじゃまいかw
456 :
デフォルトの名無しさん :2007/12/09(日) 01:21:32
>>454 あれ、デストラクタってないんだっけ?
dispose()(だっけ?)とかクラス名に~付けたメソッドってなかったっけ?
一応MSDNにはデストラクタとして書いてあるけどな
459 :
デフォルトの名無しさん :2007/12/09(日) 01:25:03
Rubyスレあたりに居そうな気が
>>459 マ板にはいっぱいいるよ
ついて来れてないだけの人達だけどね
>>456 それはusing使わないと呼び出されないじゃん。
あとは、GCに呼び出されるやつもあるけど、C++とかDみたいにスコープをはずれた
タイミングで呼び出されるやつはない。
usingとDisposeでC++やDと同じ事ができるし usingを使わないことで違う事もできるってだけなんだが なんで無い事になるのかい
>>463 usingはネストが深くなる。
using(a)
using(b)
using(c) {
}
みたいに書けって言われるけど、こうはかけない状況が多々ある。
465 :
デフォルトの名無しさん :2007/12/09(日) 01:40:28
C#の弱点を聞きに来たのかw
全く同じ構文が欲しいってだけじゃね
>>465 弱点ってほどでもないけど、個人的にはあってほしい機能だよ。
usingはつけるの忘れたら終わりだろ File.Using("hoge.txt", file =>{ ... }); そろそろこうする時期に来てると思うんだ
そっか
471 :
デフォルトの名無しさん :2007/12/09(日) 01:51:05
>>466 そうだね。
というか、最強言語を探しに来て、C#が一番近そうだと思ったから、
C#が最強言語になるために足りないものを調べている。
なんだ中学生か
typedefがないなあ 強力なマクロもない 多重継承も無い
>>473 無いというかわざわざ省いたものじゃないのか
475 :
デフォルトの名無しさん :2007/12/09(日) 01:53:51
多重継承のように、無い理由付けがされている機能はなくてもいいと思う。 あると便利なのにスルーされている機能があったら教えて。
何に対して最強なんだ
メソッドスコープの静的変数
479 :
デフォルトの名無しさん :2007/12/09(日) 01:56:22
プログラミング言語の中での最強。 他の言語使いに、無いと言って馬鹿にされない様に完全無欠を目指す。 多重継承のように、無いと言われた時に理由を話せれば無くても問題ない。
Delphiにある委譲自動化が欲しい 実質多重継承だけど
ダックタイピングが出来ない
>>474 ジェネリックをネストして型名が長くなったとき、typedef欲しいと思う。
関数型言語の原理主義者あたりからすると、もうぜんぜんダメなんじゃね?
484 :
デフォルトの名無しさん :2007/12/09(日) 02:00:47
RubyとSchemeとOCamlとPrologを撃破できれば最強になると思うんだけど これらと比べてC#に足りない点はないかな。
485 :
デフォルトの名無しさん :2007/12/09(日) 02:04:32
>>483 どこら辺がダメかな。
λ式は制圧したよね。継続はよくわからないけど。遅延評価はあるんだっけ?
遅延評価はFunc<T>で十分
487 :
デフォルトの名無しさん :2007/12/09(日) 02:08:07
実はもう最強?
>>485 オブジェクトがImmutableでないから。
C++におけるconstってない気がする
無くても足りてるから
設計者が「インテリセンスを拡張すれば…」とか言っちゃうくらいだからな あんまり言語だけで語るのは意味無いよ VC#のインテリセンスは神
>>477 あ、やっぱり無いんだ?
C#でメソッド内にstatic hoge mona = orz;って書いたら怒られるから、
「VB.NETのSharedはどこにあるんだろう…」
と思いながらクラス変数にしてた。
いつでも付けられるけどあんまり意味のない機能はとりあえず付けない方向なんじゃね 自動プロパティなんかそうだったし
C#の機能じゃないけど、プロジェクトの循環参照って出来るようにならんもんだろうか。 これが出来ないから、プロジェクトA内のクラスを使うプロジェクトBは、 自分の持つクラスをプロジェクトAに対して公開できない。 というと、そんな状況になるのはそもそもプロジェクトやクラスの切り分けが 間違ってるからだ、という声が聞こえてくるようだ。 最初は俺自身そのように考えていたんだけど、どうも必ずしもそうでもない場合が あるような気がする。 適切な例を提示できなくて申し訳ないんだけど。
>>492 C#では全ての関数がクラスやインスタンスに属してるから、
フィールドで事足りるってことだろう。
>>492 揚げ足取りみたいになるが、メソッドスコープの静的変数なんてVBにもないでしょ。
VBのSharedフィールドはC#のstaticフィールドと同じでしょ。
VBのStatic付きのローカル変数は「メソッドスコープの静的変数」じゃないよ。
あれは機能的には「特定のメソッド内からしかアクセスできないフィールド」
という感じ。
CILに静的変数ないからな。 フィールドをあたかもローカル変数のように見せかける構文糖を用意するしかない
>>496 勉強になた。やっぱ恥は晒すものね。
C#で同じことが出来たらいいのに。
あと、C#にもWithEvents相当の機能が干し犬。
WithEventsなんてあったからって特別便利になるようなものじゃないだろ 複数のコントロールで共通のイベントハンドラを使うようデザイナで指定することもできるし 手で書くなら手間はWithEventsと変わらんし
Typedefだってシンタックスシュガーで出来ると思うんだけど ヘジはILレベルで変えなきゃならんから時既に遅しとかいってたな
>>500 C#の世界だけなら構文糖でいけるだろうけど、
他の言語との相互呼び出しやILレベルでの強いtypedefを実現するのは無理じゃなかろうか。
>>499 Private Sub ガッ(byval sender As Object, byval e As EventArgs) Handles
>>499 .ぬるぽ
Dim orz As Nanasi = DirectCast(sender, Nanasi)
Call Sendガッ(orz)
End Sub
みたいな時にHandlesの後を見れば
何のイベントプロシージャか分かるのはエレガントだと思うぬ。
ファイル内なら今でもできるわけで。 定義側でやりたいって話だから必然的に情報の埋め込みは必要になる。 属性レベルで保持して構文糖でサポート、レベルならできそうだけどね。 CLR内でもまともに扱おうとしたら無理があるな。
>>503 ファイル内でも弱いtypedefしかできないと思うが。
いや、どっちの話をしてるのかわかんないけど。
うわほんとだ usingで出来るんだな 知らなかったwwwww
VBはもう見たくないから、巣に帰ってくれんか・・・
もうtypedefがずらずらならんでるのなんか見たくないお・・・ typedef IntPtr HWND
>>508 dllimportをコピペするのに便利かもw
ヘッダを基にしてdllimportしまくるときにusingでやったことあるw
>>499 WithEvents とHandlesを組み合わせた機構は無茶苦茶便利だぞw
便利な上に
>>502 が言わんとしているような利点、つまり「それ」がイベントハンドラで
あることを明示する機能もある。
実際使わずに想像だけで物言っちゃダメだよ。
あれはC#に導入してもいいと思うよ。
このスレもVB厨沸いてんのか、VB使っとけよ
>>511 C#に必要かどうかはおいといて、eventのより抽象化された実装としては悪くないと思うよ。
C#のは良くも悪くも生っぽいというかILの基本的な仕掛けがそのまま見えるところが特徴だしな。
逆にVBのDispose/Finalize周りがC#と同じでむき出しの実装になってることに違和感を覚えた。
いまならC++/CLIのような仕組みにすべきなんだろうと思う。
スプリットコンテナの線に.....みたいのが付いていて ダブルクリックすると出たり隠れたりするやつはどうやって作るの?
ただC++/CLIでは値型ローカル変数とマネージポインタ変数の型が明示的に表現されるから FileStream fs(L"hoge.txt"); FileStream^ fs = gcnew FileStream(L"hoge.txt"); これで書き分けることが出来るのだろう よく知らんけど C#だとusingになっちゃうのはまあ仕方ないことかもしれない
>>514 そこの例にあるCloseは全部不要だな
C++/CLIのは良さそうに見えるけど実際使ってみたら結構分かりにくいと感じた
どっちみち意識しないといけないんだから、目立つC#のusingの方が好き
Close取ったらシンメトリーが崩れる
マニュアルに Close == Disposeと明記してあるならいらないと思う。 明記してないなら用心でCloseも呼んどく。 バッファをフラッシュせずにハンドルだけ閉じないかとか心配してしまうから。
520 :
513 :2007/12/10(月) 14:35:53
>逆にVBのDispose/Finalize周りがC#と同じでむき出しの実装になってることに違和感を覚えた。 ここは朝っぱらだったので端折りすぎた。 言いたかったのはusingのことではなくて、 ~ClassA() { } !ClassA() { } のこと。本物のDispose/Finalizeは隠されていて、 この2つはDispose(bool)から呼び出されるメソッドだということ。 GC.SuppressFinalizeを直接書かなくていいだけでもだいぶすっきりしてると思う。
CloseとDisposeの違いはCloseだと再びOpen出来るんだっけ CloseだけしてDisposeしないのがアウトになったりされると余計にわかりにくいな
!ClassA()はC#にも取り入れられるべきな気がする
!ClassAはどちらかというとC#の~ClassA相当
>>521 System.IO.StreamReaderはこうなってて違いはない。Close後の再オープンは出来ない。
public override void Close() {
this.Dispose(true);
}
!ClassA()はFinalizeもDisposeも Dispose(bool)もSuppressFinalizeもベースクラスのDisposeも自動で実装して アンマネージかマネージかによる分岐もやってくれるんだろ
俺は大抵Closeは普通に書いて、 usingと併用してるな。 記述が煩雑になるので、Closeはfinallyにしてない。
冷害は調べないほうがいいの
ドキュメントに書いてあって、対処できそうならキャッチ
Visual C#を使っています aを押したら自動候補が現れて、aだけを入力したいのにasって入力されてしまうんですが、 aだけを入力する時ってどうすればいいのでしょうか? a→as b→base ってなっちゃう
Esc
>>531 即レスありがとうございます!
できました^
533 :
デフォルトの名無しさん :2007/12/11(火) 13:19:41
ところで、C#は3.0になってRubyに完全勝利したの?
IronPythonに完全敗北しました
つまり、C#はIronRubyに歴史的大敗ってことか。
あのくそ遅い言語で何を記述するというのですか? スピード速いなら何でも良いです(´・ω・`)
つC
C# 3.0は最高だ ラムダ式万歳
λ式なんてRubyにもあるだろ。
C#もS式で記述できればいいのにな
ブロック構文の方が見た目分かりやすいと思うがC#のやつでも十分だ 何より静的型の方が俺は好きだ
LINQって特定用途のくせに、予約語増やしまくりで生意気じゃない? from、where、select とかって、今後も構文レベルでどんどん拡張しまくるつもりなの? なんかおかしくね?
特定用途のところでしか予約語にならないだろ
でも、その特定用途のためにコンパイラ(パーサ)を拡張してるんだよね。 ライブラリでいいんじゃね?なんで言語拡張しちゃってるの?意味わからんし。
その言語拡張を自分たちにもさせてくれ('A`)
そのためのLispです。
共通に使う部分は共通にするべきだ コミュニケーションを円滑に進めるために 言語を拡張する以外の方法でそれが出来ないならそうしたらいい
LINQが拡張されるたびにC#の言語仕様も拡張されていくのか 確かにキモいな
お前らが勝手に拡張したらコミュニケーションが出来なくなるだろ 予約語が増えるといったって識別子が制限されるわけでもないし
>>549 ライブラリは皆が勝手に拡張しているものだが、コミュニケーションは出来ているぞ。
逆に、特定用途のために言語仕様が大きくなれば、
(その特定用途の記述は特定用途を使っていない人には理解が難しいわけだから、)
その分コミュニケーションが取りづらくなる。
言語仕様は最大公約数的であるべきだよ。
>>551 .NET Frameworkのライブラリの使い方の質問はそこら中で出来るけど
自作クラスの使い方の質問なんて作者にしか出来ないだろ
そしてLINQはプログラミングのあらゆる場面で出て来る
特定用途でもなんでもない
構文的には特殊なものに限っていて、それによって識別子がかぶったりすることを防いでいるわけだが
var q = hoges.Where(s => s.Length == 5).OrderBy(s => s).Select(s => s.ToUpper()); クエリ構文はあくまでも上のようなよく使う組み合わせを次のように簡潔に書くためのもので、 var q = from s in hoge where s.Length == 5 orderby s select s.ToUpper(); SQLにはあってクエリ構文にないものは拡張メソッドを直接使うことになる。 var q = ( from s in hoge where s.Length == 5 orderby s select s.ToUpper() ).Distinct(); 機能を拡張してもリンク構文を増やすことはあまりやらないと思うな。
LINQ構文なんてSQL使用者の便宜のためにあるんで 慣れたら必要なくなるんじゃないかと思うが
そのうち var q = ( from s in hoge where s.Length == 5 orderby s select s.ToUpper() ).Distinct(); と var q = ( from s in hoge where s.Length == 5 orderby s select distinct s.ToUpper(); をC#のバージョンで切り替えるようなソースが出てくるんだろ。 気持悪すぎる。
いやだと思うなら拡張メソッドで全部書けばいいんだよ。 クエリ構文はLINQ拡張メソッドの簡易構文なのだから。 そういえばLINQ for XMLでXMLリテラルの採用は見送ってますね。 気持ち悪いとか言う輩が多かったせいだろうか。VBにはしっかりあるけど。 var x = <hello> <hoge>hhh</hoge> </hello> ;
さすがにキモイです^^
>>556 自分だけの問題なら別にいいんだよ。
例えば、自分がC#3のコンパイラしか持っていなくて、
C#4の言語仕様にdistinctが取り込まれてC#4のソースにdistinctが使用されたら
自分の持っているコンパイラではそのソースはコンパイルできないんだよ。それは困る。
言語仕様の拡張ではなくライブラリでの提供だけなら、ライブラリを調達するだけで対応できる。
コンパイラまで変える必要はない。
このインパクトの違いは大きい。
どうせWindowsUpdateで入る.NETにCscついてくるわけだから、どうでもいいよ。
C#の採用しないセンスは素敵だな 何を取り入れないかにすごく気を使っている感じがする
>>558 C#4のソースがC#3でコンパイル出来るわけねーじゃん
今までを見てみろよ
それでも別に何の問題もなかったろ
. も () も <> も使わないメソッド呼び出しの構文糖をユーザにも定義させてほしいよ。
LINQの評価順は分かりにくいな 拡張メソッドで書いた方が断然読みやすい
>>558 自分が.NET3.5とC#3のコンパイラしか持っていなくて、
.NET4.0の標準ライブラリに新たな関数が追加されて、C#4のソースにその関数が使用されたら
自分の持っているコンパイラではそのソースはコンパイルできない。
同じ話じゃん。
言語をユーザーが勝手にいじるのは不利益が大きすぎる 言語の標準を守って節度のある使い方をしてくれる人ばかりならいけるんだろうけど
>>564 ぜんぜん違うよ。ライブラリならその言語を使って自前で作ることができる。言語仕様を拡張されたら手も足も出せない。
>>562 のような奴がいるから言語に手を加えることが許されないんだな
ま、コンパイルに必要なコンパイラの最低のバージョンを指定する アトリビュートなりなんなりがあったほうがいいかもなあ。
コンパイラはどうでもいいだろ .NET Frameworkのバージョンは指定できるようになったし
ちなみにVBのクエリ構文はC#のそれよりキーワードが多い。 DISTINCTやSKIPやTAKEなどもあるし、拡張メソッドへの単純な糖衣構文でもない。 LINQの拡張毎にキーワード増やす気満々だ。VBらしいっちゃらしい。 Dim xm = <AAA> <BBB id="1">aaaaacxzc</BBB> <BBB id="2">aaaaaxczx</BBB> </AAA> Dim rs = From x In xm...<BBB> _ Where x.@id > 2 _ Distinct Skip 1 Take 3 _ Order By x.@id Descending _ Select ID = x.@id, x
>>570 クロージャの考え方は変わってないよ。
その違いはバグではなくてC#のクロージャはそういうものというのが正解。
C#のクロージャについてはここの前スレかその辺でだいぶ議論した記憶があるな。
public List<Employee> Managers(List<Employee> emps) { return emps.FindAll(delegate(Employee e) { return e.IsManager; } } public List<Employee> Managers(List<Employee> emps) { return emps.FindAll(e => e.IsManager); } def managers(emps) return emps.select {|e| e.isManager} end 差は縮まってきたな
public var Managers(List<Employee> emps) { return emps.FindAll(e => e.IsManager); } にならないかな。
C#なら普通は public Employee[] Managers(IEnumerable<Employee> emps) { return emps.Where(e => e.IsManager).ToArray(); } こうか public Employee[] Managers(Employee[] emps) { return emps.Where(e => e.IsManager).ToArray(); } こうだと思うが というかオブジェクト指向的には List<Employee> list; public Employee[] Managers() { return list.Where(e => e.IsManager).ToArray(); } こうだと思うが
>>576 戻り値の型が見ただけでわかんないだろ
最悪じゃないか
いやSQL使わない職業プログラマなんか皆無だろ
SQLになれた人間がいくらいようと LINQ構文が拡張メソッドに慣れるまでの経過的措置なことには違いない
世間知らずだな
経過的措置を言語仕様に組み込むなんて美しくありませんこと
匿名メソッドは設計チームも認めた経過的措置だったけどな
匿名メソッドを見ろ 使い物にならん ラムダ式があればこんなものはいらないことはMSも認めてるし
なんでラムダ式を見越して匿名デリゲートを(int x)=>{ return x; }の形式にしなかったんだろう かなり早くからC#3.0の仕様出てたのに ジェネリック制約のwhereなんかは明らかに意識してるっぽいのに
あてずっぽうなんだが、ステートメント本体を持つラムダ式を ラムダ式とするか匿名デリゲートのままにするか意見が分かれてたのではなかろうか。
あれ?ラムダ式だととりあえず複数行のセンテンスはかけなかったよね? それが匿名メソッドの書き方である必要はまったくないんだが。
{ }で囲んでreturnを省略しなければ複数ステートメントも可
>>589 このタイプはExpressionと互換が無い。
つまりDLinqでは使えない。
>>589 さんくすこ。前かけたような気がして匿名メソッド書かなくていいやと思ってたら、その後別のところでエラー出されてひとつの式しかかけないのかと悩んでた。
>>590 そりゃそういうものだからしょうがない。でもExpressionじゃなくてSentence的なものでも良いからセマンティクスをいじれるものがほしかったなあ( ´ー`)フゥー...
あれ?DLINQのばあいはILレベルでSQLが構築されてるの?それとも実行時にコンパイルされたExpressionに基づくILにしたがってSQLが生成されて実行される?
>>593 var query = from x in context select x; // この時点でクエリをビルド
foreach (var x in query) // この時点でDBサーバにクエリを送信
// some action
という感じっぽい。
コンパイル時には Expression Tree になってる。
SQL文は実行時に生成。
パラメータだけが違うほとんど同じ SQL 文を何度も使いたい場合には、
CompiledQuery ってものもある。
拡張メソッドのthisの後ろの型名って恐ろしく冗長じゃない? 何で省略できるようにしないんだろう。この言語設計者は馬鹿なのかな。
省略して型が何かわからなくなるよりはいい IEnumerable<T>が冗長だとも思わない
>>594 ラジャ、
つーとデータに関係ない文をラムダ式中に複数書いた場合はむしされるのか?今やってるの落ち着いたら試してみるノシ
using System; using System.Linq.Expressions; class Program { static void Main() { Expression<Func<int,int,int>> e = (x, y) => x + y * 1000; Console.WriteLine(e); var f = e.Compile(); Console.WriteLine(f(3,4)); } } (x, y) => (x + (y * 1000)) 4003 ステートメント本体があると即コンパイルエラー 外部の関数などを呼んでたら、SQLを組み立てるときに実行時例外のはず。
ラムダからExpressionが生成されるのはコンパイラーのおかげ?
コンパイラーのおかげです。
>>600 を自前で組み立てるとこうなった。
static void Main() {
//Expression<Func<int,int,int>> e = (x, y) => x + y * 1000;
var ex_x = Expression.Parameter(typeof(int), "x");
var ex_y = Expression.Parameter(typeof(int), "y");
var ex_1000 = Expression.Constant(1000, typeof(int));
var ex_r1 = Expression.Multiply(ex_y, ex_1000);
var ex_r2 = Expression.Add(ex_x, ex_r1);
Expression<Func<int,int,int>> e =
Expression.Lambda<Func<int,int,int>>(ex_r2, new ParameterExpression[] { ex_x, ex_y });
Console.WriteLine(e);
var f = e.Compile();
Console.WriteLine(f(3,4));
}
>>601 それが、ラムダ式の「単なる匿名デリゲートの簡素化」ではない部分。
静的な命令型言語で関数型言語のクオート的なものを実現しようという要求の解答。
同じ構文で、
デリゲートに代入すれば匿名デリゲートと同じ扱い
Expression 型に代入すれば Expression Tree にコンパイルされる。
てかvarってナニよ
イナイイナイ var
不覚にもワロタ
ベェー
ヴェル
ヴァー
そんなネタ今時小学生でも笑わん。 余程楽しいことがない人生を生きてるのかね
妖怪人間♪
暇つぶし程度のプチネタでも この板だとレス飛び越してワロタとか言ってくれるよな。 この板って笑いの沸点低いのかね。 あ、もちろん良い意味で。
なぜC#の話をしない
>>615 お前、周りから冷たい人って言われるだろ
で、C#3.0本の日本語版は、いつ出るのよ。
C丼本はもう少しで出ると思います。
ちとアホなこと聞いていい? .NET Framework 2.0 から WebClient に Download*Async ってメソッドが追加されてると思うんだけど この非同期操作の DownloadProgressChanged ってどんな条件で発生するか分かる人いるかな? 1.0 で同じようなもの作らなきゃいけなくなって気になったんだ。 ProgressChangedEventArgs.ProgressPercentage が INT32 っぽいから、単純に ProgressPercentage が変わったら、とかかな? まさかバッファに読み込むごとに発生するとかじゃないよな…
Enterprise Libraryを使ってる方います? 今、EL3.1のLoggingを使っているんですが、ログローテーションしないのです。 ちゃんと、Rolling設定しているのですが。 日単位でローテーションして欲しいのですが、 これって、アプリケーションが深夜0時に起動しっぱなしだと、 ローテーションしないのでしょうか? 書きっぱなしでは無いのですが。
622 :
621 :2007/12/13(木) 17:29:17
ごめんなさい、ローテーション間隔の指定はIntervalですから、Dayを指定しても、 午前0時でローテーションされるわけではなく、24時間でローテーションでした・・・。
Enterprise Libraryはなぜか使う気がしない。 なぜだろう…
>>620 sscli 見れば詳しく分かるんじゃないかな
>>620 内部バッファから出力先に書き写すごと、のような気がする。
codezineの記事で C#使って.NETのフォームの自動テストを 自作しようみたいな記事あったはずなんだが 消えてる 誰か知らね? invokeとか使ってhackするイメージだったはずなんだが
リフレクションのやり方知ってりゃ自動テストなんて簡単に自作できる
>>627 おまいUI野テストほんとにしたことあるの?
UIのテストは手動でやるなあ
Debug.WriteLineとかで開発ソフトの出力のとこに表示されるのを アプリの中で表示するにはどうすればいいの?
Debug.Listeners.Add(自分で実装したTraceListenerの派生クラスのオブジェクト); TextBoxに出力するとか自由自在
全部オーバーライドするのはちょっと面倒ような
は?
標準でいろいろ入ってるだろ。 あんまり使えないけど…
637 :
620 :2007/12/14(金) 19:42:12
Windowsサービスでログオン時、ログオフ時に処理させたいのですが、 SystemEvents.SessionSwitch が上手く働かない・・・。orz public class Program : ServiceBase { public static void Main(string[] args) { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new LogonEventWatcher.Program() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); Console.ReadLine(); } protected override void OnStart(string[] args) { base.OnStart(args); SensNotification.writeLogFile("Service started !"); SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch); } static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) { SensNotification.writeLogFile("The session is switched. Reason: " + e.Reason); } protected override void OnStop() { base.OnStop(); } } なんか対応出来ませんかね?
今日久々にVBA触った… 少しだけコードを追加して実行。 構文エラー 少し直して実行 構文エラー そのあと何回直しても構文エラー よくみてみるとステートメントの後ろに ; をつけていましたorz
あるある
そんでVBやり込み過ぎて、C#に戻ってきたら ; を忘れるようになると言う落ち
そんなことでは、PLSQLやTSQLとC#の並行開発なんて無理だろうなw
lispぐらいになれば文法的には混同しようもないのだが 今度は思考レベルで
644 :
デフォルトの名無しさん :2007/12/16(日) 11:44:59
3回に1回はDOS窓でlsと打ってしまう俺が来ました
cygwinのbinにpathを切れば無問題。
cygwin も入れてると、3回に1回どころではなく ls と打ってしまう。 人の PC 使うときに結構困る。 PowerShell だと Get-ChildItem に dir と ls の両方でエイリアス付いてたり。
とってもどうでもいいけど PowerShell は sl はやめてまじで
set-location か。 まあ、打ち間違うなって話だけど。 どんどん話し脱線するけど、 Unix のジョークソフトで sl ってタイプミスすると、 SL 機関車の AA が画面上を走る奴があったよね。 タイプミスするたびに脱力物。
あめりかんじょーく
C++/CLI触った後にC#やると^付けちゃったりnew忘れたりgcnewと書いちゃったり 似てるだけにVBより厄介 Javaほど似てるとかえって混乱しないんだけど
C#は確保されたスタックの容量を調べることができますか? 数万個の構造体をスタックに置きたいのですが、容量が足りるか調べたくて
使用は推奨されてないがThreadコンストラクタでスタックサイズ指定できるな メインスレッドじゃ無理だが ちなみに既定では1MBytesらしい
でも普通に配列使って必要に応じてfixedする方がいいと思うけど
あるクラスAが保持しているコントロールを Aが保持している2つのフォーム両方に表示することはできないでしょうか? フォームのControlsに追加してもどうやら最後に追加したフォームにしか表示されないみたいです。
無茶ゆうな
Control→ウィンドウハンドルを持つ って知ってたらそんなこと考えないよ
ウィンドウサイズ変えるとリストとかツリービューとかが一緒におっきくなってくれねえ、どうしたもんか
WPFへどうぞ
とってもどうでもいい上に亀だけど
>>647 Remove-Item Alias:ls
あ、素で間違えてら、まあいいか
Visual C# 2008 Express Edition日本語版来たな
for (int i = 0; i < parts.Length; i++) { textBox1.Text = parts[i] + "\r\n"; } これでpartsを全部表示できないどころか何もtextBox1に表示されないんですがなんででしょうか? partsはstring[]型で、コンパイル時にエラーなんかはないです
>>664 最後の行に空白文字しか入ってなかったとか、空文字列だったとか。
textBox1.Text = だから、追記になってないけどいいのか?
AppendText把握しました コンソールの要領でやってましたごめんなさい
C#での正規表現なんですがどうもうまくいきません。 Match m; Regex reg = new Regex("あいうえお"); m = reg.Match(str); if (m.Success) textBox1.Text = "hit"; ここまでしてもhitが表示されない あいうえおを[]や()でかこっても同じだしコンパイルエラーはないしstrを表示させればあいうえおは含まれているしなんでなんでしょうかorz
それコピペしてstr追加したけど、ヒットしたけどな
670 :
デフォルトの名無しさん :2007/12/18(火) 17:39:22
>>668 よくわからんけど、まずはおちついてブレークポイント設定して、
一行ずつ実行してみれば?
実際のプログラムでも正規表現は本当に"あいうえお"なの?
単なる例で実際に正規表現で複雑なことを引っかけようとしているのなら
正規表現が間違っている可能性が一番高いと思うけど、正規表現をテストできる
サンプルプログラムはネット上で沢山転がっているので、それ使って、正規表現が
正しいかどうかまず確認してみては??
別スレッドで実行してるとか
VC# 2008 Express使ってみた方はいらっしゃるでしょうか? 新しいプロジェクト→フォームアプリケーション→デバッグなしで開始 とやっても何にも出ないのですが。 まともに使えないのは私だけでしょうか?
普通に動くんだが どうでもいいけど普通真っ先にWPF触ってみたくない?
WPF重すぎwww
675 :
672 :2007/12/18(火) 19:57:00
>>673 >普通に動くんだが
そうですか。
こちらの使い方が悪いと判断してがんばってみます。
>どうでもいいけど普通真っ先にWPF触ってみたくない?
とりあえず動くかなとやってみたら、動かなかったという感じです。
それに、「デバッグ開始」ってやると、
プログラム '[484] WindowsFormsApplication1.vshost.exe: マネージ' はコード -1073741819 (0xc0000005) で終了しました。
と出て止まるし、
「新しいプロジェクト→WPFアプリケーション」ってやると、
Microsoft Visual C# でエラーが発生したため終了します。
と出てIDE自体落ちるし、何が悪いんだか・・・
677 :
672 :2007/12/18(火) 20:54:36
>>676 Windows XP Service Pack 2です。
WPFでTabControl追加して タブ追加してそのタブの中にボタン追加しようとしてもデザイナだけだと追加できなくない? XAMLいじればタブ内に配置できるけど。。。。
多重起動した際に元々起動していたアプリケーションを最前面に持ってきて表示し、 後に起動したアプリケーションは終了するソフトを作っております。 GetProcessesByName等により、元々起動していたアプリケーションのプロセスは取得可能なのですが Form.Hide()によりFormが隠してある場合、MainWindowHandleが0のため最前面に持ってきて表示という動作が不可能な状態です。 なんとかしてHide状態の元々起動していたアプリケーションのハンドルを知ることはできないでしょうか? もしくは代用策でもありましたら教えていただければ幸いです…
680 :
デフォルトの名無しさん :2007/12/19(水) 00:35:57
しつもんです。 Graphics.MeasureStringだと余裕もって測られてしまうので、 Graphics.MeasureCharacterRangesでカッキリ計測して、 きっちし文字列を描画したかったんです。 ですが、Graphics.MeasureCharacterRangesからもってきたRectangleに Graphics.DrawStringすると、今度も微妙にはみ出して文字ごとクリップされたり ellipsisの点々がでたりしてしまいます。 数ピクセル余裕をもたせればなんとかなりますが すべての文字列に対応できるのか分からず気持ち悪いです。 なんとかカッキリきっちし描画する方法はないんでしょうか。
>>680 TextRendererは使ってみた?
>>679 後から起動したのは名前付きイベントとか使ってもともと起動していたアプリに通知だけして終了。
元々起動していた方が自分をアクティブにする。
>>681 TextRendererだとアンチエイリアスがひどいので……
ってStringFormat.GenericTypographicをつっこめばいけるみたいでした。
とりあえずこいつを相手にしてみます
すんません。。。。。
既出かつ基本的な話ならすまんそ デバッグで最適化入れてないにもかかわらずデバッグ時にこのメソッドは最適化されてるため評価できませんうんたら出るのはなんでなんでしょう? 匿名メソッドとかのからみ?
C#で質問なんですけど、 現在在庫管理のソフトを作ってます。 それで、在庫の変数をclass Declarationで宣言して frmMainとライフタイムを同じとするように、public class Form1の内側(全てのメソッドの外側) にpublic Declaration dec = new Declaration();とインスタンスを作成して frmMainでボタンイベントが起こったときに、現在の在庫数をCSVで出力する用のクラス FileInOutのInputCsv(Decralation dec) でCSVから取り込んだ値をDeclarationの変数郡に代入す際に どうしても参照エラーになってしまいます。デバッガで確認すると dec.sample と参照した変数は0となっており、参照できているはずだと思うんですが・・・ なぜでしょうか。どなたかご教授いただけませんか マルチすみません。
これはひどい
>>685 家帰ったら試してみるノシ
AllReBuildやると同じ効果ある?
下のコードが通ることにちょっとびっくりΣ(・∀・;) static void Hoge(Delegate1Param<bool,Form> deleg) { } static bool Hoge2(Control l) { return false; } static void HogeHoge() { Hoge(Hoge2); }
びっくりする箇所を教えてくれ。
型パラメータの違うdelegateを渡してもコンパイルが通ること。 コンパイラ賢いなぁと
キーワード:共変性・反変性
リストボックスなのかしらんが複数列できねえ・・・janeは一体どうやってんだ ボタンとリストで代用する作業疲れた
リストヴューだろ
janeはDelphiだろw
共変・反変の概念があるなら class A { } class B : A { } void F(){ Action<A> funcA = i => { }; Action<B> funcB = i => { }; funcA = funcB; // エラー } このコードが通ってほしいよ。
それってIEnumerableオブジェクトがICloneableオブジェクトとして扱えるようなもんだろ
さっそく教えてもらったリストビューだけど解説してるとこ少なくて敵わんです 一体どうやってデータを追加すればいいんだろう listView1.BeginUpdate(); items = new ListViewItem[1]; items[t].SubItems.Add(title); items[t].SubItems.Add(name); items[t].SubItems.Add(date); items[t].SubItems.Add(point); listView1.EndUpdate(); こんなんしてみたりこまこま変えて試しまくってるけど見当つかないですorz 誰か詳しく載っているページとか知らないでしょうか
何か困ったときは真っ先にMSDN引けよ。 Google先生に尋ねたり、2chで訊いたりするのは最後の手段。
問題はMSDNを理解出来るか否か、さらにはあれを読み切るか否か
ググってMSDN探すのはガチ
>>697 IEnumerable<int>がIEnumerable<long>として扱えるようなもんだ
なんでICloneableになっちまうんだ?
>>696 ILレベルではサポートしてるからそういう言語作ればいいと思う。
>>692 正直今日はじめてこの言葉知った。
まぁ中でやってること、いいたいことはわかるが、その日本語見て意味がわかるやつはおらんだろ。
原語がなんていう単語か知らんが、なんか間違ってる。
>>708 原語の直訳。
covariant, contravariant。
圏(けん、category)論っていう数学の分野の用語。
学者肌の人が言語を作るとこういう難しい用語使っちゃう。
710 :
デフォルトの名無しさん :2007/12/20(木) 17:17:45
aspectdngでウィービングすると文字列の終端に制御文字っぽいなにかが混じってしまいます。 aspectdngのバージョンは0.9.0.0です。 なにかご存知の方よろしくお願いします。
おかしくなる場合があるようだ ってことは知ってるがそれ以上のことは知らない
712 :
710 :2007/12/20(木) 18:19:20
>>696 それが必要になるのは設計が間違ってるから
C#のジェネリックは正しく設計しないとコンパイルすら通らない
EventHandler handler = new MouseEventHandler(Hoge); これが通ってほしいと思うことはあるな EventHandler<T>に統一しとけばジェネリックメソッドとか駆使して何とかなるんだけども
それが通ったらおかしいだろどう考えても。
MouseEventArgs 以外が渡されたらどうするんだよ、って意味な。
EventHandler eventHandler = (object sender, EventArgs e) => { }; MouseEventHandler handler = new MouseEventHandler(eventHandler); こうはできるな
718 :
710 :2007/12/21(金) 22:35:11
ひとり引っ張ってしまってかたじけないが cecilのどこかで文字列末尾にU+FFFDがついてしまってる模様。 強引に末尾ちょんぎっても不正なアセンブリっていわれちゃうし・・ みなさんはAOPのライブラリってなに使ってるんでしょうか?
使わない。
フラットが聞ける状態じゃないけどこっちにも書き込むのはまずいよなぁ
かまへんで嬢ちゃん
リストビューに関してなのですが、選択されたリストビューの項目を取得する方法がわかりません
ColumnHeader A = new ColumnHeader();
ColumnHeader B = new ColumnHeader();
ColumnHeader C = new ColumnHeader();
...
こんな具合でA列B列C列・・・とあり、ここにデータが追加された状態で、
ある行をクリックするとその行の特定列の情報を得たいです。
private void listView1_SelectedIndexChanged(object sender, EventArgs e){}
こいつの中でうまくやればいいのはわかるのですがいまいち他コントロールとは勝手が違う為よくわからないでいます
|A|B|C|
|.1|.2|.3|
|.4|.5|.6|
|.7|.8|.9|
...
こんな具合で2行目をクリックすると4,5,6部分が選択され、例えばその中のB列にある5を取得するといったかんじです
それではよろしくお願いします
こいつです(
http://pc11.2ch.net/test/read.cgi/tech/1197802312/293 )
まるちいくない
何が分からんのかが分からん SelectedIndexを知らんだけか?
リストビューでselectedindexあったっけ
727 :
723 :2007/12/22(土) 21:55:56
選択したリストビュー内の行の情報を得たいんですが、うまくいかなく 選択した行の特定列を得たい、だけかけばよかったかなorz リストボックスならSelectedIndexもありますし、リストビューにも似たものがあったのですが同じようには使えなかったのでおそらくハズレです
>>726 そういえば無かったなw
SelectedIndicesなりSelectedItemsなりから取れるよ
ListViewは複数選択可能なのが多いからか取得できるのは選択アイテムのコレクションのみ
>>727 SelectedItemsじゃいかんの?
>>728-729 どちらも試したのですが、その二つそれぞれの下にある関数でそれらしいものがなかったため違うのかと思っていました
いろいろとToStringで表示させてみたのですがその二つを表示させた時もその行の情報がでてくれなくorz
何か勘違いしてるんでしょうか
ちょっとはヘルプの使用例を見ろという話ですよ
「下にある関数」って何だろう
インテリセンスに出てくる候補だ絽
ListView.SelectedListViewItemCollection items = this.ListView1.SelectedItems; これくらいしかヘルプからはわからなかったけどこれも無理だったorz 素直に今回は諦めておきます
MSDNに使用例載ってるだろ… まずはコピペしてみろよ
MSDNからのコピペは一通りやっています、すぐ上のもそれです おそらく知識不足な為調べ方も悪いんだと思われます
>>720 .NET1.x時代で開発終わってるものばかりで、AspectDNG以外はLoomくらいなもんで
Loomは使ってみたけど元のコードを変更しないとWeavingできないみたいだし使いづらい。
消去法的にDNGなんだけどU+FFFD問題が・・(DNGっていうよりcecilの問題っぽいんだけども)
た す け て・・・
AOPイラネ宣言もあったしな
へじたんはAOPがお嫌い
>>734 this.listView1.SelectedItems[0].SubItems[0].Text
SubItems[0]の数値を適当に変えてみろ。
ヘルプ見ろとか言ってるヒマあるなら答え教えてやれよ
741 :
710 :2007/12/23(日) 23:22:00
レスくれた方もいたので一応報告。 PostSharpを試してみてなかなかよさげだったんだけど、PInvokeメソッドがうまくいかなくてこれまた断念。 結局AspectDNGでCecilを最新版にして、そのInjectメソッドのシグネチャが変わってたので呼び出し部分を修正。 目的はPInvokeしてるメソッドたちのプロファイリングだったんだけどこれでなんとかうまくいきました。
742 :
デフォルトの名無しさん :2007/12/25(火) 23:28:18
フライドチキン
C/MigemoにもとからC#のラッパついてるじゃん
まじで?
746 :
デフォルトの名無しさん :2007/12/26(水) 13:16:29
Migemo.cs
ほんまやtoolsフォルダに入っとった。 だけどこれdllの場所決め打ちだね
置換すればいいだろ
この人(ry
こんなちょっとしたアンマネージドDLLの呼び出しに、 P/Invoke使わないなんて車輪の再発明もいいところだろ。
誰がそんなこと言った?
754 :
749 :2007/12/26(水) 15:46:49
>>743 ライブラリのロードに失敗したときに適切な例外を投げたりしないのは実用上問題があるよね。
普通に[DllImport]使ったほうがいいと俺も思うよ。
関数ポインタを delegate に代入するとき、 (HogeDelegate)Marshal.GetDelegateForFunctionPointer(p, typeof(HogeDelegate)); みたいに2回同じ型を指定するのがわずらわしかったので、 // T は delegate、p は GetProcAddress で取得する関数ポインタ static T GetDelegate<T>(IntPtr p) { Delegate d=Marshal.GetDelegateForFunctionPointer(p, typeof(T)); return (T)d; } みたいにしてみたが、キャストするところで 「型 'System.Delegate' を型 'T' に変換できません。」 とコンパイルエラーになる。 うまくやる方法は何かない?
Delegate型じゃなくてObject型で受けたら
>>757 お、うまくいった。ありがとう。
しかし GetDelegateForFunctionPointer の戻り値って Delegate だし、
Generic使わなければ Delegateで受けてもキャストできるのに。
謎だ。
where T : Delegate とすればいい といいたいところなんだけどC#ではコンパイル通らない
フォームの最大化ボタンを押されたときに処理をするにはどうすればいいの? サイズ変更する前に。と言うか揉み消ししたい場合。
多分WndProc乗っ取らないと無理
WM_SYSCOMMAND SC_MAXIMIZE
protected override void WndProc( ref Message m ) { if ( ( int )m.Msg == 0x0112 ) //WM_SYSCOMMAND { if ( (int)m.WParam == 0xF030 ) //SC_MAXIMIZE { MessageBox.Show( "そうはいくか!" ); return; } } base.WndProc( ref m ); }
できました。乙です。
if((int)WParam & 0xFFF0) == 0xF030) でないとタイトルバーダブルクリックがスルーされるぞ
そんな「意地悪」が意味をもつ場面って想像できないなあ。。 最大化できないならそれと分かるようにしとけよヴォケ、 あーあーこんな糞ソフト作った奴の顔が見たいよ、と俺なら思っちゃうと思う
最大化ボタンを消せばいいんじゃないのか
>>760 が期待してる回答ってFormのプロパティだけで済むんじゃないか?>エスパー
769 :
デフォルトの名無しさん :2007/12/27(木) 08:43:43
そうなんでそうしない。あえて難しくかんがえてるよ 最大化ボタンをけしてもだめなの
最大化でフルスクリーン移行なアプリとかじゃないのどうせ
そんなら最大化を検出したときにフルスクリーンに移行でいいんじゃないの?
C#からC++のDLLを使おうとしてるんだけど DLLにコールバック関数を渡してそれを維持している必要があって C#に用意した関数をGetFunctionPointerForDelegateでポインタをDLLに渡してるんだけど 同時にいろんなスレッドが動いててC#のコードでガベージコレクションが動く ここでDLLを呼び出すとC#で用意したコールバックが移動して見当たらなくなる そこでDLLの関数を呼び出す前に ガベージコレクションのWaitForPendingFinalizersで待つ 再度GetFunctionPointerForDelegateで取ったコールバックのポインタをDLLに渡す DLLの関数を実行(処理してコールバックを呼ぶ) ってやってて、なんとなく動いてるんだけど DLL側が処理している瞬間に関数のアドレスが移動する可能性を否定できないのは どうしようもないのかな? それともDLLから帰ってくるまで他のC#のスレッドを全部止めれれば 回避できるって考え方でいいのかな?
わざわざ関数ポインタ取得する必要ないだろ? 素直にデリゲートの参照そのまま渡しとけ 呼び出しから帰ってくるまで保持するだけでいいならローカル変数で問題ないし
なるほど、なんかすでに頭がこんがらがって本末転倒になってたぽいです ありがとうです
OnSysCommand()みたいなMFCに普通にある物がなくてなんだか…
>>773 ここまで当たってるか知らんがフルスクリーンの方法がWindowed=FALSE
でResetならWindowは本当に最大化すると居座ってしまって邪魔なだけ。
アニメもウザいし
protected: virtual void WndProc(Message% m) override { if(m.Msg == 0x0112) { if((m.WParam.ToInt32() & 0xF030) == 0xF030) { MessageBox::Show("むりぽ", this->Text, MessageBoxButtons::OK, MessageBoxIcon::Warning); return; } } Form::WndProc(m); }
変態言語
C++/CLIのコードの見た目はインパクトがあって好きw
インパクトだけならもっと凄いのがいろいろあるぞ
whitespace とか brainfu*k とかなw
for (var i = 0;... とか書く奴って、馬鹿丸だしって感じww
forループとか書く奴って(ry だな。 Enumerable.RangeかわいいよEnumerable.Range
またえぴすか
伝わってねー ではあらためて。 for (int i = 0;... と書くべきところで for (var i = 0;... とか書く奴って、馬鹿丸だしって感じww var擁護してる奴ってガキばっか チームでvar擁護してる奴は即行クビだなwww
>チームでvar擁護してる奴は即行クビだなwww 意味不明。 煽りたいなら、日本語ぐらいちゃんとしろ。 かっこ悪w
アホはスルーしましょう。
まあ、煽り云々はさておき、「varは、使わなくてもいいなら使わない」というのには同意しとく。
明示的に宣言できる型に汎用型を多用するようなプログラミングは 好ましくないだろう。 C++でなぜ、スパゲッティコードが多発したのか原因を良く考えることだ。
forのintはインテリセンスが書いてくれるからわざわざvarに変えたりしないだろ
一瞬javascriptスレかと思ったぜ。
for (int i = 0; ... なんて書くなら foreach するよ・・・
どうぞどうぞ
foreachだと配列の中身変えられないじゃん・・・
int i = 0; foreach (object obj in list){ i++; }
∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ <こいつ最高にアホ 彡、 |∪| / / __ ヽノ / (___) /
型が明らかな場合長ったらしい型を書くよりvarにした方が可読性は高い
現在、mshtml.IHTMLDocument2でwriteメソッドを使い 直接htmlソースを入力しHTMLドキュメントを生成しています。 mshtml.HTMLDocumentClassのcreateDocumentFromUrlメソッドを 使った場合と殆ど同じものを得る事ができるのですが 上記の方法ではurlの部分がabout:blankになってしまいます。 このurlの部分のみをあとから修正する方法はないでしょうか?
ないと思うけど、urlいじってどうしたいのさ?
レスありがとうございます。 今クローラを作っていてこの生成したHTMLドキュメントをあとから 利用するときのためにurl情報も残しておきたいと思っているのです。
URL情報がIHTMLDocument2にある必要はないと思うのだけど クローラならHTML解析さえ済ませればIHTMLDocument2は用済みじゃない?
たしかに仰るとおりですね。 ただ今のところ解析結果の情報を他に移すことなくそのまま利用しているので。 ちょっと修正が大掛かりになりそうなので 簡単にurlの部分だけ更新できれば、と思い相談させて頂きました。
横槍だけどurlがabout:blankのままだと imgノードとかのsrcを得たい時に困るんじゃないの?
ヴァリアント てーっ!
>>810 まさにそこの部分で困っていました。
DOMツリーを辿ってIMGノードのmshtml.IHTMLImgElementの
srcを取ろうとしたらabout:../image/01.jpgのようになってしまいました。
いないいないvar
>>812 以前いろいろ考えてみたが、その時はあきらめてbase要素をHTMLに仕込んだな
ありがとうございます。 writeするHTMLにbase要素を仕込む方法試してみました。しかし baseUrl' は、型 'System.NotImplementedException' の例外をスローしました。 となります。
C#で.netのGUIアプリケーションを作りたいのですが
入門サイトなどをみると、CUIでハローワールドやら値の入出力やらの説明がされており
GUIで例えば
テキストボックスから値を取ってボタンを押されたら入力された値を表示する
という簡単な動作をやってみたくても参考にできるサイトが見つかりません
ttp://ufcpp.net/study/csharp/st_basis.htmlのサイトの GUIプログラム例を元にやってみたら動かなかったし…
どこか良いサイトなどありますでしょうか?
VS なり VC#Express なり使ってるなら、適当にコントロール張り付けたり、 プロパティグリッドでプロパティいじったりイベント一覧からハンドラつけたり あんまり悩むところもないと思うのだが
>>815 それ「baseUrlプロパティに設定」しようとしてないか?
J#のvjslib.dll読み込んで作ったアプリを別のサーバーで使おうとしたら、アセンブリ読み込めません・・ のMsg出るんだけど、なんで?.NET2.0入れててればGCAに登録してなくてもいいんじゃないの?と思って ましたが、何か勘違いしてるのかな・・
J#は別にランタイムが必要だったような J#のライブラリなんて必要ある?
>>821 そうでしたか。zipファイル扱いたかったので仕方なくvjslib.dll利用しました。
>zipファイル扱いたかったので仕方なくvjslib.dll利用しました。 よくあることだよね。 多倍長整数なんかも、今はDLRがあるけど、以前はJ#のライブラリを使うのが 一番手っ取り早い方法だった。 >J#は別にランタイムが必要だったような 「Microsoft Visual J# 2.0 再頒布可能パッケージ」だな。
System.IO.Packaging.ZipPackage
.NET Framework 3.0か そんなのあったんだな
3.5も出てますがな
> そんなの ってのは > System.IO.Packaging.ZipPackage を指しているんじゃまいか
828 :
825 :2008/01/01(火) 02:07:35
>>827 その通りです。
3.0というとWPFってイメージしかなかったから、「そんなの(ZipPackage)あったんだな」と。
一応補足。
というかWPFの一部だべ>ZipPackage
Dns.GetHostEntry("218.42.128.8"); これが何でエラーになるの > 218.42.128.8 Name: pso-mp08.sonic.isao.net Address: 218.42.128.8 逆引きできるはずなのに
>>830 IPHostEntryの情報を取るのに逆引き以上のことをしている。
pso-mp08.sonic.isao.net この名前で引けないし。
ジョイパッドのボタンが押されたらイベントを発生させるコンポーネントを作ろうとしています。 フォームに表示する必要はないのでComponentから継承して、コンストラクタは(IContainer container)をパラメータにしています。 System.Threading.Threadで別スレッドを起動し、そのスレッドで Microsoft.DirectX.DirectInput.Device.SetEventNotificationを使ってシグナルを待ってからイベントを起こそうと思っているのですが、 メインスレッドでイベントを起こすための方法に悩んでいます。 DelphiでのTThread.Synchronize相当のものを探しています。 Invokeを使うようですがControlで実装されているので、Componentから継承しているので使えません。 そこで親のフォームのInvokeを使おうとしています。 プロパティを通して親Formを設定するコードを書いてしまえば出来そうなのですが、 できるだけ汎用性を持たせたいので、IDEでフォームに乗せただけで、 自分はどのフォームに乗せられているのか知る方法はないのでしょうか?
>>832 俺自身C#初心者なんてトンチンカンな答えかも知れないけど、
例えば次のようにUIの同期用に適当なコントロールを強制的に作っちゃうのも
一つの方法なんじゃない?
static Label mUISyncObj;
public static ISynchronizeInvoke GetUISyncObject()
{
if (mUISyncObj == null)
{
mUISyncObj = new Label();
mUISyncObj.CreateControl();
}
return mUISyncObj;
}
Application.Formsかなんかでその上で実行させるとかでいいんじゃない?
ContextMenuStripとかに仮想リストみたいな機能はないのかな 2000個のアイテムを追加すると(SuspendLayoutしてAddRange)2秒以上かかる。。 個数と時間考えれば遅くはないんだろうけど。 2000個もつっこむのが間違ってるよね。。。。
836 :
835 :2008/01/06(日) 01:16:12
アイテムにImageIndexがついてると重いみたい。寝る。
837 :
832 :2008/01/06(日) 09:40:41
結局、作らなくていい回避策があるハンドルは増やしたくなかったのと ジョイスティックの初期化でもハンドルが必要なことに気づいたので、とりあえず public Control ParentControl というようなプロパティを持つことにしました。 アホなことに、こうすればIDEで簡単に設定できることにも気づいたし。
ゲームパッドに初期化なんてあったっけ? あったとしてもハンドル(ウィンドウハンドルのことを言ってるんだと思うけど) なんて必要だったかなあ。。 いずれにせよ、ISynchronizeInvokeをグローバルで一つ持つのが一番単純で応用が利くと思うんだが。
C#でゲームって誰が買うんだよw
DirectXならC#でも十分なパフォーマンス出るぞ XNAとか知らんのか
遅いのはFormsだけだろ
842 :
832 :2008/01/06(日) 13:46:30
ISynchronizeInvokeってのには気づきませんでした。憶えておきます。 ちなみに私が作ろうとしてるのはゲームじゃないです。 パッドをリモコン代わりにいろんなソフト(主に動画・音楽再生系)をコントロールするツールです。 自分専用。
Formsって何だろ 探偵小説?w
844 :
832 :2008/01/06(日) 13:52:23
>>838 あとDevice.SetCooperativeLevelのことです。
System.Windows.Timerは内部でNativeWindowを持ってるよ
MDXは封印されますた
Managed DirectX 1.1 から XNA Framework への移行ガイド
ttp://www.microsoft.com/japan/msdn/xna/migration.aspx より
>DirectInput デバイス
>
>フライト スティック、ハンドル、旧式のゲームパッドなどの DirectInput デバイスは、
>XNA Framework ではサポートされて いません。
>これらのデバイスは Xbox 360 と互換性がないため、
>クロスプラットフォーム ゲームをサポートするためには適切で ありません。
>
>DirectInput デバイスのサポートが必要なゲームでは、
>これら のコントローラにアクセスする手段として引き続き MDX 1.1 DirectInput アセンブリが必要となります。
>DirectInput はクロス プラットフォームでは動作しないので、ほとんどの XNA Framework プロジェクトにとって推奨されません。
もの凄く中途半端な位置づけ
ジョイスティックくらいWin32APIとかC++/CLIとかで何とでもなる
ゲームは箱で作れ てこと
質問です、WebBrowserコントロールでExcelファイルを表示したばあい、そこで使われている Excel本体のProcessオブジェクトはどのような形でつかむことができるでしょう。 たとえばHtmlDocumentのようなものから手繰っていくのでしょうか、よろしくお願いします。
WebBrowserコントロールのDocumentは何になってる?
タイトルバーにボタンを追加したんですけど、サンプルありますか?
したんだったらいいじゃん
854 :
デフォルトの名無しさん :2008/01/08(火) 13:10:51
>>851 >Documentは何に
と言われますと、それのプロパティで見るのでしょうか・・・。
すみません、よくわかりません。
ブレークポイント設定してウォッチするとかしてみたら?
もしWorkBookなら、それから.Application ApplicationのExecuteExcel4Macroを使って kernel32.dllのGetCurrentProcessID()で ExcelのProcessIDが取れる
857 :
デフォルトの名無しさん :2008/01/08(火) 16:52:04
>>856 ありがとうございます、そういうふうに行うのですか!!
これでやってみます!!
858 :
デフォルトの名無しさん :2008/01/08(火) 21:32:17
>>856 この方法でExcelの場合のProcessをつかむことができそうでした、ありがとうございました!!
Excelのマクロを使ってしまうというのはすごい方法ですね!!
こうしたWebBrowserで走っているCOMサーバープロセスをつかむ一般的な方法と
いうようなことを考えた場合ですが、Excelも含めて対応できるものがあると便利かと
思いました。もしかしてそうしたことも可能でしょうか。今回の方法から類推して
考えてみればいいのかもしれませんが自分ではちょっと考えつきません。
もしそうしたものがありましたら教えていただけないでしょうか・・・。
ないと思う。例えばインプロセスサーバだったらどうするの。
それよりプロセスとって何がやりたいのか興味がある。
861 :
デフォルトの名無しさん :2008/01/08(火) 23:57:52
>>859 そうですか、やはりないですか、わかりました。
>>860 実はExcelファイルの表示を終了してもExcelのプロセスが生き残っていたため
それを強制的に終了したかったのですが、ActiveXInstance.ExecWBでCloseコマンド
を投げるとWebBrowser自体が消えてしまいましてびっくりしました。
それでCOMのプロセスは残りやすいのではと思いまして、そうしたときの対策でと
思いました。別の方法がありましたら教えてください。
>>861 (訂正)
>ActiveXInstance.ExecWBでCloseコマンドを投げる
-> ActiveXInstance.ExecWB(OLECMDID_CLOSE, ・・・, ・・・) を投げる
>>861 いやおまえ・・・力づくでプロセス落とそうとすんなよ・・・。
それバグだぞw
クローズするのはプロセスじゃなくて、 ハンドルをクローズさせないといけないだろう。 まずは基礎的なCOM操作を覚えないとな。
少し待てば終了するはずだけど。。。
867 :
デフォルトの名無しさん :2008/01/09(水) 00:29:11
>>863-864 >クローズするのはプロセスじゃなくて、
>ハンドルをクローズさせないといけないだろう。
わかりました、COM操作について勉強します。
OLECMDID_SAVE ができたのでExcel自体のプロセスが終わって
くれるのかと思ってしまいました。
>>865 いつかはガーベジコレクションで消えるのでしょうか・・・
気にしないでいいでしょうか。
C# または VB.NET で Excel.Application (というか COM) を扱う時は、 明示的に参照の解放をしなければなりません。 解放しないと、プロセス内に居座り続けるため Excel は終了しないです。 (タスク マネージャを見ると、Excel.exe がプロセスに残ったままになる) とりあえず、参照はすべて変数に取りましょう。 必要ではなくなった時点で、System.Runtime.InteropServices.Marshal クラスにある、 ReleaseComObject メソッドで解放してください。 それと、例外発生時の対応として Try 〜 Finally を使用して、 解放を保証することを強くお勧めします。
この話題は長くなるからな〜 呼び出しもとのプロセスを終了してもExcelが残っているなら、 それはExcelに対してClose/Quitの命令を実行してないからだと思うがね。
TLB公開されてないオブジェクトをC#で扱うと発狂しそうになる。
WebBrowserコントロール上のExcelの話か。ややこしい使い方してるなぁ。
WebBrowserコントロールのDocumentが何か知らないので、
Excelを触ってないと思ったので、
>>865 触ってるなら
>>868
WebBrowserコントロールはVBやDelphiの頃から鬼門だなあ 多少のメモリリークは目をつぶるしかないところがある。
875 :
デフォルトの名無しさん :2008/01/09(水) 09:30:45
>>868 詳しいご指導を頂き、大変ありがとうございました!
>>869-874 WebBrowserで表示したのみで直接Excelのオブジェクトを
操作はしてませんでしたが、こちらのアプリケーションを終了しても
残っていました。
>>873 つまり「触って」はいなかったです。その場合はいつかはシステム上の
誰か(.NETFrameworkでしょうか?)が消してくれるのですね、
そうならば特に気にかけないことに致します。
別でExcel実行中にたまたまこれ使ってて落とされたらたまらんなw
だからProcessIDで特定するんだろ
同じだって
Excelは複数のファイルをMDIで開くからProcessIDで特定しても、 ファイルがプロセス共有してる。 ここまで、言わないと理解できないわけじゃあるまい。
んなこといったらApplication.Quitも使えん
^^?
882 :
デフォルトの名無しさん :2008/01/09(水) 19:42:27
C#の話題と限ったことではないのですが、 Explorerなどで、ファイルやフォルダの「新規作成」という操作ができる ようになっていますが、あそこに出てくるファイルの種類というものは、 何かの基準で選別されて出てきているのでしょうか? その場合には何かの選択されるの基準や条件というものとしてどこに 情報ファイルとして格納されているということでしょうか?もしそうしたものが あって見られるとしましたらその形式やアクセス方法などを知りたいのですが、 どなたか教えていただけないでしょうか。
>>882 どの辺のレベルのことを聞いているかわからないけど、直接的にはFileDialog.Filterプロパティ
新規作成 explorer レジストリ で出てくる辺り?
>>882 レジストリ、フォルダ、色々あるけど ShellNew でググれば大体わかるんじゃない?
886 :
デフォルトの名無しさん :2008/01/09(水) 20:33:25
>>883-885 >FileDialog.Filterプロパティ
>新規作成 explorer レジストリ
>レジストリ、フォルダ、色々あるけど ShellNew でググれば大体わかる
おお!!ありがとうございます!!
すばらしいです、こんなにすぐにもたくさんのレスを、感謝です!!!
これらを調べてみます!!助かります!!またよろしくです。
パフォーマンスカウンタとかも Win32からのAPIも提供されてるってだけで 中身COMだから、そもそもサービス全滅。
std::list<Hoge> hogelist; std::list<Hoge>::iterator it; for (it = hogelist.begin(); it != hogelist.end();){ if (it->inactive()) it = hogelist.erase(it); else it++; } こんな感じで、inactiveになっていたらリストから消すって事ををやりたいんですが、 C#だとSTLないんで、System.Collection.Genericを使うんだと思うんですが、 上の書式ってどういう風に書けばいいんでしょうか foreach使って消すとなんか怒られるんですよね…
enumeratorはコレクションに手を加えると無効になるから、添え字でアクセスする。
List<Hoge> hogelist; hogelist.RemoveAll( delegate(Hoge o) { return o.inactive; } );
>>890 おお、RemoveAllに条件をつければよかったんですね
てっきりclearと同じ関数だと思ってました
ありがとうございます
892 :
886 :2008/01/10(木) 13:52:05
教えていただいた項目から調べてみましたところ、レジストリへの設定で可能となっている ことがわかりました。ありがとうございました!! ところで、このレジストり内の 「拡張子」 の項目に Shellnewで新規作成できるファイルを 追加しようと思うのですが、テンプレートファイルを複数用意しておいて、それらすべてを 一つの拡張子に割り付けて複数のファイルから選択できるようにしたいと思ったのですが、 これは可能でしょうか? 何卒よろしくお願いします。
894 :
デフォルトの名無しさん :2008/01/10(木) 14:28:07
>>893 誘導ありがとうございます!!あちらで聴いてみます!
895 :
デフォルトの名無しさん :2008/01/10(木) 20:49:12
C#で callmethod(String methodname, arg1・・・) みたいに文字列のメソッド名を使って指定したメソッドを呼び出すみたいなことはできませんか?
またスクリプト脳か。
次あたり「evalはありませんか?」が来る。
あるから困ったもんだ
文字列を変数に使いたいのですが、どうすればいいですか。
遠慮なく使ってください。
object o = 0xffffffff; ×IntPtr p = (IntPtr)o; InvalidCastException ×IntPtr p = (IntPtr)(int)o; InvalidCastException ×IntPtr p = (IntPtr)(uint)o; OverflowException ○IntPtr p = (IntPtr)(int)(uint)o; 小一時間はまっちゃった。 どうしてこうなるの?
0xffffffff の型は uint で、object に代入する際にボクシングされる。 んで、それを元に戻すのが uint へのキャストで、 他へのキャストはできない。 uint から IntPtr への直接のキャストでは範囲の判定が行われて、 オーバーフローになってしまう。 そこで、一旦 int を挟む必要がある。 という事なんだろう。
IntPtr p = (IntPtr)(int)(uint)o; ↑ ボックス化解除 ↑ 整数変換 ↑ ユーザ定義キャスト
ども。 >元に戻すのが uint へのキャストで、 >他へのキャストはできない。 なるほどなるほど…… だけどIntPtrへのキャストで範囲をチェックするのが納得いかない UIntPtrの存在も。
IntPtr p = (IntPtr)(uint)o; これは、 IntPtr p = IntPtr.op_Explicit((uint)o); とみなされて、 op_Explicit(Int64)が呼ばれるから。
(18禁ゲーム)[050715][HOOK] _summer(AlphaROM補修済 ccd+bin)
通りすがりだけど、unboxingとキャストを区別してなかった。 uint u = 1; object o = u; int i = (int)o; で例外がでるなんて思いもよらなかった。 吊ってくる。
なんかIntPtrあるんだからUIntPtrあったほうがなんか他の型と対称的やん てUIntPtrの説明に書いてあるよw
まず、Vistaを買います
あぁ、そういうことですか。 わかりました。ありがとうございます。
class Hoge<T> where T : ??? { } ・型パラメータの制約(where)を使って、プリミティブ型のみ使えるように制限したい って事で悩んで小一時間調べてたんだけど、もしかして class Hoge<T> where T : IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> { } と少々強引?なやりかたでもいいのでしょうか。
別にいいけど、それらを全部満たすものがあれば、それも通るよ。
>>915 そう思うから、何かもっと良い方法がある筈と考えてるんだけど、分からないんだよねぇ
実行時に型チェックすればプリミティブ型を一発で見分けれるんだけど、実行時に分かっても例外飛ばすしかなくなるし・・
残念ながら、それよりよい方法は存在しない。
型制約どうも記述力不足だよなぁ・・・
プリミティブ型ってのはIL上で見分け付くもんなの?
>>914 Tじゃ演算できないからICalculable<T>インターフェースみたいなのも作らないとね
演算子定義したり違う型との演算とかまで考えるとちと面倒になってくるけど
decimalはプリミティブじゃないぜ、事実上。
decimal以外のC#のプリミティブ型をジェネリックの型パラメータに指定したら System.Int32とかじゃなくてIL組み込み型としての名前が付くみたいだね 区別する方法はありそうだけど
整数はint 少数はdoubleでいいじゃない
GCがある時点で構文がシンメトリーではない。
プリミティブの演算をインターフェース越しにするなんて 考えただけで気持ち悪いな
プリミティブ型だけならILGenerator使って四則演算できたような かなり危ない感じだけど
やだよそんなの><
すみません、TraceSourceについてちょっと質問です。 以下のようなクラスを作り class TextBoxTraceListener : TraceListener { TextBox textBox; public TextBoxTraceListener(TextBox tb) { this.textBox = tb; } public override void Write(string message) { this.textBox.AppendText(message); } } class Form1 : Form { public Form1() { TraceSource ts = new TraceSource(GetType().ToString()); ts.Listeners.Add(new TextBoxTraceListener(this.textBox1)); ts.TraceInformation("hoge"); } } とやれば、hoge がテキストボックスに表示されますよね。 他のクラスでTraceSourceを作成し、トレースしても、そのインスタンスごとにリスナを登録しないとだめですよね。 でも構成ファイル(app.config)にConsoleTraceListenerとか TextWriterTraceListenerとかを指定してやれば全てのTraceSourceのインスタンスにリスナを設定してくれますよね。 ところがTextBoxTraceListenerはTextBoxのインスタンスが必要なので、構成ファイルで設定できないのです。 複数のクラスでTraceSourceを使っていて、それらの出力を全てテキストボックスに表示させたいんです。 なんかいい方法ありませんか?
>>928 ログの名称はアセンブリ名かアプリケーション名にしたほうがいいぞ。
GetType().Assembly.GetName().Name
>>928 TextBoxのインスタンスは後でプロパティ経由で渡すことにして、
それまではバッファリングしとけば
ちょっと気になったことで質問をば UNLHA.dll(アンマネージコード)を使ってLHAファイルを解凍しています UnlhaExtractMem関数(つまりファイルの解凍)を呼び出すときにbyte配列を渡していますが UnlhaExtractMem関数実行中に渡したbyte配列がGCの対象になって 移動してしまうことはないかです unsafe中では、fixedを使用すれば移動しないのが分かるのですが、 同じことは不要なのでしょうか? マーシャリングの中で自動的に整合性を取ってくれてるように思えますがご回答願います。
P/Invokeでアンマネージドな関数を呼ぶ場合、 関数を呼び出してから戻ってくるまでの間にGCが動くことはない。 渡したポインタをDLLが保存していて、後で使うような場合ははまる。
>>932 呼び出しはDllImportを使用しています
>渡したポインタをDLLが保存していて、後で使うような場合ははまる。
保証の限りではありませんが、さすがにそれは無いと信じますがw
>>932 >P/Invokeでアンマネージドな関数を呼ぶ場合、
>関数を呼び出してから戻ってくるまでの間にGCが動くことはない。
ちょっと補足させてもらうよ。
1)アンマネージドな関数Xを呼ぶ
2)Xからマネージド関数MXがコールバックされる
3)MXでGC発生
4)MXからリターン
5)Xからリターン
という可能性はあって、その場合Xの呼出し周辺のみを見ていると嵌ることがある。
>マーシャリングの中で自動的に整合性を取ってくれてるように思えますがご回答願います。
byte配列を渡したからと行って常にコピーが起きないとは限らない。
もしコピーが回避された場合、
マーシャラは1)のタイミングでfixed相当のことをやっていて、
5)のタイミングで解除している。
仮に3)でGCが起きたとしても大丈夫。
935 :
931 :2008/01/12(土) 15:59:31
>>932 ,934
回答ありがとうございました
お二方?とも問題ないと言うことなので、
GCによる問題は発生しないとで安心致します。
(あとEssential.NETという本を思い出して見てましたが、GCの問題の記述は見あたりませんでした)
>2)Xからマネージド関数MXがコールバックされる
こんなことも出来るんですねw
>>934 そうだっけ?マーシャラがP/Invoke時にpin指すから3)は起こらないと思ってたけど。
BStr -> COM
上のほうはサンプルコードでやろうとしていることと逆の説明じゃないか? 間違い?
940 :
928 :2008/01/12(土) 21:11:24
>>929 はい、サンプルなので適当に書きましたが、実際はそうします。
>>930 その方法でうまくいきました。
サンクスです!
ちょっと嵌っているので、教えてください。 以下のようなコードで、hoge()をマルチスレッドで処理したいのですが、シングルCUP環境だと意図した通り 実行しますが、マルチCPU環境だと2つ目のスレッド開始時点でShareClass.m_TaskQueue.Countが0となって 1つのスレッドしか動作しません。解決のヒントを戴けないでしょうか・・・ デリゲートで非同期実行しています。 static class ShareClass{ public static Queue<string> m_TaskQueue = new Queue<string>(); private static object sync = new object(); public static void SetTarget(string item){ lock(sync) m_TaskQueue.Enqueue(item); } public static string GetTarget(){ lock(sync) return m_TaskQueue.Dequeue(); } } //別のクラス void hoge(){ while(ShareClass.m_TaskQueue.Count != 0){ string item = ShareClass.GetTarget(); //何らかの処理 } }
942 :
941 :2008/01/14(月) 13:02:50
ちなみに、m_TaskQueueへの追加は(hogeを含まない)別のオブジェクトから行なっています。 連投すみません。また夜におじゃまします。
>>941 Singletonにすりゃいいんじゃね?
>>941 Monitorを使ってちゃんと排他する。
class BlockingQueue<T> {
object sync = new object();
Queue<T> qu = new Queue<T>();
public T Dequeue() { lock(sync) {
while (qu.Count==0) Monitor.Wait(sync);
return qu.Dequeue(); }}
public void Enqueue(T item) { lock(sync) { qu.Enqueue(item); Monitor.PulseAll(sync); }}
}
もうちょっと説明すると、
.m_TaskQueue.Count を読み取る箇所にもlockが必要。
読みとって1以上だったときにDequeueするまでの間も
他の処理が入り込まないようにlockしたままにする必要がある。
>>944 はそれをMonitor.Waitで実現している。
>>946 マルチスレッドのバグってCPU2個以上で表面化するものが多いから
別に不思議ではないんでは?
元のプログラムが何をしたいものなのかいまいち分からない。
>>944 >>945 であってるんだろうってきはするが、
元のプログラムとは違うよな…
waitってスプリアスウェイクアップって起こり得るの?
XmlSerializerについてなのですが、 (ひとつめ) プロパティP1{ get; set{ if(P2==null)return; base.A=value;}} のとき、P2、P1の順でシリアライズできないでしょうか? (ふたつめ) インスタンスI1のプロパティPとI2.Pの参照が同じであるとき、 その関係を保持したままシリアライズ・デシリアライズを することはできないでしょうか?
952 :
941 :2008/01/14(月) 23:02:18
>>944-945 参考になりました。
適切にロックすることで解決できました。
Count調べてアイテム取得するまでの間に別のスレッドが取得、削除して
エラーとなってました。デバッグ環境ないPCで動かしてたので特定に時間かかってしまいました…。
ありがとうごさいました。
953 :
デフォルトの名無しさん :2008/01/15(火) 14:52:00
大量の計算を行うプログラムで、プログレスバーを使おうとおもっているのですが、 実行中に処理を一時中断するのにThread.suspend()を使おうと思ったのですが 困ったことに.NET2008では使用が推奨されていないようです Thread.Interrupt()を使おうかと思ったのですが 途中でsleepする部分が無い(パフォーマンスが落ちると困る)ので 停止してくれません suspend()、resume()に相当する機能を実現するには どうすればよいのでしょうか? よろしくお願いいたします。
「大量の計算」の中で、適当な間隔で実行される部分を見つけて 外部からの処理一時停止リクエストを監視して自ら待つコードを入れとく。 一秒に数回も実行されれば十分だろうから、パフォーマンスへの 影響はさほど無いでしょう。 非推奨のThread.Suspendで強引に Thread を suspend しちゃう場合には、 当該スレッドが何かの共有資源をつかんだタイミングで suspend なんかしちゃったりして他のスレッドをブロックしちゃう可能性とか そういうことを詳細に検証したうえで行ってください。
MonitorとかManualResetEventとかは?
Form1とForm2を定義して Form1内で Form2 f2 = new Form2(); f2.ShowDialog(); でForm2を呼び出した後にf2内のbutton_Clickイベント処理内でf2の中のテキストボックスや、コンボボックスの値をForm1で取得したいのですが どうしたらよいでしょうか?
そのForm2が閉じてから取得したいのか、リアルタイムで取りたいのか。 リアルタイムならShowDialogは不向き、、、つかこれふらっとスレでいいんじゃ?
>>957 具体的に言うと、form1からform2をdialogで呼び出します。
そしてdialogの中のテキストボックスとコンボボックスに値を入れてOKボタンを押します。
そんで、form1内のデータグリッドにform2で入れた値を反映させる。
というものです。
なのでタイミング的には閉じた後でいいのかな?
FontDialogやOpenFileDialogみたいに、ダイアログの結果として必要な値だけ プロパティで直接公開する。コントロールを外に見せることはしない。
>>プロパティで直接公開する ってのはDesigner.csの必要な値のプロパティをprivateからpublicにするということでしょうか? それとform2のその必要な値はform1からどのようにすれば参照できるのでしょうか?
privateから以前に、そもそも存在してないものだと思うが。自分で定義するもの。 OpenFileDialog使ってみればどう取得するかは分かるだろ?
Form2にメンバーを作って、get setを作って 外からアクセスするようにしてみ。 その後、Form2でtextboxとメンバーが同期するようにする。 つーか、参考書ないのか?
はい、ですから >dialogの中のテキストボックスとコンボボックスに値を入れてOKボタンを押します ここを手動でいれます。 そのあとのOKボタンをクリックした時に、form1からform2のテキストボックスとコンボボックスの値を取り出したいということなのですが。 なにか私おかしいでしょうか?
ふらっとレベルの質問でしょ 移動しなはれ
というか14:07:03の時点でマルチポスト
C#で可変長のデータを扱うのはどういうのが定石 ? 自分はリストが一番慣れているんだけど(Lispをかじっただけだけど) そのリストの中に入れれる型を指定することできるかな。 Cell(object car, object cdr)とかやると何でも入っちゃうでしょ。 それをMLだったら[a]とかやると[Int]ならIntしか入らないし[String]ならStringしか入らないしとかやりたいんです。 (MLは使ったことないんで間違ってたらすみません) generics使ってclass Cell <T> {public Cell(T car, T cdr)}とかやるとcarやcdrにはCellが入らなくなっちゃうんですよね。
>>967 Thank you.
C# Listでググレばよかったんだね。
俺低脳。
これって.Net Frameworkの一部と考えていいの ?
.Net FrameworkってC#の標準ライブラリと考えていいの ?
JavaやRubyでいう公式ライブラリみたいな。
とりあえず.Net Frameworkの本買ってくる。
千葉はろくな本屋がないので週末まで待たなきゃいけないのがおっくうだ。
>.Net FrameworkってC#の標準ライブラリと考えていいの? うん
>>969 Amazonって千葉にあるんじゃなかったっけ?
>>971 千葉はまだ日本だからAmazonで買えるはずだな
部長の家wアマゾンw
975 :
デフォルトの名無しさん :2008/01/16(水) 22:02:02
ADO.NETスレから来ました。 C#のTableAdapterに関して教えてください。 TableAdapterを使って関連付け(Relation)されている テーブルのDBの行を削除することって出来ますか? 例えば以下の二つのテーブル(親:Table1 子:Table2)で Table1のIDの"ID1"の行を削除すれば Table2のIDの"ID1"の行が自動的に 削除されるみたいな・・・。 [Table1] ID Name Age ---------------- ID1 Yamada 20 ID2 Hanako 18 [Table2] ID Height Weight ------------------- ID1 170 65 ID2 160 50
そーいった使い方は出来ないと思う。 各々のDataTableのRowDeletedイベントとか使ってみてはどうだろか
977 :
デフォルトの名無しさん :2008/01/16(水) 23:57:21
ちょっと相談なのですが。 たとえば、こういうコードがあったとします。 if (Result == null) { transaction.Rollback(); MessageBox.Show("エラー0です。"); return false; } if ((int)Result == 1) { transaction.Rollback(); MessageBox.Show("エラー1です。"); return false; } if ((int)Result == 2) { transaction.Rollback(); MessageBox.Show("エラー2です。"); return false; } transaction.Commit(); return true; これをスッキリ表記するのに何かいい手段はないですかねぇ…。 throwで例外起こしてtry〜catchってのもスッキリしなくて…
えーっとフラット池
979 :
977 :2008/01/17(木) 00:51:48
>978 ありがとうございます。ふらっと逝ってきます。
981 :
デフォルトの名無しさん :2008/01/17(木) 14:46:23
System.Diagnostics.ProcessでDOSプログラムを立ち上げ、 キーボードイベントを送りたいと思っています。 DOSプログラム側では kbhit()+getch() でキーコードを取得しているのですが、 RedirectStandardInput = true にして StandardInput.Write() でキーコードを送ろう としているのですが、うまくいきません。 おそらく kbhit() が反応しないからだと思うのですが、 kbhit() で引っ掛けられるようなキーボードイベントをC#側から起こすことは可能でしょうか? 何かご存知の方がいらっしゃいましたら、よろしくお願いいたします。
コンソールのハンドル取って、SendKeys
983 :
981 :2008/01/17(木) 15:31:01
>>982 即レスありがとうございます。
確かに、コマンドプロンプトを最小化しないで SetForegroundWindow() でアクティブにし、
SendKeysを使うことでとりあえず期待している動作を確認できました。
ただ、できればコマンドプロンプトを最小化しておきたい、
可能であれば CreateNoWindow = true でウインドウすら消して実行させたいのですが、
そのようなケースで同様の処理を実現することはできないでしょうか?
ダメならば kbhit() が書かれているコード側を修正したいと思います・・・。
EnumWindows, SendMessage
985 :
981 :2008/01/17(木) 15:37:15
すいません、コマンドプロンプトを最小化したままでも期待している動作はしました。 初めにやったときはうまくいかなかった気がしたんだけどな。 さすがに、CreateNoWindow = true ではダメっぽいです。 フォーカスできないですもんね・・・。 引き続き、何か情報がありましたらお待ちしております。
986 :
975 :2008/01/17(木) 20:55:15
>>976 なるほど、DBのレコードの削除は
関連付けされていても一括でできないものなんですね。
RowDeletingイベントでやってみます。
>>986 AP側で対処せず、できるならDB側でトリガー作成するのがベターじゃないかな。
988 :
975 :2008/01/20(日) 00:28:44
>>987 助言ありがとうございます。
DBも初心者なのでトリガの存在は知りませんでした。
少し調べたところによるとDBのテーブル、ビューが
更新されたときに実行されるものみたいですね。
ちょいと調査してわからなかったらまた聞きにきます。
出来たら出来たで報告しにきます。
それまでこのスレあるかな・・・。
989 :
975 :2008/01/21(月) 15:21:22
>>987 トリガについて調べたのですがわかりませんでした。
データ定義言語(DDL)にて記述が必要そうなのは
何となくわかったのですが、いろんなサイトを覗いて
いざトリガの記述をしようかと思うも全然手につきませんでした。
何か初心者にもわかりそうな
これっていうサイトはありますか?
関連するテーブルのレコードを削除するくらいだから
すぐに見つかると思っていたら大間違いでした・・・。
何を勘違いしているのかしらんがトリガはSQLだぜ SQLSeverならBooksOnline(MSDNライブラリに統合されてるかもしれん)あたりで CREATE TRIGGERあたり調べるなり
何も勘違いしてない気がするが 気がするだけかも
トリガなんて例がいっぱいあるじゃんか。 RDBMSによって違うから、ググる時はDBの名前も含めるといいよ。
993 :
デフォルトの名無しさん :2008/01/21(月) 16:52:34
テンプレートを利用した BaseClass<T> を継承したクラスを作成したいのですが class SubClass<T> : BaseClass<T> みたいに宣言してもエラーが出ます。 こういうのがやりたいときはどのように記述すればよいのでしょうか?
994 :
993 :2008/01/21(月) 16:54:54
基本のクラスは class BaseClass<T> where T : FooObj みたいに制約をかけています。
継承するクラスでもTの制約を記述する
996 :
993 :2008/01/21(月) 17:03:16
ありがとうございます。できました class SubClass<T> : BaseClass<T> where T : FooObj ですね。
class A<T> { public T Foo(T a, T b) { return a - b; } } これはエラーでるんですがこういう事はできないんでしょうか?
うん
ありがとうございました Enumaで調べてみます
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。