トップページ⇒tech
1001コメント276KB

C#, C♯, C#相談室 Part44

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/11/13(火) 21:20:18
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。

前スレ
C#, C♯, C#相談室 Part43
http://pc11.2ch.net/test/read.cgi/tech/1190845036/
0153デフォルトの名無しさん2007/11/18(日) 11:58:50
>>152
初心者に一番わかりやすいだろ?
参照が関数から抜けると切れるし、strが参照型だと解る
0154デフォルトの名無しさん2007/11/18(日) 11:59:45
なんか頭のおかしい人がいます
0155デフォルトの名無しさん2007/11/18(日) 11:59:51
本気で言ってんの?…
class HeavyObject:IDisposable{
 int[] data;
 public HeavyObject(){data=new int[100000000];
 public void Dispose(){/*これ実装してdataを解放してくれ*/}
}
0156デフォルトの名無しさん2007/11/18(日) 12:06:56
>大量の資源を使うクラスに対するDispose呼び出しは
>VMの一定メモリ割り当て量超えた場合のパフォーマンス低下を防ぐため

具体的にパフォーマンス低下を防いでいる例を書いてくれ。
0157デフォルトの名無しさん2007/11/18(日) 12:08:53
>これの"A"と"B" はすぐに使えなくなるがDisposeしないでGCにまかせたりしてるのは
やっぱり意味不明だろどう考えても。
0158デフォルトの名無しさん2007/11/18(日) 12:10:36
>>155
配列の開放って、具体的にはどうするの?
今まで意識してやってなかった。
0159デフォルトの名無しさん2007/11/18(日) 12:12:38
>>155は冗談で書いたんだよ
GCに任せるしかない
よっぽどすぐ削除したかったら参照切ってからGC.Collectとか考えられるけど、
Disposeでやることじゃない
0160デフォルトの名無しさん2007/11/18(日) 12:14:02
data = null;
とでもいうつもりなのかな>>151は。
しかし問題はHeavyObject自身がどういう使われ方を想定してるかだ。

Disposeイコール普通はもう使わない、なんだから、
普通はDispose実装しても意味無いわな、ほっといても変わらん。
いやむしろDispose呼び出しのために開放が遅れる場合があるw
0161デフォルトの名無しさん2007/11/18(日) 12:17:33
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);
}
}
0162デフォルトの名無しさん2007/11/18(日) 12:23:10
??
それどう見てもdata=nullは一応ついでにやっといたほうがいい程度だし。
どう考えてもdataの開放は主目的とまったく違うし。

ついでっていうのは、Disposeされても参照が開放されない場合という、
どちらかというと特殊な状況でしか時再には意味無いけど、
せっかく開放のタイミングがあるんだから、一応ついでにやっとくべきだろう、
っていうレベルの話ってことね。

0163デフォルトの名無しさん2007/11/18(日) 12:24:22
まあその前にSafeHandle使え。
0164デフォルトの名無しさん2007/11/18(日) 12:30:12
ただのアンマネージメモリだったらGC.AddMemoryPressure
0165デフォルトの名無しさん2007/11/18(日) 12:33:06
問題はそれじゃないだろ。
GC.SuppressFinalize(this);
に指定されたオブジェクトがGCによって呼ばれないことによって
>大量の資源を使うクラスに対するDispose呼び出しは
>VMの一定メモリ割り当て量超えた場合のパフォーマンス低下を防ぐため
をおこなってるんだろう。
0166デフォルトの名無しさん2007/11/18(日) 12:33:12
DisposeしないでFinalizeにまかせたりしてるのは
だったらまだ、この表現自体の意味はわかるが、

DisposeしないでGCにまかせたりしてるのは
ってのはもはや意味不明
0167デフォルトの名無しさん2007/11/18(日) 12:34:11
>>165
それって「でかいアンマネージメモリ確保しちゃったからマネージメモリ詰めといてね」だろ
0168デフォルトの名無しさん2007/11/18(日) 12:38:11
>>165は>>164に言ってるんじゃないと思うけど、
>>167は>>165が>>164に言ってると思って言ってるのかな?
0169デフォルトの名無しさん2007/11/18(日) 12:38:50
>>166

表現のミスは認めるが、あげ足とり好きなやつが多すぎだな。
0170デフォルトの名無しさん2007/11/18(日) 12:42:34
こういうのを揚げ足と思ってる時点でやっぱりわかって無いことがわかる。
じゃあFinalizeって意味で書いたのか?
そんなわけ無いだろ、さらに意味不明だ。

>DisposeしないでFinalizeにまかせたりしてるのは
>だったらまだ、この表現自体の意味はわかるが、
って書いたとおり、「この表現自体の意味」はわかるってだけ。

>string str = "A" + "B";
>これの"A"と"B" はすぐに使えなくなるがDisposeしないでFinalizeにまかせたりしてるのは
>影響が少ないから。
これでどうだ、ますます意味不明だろ。
0171デフォルトの名無しさん2007/11/18(日) 12:42:50
オブジェクトの解放にはDisposeを実装
VMによるパフォーマンス低下を防ぐにはSuppressFinalizeの呼出

参照型には安全に解放を行うためnull参照を設定
まとめたらこんな感じか?
0172デフォルトの名無しさん2007/11/18(日) 12:44:04
言葉遊びに付き合えんわ
0173デフォルトの名無しさん2007/11/18(日) 12:44:38
>表現のミスは認める

本当はこういう表現をしたかったのに
ミスしてこう書いてしまった

っていう風にを説明してみ、できるわけ無いが。

0174デフォルトの名無しさん2007/11/18(日) 12:45:52
>オブジェクトの解放にはDisposeを実装
>VMによるパフォーマンス低下を防ぐにはSuppressFinalizeの呼出

>参照型には安全に解放を行うためnull参照を設定
>まとめたらこんな感じか?

んーそりゃ無茶だw
0175デフォルトの名無しさん2007/11/18(日) 12:46:08
ごめん、俺が悪かったから許してくれ!
01761402007/11/18(日) 12:46:36
>>142-143
遅ればせながら、ありがとうございました。
納得しました。
0177デフォルトの名無しさん2007/11/18(日) 12:47:19
オブジェクトの解放はGC任せが基本
特別な終了処理を行いたかったらDisposeを実装

っていうだけのことなんだけどな
0178デフォルトの名無しさん2007/11/18(日) 12:49:03
こっち先に埋めてね

C♯, C#相談室 Part34
http://pc11.2ch.net/test/read.cgi/tech/1162467959/
0179デフォルトの名無しさん2007/11/18(日) 12:52:22
必要なタイミングで即時に開放する必要のあるリソースをメンバとして扱うクラスは
Disposeを実装する。Disposeを実装してるメンバを持ってる場合も同じ。

アンマネージリソースを直に扱うクラスはFinalizeを実装する。
ただし、普通はSafeHandle使うべきだし、アンマネージリソースを直に扱うクラスなんて
まずめったに無いから、Finalizeを実装するのは本当にまれ。

Finalizeを実装するなら、Diaposeも実装して、確定的なタイミングでの開放もできるようにする。
この場合はDisposeのタイミングでSuppressFinalizeを呼び出して、
もうFinalizeは呼び出さなくていいことを伝える。
でも普通はDisposeパターンを使うけど。

Disposeを実装する場合は、一応マネージドなメンバの参照もnullにしておけば、
もしDispose後すぐに参照が開放されない、ということがあった場合には効果がある。
まあ普通の使い方じゃそんなに無いけども。
0180デフォルトの名無しさん2007/11/18(日) 12:58:03
もしかして釣られてるのか?
0181デフォルトの名無しさん2007/11/18(日) 12:59:58
どれにいってるのん?
0182デフォルトの名無しさん2007/11/18(日) 13:01:24
結論は179

Disposeの話題はおしまい
0183デフォルトの名無しさん2007/11/18(日) 13:01:46
Dispose厨に釣られてる
0184デフォルトの名無しさん2007/11/18(日) 13:03:39
まあDisposeはリソース開放とは別の意味合いで、
Before-Afterパターン的なことをするために会えて実装することはたまにある。
単にusingで簡潔かつ確実に書けるようにするってだけの目的だけど。

TransactionScopeなんかと同じ使い方だな、
何らかのスコープを定義したい場合に使うことが多い。
0185デフォルトの名無しさん2007/11/18(日) 13:08:51
個人的には>>184の使い方がとっても好きなんだが。
0186デフォルトの名無しさん2007/11/18(日) 13:09:12
列挙子を実装するときとかかな
0187デフォルトの名無しさん2007/11/18(日) 13:10:22
ビフォーとアフターを確実にやりたいなら
コードブロックを引数に取れよ
0188デフォルトの名無しさん2007/11/18(日) 13:14:17
ビフォーアフターっていうよりは、スコープ定義、だな、
簡潔簡単にかつ間違えなずに使えるようにしとくってのが目的だからな、
コードブロック引数ってのはやりたくない(外向けには、内部ではやったりもするが)。

あと大きいのは、VBでも普通に使えなきゃ困るから、だ。
0189デフォルトの名無しさん2007/11/18(日) 14:54:18
やっと終焉しましたね。
0190デフォルトの名無しさん2007/11/18(日) 15:00:17
>>187
Rubyのように内部イテレータをメインに使う言語はそれでいい。
foreachで外部イテレータも多用されるC#では
foreachからの脱出時の軽量コールバックにDisposeが流用される。
ttp://www.okisoft.co.jp/esc/prolog/in-cs.html#4

そしてLINQのせいでますます外部イテレータ依存度が高くなった。
IEnumerator<T>.Disposeはもう殺せないよ。使われすぎてる。

例外が軽い言語だと、列挙の中断通知には例外を使う言語もあるけどね。
PythonとかECMAScript 4とか。
0191デフォルトの名無しさん2007/11/18(日) 15:54:47
スレタイにC#追加して立てといた
ふらっとC#,C♯,C#(初心者用) Part21
http://pc11.2ch.net/test/read.cgi/tech/1195368821/l50
0192デフォルトの名無しさん2007/11/18(日) 19:38:56
マウスカーソルの付近に、マウスカーソルの位置情報を表示するアイデアありますか?
マウスを高速でぐりぐり動かしても表示がもったりしないような。
もちろんC#で。

具体的にはこんな感じで

            (100,230)
           ↑
0193デフォルトの名無しさん2007/11/18(日) 19:44:16
C#でマウスと言ってるからFormsかい?
普通に、イベントはMouseMoveを取得、表示はカーソルを自分で作成する。
0194デフォルトの名無しさん2007/11/18(日) 19:52:09
BorderStyle = Noneでラベルを乗せたフォームを表示して
親フォームのMouseMoveで位置とテキストを更新すれば
0195デフォルトの名無しさん2007/11/18(日) 19:56:28
C++のスキルに自信があるなら、IDropTargetHelperをアンマネージ操作というのもあるけど。
http://www.microsoft.com/japan/msdn/windows/windows2000/ddhelp_pt1.aspx
0196デフォルトの名無しさん2007/11/18(日) 21:03:59
んなことしなくてもMouseMoveでツールチップテキストを更新するほうが
お手軽かつ確実じゃないか。

まあ、一見便利そうで鬱陶しいUIの見本みたいになりそうだけど。
ステータスバーか、もしくは専用の表示スペース作って表示するのが普通に感じる
0197デフォルトの名無しさん2007/11/18(日) 22:06:36
VisualStudio での WinForm デザイン時に特定のコードを実行させたいんですが、対応するイベント等はありますか?

具体的にいいますと http://www.codeproject.com/cs/miscctrl/XPTaskBar.asp ;を Vista で動かすときに
デフォルトのままだと描画に不具合が生じるのでクラシックテーマに変更するメソッドを実行させたいのです。
0198デフォルトの名無しさん2007/11/18(日) 22:12:48
何ていうか........根本的に発想が間違ってる気がするよ。
まあデザイン時か実行時かはDesignModeプロパティで一応判別ができる。
MSDNライブラリよく読まないとハマる可能性があるけど
0199デフォルトの名無しさん2007/11/18(日) 22:28:23
XPExplorerBar の中身に手をつけないで、デザイン時に特定のメソッドを呼び出したいんです。
デザイン時は親フォームの InitializeComponent しか呼び出されないので、その呼び出しをどうやって知ろうかな、と。
0200デフォルトの名無しさん2007/11/18(日) 23:01:43
派生させればー?
0201デフォルトの名無しさん2007/11/19(月) 00:22:47
>>195
IDropTargetHelperって簡単なんだな
今作ってるやつにちょこっと足したらできた
0202デフォルトの名無しさん2007/11/19(月) 00:25:11
>>201

デバイスコンテキスト関連が面倒なんじゃないか?
GDIは癖があってあまり好きになれないんだよな。
0203デフォルトの名無しさん2007/11/19(月) 01:22:55
>>202
DC関連てソースの話じゃね?
ターゲットの場合、ドラッグイメージの描画はOSつーかexplorerがやってくれるよ?
Vistaならあのでかいアイコンとコピー/移動だかのインジケータ含めて。

問題は下のウィンドウの描画みたいだけど、
Vistaなせいなのかホバーしたときの描画がたいしたことないせいなのか
IDropTargetHelper.ShowまわりはいじらなくてもOKだった

つーか訳ありでIDropTarget自前実装だから簡単だったわけだけど
0204デフォルトの名無しさん2007/11/19(月) 13:17:58
ボタンに画像を貼り付けたいのですが、
画像を貼り付けて配置をmiddlecenterにしても
中央に表示されません。どうすれば上手く表示出来ますか?
0205デフォルトの名無しさん2007/11/19(月) 13:47:49
>>204

それはふらっと向けの質問だな。
そのプロパティがどのプロパティと関連があるのかライブラリを見ておくこと。
0206デフォルトの名無しさん2007/11/19(月) 15:06:34
>>205
ありがとうございます。まだ上手くいきませんが頑張ってみます。
レスありがとうございました。
0207デフォルトの名無しさん2007/11/20(火) 10:36:17
EPS形式の画像をJpegやGifに変換するAPI、というかC#ライブラリってありますか?
0208デフォルトの名無しさん2007/11/20(火) 10:54:10
ここらのを使って一旦ビットマップにしてから変換すればおkじゃない?
ttp://www.hinet.mydns.jp/tdiary/?date=20050517

SPIのC#ラッパーはそこらに転がってると思う.
0209デフォルトの名無しさん2007/11/20(火) 11:37:43
>>208
なるほど、Susieですか。

GhostScriptを扱うAPIがあるといいんですけどねぇ。難しいのかな。
0210デフォルトの名無しさん2007/11/20(火) 20:11:49
わざわざ直接C#でやらなくても変換ソフトはいくらでもあるんだから
コマンドライン引数渡してプロセス動かせば良くね?
0211デフォルトの名無しさん2007/11/21(水) 00:00:35
TcpListener 開始前に指定したポート番号が既に使われていないかどうか調べたいのですが、
そのようなメソッドはありますか?
0212デフォルトの名無しさん2007/11/21(水) 00:02:31
使う前に未使用でも実際に使おうとしたときには使用中ということもある
素直に接続時の例外でチェックした方がいい、ぞ

netstat みたいな事をしたいというんだったら別だが
0213デフォルトの名無しさん2007/11/21(水) 11:48:37
質問です。

現在1024bitRSAを使用した通信のプログラムを作っているのですが・・・
相手の公開鍵が判明してる場合

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters rsaParameters = new RSAParameters();

rsaParameters.Modulus = 相手の公開鍵(0x80byte)
rsaParameters.Exponent = {1,0,1};

rsa.ImportParameters(rsaParameters);

暗号化済みデータ = rsa.encrypt(暗号化したいデータ,false);

で、大丈夫なのでしょうか?
いまいちRSAの使い方がわからないのでわかるかたいらっしゃいましたらお願いします。
0214デフォルトの名無しさん2007/11/21(水) 19:47:56
開いたFormの領域いっぱいにTextBoxを配置したいんですがどうすればいいんでしょうか?
0215デフォルトの名無しさん2007/11/21(水) 19:48:23
Dock=Fill
0216デフォルトの名無しさん2007/11/21(水) 20:20:03
>>215
できました!ありがとうございます!
0217デフォルトの名無しさん2007/11/23(金) 01:31:53
.NET Framework 2.0 にて、Form に MenuStrip を追加し、それに TextBox を追加したんですが、
TextBox に一度フォーカスを合わせると、以降 Form の MouseWheel イベントが呼ばれなくなります。
回避方法を教えてください。
0218デフォルトの名無しさん2007/11/23(金) 02:18:05
再現したりしなかったりだけど、MenuStripとかToolStrip系は
フォーカスまわりが怪しい挙動するときがあるよね

toolStripTextBox.Leaveでform.Focus();したらどうか
0219デフォルトの名無しさん2007/11/23(金) 03:57:38
C#2.0で作成したEXEを社内のファイルサーバに置いて
共有しようとしたのですがEXEを起動させたらすぐに異常終了
してしまいます。
これは何故でしょうか?クライアントに置いて起動すると
問題なく動きます。
VB6で全く同じ内容のEXEはファイルサーバ上でも
起動できたのに・・・
0220デフォルトの名無しさん2007/11/23(金) 04:16:28
>>219
新規プロジェクトで作ったなにもコード書いてないexeでも?
0221デフォルトの名無しさん2007/11/23(金) 04:23:48
>>220
何もコードを書いていないEXEでは今のところ試していません。
内容はあるファイルをある場所へコピーするだけのプログラムです。
0222デフォルトの名無しさん2007/11/23(金) 07:06:44
>>219
ネットワーク上にあるファイルは制限ゾーンで実行される。
とくに設定をしなければInternetZone扱いで実行されるんでほとんどのプログラムは動かない。
動かしたければポリシーをいじって、\\server\hoge\* のは
FullTrustといったふうに設定することになる。
0223デフォルトの名無しさん2007/11/23(金) 10:50:10
CASとか知らないんだろうね。
その辺から勉強した方がいいよ。
0224デフォルトの名無しさん2007/11/23(金) 12:32:21
ポリシーいじるよりも署名したほうが楽じゃね?
0225デフォルトの名無しさん2007/11/23(金) 16:33:45
分かってないなら書くなw
0226デフォルトの名無しさん2007/11/23(金) 16:42:53
>>225

アンカーが無いと誰にレスしているのか分らない。
0227デフォルトの名無しさん2007/11/23(金) 18:51:48
どうみても>>224
0228デフォルトの名無しさん2007/11/23(金) 21:18:36
署名って厳密名つけるのとコード署名の2種類あるけど
どっちにしても署名だけじゃ駄目だわな。
0229デフォルトの名無しさん2007/11/23(金) 22:52:39
めんどうならクラス全体に属性つけて許可すればおkだろ
0230デフォルトの名無しさん2007/11/23(金) 23:21:14
何のために.NETFrameworkのサンドボックス機能があると思っているのやら。
0231デフォルトの名無しさん2007/11/24(土) 00:20:46
Clickワンコでいいじゃん
0232デフォルトの名無しさん2007/11/24(土) 01:07:52
Array.ClearやArray.CopyってArray型を引数に取るからなんとなく遅そうなイメージがあったけど
試してみたらfor(int i=0;i<array.Length;i++)で回すより速いね
どういう実装になってるんだろう
0233デフォルトの名無しさん2007/11/24(土) 01:29:09
コード先頭のusing をアルファベット順に並べないと気が済まない
0234デフォルトの名無しさん2007/11/24(土) 01:36:25
上から順に、
System名前空間のよく使う順(親階層が同じなら揃える)
その他外部のライブラリの名前空間
自分で作った名前空間
俺はこんな感じ
0235デフォルトの名無しさん2007/11/24(土) 01:39:30
usingの順序なんか気にする余裕があるプロジェクトでよかったね。
0236デフォルトの名無しさん2007/11/24(土) 01:40:41
エディタで選択してソートして終わり
0237デフォルトの名無しさん2007/11/24(土) 02:35:50
>>224
よう俺。
0238デフォルトの名無しさん2007/11/24(土) 02:37:01
2008だと並べ替えしてくれる
0239デフォルトの名無しさん2007/11/24(土) 08:29:13
>>238
そんな機能付いたっけ
0240デフォルトの名無しさん2007/11/24(土) 08:59:08
using勝手に自動的に付けてくれたらいいのにな
0241デフォルトの名無しさん2007/11/24(土) 12:26:12
Visual C# 2008 Express Edition beta2ってどんな感じ。バグバグだったりしない?
0242デフォルトの名無しさん2007/11/24(土) 12:31:49
英語版はもう完成してるだろ
0243デフォルトの名無しさん2007/11/24(土) 12:39:30
英語版出たからbataいつまでも使ってるなよw
0244デフォルトの名無しさん2007/11/24(土) 12:49:49
日本語版じゃないといやなので。
0245デフォルトの名無しさん2007/11/24(土) 12:52:19
ならあと1月待て
0246デフォルトの名無しさん2007/11/24(土) 12:53:54
「すみません。C#2.0でお願いします。」
これからしばらくの間、このスレでしょっちゅう見かけるに違いない
0247デフォルトの名無しさん2007/11/24(土) 12:58:06
varもLINQもラムダ式も使いたい放題だぜ
生産性あがるうううううう
0248デフォルトの名無しさん2007/11/24(土) 15:05:49
namespaceを名前空間と訳すのに違和感を感じるな

nameの意味を調べればこの違和感に気づくだろうが
0249デフォルトの名無しさん2007/11/24(土) 15:10:18
「違和感を感じる」に違和感
0250デフォルトの名無しさん2007/11/24(土) 15:50:55
岩漢
0251デフォルトの名無しさん2007/11/24(土) 16:58:12
つーか、いまだ2.0ですら浸透したか、してないかなのに3.5は早すぎる
0252デフォルトの名無しさん2007/11/24(土) 17:52:15
VS2008では.NET2.0ターゲットの開発もできるから安心です!
LINQ以外は大体C#3.0の機能が使えます!

日本語版は開発完了が年内予定か
個人で買うには高いんだよなー…一応買うつもりだけど
■ このスレッドは過去ログ倉庫に格納されています