ふらっとC#,C♯,C#(初心者用) Part38
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980 を踏んだ人は新スレを建てて下さい。
>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part37
http://pc11.2ch.net/test/read.cgi/tech/1234017654/
>>
http://pc11.2ch.net/test/read.cgi/tech/1234017654/989 > 例えばゲームなんかだとそれぞれに独立したカウンタなんかを持たせたい時に必要です。
> それすらも別クラスにわけろというなら著しく生産性が落ちまくります。
OOPL的には”それぞれ”はオブジェクトなので,「独立したカウンタ」をするオブジェクトがあればいいと思うんだけど.
あと,内部的に完全に隠蔽されている変数って,なんかとてもキモいんだがその辺はどうやって折り合いつけるの?
(外から初期化したいときとか,値を変更したいときとか)
5 :
デフォルトの名無しさん :2009/03/01(日) 10:55:18
フィールドと変数は同じ意味ですか?
>>5 変数は意味が広い。フィールドもローカル変数も変数と呼ばれることもある
dockの優先度がさっぱりわかりません。 優先順を設定する方法はありますか?
ZOrder、つまりControlsへの挿入順 右クリックから前にとか後ろにとか あとControlsのSetChildIndex
前スレの
>>986 が言った
> メソッドの中でしか使わないけど値を保持しておきたいローカル変数ってたまにありますけど、
これは正しいよ。
なぜかC#しかやってない人は頑なに否定する傾向があるようだけど。
例えばこれが可能だと、シングルトンパターンとか、IDisposable.Disposeを実装したときありがちな
2回目以降の呼び出しはスルーする処理が綺麗に安全に書ける。
つまり関数の呼び出しをカウントするための変数ってことですね インスタンスフィールドでFAじゃ・・・ないの? 綺麗?安全?だからか
使い道はあるかもしれないけど複雑になるのが嫌だから省いただけだろ もともと過去の名残で残ってるだけだし
>9 JavaScriptみたいに匿名メソッドを返す匿名メソッドを実行する形で メンバ変数のdelegateを初期化すれば実現できると思うけどコンパイルが通らない。 こんな感じになると思うのだけど。 public static Func<int> TestFunc = (() => {int i = 0; return (() => i++);})();
型推論に失敗してるだけだろ 適当にActionとかヒント与えたら通る
すまんActionじゃなくてFunc<int>か public static Func<int> TestFunc = new Func<Func<int>>(() => { int i = 0; return new Func<int>(() => i++); })(); こうだな
>>9 あるよって言うのは半分同意せんでもないが、使っているとこに
手を入れるときにメンバに直すこともかなりの割合で経験上
発生するので実質いらんと思う。
否定する人ですが、こういったらいいですかね?C# だけしか
やっていなくて否定している人ばかりではないですよと
ちなみにお前が挙げた例で、IDisposable.Dispose の例、その
フラグを後で他から参照したくなることは多くて結局 IsDisposed
実装したりだとかな(というか ObjectDisposedException どうする
んだよそれしたら)。
つまり、乱用もよく見かけるってことか。なので初めからメンバに
持ってろと。
人をいきなり「お前」呼ばわりする奴ってどうして例外なく馬鹿なんだろ。 「こういう場合は」必要だ、って主張の反論に「こういう場合」と違う場面を 挙げてそれって反論として成立してると思ってるのかな。
何でもいいけど和やかなカンジで頼む
最大の理由は「Javaに無いから」なんだろうなきっと 意図的に捨てたんだから無いもんは無い
プログラミングC# 第5版の日本語版が出たらしいのですが、 JavaをやってたC#初心者には難しいですか? Webの入門サイトだけじゃなく、手元に本が欲しくなってしまって
難しかったらJavaをやってたとは言えない
別に難しくはないと思う。 パラパラと見ただけなんだけど印象としては、 説明が親切なつもりなんだろうけど回りっくどいだけで全然分りやすくない。 あと冒頭で同性愛をカミングアウトするのはいらないと思った。 誰も著者の私生活になんて興味ないのに。
>>16 気分害した、解りにくいなら謝りますが、本旨は「挙げた例にすら乱用してる
っぽい感じのものがあるよ」って話です。
これで「たまに」のラインが変わってくるのですよ
>>22 過剰反応だったかなごめん。
まあ確かにそんなに有用な場面が多いわけではないのは俺も認めるところ。
あった方がいいとは思うけどなくてもそんなに困らないのは確か。
何でもいいけど和やかなカンジで頼む
>>23 さらにいえばなんつーかな、C++ とかだと時間を経るごとにこういう
ので見えるところ消えていくんだよなぁってのがあり。楽する機能として
使っているところな。テンプレートライブラリやらマクロやらではどうして
も必要なときがあってそういうのは残るけども。
そして突っ込んでいくと、後から考えるに明らかに乱用だったなぁと思う
わけだが、事前にこれを予測するのは難しかったなぁってことで結局
状態単位が class スコープに絞るほうが混乱がなくていい気がするんだよ
もちろん単純に経験からくる感覚なので常に正しいとは言わないが
コードでタイトルの文字を変える方法がよくわかりません プロパティで変えるのは出来ますが、起動中に変えたいのです 普通に考えてform1.text=だと思ってたんですがそれだといかんようで。。。
form1はクラスだろ インスタンスじゃねえだろ
全然わかりません・・・
>>4 外から初期化したり変更出来ないメンバ変数なんて普通にあると思うけど。
特定のメソッドからしか参照できないメンバ変数って革命的じゃない?
宣言だけ明確にしてれば変数名に悩む必要ない!
言語をそういう風に拡張するのは難しくはないのだろうが、下のどっちの機能が欲しいんだ? Sub f() ' VB クラス内の関数 Static anonimous As Integer = 0; // インスタンス変数 void f() { // c++ クラス内のメンバー関数 static int anonimous_static = 0; // クラス変数 実装は結局、匿名のメンバーまたはスタティックメンバーを追加するだけなのだろうけど。 int f_anonimous = 0; static int f_anonimous_static = 0; void f() { f_anonimous++; f_anonimous_static++;
>>31 クラス分けすれば済むんじゃないか。
そんな変な機能は迷惑
>>32 staticだとオブジェクトを複数生成した時困るよ。
>>33 糖衣構文だよ。
匿名型とかラムダ式だってクラスわけすれば済むけどもっと手軽に書けるようになったじゃん。
そのうちC#にも糖衣構文でmoduleが欲しいとか言い出しそうだな。 そろそろすれ違いだこの辺にしよう。
>14 やはり省略できないのか。 もうちょい型推論頑張ってくれと思うけど仕方がないか。
C#でマップエディタ作ろうと思うんだけど marshalとか必要になってくるかな? C#ってそんなに重くない?
要らない 重くない
ありがとうございます
40 :
1 :2009/03/01(日) 18:01:37
どうでもいいけど俺への感謝はないのか
thx
ジェネリッククラスのwhere節でなぜSystem.ValueTypeは指定できないんですか?
45 :
19 :2009/03/01(日) 19:18:39
IDisposableを実装するのは、破棄すべきアンマネージリソースがあるからであって、 その状態をきちんとマークしておけば、わざわざフラグなんか持つには及ばないと思うんだ。 たとえば、内部的に何かのWin32ハンドルを使っているとすれば、↓こんな感じで。 if (_hProc != IntPtr.Zero) { bool success = CloseHandle(_hProc); if (success) { _hProc = IntPtr.Zero; } else { throw new Win32Exception(); } }
Disposeが例外投げちゃ駄目だろ。 ディスク容量不足の時のFileStreamみたいな悲惨なことになるぞ。
C#2.0でForm上に区切り線を設置したいのですが、どうすればいいですか? Penオブジェクトやらを用意して、Form上に描画しないとならないのでしょうか。
>>50 Win95のころからある手法なのに知らない人多いのかな
>>49 工エエェェ(´д`)ェェエエ工工
>>50 ありがとうございます。便利だけど関係ないtextboxがあるのは、なんかいやですね・・
>>51 不便ですね。直接描画できると良いのに。
Splitterコントロール使ったら?
>>52 直接描画したいのなら最初からそうすりゃいいじゃんw
言ってること意味不明だよ。
Visual Basic PowerPackにLineって無かったっけ?
>52 Visual Basic Power PacksにLineShapeコントロールがあるよ。
屈辱的な11文字だなw
>>44 >>49 で出てるけど where T : struct。
細かい話をすると同時に new() 制約フラグとか valuetype 制約フラグ
とか必要といった話になるので直接 ValueType から継承なクラス指定は
しない。
>>46 根っこはな。Component も IEnumerator<T> も実装していたりする
ので一概に言えるものじゃない。
>58 2005でも追加でインストールすれば使えなかったっけ?
>>59 でもC++/CLIだとSystem.ValueTypeだけを指定ってのもできるんだよな
>>61 それ、C# だと struct 制約のことなんでは。
C# で
class GenericTest<T> where T: struct {}
をコンパイルして逆アセすると、
.class private auto ansi beforefieldinit GenericTest`1<valuetype .ctor ([mscorlib]System.ValueType) T>
になる。
すいません質問です。 OpenFileDialogやSaveFileDialogをフォームデザイナから追加したのですが、最後に検索したフォルダの位置を記憶しているようなのです。 もしかしてレジストリとかに最後のフォルダの位置とか記憶してたりするのでしょうか?
>>63 インスタンスのプロパティで設定できる。
詳しくはMSDN読め
記憶してるのが気味悪いって意味だと主
RestoreDirectoryで設定できるって意味だとおも
みなさんサンクス。言いたかったことは
>>65 です。
そしてRestoreDirectoryを少なくともデザイナからの変更した状態では、何も変わっていないような気もして凄く気味が悪いです。
変わらないってこと自体おかしいと思うんだが まさかfalseにして変わらないとか言ってないだろうね
カレントディレクトリが変わるからな
>>62 C++/CLIでValueType制約にすると <([mscorlib]System.ValueType) T>
これだとValueTypeを継承しただけの参照型(C#では作れない)でも可
デフォルトコンストラクタ制約もない
C++/CLIでvalue class制約にすると <valuetype .ctor T>
これだとValueTypeを継承してなくても値型ならなんでも可(C#では作れない)
C#のstruct制約と同じにするにはwhere T : ValueType, value classにする
>>69 ,70
あー理解しました、ありがとうございます。
カレントディレクトリとFileDialogが固有に保存するディレクトリ位置をごっちゃにしてました。
ただこうなるとFileDialogが固有の値がどこに保存してるかホントにわかりませんね
普通にレジストリだけどな
最後に検索したディレクトリ=CurrentDirectoryだろ? 固有の値ってなんじぇすか?
いいえ
>>74 System.IO.Directory.GetCurrentDirectory()静的メソッドで取得できるのがカレントディレクトリ。通常は起動したアプリの位置。
以下さっき確認した方法をば。
1、WindowsFormAppricationを新規作成
2、フォームデザイナ表示して、ツールボックス>適当にOpenFileDialogを追加。
3、フォームのクライアント領域をフォーカスして、適当にプロパティ>Clickイベントを追加。ハンドラでダイアログをShowDialogる。
4、ShowDialog()の前後をMessageBoxでカレントディレクトリ情報を表示。
5、ダイアログのRestoreDirectoryプロパティがtrueとfalseのときの挙動を見比べる。
質問 System.Windows.Forms.WebBrowserコントロールで Navigate("url string") でHtml表示できますが、 Proxyサーバを経由するときはどうしたらいいのですか? Proxyプロパティを持っているWebClientを使用して 試しにyahoo.co.jpを WebClientからDownloadData⇒byte[]をstreamに変換 DocumentStreamにセット DownloadString⇒DocumentTextにセット とかやってみたんですがスクリプト関係が読み込めないようです。
一番楽なのはインターネットオプションで設定しとくことだが
>>78 test1.xml
はどんな出力になっているの?
82 :
78 :2009/03/02(月) 21:41:32
>>82 http://msdn.microsoft.com/ja-jp/library/ms229919 (VS.80).aspx
には、
><EncryptedData> 要素の <EncryptedKey> 要素に格納されたセッション キーを
>復号化します。次に、セッション キーを使用して XML 要素を復号化します。
って書いてあるけれど、<EncryptedKey> 要素がないよね?
暗号化は出来ているようだ、って書いてあったけど、その認識が多分誤り
なんじゃないかな。長いのでチェックしきりれないんだけど、多分間違いが
あるのはEncryptメソッドの方だと思う。
AESで暗号化しているのに、非対称キーってどういうことなんだろな→マイクロソフト 初期化ベクタと共通キーで、共有鍵暗号のはずなのに。
85 :
83 :2009/03/02(月) 22:07:36
>>84 いや、セッションキーはAESなんだけど、それをRSAで暗号化してXMLに埋め込むって
コードのはずが、上手く行っていないって話のようです。
86 :
83 :2009/03/02(月) 22:15:06
なんか、 edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek)); の後に edElement.KeyInfo = new KeyInfo(); なのって凄くおかしくない?
87 :
83 :2009/03/02(月) 22:43:53
// Create a new KeyInfo element.
edElement.KeyInfo = new KeyInfo();
// Add the encrypted key to the
// EncryptedData object.
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
この順序にしたら、出力が
<root>
<EncryptedData Id="EncryptedElement1" ほにゃらら>
<EncryptionMethod Algorithm="
http://www.w3.org/2001/04/xmlenc#aes256-cbc " />
<KeyInfo ほにゃらら>
<EncryptedKey ほにゃらら>
<EncryptionMethod Algorithm="
http://www.w3.org/2001/04/xmlenc#rsa-1_5 " />
<KeyInfo ほにゃらら>
<KeyName>rsaKey</KeyName>
</KeyInfo>
<CipherData><CipherValue>ほにゃらら</CipherValue></CipherData>
<ReferenceList>
<DataReference URI="#EncryptedElement1" />
</ReferenceList>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>ほにゃらら</CipherValue>
</CipherData>
</EncryptedData>
</root>
ってなった。これで、キーが埋め込まれたっぽくない?
XMLの要素だけを暗号化してくれるのか 項目を自分で暗号化してxmlに保存するでもいいけど、 一括して暗号化してくれるなら、ライブラリ化しとけば後で便利そうだな
まあ、MSDNのサンプルなので間違いも多いってこった。 #MSDNのコードって、何故か、バグはあってもビルドだけはばっちり通るんだよなあ。
>>61 >>71 そうなのか
C++/CLIでできることをC#では禁止する理由がわからんな
91 :
78 :2009/03/02(月) 23:21:43
>>87 ありがとうございます。
お蔭さまで無事解決しました!感謝感謝です!!
それにしても公式のサンプルでも間違いはあるのか。
>>90 できたところで全く意味がない
混乱を生むだけ
CILではできるのにC++/CLIではできないことだって当然いくらでもある
93 :
87 :2009/03/02(月) 23:32:05
MSDNに関する限り、「公式のサンプル"でも"」という認識は改めるべき。 バグがあるとかいう以前にそもそもヘルプに直書きしてテストしていないような 雰囲気のコードが多い。
>>90 一言で言うとややこしかったり仕様にあわなかったり意味が
なかったり。
C# 内の制約は何つーかすごい色々な理由が複雑に絡まり
あってさまざまに制限がかけられている。必要のないパターン
だったり、扱えないものだったり、推論上の問題だったり。
例えば、class ([mscorlib] System.ValueType) なんて制約は
実はありでこれはValueType と Enum だけ OK とか
valuetype ([mscorlib]System.ValueType) と
([mscorlib]System.ValueType) だけの違いは Nullable<T> が
入るかどうかとか。
ちなみに
>>71 の説明ちょっと変?というか valuetype special
constraint は Nullable<T> 「構造体」の存在が大きい。
この special constraint で大雑把に言って Nullable<T> が
含まれるのか除外されるのかが決まる
95 :
デフォルトの名無しさん :2009/03/02(月) 23:43:06
SQLを発行してその結果をGridViewに突っ込んでBindしてGridを表示しているのですが SQLの結果で例えばある列に特定の値があった場合は、その行を表示しないという事をやりたいのですが どのようにしたら良いでしょうか? rowdataboundイベントで値のチェックをして e.row.cells[0].remove()とかを全部の列にやっても小さい枠が残っちゃうんですよね。
それをSQLのクエリに書くのが普通でしょ もしくはDataTable.Select("", "");を使う
こんな質問していいかわからんのですが 普段windows認証でsql serverにつないでるのですが 今回sql server接続にチャレンジしたのですが、つながりません・・・・ 「ユーザーhogeは接続できませんでした。このユーザーはsql serverの信頼関係接続と関連づけられてません」と帰ってくるのですが hogeに問題があると思うのですが、通常hogeは何なんでしょう? ぎ・・・ギブ 日本語・・おkだな
98 :
デフォルトの名無しさん :2009/03/03(火) 00:10:01
hogeに接続権限がないとか?
>>98 ・・・ということは
SQLマネージメントスタジオで設定するんですか?^^;ひー
管理ツールで設定すれば大丈夫です。
>>100 SQL Server構成マネージャのことですか?
試行錯誤中
RuntimeTypeHandleをTypeを通さずにジェネリック型から直接取る方法はないの? IL1命令だけで取れるはずなのに ILを直接書くか, static class RuntimeTypeHandles<T> { public static readonly RuntimeTypeHandle Value = typeof(T).TypeHandle; } くらい?
103 :
78 :2009/03/03(火) 00:29:39
>>93 了解しました!
ホント思ってもみませんでしたよ…
104 :
デフォルトの名無しさん :2009/03/03(火) 01:00:47
saでいいじゃん
Lanの接続テストをしようとして ヴァーチャルPc越しに下記コネクションを利用して開こうとしたんですけど つながりません・・・ C:\を\\にしたり \SQLEXPRESS;を\\SQLEXPRESS; にしたけどダメでした C# Express Editionじゃだめなんでしょうか? connStr = @" Data Source = .\SQLEXPRESS; AttachDbFilename = C:\hoge\hoge.mdf; Integrated Security = True; User Instance = True;"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); // コネクションのオープン }
>>105 それじゃ自分自身のインスタンスになってんじゃないの?
バーチャルPCに対してならIPアドレスか、バーチャルPCのドメインとか、
PC名で指定する必要があるんじゃないか?
>>106 むむむ
しらべてあす報告します
ありがとうです
char c = 'a'; string s = Convert.ToString(c); string s = c.Tostring(); 上ができないのは何でなんだぜ?
2回もキャストするの?
>>108 エラーになるのは下だけでしょ
Convertには ToString(char) のクラスメソッドがあるけど、
Charには ToString() のインスタンスメソッドがないから
111 :
デフォルトの名無しさん :2009/03/03(火) 02:52:33
鳩山弟の偵蝶はすげえなというか、この情報の確度と有益さは恐ろしい さすがアルカイダの友達の友達だ
112 :
108 :2009/03/03(火) 02:56:20
間違えた char c = 'a'; ↓はできるけど string s = Convert.ToString(c); string s = c.Tostring(); ↓はできない string s = (string)c;
113 :
108 :2009/03/03(火) 03:00:40
もしかしてstringはキャスト演算子使えない?
キャストはコンバートじゃありません 根本的に勘違いしてるんじゃないかなあ
>>115 ごめん、そりゃそうだ
エラーになると思い込んでたのでorz
>>113 ちなみに(int)cは出来る。
といった辺りから考えてみてくださいな。
あー、わかった stringはcharの配列だけどcharは値型、stringは参照型だからキャストできないってこと? charは16bitのUnicodeだし
変換演算子が定義されてないからキャストできないだけで 値型とか幅とか何も関係ない
うん できたからといって別におかしいことはない できるようにされてないだけ
ファイル読み込みについて質問なんですが、 拡張子ではなく中身でテキストファイルかバイナリファイルかを 判別する方法ってありますか?
テキストファイルだってバイナリだろ
IMultiLanguage2に食わせてみる
メソッド名抜けた。DetectInputCodepage
FindMimeFromData()じゃないの?
127 :
デフォルトの名無しさん :2009/03/03(火) 14:10:53
DBから指定したテーブルのIDフィールドとNAMEフィールドを取得して NAMEフィールドをコンボボックスに表示したいと思っています。 その時にNAMEフィールドのデータに紐付くIDフィールドも保持して コンボボックスを操作した際に、IDフィールドも同時に制御するような処理を作りたいのですが どのように作ればいいのでしょうか? コンボボックスを2つ用意して片方を非表示にして制御する方法しか思いつきませんでした 宜しくお願い致します
DataTable使ってねーの?
めんどくさいからバインドしちゃえよw
>127 DisplayMemberにName ValueMemberにID SelectedChanged(で合ってるのかな)イベントにハンドラ追加して ComboBox.SelectedValueでIDが取得できるんじゃね? データバインドのときに限るが。 それかEntityクラス作って ToStringメソッドをオーバーライドして ToStringでNameを返すようにする。 Entityクラスのオブジェクトをコンボにセットすれば ToString()したときの文字列がコンボに表示される。 あとはSelectedChangedで(Entity)キャストしてオブジェクトを取り出す。
List(要素数は50個)を List1(0〜25)とList2(25〜50)に分割するにはどうやったらいいのでしょうか?
GetRange使えば?
ありがとうございます GetRangeなら出来そうですね やってみます
list.GroupBy(i => i < 25);
>>135 それは違うだろ。値じゃなく添え字で分けたいんだから。
そういえばGroupByにindexくれるFuncを使えるのが無いのは何でなんだろ
>>136 すまん、そのとおりだ。
長くなるけどこっちで。
list.Select((value, index) => new { value, index }).GroupBy(t => t.index <= 25, t => t.value);
139 :
デフォルトの名無しさん :2009/03/03(火) 22:59:25
生年月日と指定した日付を渡すと 指定した日付の時の年齢を返すようなのってどうやりますか?
引き算
141 :
デフォルトの名無しさん :2009/03/03(火) 23:08:45
DateTimeクラスなんかで年齢を返すメソッドがあってもいいような・・・ あんま需要ないのか?
それは需要があるとしてもTimeSpanか、あるいは年齢専用のクラス(Ageクラス?) でやるべきじゃないのかな
誕生日って閏年とかあったから、単純に引き算だとへんな年齢になることなかったっけ? 正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。
VB だったらそういうメソッドも普通に定義されてるかもな。
日本の法律では、誕生日の前日に年を取る 豆知識
>閏年の翌日?前日? ?
TimeSpanに年数を示すプロパティはないんだな。考えてみれば、月数や年数はTicksから 一意に定まるものじゃないものな。 結局場合分けして引き算するしかなさそうだ。 ちなみに、年齢が変わるのは「誕生日の前日の午後12時」なので、誕生日が来たら年齢が変わると考えておk。 // DateTime d1 = 指定日付, d2 = 誕生日 int age; if (d1 < d2) { // 何かしらエラー処理する } else if (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day)) { age = d1.Year - d2.Year; } else { age = d1.Year - d2.Year - 1; }
税金関係は1年=365日で定数だった気が 誕生日の前日に年取るのは閏日生まれの為だし
>>106 詳しく!
ヘルプミー
今日で約1週間!俺はアホなのかー♪;;
>誕生日の前日に年取る これじゃ不正確 民法の試験じゃ×になる
だからなんだよ。司法関係者にでもなるのか?
うん 応援してね
.∧__,,∧ (´・ω・`) (つ夢と) `u―u´ あなたの後ろに落ちてたこれを、 ∧__,,∧ ∧__,,∧ (`・ω・ ) ミ (`・ω・´) ( つ ⌒ヽ と ,u、つ `u―u' 夢 `u´夢 YY⌒Y こうして、 こうして、 ∧__,,∧ _ (ω・´ ) 夢 三ニ ☆ __,( )つ  ̄ `ー―‐u' こうだ !
>>150 Data Source=***.***.***.***,????;Initial Catalog=++++;Persist Security Info=True;User ID=--;Password=\\\\
***.***.***.*** ipaddress
+++ データベース名
-- 接続するユーザ名
\\\\ 接続するユーザ名のパスワード
で接続できた。インスタンスは規定のインスタンスだから指定なし
>>151 んでシステム上ではどうするのが正解なんだい
すまん ????はポート
.∧__,,∧ (´・ω・`) (つ夢と) `u―u´ 回収!!
ポート・・・?うーん勉強してきます・・・ ありがとう
∧_∧ ( ・∀・) と )シュッ Y しノ彡 -=ニ三 夢 ヽ )
.∧__,,∧ (´・ω・`) (つ夢と) `u―u´ もう離すものか!! だれにも渡さない!
∧_∧ ∧_(∀゚ ; ) ( ・∀・) つ (っ夢⊂≡て ヽ よこせ して_)_ノw (_) ∧_∧ ( ・∀・) と ) シュッ Y しノ彡 -=ニ三 夢 ヽ )
いつも思うんだが、お絵かきできてうれしくなっちゃう奴って 精神年齢が幼稚園時代で止まってるのか? 本気で理解できんよ。
コピペネタにマジレスかよw
.∧__,,∧ (´・ω・`) (つポート `u―u´ ポートとは何ぞや!
コピペだろうが何だろうがマジレスしてもらえるだけありがたいだろ
わりい間違えた ×マジレス ○キチガイレス だわ
>>132 25が重複してるが、当分割と仮定して、
var list1 = list.Take(25).ToList();
var list2 = list.Skip(25).Take(25).ToList();
>>139 int age = target.Year - birth.Year;
if(target < birth.AddYears(age)) age--;
>>159 特別な事情がない限りSQL Serverのポート番号はデフォルトの1433なので省略可能。
ので接続先のマシンがたとえば192.168.1.1でインスタンス名がSQLEXPRESSなら
Data Source=192.168.1.1\SQLEXPRESS
だし、既定のインスタンスに接続するならインスタンス名も省略できて
Data Source=192.168.1.1
で、特別な事情(SQL Server 2000/2005/2008を共存させてるとか)があって別のポート(たとえば11433)を使っているなら
Data Source=192.168.1.1,11433\OTHERINSTANCE
それでもつなげないなら接続先のファイアウォールが邪魔してると思われる。
そもそもManageMentStudioExpressとかで繋げてるのかな…・?
>>159 >>171 も言ってるように、SSMSとかサーバーエクスプローラとかで接続してみるのが先だな。
てか、TCP接続ってデフォルトでOFFじゃなかったか?
それにしても斬新な区切り方だな
>>171
C#でアッカーマン関数を計算させようとしていますが、スタックオーバーフローが 起きます。C#でスタック領域を広げるにはどうすればいいのですか?
>>174 再帰が深くなりすぎます
>>175 具体的にはどのようなコードを書けば良いのでしょうか?さっぱりわかりません
例えば大きな配列を確保する時など、後学のためにスタックサイズを 広げる方法を知っておきたいのです。C/C++ならリンカオプションで 簡単に出来るのですがC#では何かよくわかりません
Threadクラスの(ThreadStart, Int32)のコンストラクタ
.NETの配列はヒープに領域を取るのでスタック関係なし 再帰はスタックサイズの変更よりループに展開することを考えた方がいい
>>178 それはヘルプを見て確認していますが、使い方がわからないのです
短いコードで良いので具体的な使い方を教えていただきたいのです
別のスレッドを作ってそっちで動かすってこと C# スレッド でググれ
>>181 もちろん既にぐぐっていますがよくわからないのです
スレッドが分からないくらいだったら スタックサイズとか変なこと考える前に基礎をやれとしか
using System; using System.Threading; class Program { static void Main() { int maxStackSize = 1 * 1024 * 1024 * 1024; Thread th = new Thread(DoWork, maxStackSize); th.Start(); } static void DoWork() { //... } }
>>184 ありがとうございます
助かりました
これを参考に作り直してみます
Stack<T>でも使って引数だけでもヒープに置くようにしたらだいぶマシなんじゃない >このコンストラクタのオーバーロードを使用しないでください。 だし
遅そうだけど素直に展開したらこんな感じか Stack<long> stack = new Stack<long>(); stack.Push(m); stack.Push(n); while (1 < stack.Count) { n = stack.Pop(); m = stack.Pop(); if (m == 0) { stack.Push(n + 1); } else if (n == 0) { stack.Push(m - 1); stack.Push(1); } else { stack.Push(m - 1); stack.Push(m); stack.Push(n - 1); } } return stack.Pop();
>>139-143 20090304 - 19870305 = 219999
これを10000で割った商が年齢になる。
別にうるう年とか全然関係ない。
このスレは算数もできない文系プログラマばっかりなのか?
算数や数学の問題じゃないだろうw ともかくそれで正確な答えが出るんだったら便利だな
結局、月を比較して同月なら日を比較してるだけじゃん
さすがC#スレ レベルが低すぎる 日曜プログラマならぬなんちゃってぷry
int ydiff = dt1.Year - dt2.Year; if (dt1.AddYears(-ydiff).CompareTo(dt2) < 0) { ydiff--; }
どうみても算数や数学の問題だろう。
極論を言えば、
1+2+4+8+16+32+.................+1024を求めるときに、
思考を放棄している人間はそのまま足していくか諦める。
思考する人間は、
S=1+2+..........+1024とおいて、
2*S = 2+4+........+2048との差を求めることで和を得る。
これは別に学校で等比級数の公式を習ったかどうかという問題ではない。
>>140 で答えが出ているのに、
>>143 みたいな思考を放棄したプログラマは考えもせずただ
>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。
こんなことを言い出す始末。
これは上の問題で言えばそのまま足していく人間だと言うことだよ。
プログラマだったら便利なメソッドが用意されてなかったら自分で考えて作るくらいのアタマが欲しいところだ。
196 :
174 :2009/03/04(水) 15:42:06
アッカーマン関数の話だけど、 ・同じ行では左側(nが小さい方)しかか参照しない ・上(mが小さい方)の列程計算可能な行(n)は多い なので、再帰を使わずに、表の参照と捉えた方が良い。 そうしないと、同じ枡を何度も無駄に計算する事になる。 List<List<int>> Ack = new List<List<int>>(); とか作って、 const int maxN = 100000; int m = 0, n = 0; while (true) { Ack.Add(new List<int>()); n = 0; while (true) { try { if (n > maxN) throw new Exception(); if (m == 0) { Ack[m].Add(n + 1); } else if (n == 0) { Ack[m].Add(Ack[m - 1][1]); } else { Ack[m].Add(Ack[m - 1][Ack[m][n - 1]]); } n++;
} catch { Console.WriteLine("for m=" + m.ToString("0")+ " calculation is terminated at n=" + n.ToString("0") + "."); break; } } if (Ack[m].Count == 0) break; m++; } ってやれば、再帰は必要ない。再帰ではなく、表の参照だと考えて、 各枡の値を計算するにはどの枡の情報が必要かを考える。 環境によってmaxNを色々変えるとベンチマークにもなるかも。
>>192 構造上、比較の優先順構造が桁の上下に投射されているだけだという話だろ
ASP.NET でC#使ってます。VS2008。 Default.aspxが呼ばれたときに それがWebClientからの要求かブラウザからの要求かを 見極める方法はありますか? WebClientからの要求がTrueでその他はFalseと判断したいです。 ブラウザプロパティを見てみると WebCleintの場合は"Unknown"と出るんですが、 新しいブラウザが開発されたらUnknownになるかなと思ったんです。 QueryStringによる判断は不可です。 ブラウザで直打ちされたらtrueになるので。 どなたかよろしくお願いします。
HTTPリクエストヘッダなんかいくらでも詐称できる
>>188 言ってることはわかるし、凄いとも思うんだが、C#のコードで表現すると
さほどシンプルでもないんじゃね。
int age = ((today.Year * 10000 + today.Month * 100 + today.Day)
- (birthday.Year * 10000 + birthday.Month * 100 + birthday.Day)) / 10000;
>>195 「引き算」と書かれてそれを鵜呑みに信じることこそが、真の思考を放棄していないプログラマなんだな。
楽だな。
>>201 引き算だってC#で書けるだろ。
>>188 はyyyyMMddを引き算すればいいじゃんってことを言っているわけで
わざわざ
>>201 みたいなコード書く必要ないよ、ってことだよ。
どう考えても
>>188 がシンプルで
>>188 の勝ちであることは否めない。
君の負け。
>>201 年未満の線形性を切り捨てる代わり、うるう年を考えなくてもいいというのが利点
勝ちとか負けとかガキかよw
>>203 yyyyMMddをどこから持ってくるかという話でしょ。
intで定義されてるなら>201みたいな操作が必要だし、
Stringでとるならそれでもいいし。
>>202 そんな悪態ついてないで素直になれよ。
最も合理的な解決策を見つけるのもプログラマの仕事ってことを言ってるんだろ。
それが積もってパフォーマンスに影響してくるんだからさ。
悔しいのは分かるけど、プライドでプログラムやるもんじゃない。
>>206 どこから持ってくるも何も
int.Parse(DateTime.ToString("yyyyMMdd"))
とかでいいじゃん。Convert.ToInt32でもいいよ。
210 :
188 :2009/03/04(水) 16:57:41
>>201 なんだその糞コードは・・・
int nToday = int.Parse(today.ToString("yyyyMMdd"));
int nBirthday = int.Parse(birthday.ToString("yyyyMMdd"));
int age = nToday - nBirthday;
どうみてもシンプルだと思うが。。。
スレ住人のセンスを疑うな・・・
日付→文字列→数値と変換するオーバーヘッドを気にする俺は古い人間なのか?
>>209 そんなコードも考えられないようなお前の脳みそを疑うよ・・・
>>207 「引き算」と言われて何も疑わず信じることが思考停止でなくてなんなんだ?
int.Parse(DateTime.ToString("yyyyMMdd")) これだけの操作の裏で、どれだけ複雑な操作が行われているか想像できない方が プログラマとして不適格だろ。
>>213 必死だなお前w
「引き算」と言われて、
>>143 みたいに
「引き算だとうるう年とかあるからダメだぜ?分かってねぇなあ。俺みたいにきちんとやるのが正しいんだよ!」
というような、
自分のやり方が一番正しいとして他人の意見をくみ取りもしないことが思考停止って言ってんの。
>>207 >正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。
と
>20090304 - 19870305 = 219999
はやり方が違うだけで言ってることは同じ。
下4桁の引き算がif (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day)) にあたり、
その結果、単に引くだけか、-1するかの違いだからな。
雑談はよそでやれよ
>>211 気になったら後でリファクタリングすればいい
まあある程度の規模になるなら、線形性がないという問題を抱え込んだままにしておくのは怖いが。
>>213 お前プライドの塊だな。めんどくさいやつだな。
>>216 だからその結果が正しいかどうかを疑わず信じろというのは思考停止だろ?
本当にそれで可能かどうか検討もせず受け入れるのが思考停止でなくてなんなんだ?
>>216 結果が正しいかどうかはデバッグすればわかるだろ・・・
頭悪すぎるぞこいつ・・・。
223 :
222 :2009/03/04(水) 17:12:02
>>223 >結果が正しいかどうかはデバッグすればわかるだろ・・・
この時点で正しいかどうか疑ってるからデバッグするわけだろ?
思考停止じゃないじゃん。
225 :
デフォルトの名無しさん :2009/03/04(水) 17:14:51
年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。 盲目的に受け入れるほうがおかしい。
>>210 >>194 のほうがシンプルじゃないかい?
そのままだと2月29日と2月28日を比較したときに、
2月29日の時刻が比較対象より前だと間違いになるので、
(そもそも時刻成分を考慮する必要がない気がするけど念のため)
ちょっと修正して:
int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).Date.CompareTo(dt2.Date) <
0) { ydiff--; }
馬鹿にされた文系プログラマがわんさか湧いててワロスwww >年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。 うん >盲目的に受け入れるほうがおかしい。 うん、だから「閏年を考慮したら引き算ではつじつまが合わなくなる」という 自分の意見が正しいという意見を盲目的に信じるのはおかしいよな?
Func<DateTime, int> hoge = (x) => int.Parse(x.ToString("yyyyMMdd")); return (hoge(to) - hoge(from)) / 10000; Func<DateTime, int> hoge = (x) => x.Year * 1000 + x.Month * 100 + x.Day; return (hoge(to) - hoge(from)) / 10000; たいしてかわらん。
>>227 そこから検算してああ正しいんだなと理解すれば問題ないじゃんw
言われてはいそうですかじゃアホだろ
おいおい、なんでこんな厨臭くなってるんだw 初心者スレで言い合いすんなよガキだな
エレガントな解を示したつもりが、あまり賞賛されなかったので拗ねているんです。
結局
>>217 が真理
計算方法が違うだけで意味はどちらも同じ
意味がどちらも同じなのはみんな分かってるよ。
今話題になっているのはコードの美しさと可読性だろ?
俺は少なくとも
>>148 と
>>228 みたいなコードを見比べたら、
>>228 の方がデキるプログラマって感じがするけどな。
ラムダ式って美しいんですか?(スマートな解という意味で) 美しいなら勉強するよ!
236 :
228 :2009/03/04(水) 17:40:31
× x.Year * 1000 ○ x.Year * 10000 プギャー(AAry
動的に処理を差し替えるような必要があればラムダ式は有効だけど
>>228 のケースでは意味がないな。違いはメソッドより効率が悪いこと。
長くなるのを避けてるだけだと思う。
>>235 まあ>228レベルならC的関数定義の別の書式に等しい。
マ的には現代的関数型言語みたいに、ラムダ計算後にインライン化とか末尾最適化が言語で保障されているなら嬉しいけど。
知識はあってもかしこくない だめだこりゃ 関数がいやならC#やるな
どこをどう読んだら誰が関数が嫌なんて言ってるように見えるんだろう
ラムダ式は超美しい。
どうでもいいよ
244 :
174 :2009/03/04(水) 18:56:15
みんなー、アッカーマン関数の話しようぜー。
>>174 のコードだと、m=0, n=int.MaxValue-1みたいなケースが計算できない
のが嫌だ。ていうかそもそもの問題は多分アッカーマン関数の表を一気に計算する
コードじゃなくって、与えられたm,nに対してアッカーマン関数の値を計算するコード。
なので、
>>187 のスタック使ってヒープを使って再帰する方法と、ハッシュ使って
計算済みの値を再利用する方法を組み合わせたアプローチにしてみた。値を再利用
するので、表を生成する用途でも有効。
うちの環境(メモリ1GB)では
m=0でn=int.MaxValue-1まで
m=1でn=10000000くらいまで
m=2でn=5000000くらいまで
m=3でn=20まで
m=4でn=1まで
計算できた。
スレの空気読まずにコードアップするぜ!
static Dictionary<int, Dictionary<int, int>> Ack
= new Dictionary<int Dictionary<int, int>>();
static Stack<int> argM = new Stack<int>();
static Stack<int> argN = new Stack<int>();
static int Ackermann(int m, int n)
{
argM.Clear();
argN.Clear();
argM.Push(m);
argN.Push(n);
while (argM.Count>0) {
245 :
174 :2009/03/04(水) 18:57:14
if (!Ack.ContainsKey(argM.Peek())) Ack[argM.Peek()] = new Dictionary<int, int>(); if (Ack[argM.Peek()].ContainsKey(argN.Peek())) { argM.Pop(); argN.Pop(); continue; } else { int value; if (argM.Peek() == 0) { value = checked(argN.Peek() + 1); } else if (argN.Peek() == 0) { if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(1)) { value = Ack[argM.Peek() - 1][1]; } else { argM.Push(argM.Peek() - 1); argN.Push(1); continue; } } else {
アッカーマン関数なんて使わないし
247 :
174 :2009/03/04(水) 19:00:46
int n_; if (Ack.ContainsKey(argM.Peek()) && Ack[argM.Peek()].ContainsKey(argN.Peek() - 1)) { n_ = Ack[argM.Peek()][argN.Peek() - 1]; } else { argM.Push(argM.Peek()); argN.Push(argN.Peek() - 1); continue; } if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(n_)) { value = Ack[argM.Peek() - 1][ n_]; } else { argM.Push(argM.Peek() - 1); argN.Push(n_); continue; } }
Ack[argM.Pop()][argN.Pop()] = value;
continue;
}
}
return Ack[m][n];
}
終わり。Ackermann(3,20);あたりで速さが実感できるぜ!。
あと、
>>244 の「
>>174 のコード」ってところ、アンカーミスで
>>196 のコードね。
>>246 >>173 を思い出してあげてください。
Dictionary<int, Dictionary<int, int>>は効率悪いな struct Key { public int M; public int N; public override int GetHashCode() { return M ^ N } } こういうのをキーにしたらDictionary<Key, int>で済むのに
>>249 一般にはそうだろうけど、そもそも話題がアッカーマン関数だから、
mはどうせ0から5くらいまでしかとらないんだよね。だから別に
これでかまわないんじゃないかな。
あと、ハッシュ値の衝突って詳しくないんだけど、そういう衝突しまくる
ハッシュ関数って効率はどうなっているの?
251 :
デフォルトの名無しさん :2009/03/04(水) 20:49:39
ファイルを選択して、それを別のコンソールプログラムに読み込ませて その結果の出力(文字列)を別ウィンドウに表示したいのですが、どうやればいいですか? ファイル選択まではいいのですが、別のプログラムを起動してそいつに引数を 渡すにはどうすればよいですか?
Process
>>251 Process のヘルプをじっくり見る。
>>228 はマイナスの年齢が出るから間違いだろそもそも
>>238 別にメソッドと比べて効率悪くならないよ。
モノホンのラムダ式であるリスト構造に基づく関数定義から
実行時に動的にメソッドを生成する、なんて事は行われていない。
匿名メソッドの名前どおり、コンパイル時にコンパイラが勝手な
メソッド名を割り当ててメソッドを作る。自分でメソッド定義する
のと何も違いはない。
デリゲート呼び出しが入る 最適化もできなくなるから使い方にもよるけど多かれ少なかれ確実に遅くはなる その小さい差の意味は置いといて
まじ?
>>228 のhoge(ほにゃらら)みたいなのって、匿名メソッドの呼び出し
として最適化されるんじゃなくて.Invokeされちゃうの?
ちょっとリフレクタで確かめてみる。
ほんとだ。C時代のプリプロセッサマクロに代わる、スコープがあって上位スコープ にアクセスできる素性の良いマクロとして利用する事がたびたびあったから、 ちょっとショック。
>>251 P/Invokeを駆使して共有メモリ経由でやりとりする。
{Tcp,Http,Ipc}Channelクラスを使って通信する。
特定の位置にファイル作って監視させる。
アプリケーション構成ファイルを動的に書き換えて起動する。
ProcessStartInfo.Argumentsを設定してProcessオブジェクトのStartを呼ぶ。
Process.Start(string,string)を呼ぶ。
理系プログラマだからさ
かっこいい
263 :
デフォルトの名無しさん :2009/03/04(水) 23:15:38
VS2005を使っているのですが2008にすると C#3.0とかになっちゃうの? 今まで2005で作ったプログラムって2008でも修正可能なんでしょうか? .NET2.0用で作ってたのが.NET3.5になっても無問題?
>>263 > VS2005を使っているのですが2008にすると
> C#3.0とかになっちゃうの?
も、使える
> 今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?
可能
> .NET2.0用で作ってたのが.NET3.5になっても無問題?
没問題
というか、.NET 3.5 って、.NET 2.0 上で動作する拡張なだけだから。
>>263 C# 3.0 になる。
2005 → 2008 へのプロジェクトのアップグレードで失敗したって話は見たことも聞いたこともない。
.NET 2.0 が 3.5 になっても問題ない。
170-172 今夜も試行錯誤: Windows認証で 環境(Vista アルティメット) <= (ヴァーチャルPC Xp home) Data Source=192.168.1.1\SQLEXPRESS これでも 11433\OTHERINSTANCE これでもダメでしたが SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、 SQL Server の既定の設定がリモート接続を許可しないようになっていることが エラーの原因である可能性があります。 (provider: TCP プロバイダ, error: 0 - 対象のコンピュータによって拒否されたため、接続できませんでした。) セキュリティー構成は、サービスと接続のセキュリティ構成−リモート接続−ローカル及びリモート接続 ●TCP/IP および名前付きパイプ・・・ にチェックは言っているんですけどねー まだまだ頑張る・・・応援よろしく
>>263 ただ、Windows2000は.Net2.0までしか入らないから
その辺のサポートするならVS2008にしても.Net2.0で作り続ける必要がある。
プロパティ打つのがたるいし型推論も使えない。。orz
>>266 まず、MSSQLSMSEで、IPアドレスで接続できるかどうか試してみれよ
サーバ名にIPアドレス、認証はSQL認証で、設定したアカウントを設定しれ。
MSSQLSMSE<<とりあえず ぐぐってみる・・・・ まだまだ ど素人だな俺って・・・
やっぱりC#使う場合はDBをSQLServerにすることが多い?
269だけど Accessとかもありじゃないでしょうか おいらはAccess買えない貧乏仕様 定額給付でSqlServer2008でも買うか…
実行後に実行プログラム自身を削除するのってどうすればいいですか?
SQL Server 2008 Expressでいいんじゃないの? 無料だし、商用にも使えるし
実行プログラムを実行して削除するプログラムを作る
>>267 .NETとC#のバージョンがごっちゃになってないか?
>>267 varはコンパイラの機能だから.NET Framework 2.0対象でも使えるはずだよ。
>>268 なんかちょっとわかった!^^進展してないけど明日チャレンジします
ね・・・ねむけが
278 :
267 :2009/03/05(木) 00:38:45
あ!そうかも。 LINQが参照できなくて色々できないあたりから 色々思考停止してる。さんくす!
ILのレベルでは何も代わっていないのだから、3.5で追加されたクラスライブラリを 使っているかどうかだけが問題なのだと思う。 Linq to ObjectはSystem.Linq.Enumerableクラスの拡張メソッドだから .NET3.5専用。 でも、拡張メソッド機能自体は、.NET2.0でも使える(多分)、など。 型推論も自動プロパティも匿名メソッドも全部.NET2.0で使えるんじゃないかな(未確認)。
>>279 拡張メソッドは構文糖じゃないし、専用のアトリビュートが必要なのでダメでせう
拡張メソッドは構文糖だよ。
今日日何が糖衣構文とそうでないものの境界もあいまいな気もする。 糖衣というより、コンパイラが提供する機能と言った方が適切じゃないのか
284 :
デフォルトの名無しさん :2009/03/05(木) 00:58:56
>>252-253 ありがとうございます。出来たのですが、コマンドプロンプト内に表示される出力内容を
取得できません。どうやればいいですか?
>>280 delegate int delTest(int i);
static void Main(string[] args)
{
delTest a = i => i + 1;
Console.WriteLine(a(3).ToString());
}
は2.0で通った。
あと、Func<T>(というかSystem.Core.dll)は3.5だけどAction<T>は2.0かららしい。
286 :
267 :2009/03/05(木) 01:02:19
やあ。期待に膨らんだ胸がしぼみつつあるよ。 ×var ×配列の暗黙的な初期化 ○自動プロパティ ○コレクションの初期化 ラムダは試すまでもなく。 それでも.Net2.0のまま短縮できる表記が増えた!感謝!
287 :
285 :2009/03/05(木) 01:03:39
なるほど、 foo(this IEnumerable boo){ } は foo([System.Runtime.CompilerServices.ExtensionAttribute] IEnumerable boo){ } と等価で、System.Runtime.CompilerServices.ExtensionAttributeは 3.5からなんだね。
varって何が原因でいけないの?
いないいない
290 :
285 :2009/03/05(木) 01:07:58
>>286 static void Main(string[] args)
{
List<int> a=new List<int>(){1,2,3,4,5};
foreach (var i in a) {
Console.WriteLine(i.ToString());
}
}
は通ったけど。
自分、279ですが、やっぱ基本的な基準は
>>279 でしょう。
291 :
267 :2009/03/05(木) 01:18:45
スマソ。今まで1度も使ったことなかったので、 そもそもvarがローカル変数のみに有効ということを知らなかった。 メンバで試してエラーが出たのでダメと判断してた。 色々勉強になった、ありがとう。
varはVBのvariantと違うんだ。他の変数同様に厳密な型付けはされる。 型推論によって型を明示しなくてもコンパイラがわかってくれるという 場合にだけ有効。
IDEが優秀であれば問題ないかもしれんが、 紙で見てる分にはvarじゃ何の変数だかわからんので困らんのかな
紙で見るとかw
>>293 まあ、var にして型が何か分かりにくくなるようならやっぱ使わない方がいいと思う。
少なくともwebや解説本、MSDNのサンプルプログラムで書かれてたらえらい迷惑
.NET2.0の範囲で使えるC#3.0
推論型、匿名型, 暗黙型付け配列
コレクションのイニシャライザ、オブジェクトのイニシャライザ
パーシャルクラス、パーシャルメソッド
自動プロパティ、ラムダ式
.NET3.xが必要になる機能
ラムダ式でFunc<>, Expression<>を使用
LINQクエリ式他
拡張メソッド
>>281 拡張メソッドが使えないのはExtensionAttributeが3.5に含まれるから。
という事で、System.Runtime.CompilerServices.ExtensionAttributeを自分で定義してやれば2.0でも使える。
インテリセンスにゃ出ないけど、まぁそのくらいは我慢できるだろう。
>>拡張メソッド、Func<> ぶっちゃけSystem.Core.dllをローカルコピー=trueにして参照しちゃえば良いんじゃ・・・
ど、ど、ど童貞ちゃうわ!
>299-303の話の流れがさぱりわからないんだが・・・
触るな危険。放っておけ
311 :
デフォルトの名無しさん :2009/03/05(木) 03:00:42
OpenFileDialogでファイルを選択して、コンソールプログラムの引数に与えて実行しようとしています。 ファイルのパス名に空白が含まれるときは、どうすればいいですか?
314 :
デフォルトの名無しさん :2009/03/05(木) 03:15:02
変数に入ってるので、ダブルクォーテーションができないみたいなんですが、、 こんな感じ。 String s = OpenFileDialog.FileName; ProcesStartInfo.Arguments = s; こうやって、ProcessをStartすると、ファイル名のパスに空白があるとそこで引数が終わりと判断されてしまいます。
その変数を括ったらどうなる?
String s = "\""+OpenFileDialog.FileName+"\"";
318 :
デフォルトの名無しさん :2009/03/05(木) 03:28:59
えー、括ったら単なる文字列になってしまいませんか? やってみたら、Visual Studioの作業ディレクトリ+"s"というファイル名 をオープンしようとして失敗する、という結果でした。
321 :
デフォルトの名無しさん :2009/03/05(木) 03:31:28
>>317 できました!
なるほど、そうやるんですか。
ありがとうございました。
なんで荒らしがわいてんだ?
>>322 自称エレガントな解法を示したつもりが、
誰にも相手にされなかった可哀想な一般人らしい
日曜プログラマ、まだ粘ってたんか
なんで文系という言葉に反応するんだろう?
いいえ短小包茎です
string.Format("\"{0}\"", path);
ToolStripMenuItem で選択後、自動で閉じないようにしたいのですが どうしたらいいのですか?
その奇抜なUIの設計思想を変える
自分でパネルにでもラベルとか作って完全に自作して実装すれば? というかクリックして閉じないとか・・・どうやって閉じるんだ? Windowsライクな実装の方が使い手も違和感ないと思うんだけど?
継承してWndProcをフックすればいけそうな気はする
DataGridViewにDataTableをバインドしています。 DataTableの更新が終わるまで描画処理を止めたいのですが、 ListBoxで言うところのBeginUpdate()のようなメソッドってありますか?
データソースをBindingSource使うようにして RaiseListChangedEventsプロパティで一時的にイベント通知無効化して 最後にResetBindingsで更新
>>293-296 varの最強の用途は、コレクションの要素の型が分かりづらい場合だろう。
例えば、Dictionaryはキーとアイテムの型パラメタ<foo,bar>をとるけど、
要素型はKeyValuePair<foo, bar>。
そこで、まず、
foreach(var a in dic){
}
って書いてvarにマウスポインタを当てる。すると、ツールチップでaの型が
出てくる。この場合KeyValuePair<foo,bar>。それを書き写して
foreach(KeyValuePair<foo,bar> a in dic){
}
とする。これが最強。
varの存在意義を語って存在意義を否定してしまった。
varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
それヘジたんがC#3.0についてのインタビューで言ってたことだけどなぜか実装されなかった
リファクタメニューに「ソリューション内のvarを実際の型名に置換」機能があったら、バリバリ使っちゃう。
VSってアドイン作れるよね?しかも.NETで。誰か作ってよ。(他力本願)
IDEの問題で解決できるなら、入力候補の推測機能ってことで実装すればいいのに。 ? total = 0m; という入力を許可し、;を入力した段階でIDEが?を推論した型に置き換える。 上の例だと、自動的に decimal total = 0m; に置き換わる。駄目?
型を書くかvarを書くかという極端な判断が必要だから その場に応じて使い分けるというのがどうしてもしづらいんだよな var total : decimal = 0m; はじめからこういうスタイルにしとけば型を省略しても誰も違和感を抱かなかった 今作り直したらこうなりそう
なるほど、varを変数宣言の開始句として、:の後に型を書くのか。 で、:を入力した時点でInteliSenseが働くと。 でも、そこを弄ったらもう、"C"#じゃないんじゃ。
よし、:はクラスやインタフェースの継承に使うし、最近は冗長でも IDEの入力支援頼みでコードを英語の文章に近付けるのが流行だから、 var total as decimal=10m; で行こう。あれ?どっかで見たことあるぞ。
varの存在で一歩またVBに近づいた! 閣下、我々の陰謀は成功を収めつつあります。
実際その点についてはVBのほうが自然だと思うよ CスタイルのメリットはCやJavaと同じであることくらい
型名 変数名; って、 Animal dog; でしょ?どう考えても英文法的におかしい。やっぱり、英文との類似性 よりも構文の単純さやキーワードの短さが尊ばれた時代の名残だよね。
でも、VBのdimキーワードも、配列宣言からの流用だったりして 英単語的には怪しかったりする。やっぱキーワードはvarで。
省略は良くない 今はIDEがあるのだからvarもvariableにするべきだ
define a variable dog which is an Animal and let it be a new instance of Animal whose name is "dog";
おいおい、文末はピリオドに決まってるだろ
そうすると、フィールド、プロパティ参照のピリオドを取りやめないとな。 let the name of the dog be "ポチ".
文頭に挨拶を書くのが礼儀だろ dear my computer
Animal myDog=new Animal("dog"); myDog.name="ポチ"; と以下が等価ってわけですね。こんなのの入力もIDEの支援で余裕だぜ! Dear my computer. Can you please define a variable myDog which is an Animal and let it be a new instance of Animal whose speciesName is "dog". And then please let the name of the myDog be "ポチ".
それじゃ面倒だから、これでいいよ a d = n a("d") d.n = "ポ"
C#ってC++の一種とかんがえていいの?
C++とC#は伯父と甥ぐらいの位置 とても一種とはいえない
.NET言語は、CLRありきだから、多言語との親戚関係とかの議論は意味が ないと思う。とりあえず、C++のサブセットでもスーパーセットでもない。 シンタックスがC由来の別物言語と捉えるべき。 それに、Cを拡張して言語仕様を肥大化させてオブジェクト指向を取り入れる C++的なアプローチとは違い、JAVAを意識した自由度より構造性を優先させた 言語になっている。そのために、JAVA的な、やりたい事に対して解法が唯一つ的 な部分がある。 のわりに、P/Invokeなど泥臭いアプローチをしてでも自由度を確保する貪欲さもあって、 やりたい事ができないという事態も滅多に生じないようになっている。 良い所だけ挙げるならば、こんな感じでバランスの取れた構造的な言語。 プリプロセッサで変態マクロが定義できるC++なんか、もう見たくもないやい。
VSのウイザードで作るCOMやらMFCの雛形はひどかった
たまたまwin32のAPIと自分が作った関数名が衝突したので 名前空間で分けたらそれでも衝突して、調べて見たらマクロ定義 だった時の憤りといったら・・・
C++でマクロを使う奴は馬鹿
だからと言って避けて通れないのがC++のどうしようもない点なわけで。
なにしろwin32APIが・・・MFCが・・・
過去を引きずるのは大変だねとだけ
10の位を切り上げる処理をするのに y= Math.Ceiling (x / 10) * 10; と書いてるんですが他にいい書き方とかありますか 括弧の使い方とかなんか不安なんですが・・・
>>370 >>210 をリスペクトして
y = Int32.Parse(String.Format("{0:d}0", (x + 9) / 10));
とか。
(ごめん、冗談だ、念のため。別に
>>370 の通りで問題ないよ)
xが整数以外なら問題あるでしょ。 っていうか整数なら9足すだけなんだけど。。 さて質問。 Windows Form のOnLoadとか適当な場所に DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek)); listBox1.DataSource = ar; comboBox1.DataSource = ar; のようなコードを書くと、コンボボックスとリストボックスの選択が相互に 連動するんだけど、この仕組みと、こういう仕様の意図が知りたい。
データバインディング GUIなんてデータ表示するだけなんだからわざわざTextだのItemsだの使うより データを汎用的な形で関連付けられた方がいいよねという考え カレント行の共有はCurrencyManager使ってコントロールの親子関係に基づいて行われる
>>373 ごめん、その思想自体はよくわかるんだけど、知りたいのは
2つのまったく無関係のコントロールの選択されているアイテムが連動する仕組みと、
そのような仕様にしてある意図なんだ。
windows formsだとそうなんだ。 WPFの場合 DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek)); list1.DataContext = ar; list1.SetBinding(ListBox.ItemsSourceProperty, ""); list2.DataContext = ar; list2.SetBinding(ListBox.ItemsSourceProperty, ""); だと選択行は共有されないね。
>>341 >varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
それ似たのがReSharperにあるよ。
似たようなのじゃためなんだ 僕らはC#に汚染されているんだ!
>>377 ReSharperはVS用のアドインだよ。確か。
まあこちとら趣味プログラマのexpress edition使い。
たっかいツールなんか使う機会なんざねーんだけどね。
ちょっと最後に質問SQL serverでLanやりたい場合一般的にDBの配置は C:\Program Files\Microsoft SQL Serverの配下ですか? 自分で作ったC:\aaaみたいなフォルダでもいいんですかね・・・・
>>380 SQLサーバが自分のPCとは異なるPCにある場合、
c:\とか、ファイルを直接指定することはないよ。
接続する側→(LAN)→接続されるSQLServer
という関係で接続しているとき、
接続する側は、単に接続されるSQLServerのIPアドレス(とインスタンスと接続するDB名)を指定するだけ。
実際の物理ファイルのパス指定は接続されるSQLServerのほうで指定するので、
ConnectionStringでパスを指定することはない。
少なくとも自分が経験したスタンドアロンのSQLではそんな感じ。
382 :
デフォルトの名無しさん :2009/03/06(金) 00:24:32
ASP.NETの話になっちゃうんだけど Web画面上にあるボタンをクリックするとクリックイベントが走りますよね。 でもWebだとクリックイベントの前にPage_Loadイベントが実行されますよね。 ちょくせつクリックイベントに飛ばす方法はないのでしょうか? またPage_Loadイベントの処理の中で、Page_Loadイベントを抜けたら 次はクリックイベントが走るよというのを知る方法はありますか?
>>382 初期化したいのに、PostBackしたときもPage_Loadが呼ばれるから、
ボタンを押した時はPage_Loadは呼んで欲しくないということだろうけど、
そのためのIsPostBackだから、それで判断すればいいのでは?
ASP.NETの場合は、表示するたびに、そのページの新しいインスタンスが生成される。
これはwebという仕組み上仕方のないことなので、Page_Loadを実行せずに
インスタンスが生成する方法は基本的にはない。
クリックイベントが発生するということは、IsPostBackが必ずTrueだから、
それで判断すれば?
・・という意味でなかったら、contextとかみれば、イベントがあるかどうか
わかったほうほうがあるはず・・
>>374 無関係じゃないよ。同じ親コントロールに属して同じデータソースを参照してるじゃん。
無関係だと主張したいなら明示的にしないとだめ(Control.BindingContextプロパティ)。
仕組みはCurrencyManagerとかBindingManagerBaseとか調べれ。
意図? MSの人じゃないから答えられん。
まあ親とデータソースが同じなら現在行共有できた方が便利じゃねと思ったんじゃない?
.NET 2.0になってBindingSourceが追加されてデータソース主導になったけどな。
web上にあるファイルのサイズを簡単に取得する方法はありますか。 ダウンロードする前に知りたいのです。
簡単かどうかはその人次第だからなんとも 取得方法はそのファイルがどういうプロトコルで公開されているのかによるからなんとも サイズ情報が公開されているかどうかはサーバ次第だからなんとも
HTTPならHEADで返してくれればいいけどな
HttpWebResponseのContent-Length 駄目な場合もあるけど
匿名メソッドと、ジェネリクス(Listなどのコレクション以外)で うまいこと使用している例や、より利点がわかりやすく紹介されている サイトがあったら教えてください教えてください。
>389 宿題?
MSDNでいいんじゃね?
匿名メソッドは自分だけが見るソースなら短いイベントハンドラの 定義に使うけど、推奨はできないなあ。 Button1.Click+=delegate{MessageBox.Show("Clicked!");}; とか。 処理の一部をカスタムできるメソッドを作るために使う例を 示せれば良いんだけど、できるだけLINQとか標準機能に落とし 込むようにしているので良い例がない。 ジェネリクスはやっぱり、独自のコレクションを作るとかが 多いんじゃない? あと、幾つかデータの種類があって、それらのデータが更新された 時に更新値を受け取るコールバックを登録するメソッドが、 データの型をパラメタにとるジェネリックメソッドになっていた のを見た事ある。でもこの場合、データの種類毎にメソッドを 用意するのと比べた場合の利点がさっぱり分からないコードだった。
Regex.Replaceなんかまさに匿名メソッドとかラムダ式の出番
>>390 宿題ではないです。
>>391 MSDNではサンプルが少ないのと、こういう時に使うと便利というのが、
イマイチよくわからないので。イベント的なコールバック用途というのは
意味はわかります。
>>392 ありがとうございます。
なるほど。自分も匿名メソッドにあまり利点を見いだせない一人です。
そのためサンプルがみたいと思ったのですが、
いいものがないということで残念です。
ジェネリクスもやはり独自コレクションがメインですか・・
コレクション以外の便利な使い方がイマイチ思いつかないので、
サンプルをお聞きしました。
前に複素数のジェネリック型なんて議論されていたよね。 それは特殊でかつ有用な使い方なんじゃないかな。
別に無理に利点を発見する必要は無いんじゃないの 必要に迫られたら使えばいい程度のものじゃないかね
System.Linq.Enumerableで嫌と言うほど出てくるよ 結局はコレクション操作だから微妙だけどな くだらない例だけどEventHandler<TEventArgs>とか
Hoge a = 共通の前処理(); //aを使った固有の処理 共通の後処理(a); こういうのが各所に出てきたから void 共通の処理(Action<Hoge> action) { Hoge a = 共通の前処理(); action(a); 共通の後処理(a); } こんなメソッドを定義して 共通の処理(a => { /*aを使った固有の処理*/ });みたいにしたことがある
>>394 ・とくめいめそっど
Win Forms やら WPF の非同期部分で大活躍?
・じぇねりくす
基本、型を爆発させないためにある。これを踏まえると
Func<T> とかなかなかに便利な使い方じゃないか?
class HogeCache<T> { public static readonly Hoge Hoge = new Hoge(typeof(T)); } これだけで型ごとに対応するインスタンスのキャッシュが作れる Dictionary<Type, Hoge>使うよりも遥かに効率がいい Comparer<T>.DefaultやEqualityComparer<T>.Defaultなどで使われてるパターン
401 :
デフォルトの名無しさん :2009/03/06(金) 22:19:30
>Button1.Click+=delegate{MessageBox.Show("Clicked!");}; こういう使い方って何でするんですか? デザイン画面でボタンをダブルクリックするとクリックイベントのソースが出てきますが そこにMessageBox.Show("Clicked");って記述すればいいと思っちゃうんだけど わざわざこのように書く理由を教えてください。
短く書けるからって言ってんじゃん。アホかよ。
403 :
デフォルトの名無しさん :2009/03/06(金) 22:21:48
それだけかよw糞じゃん。
だから推奨はできないって言ってるだろw
405 :
デフォルトの名無しさん :2009/03/06(金) 22:24:25
糞すぎじゃん。 何でこんな機能つけたんだ。
つLINQ ラムダ式で同じことがもっと簡潔に書けるから匿名メソッドは不要になった そのうち非推奨だとコンパイラが警告出すようになってもおかしくない
状態によって、異なるクリックイベントを割り当てるのに便利かも。 状態をどこかのメンバ変数に保存して、同じメソッド内でメンバ変数の値によって分岐させるより、 処理そのものを差し替える感じ。 特に汎用できて処理を委譲できる場合なら尚更。
C#3.0以降なら Click += (sender, e) => { MessageBox.Show("Clicked!") }; と書くべき 匿名メソッドと違って引数省略できないのが時々不便に感じるけど
匿名メソッドは List<T> 周りのメソッド眺めてみりゃどういう 感じに使うのかわかる気もするが…あえてイベントハンドラなら 一時オブジェクトに使う。WebClient とか
>>401 デバッグ用途で一時的に作ったようなボタンなんかだと、
それ用のイベントハンドラも短くなりがちになる。そこで、
Loadedイベントハンドラだけはxamlエディタで定義&割り当て
をしてもらって、そのLoadedイベントハンドラの中で
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
って書いた方がゴミメソッドが増えなくて見やすいんだよね。
まあでも、書いたとおり、推奨はできない。
ただ、ある程度複雑なプログラムを書くと、デザイナもxamlも
あまり頼りにならなくて、コードでGUIをアレコレする必要が
出てくる場面は頻繁にある。特に動的な処理が必要な場合。
例えば、StackPanel1の子にButton1がなっているとして、
Button1のClickイベントハンドラで
Button1.IsEnabled = false;
Button Button2 = new Button() { Content = "Click Me!" };
Button2.Click += delegate {
Button1.IsEnabled = true;
StackPanel1.Children.Remove(Button2);
};
StackPanel1.Children.Add(Button2);
こんなの。これだと、Button2のVisiblityなりIsEnabledなり
をいじるイベントハンドラを書く方が自然なのでちょっと
人為的かな。
何の断りもなく当然のようにWPFw 初心者が混乱するよ
412 :
410 :2009/03/06(金) 23:06:04
>>408 むしろ、その引数を省略できるという性質があるために、
引数を必要としないイベントハンドラの定義にはdelegate{}を
使っている。推奨はしない。あんまり、
void foo(object sender, EventArgs e){...}
みたいなのが増えるの好きじゃないんだよね、個人的に。
そんなわけだからイベントハンドラをメソッドとして作る場合にも
void Button1_Clicked(){
MessageBox.Show("Clicked!");
}
と引数なしのメソッドを書いて
Loadedイベントハンドラの中とかで
Button1.Click+=delegate{Button1_Clicked();};
とか書く事すらある。これも推奨はできない。
413 :
410 :2009/03/06(金) 23:08:40
>>412 と類似しているけれど唯一推奨できるのは、次のケースかな。
void 処理1(){
ほにゃらら
}
void 処理2(){
ほにゃらら
}
みたいな処理の単位であるメソッドがあって、それをボタンから
呼び出させる場合。
Button1.Click+=delegate{処理1();処理2();};
みたいに書く。
VBでもWindows FormsでもWPFでも、
入門書に書いてある事を実践すると、イベントハンドラに
何でも書くスタイルを身に着けてしまう人が多いけれど、
本来は処理を適当な粒度で分割したメソッドを定義して、
イベントハンドラはそれらを呼び出すだけの簡潔なもので
あるべき。
Model-Viewスタイルとか良くは知らない趣味プログラマだけど、
こんな感覚でやっています。
WPFに限った話をすると, デザイナでイベントハンドラ追加するのがちょっとだけ面倒だったり 動的にコントロールを追加することが多かったり 基底クラスのイベントでもオーバーライドじゃなくてイベントハンドラ使うことが多かったりするから Button1.Click+=delegateみたいなことは比較的よくやる
415 :
410 :2009/03/06(金) 23:18:53
ごめん、なんか脇に逸れすぎてた気がする。匿名メソッドorラムダ式 を用いて処理を委譲する時の一番の利点は文句なしに「継続」だった。 でも、LINQ以外でうまい例を作れないや。 とりあえず、 void Sum10(){ int s=0; for(int i=1;i<=10;i++){ s+=i; } Button1.Click+=delegate{ MessageBox.Show(s.ToString()); } } ってやって、どこかでSum10()を呼び出すと、Sum10からは ちゃんと処理が戻るんだけど、その後Button1をクリックすると sの値55が表示される、って事を知っておいて。 匿名メソッドで一番重要なのはこれなんだけど、脇に逸れ過ぎた。 非同期処理なんかをする場合には超超超〜重要なはずなので 誰か例を書いてくれ。
わかりづらいんであんまりそういうのは多用しない方がいいと思うよ
>>415 の中でs++したりするとわけがわからなくなる(サンプルとしては面白いけどね)
ローカル変数を取り込めるメリットは,
>>398 のようなパターンが自然に使えること
417 :
デフォルトの名無しさん :2009/03/06(金) 23:36:52
引継でC#やる事になったんだけど、1ファイル5000行を越えるようなものがざらにあります。 一カ所直すのにも不要なものが目に付いて頭がグワングワンしてきます。 プロパティ、イベント、その他のメソッドという分類でファイル分割しようと思ってるんだけど、君らはどうしてるの?
#regionでよくね
419 :
410 :2009/03/06(金) 23:45:31
うん、
>>415 は意図は何もないただのサンプル。
とりあえずUIの話の続きとして「継続」の利点を書いておくと
UI以外のスレッドで何か計算して、その結果を用いてUIを更新する場合、
匿名メソッドを使うのが一番素直に書ける。コードの流れがぶった切ら
れない的な意味で。
例えば
//UIと別スレッド
while(円周率の計算精度>閾値){
円周率の計算の途中経過をtempPiに代入
Window1.Dispatcher.Invoke((MethodInvoker)()=>{
Window1.Label1.Content=tempPo.ToString();
});
}
こういう場合にメソッド定義とInvokeの引数ありバージョンを使っていたら
訳がわからなくなる。
>>417 自分の場合は#region-#endregionで
・変数定義とコンストラクタ
・プライベートメソッド
・パブリックなメソッドとプロパティ
・(あれば)カスタム可能なメソッド、プロパティ
と分けている。Ctrl+M-M, Ctrl+M-O等のショートカットは知っておくと吉。
>>413 > 本来は処理を適当な粒度で分割したメソッドを定義して、
> イベントハンドラはそれらを呼び出すだけの簡潔なもので
> あるべき。
理念的にはその通りだと思うんだけど、若干反発も感じるのは
その基本に忠実な書き方をすると、ベタにイベントハンドラに書いた場合と比べて
「その処理」がイベントハンドラからのみ実行される処理だという明示性が
失われるんだよね。
>>420 多分、その、”「その処理」がイベントハンドラからのみ実行される”
という事を前提としたコーディングが、設計の柔軟な変更などを将来的に
阻害してしまう、っていうのが、Model-View-Controlerモデルとか
その派生系とかが繰り返し提案される理由なんじゃないかな。
シンプルなプログラムだと却って変な事になってしまう事が多いのも
確かだと思うけど。
422 :
419 :2009/03/07(土) 00:09:11
419を1から100までの和を計算し、途中経過を表示するコードに書き直し てみた。あと、MethodInvokerはWindows Formsのだから(デリゲート だからシグネチャが正しいので通るけど)よくなかったのでActionにして みた。このコードは、はじめのお題の、匿名メソッドの利用例としては、 ”良い”利用例だと思う。他の方法だとめちゃめちゃごちゃごちゃになる。 private void Window_Loaded(object sender, RoutedEventArgs e) { Thread sum100Thread = new Thread(new ThreadStart(sum100)); sum100Thread.Start(); } private void sum100() { int s = 0; for (int i = 1; i <= 100; i++) { s += i; this.Dispatcher.Invoke((Action)delegate{ this.Label1.Content = s.ToString("0000"); }); } } xamlは <Window x:Class="WpfApplication1.Window1" ほにゃらら Loaded="Window_Loaded"> <Label Name="Label1"/> </Window> だけ。
それ全部100にならない?
424 :
423 :2009/03/07(土) 00:33:36
100じゃなくて5050か
425 :
423 :2009/03/07(土) 00:52:09
確認したけどやっぱり意味的に間違ってる 匿名メソッドは現在のスコープの変数そのものを取り込むんだ ループ内で生成される全ての匿名メソッドが同一のsを参照してるから ただ一つのsのインスタンスを共有することになる ループの中でint ss = s;みたいに宣言し直してそっちを取り込むようにしないとだめ
え、ちゃんとくるくると1から5050まで行くけど。 コンピュータが速過ぎるんじゃない? こういう、継続を必要とするデリゲートの場合 インナークラスが暗黙に定義されて、それがメソッドと フィールドを持っている。デリゲートのインスタンス作成時には このインナークラスのインスタンスが作成されて、フィールドに 必要な変数がコピーされる。これが参照型だと話がまたややこしく なるけれど、値型ならば問題はないはず。
いや
>>422 のコードだと確実にsのインスタンス(sを保持する自動生成されたクラスのインスタンス)は
一つしか作られないよ。IL見ればわかる。
何でうまくいくのかは知らないけど意味的には確実に間違ってる。
ごめん、BeginInvokeじゃないから同期実行になっていた。 なんじゃこのオチ。
スレッドの非同期処理しか役に立たないってのもなんか寂しいな
430 :
428 :2009/03/07(土) 01:45:16
というわけで private void sum100() { int s = 0; for (int i = 1; i <= 100; i++) { s += i; int s_ = s; this.Dispatcher.BeginInvoke((Action)delegate{ this.Label1.Content = s_.ToString("0000"); }); Thread.Sleep(0); } } としてみたら希望通りの動作になったんだが、 Thread.Sleep(0); をコメントアウントすると、最後の5050しか表示されないんだけど、 ディスパッチャスレッドの優先度って低いの?
ようはメソッド内で使用するだけの、クラスのメンバに加えるまでもないメソッドを定義するのに便利ってこと?
タイムスライス内で終わってしまうからだろ。 ループもっと長くしろよ
あいからわずLanでつながらない…
ところで
>>155 さんのIPアドレスってつなぎたいSQL SERVERのPcでコマンドプロンプトIPCONFIGででる
IP アドレスですか?
おれは一体何週間これをやってるんだろうか
いろんなスレ放浪して迷惑掛けまくりで
>>170 SQL Serverのポート番号は Express Edition場合動的で コンフィグレイションマネージャーで固定する遺体です
>>433 まず、SQLSMSEで接続できるのか確かめなさいってば。
できた?
えっと・・ちょっとまって
サーバ名にIPアドレス、 SQLServer認証で、 設定したログイン名とパスワードで接続できる?
MS server management studio expressで ファイル−オブジェクトエクスプローラで接続を選択 サーバー名を コマンドプロンプトipconfigで得たipV4のアドレスを入れる 認証を:SQL Server認証する ログイン:コントロールパネルのシステムにでてるフルコンピュータ名 パスワード:パソコンにログインするパスワード でやったら・・・だめでした・・・ どこが違うのでしょう?
むむむ:設定した<<ログイン名>>これが、よくわかってない気がします・・・
フォームに関してです、BackColorにTransparencyKeyに設定した色を設定した場合、 同じバイナリを実行したときにwindows XPでは透明部分をクリックするとその背後にある別のアプリケーションをクリックすることができます。 windows vistaでは透明な部分をクリックするとそのフォームをクリックします。 vistaでxpと同様にするためにはどうすればいいでしょうか?
>>437 SQL Server認証は、SQL Server自体に設定する、
Windows認証(パソコンのコンピュータ名と、パソコンにログインするパスワード)とは別。
SQL ServerにSQL Server認証用のアカウントを別途設定して、
そのアカウントでログインする必要がある。
Windows認証でログインするのは、なんていうのかな、
アクティブディレクトリとか組んで、社内のネットワークに接続するのに必要な認証のことで、
それを認証の変わりと見なすってこと。
(SQLとネットワークの両方で認証したら面倒だから、ネットワークにログインする認証を
ユーザとして認めるっていうこと。Windows認証で今自分のアカウントで接続できるのはそういうこと。)
今は普通に家で勉強しているような感じだと思うので、
ネットワーク越しに接続するのにはWindows認証は関係ない。
SQL Server自体に設定する<<ここがよくわからないところです MS server management studio expressで設定するのでしょうか?
わ もう3時か! 付きあわえて申し訳ない もう少しググッテみます でわっ
>>432 和を取るの100000までににしてみたら、ずっとマウスポインタが砂時計に
なって、最後の結果だけが表示された。
タイムスライスってそんなに長いの?数10ms単位で切り替わるんじゃないの?
>>441 SQL SMSEの左ペインのツリービューで、セキュリティ−ログインから設定する。
ログインを右クリして、新しいログインを作って、ログイン名を入力して、
SQL Server認証を選択して、パスワードを設定する。
さっきのリモートでのSMSEの接続には、ここで設定したSQL Server認証の
ログイン名とパスワードを設定すると接続できるということ。
バーチャルPCは、あなたのPCとは別のPCだから、
あなたのPCにログインするアカウントで、バーチャルPC内のSQLに接続はできないということ。
ただし、あなたのPCにインストされてるSQLServerは、あなたのPCにログインしているユーザを
SQLServerのユーザとしても認める設定をしているので、自分のPCのアカウントでも
ログインできましたってこと。
自PcからSQL Server認証試したけれどだめでした Ipv6じゃないと だめなのかな?
だめですねー V4V6同様に下記エラー Microsoft SQL Server、エラー: 18452 444さんの通り新しいログイン作ったんですが ミスったかな 試行錯誤してきます
V4でいける SQL Server認証で通らないのなら、なんかの設定がおかしいんでしょ バーチャルPCのファイアーウォール機能が働いていて、そもそも接続できないとか、 SQLの設定でTCP/IPの接続をそもそも許可していないとか、考えるときりがない。
>>446 その前にバーチャルPC上のSMSEで、そのSQLServerのアカウントでログインできる?
サーバ名に、そのバーチャルPCに割り当てられたIPアドレスを入力して。
いや今は自Pc(ローカル)でチャレンジ中
>>448 ハイ ちょいとおまちを
うは バーチャルpcにSMSEないや・・・・ ごめん
バーチャルPCにSMSEがないのに、 どうやってアカウントを設定できるんだ?
ベースのVISTA、ほうでアカウント設定したので 汗; 環境(Vista アルティメット(SMSEあり) <= (ヴァーチャルPC Xp home (SMSEなし))
VirtualPCのSQLServerにアカウント設定しなきゃ、 UltimetのSMSEから接続できないでしょうよ VirtualPCは、まったく別のところにあるPCだと思わなきゃだめよ
いや VirtualPCのPGからUltimetのフォルダにあるMDFにコネクトしたいので・・・ うーん VirtualPC側にアカウント必要なんですか?
遅くまでありがとう もう少し頑張る気力がわきました
まだ起きてるなら、しばらく付き合ってやるけど?
>>454 SMSEをクライアントにみかけて、
TCP/IP経由でSQLServerに接続するテストをしてみなっていってるわけだから、
その例で言えば、VirtualPCのSMSEでUltimetのSQLServerに接続するってこと。
だから、設定用のSMSEと、接続実験用のSMSEの両方ないとだめでしょうよ。
UltimetにだけしかSMSEがないということは、UltimetのSQLServerにアカウント設定してたわけで、
それでUltimetからVirtualPCのSQLServerに接続できるわけないでしょ。
やってることが、どうもちぐはぐだな。
458 :
443 :2009/03/07(土) 04:35:32
>>430 の問題解決しました。
ディスパッチャのノーマルプライオリティのキューが一杯になってしまって、
和を取っているスレッドの処理が終わってからようやくキュー内の処理が
全て完了する、という形になっていたためでした。ディスパッチャスレッド
での処理の優先順位を下げる事で、ディスパッチャがキュー内の処理を全部
やっつけようとせず、順次こなしていくようになりました。
ディスパッチャスレッドでの処理の優先順位を上げなければならないと
全く逆に勘違いして大はまりしてしまった。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread sum100Thread = new Thread(new ThreadStart(sum100));
sum100Thread.Start();
}
private void sum100()
{
int s = 0;
for (int i = 1; i <= 100; i++) {
s += i;
int s_ = s;
this.Dispatcher.BeginInvoke((Action)delegate {
this.Label1.Content = s_.ToString("0");
}, DispatcherPriority.Background, null);
}
}
これでようやく、UIを非同期的に更新する処理を匿名メソッドの
「継続」の利点を生かして簡潔に書く例になりました。
>>443 切り替わっても Dispatcher キュー処理するほうが時間かかってる
だけだろそれ。WPF は基本保持モード
>>459 そうです。マウスポインタが砂時計に変わることから、ようやく、
これ、UIスレッドの方が滞っているんじゃん、と気が付けました。
>>458 引数いらないなら、こっちの方が良いんじゃないか。(インテリセンスに出ないけど)
Dispatcher.BeginInvoke(DispatcherPriority, Delegate)
あと、DispatcherExtensions クラスにある拡張メソッド使うと、
Dispatcher.BeginInvoke(Action, DispatcherPriority)
が使えるらしい。(型推論が効く)
>>458 知らんかった。
[EditorBrowsable(EditorBrowsableState.Never)]
[Browsable(false)]
になっているBeginInvokeがあるのね。
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg);
public DispatcherOperation BeginInvoke(DispatcherPriority priority, Delegate method, object arg, params object[] args);
と三つも。なんでこんな事になっているんだ?
疑問に思ったんだが、WPF の Dispatcher.Invoke には WinForms の EventHandler、MethodInvoker、WaitCallback みたいに、 特別扱いされてるデリゲートは無いのかな 今夜にでもソース読んでみるか
>>389 の質問に立ち戻る
まず、ジェネリクスに関しては、ある本でこんな例を見つけた(わりと一般的?)
タブベースのUIで、そのタブの中身はそれぞれ異なるビューであるときのベース。
namespace ContactManager.Presenters
{
public class PresenterBase<T> : Notifier
{
private readonly string _tabHeaderPath;
private readonly T _view;
public PresenterBase(T view)
{
_view = view;
}
public PresenterBase(T view, string tabHeaderPath)
{
_view = view;
_tabHeaderPath = tabHeaderPath;
}
public T View
{
get { return _view; }
}
public string TabHeaderPath
{
get { return _tabHeaderPath; }
}
}
}
匿名メソッドに関しては、別スレッドで画像がロードされたときに メインのUIのサムネールを更新する例として(これはいままで議論されてたのと 基本的に同等のものだが) Application.Current.Dispatcher.Invoke( DispatcherPriority.Normal, (Action)delegate { OnPropertyChanged("Thumbnail"); }
>>457 SMSEインスト完了 く^^
アカウント作れない・・・
このバージョンの Microsoft Windows では、MUST_CHANGE オプションはサポートされません。
がーん
SMSEはインストできたんだから、アカウントつくれる方に接続すればいいじゃん
>>468 むむむ諦めていたところに
良意見
試行錯誤中
C#になんの関係もないことに、そろそろ気付けよ・・・
C#でネットワーク越しにDBに接続できないから始まって、 ならまずはManagement Studioで接続できる?の話になってるから、 関係無いとも言えるし、継続してるから関係あるとも言える。
472 :
469 :2009/03/07(土) 19:13:04
Vistaで作成したアカウントでXpのSEMSから接続 サーバーの種類 データーベースエンジン サーバー名 IPアドレス 999.999.999.999(IPconfigでvistaから得た) SQL Server 認証 ログイン名 ja パスワード ***** 結果 サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときに このエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることが エラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした) (Microsoft SQL Server、エラー: 1326) ・・・で、もって Vistaのセキュリティー構成をリモート接続をTcpipのみしてみたが だめだったので(Tcptip及びパイプ)へ戻すが・・・ここでひらめいたXpのリモート接続を(Tcptip及びパイプ)変更 サービス停止再起動 結果 上記と同じ・・・・だああああああああああああああああ<<<今ここ
他の方法でちゃんとつながるようになってから来い、ってことだわな。
474 :
469 :2009/03/07(土) 19:15:50
>>470 それはすっごく気にしてる
申し訳ない
今まで(一週間位)指摘されないこともすごく感謝してました
「ありがとうそしてごめんなさい」としか言えない
475 :
469 :2009/03/07(土) 19:17:24
>>473 ローカルでは繋がるんですけどね
今日でわからなかったら諦めるから
目をすぶってくれ
476 :
469 :2009/03/07(土) 19:20:11
つぶってくれ ・・・
>>472 他の要因が原因に成りにくい方法から、一つずつ確実にテストしなくちゃだめだな。
なんで、VistaのSQLSMSEで、VistaのSQLに、SQL認証で、そのアカウントで接続できるかどうかが第一点。
1)接続できなかったら、アカウントの設定が間違ってる。
2)接続できたら、アカウントの設定は正しいので、ネットワーク越しの接続に不備がある。
・この場合、VistaやXPのファイアーウォールやアンチウィルスのファイアーウォールの可能性
・SQLServerの設定でTCP/IP越しの接続ができなくなってる
・SQLServer2005だと、Advanveなんちゃらをインストしてないと、リモート接続が許可されないとか、
そんなのもあった気がする。
アカウントってなんだよ・・・ SQL Server 認証に NT アカウントは関係ないぞ。(TCP/IP なら)
ログイン名:ja ↑こんなログイン作ったのか? 最初からあるのは「sa」だぞ? あとは、ポート 1433 を開けてあるのか確認すれ。
480 :
469 :2009/03/07(土) 20:25:54
うん 簡単にできたから面白くて maとjaとか作った vistaの コンフィグレーションマネージャーで動的ポート消して IPALLを1433に変えて再起動 ダメ というより ローカル(vista内)でさえSQLserver認証できてないような信頼がどうのかとか
もういいでしょ。SQLサーバの設定正しくできるようになってから、またおいで。
482 :
469 :2009/03/07(土) 20:33:56
わかった すまなかったごめんな 皆さん急がしいところ2週間もありがとうございました
在日がイライラしてんだろ察してやれ
うわ・・・
C#でWindows Formアプリーケーションを作成し、WebBrowserコンポーネントを 乗せています。 そこにSVGファイルを表示させたいのですが、実行するとコンポーネント内には -------------------------------------------------------------------- 取り消されたアクション Internet Explorer は、要求された Web ページにリンクできませんでした。 要求された Web ページは現在、利用できない可能性があります。 -------------------------------------------------------------------- と表示され、別途IEが起動します。 別途起動したIEには「セキュリティ保護のため、コンピュータにアクセス できる・・・」といういつものメッセージが表示され、 「ブロックされているコンテンツを許可」を選択すると正常に表示されます。 そのファイルをHTMLでラップするとIEの起動は止められますが、 コンポーネント内には空白と赤×のアイコンが出るだけです。 恐らくブラウザコンポーネントのセキュリティ設定の問題だと思うのですが Windows Formアプリケーションから呼び出したときだけセキュリティの レベルを下げることは可能なのでしょうか? それとも別の開放があるのでしょうか? ちなみに読み込ませるファイルはローカルにあり、自分で書いた安全な物です。
489 :
464 :2009/03/08(日) 02:16:10
>>488 COMですか・・・。
と言うことはWebBrowserコンポーネントじゃなく、COMのaxWebBrowserを
使うということでしょうか?
後、これは.Net 3.5、Visual Studio 2008でも通用するテクニックなのでしょうか?
明日試してみます。ありがとうございました。
491 :
488 :2009/03/08(日) 03:15:24
>>490 ごめん、自分で実装したことはないから詳細は不明
とりあえず、
webbrowser IInternetSecurityManager
のキーワードで検索するといろいろ引っかかるから使えるかどうか調べてみてください
>>491 はい。とりあえずやってみます。
正直COMはあんまり良く理解してないのでWebBrowserコンポーネントで
何とかできるとありがたいのですが・・・。
>>489 型推論が効くって説明は誤っていると思っていたので気になって
いたんだけど、了解した。
Dispatcher.BeginInvoke((Action)delegate{},優先度);
って書くと呼び出しが高速になるって事だね。それで引数が必要ならば
拡張メソッドじゃない標準のBeginInvokeを使って
DispatcherOperationCallbackかSendOrPostCallback
を使えば良いと。
ところで、
using System.Windows.Threading;
しても、この拡張メソッドがInteliSenseに出てこなくて拡張メソッドが
有効になっていない気配だったので気になって調べて見たら
System.Windows.Presentation
への参照を追加するのが必要なのね。これでめでたくInteliSense
に出てきました。
C#2.0、ジェネリクスメソッドで、型のインスタンスを生成して返すことってできますか? できるのなら、どうすればいいでしょうか。こんなことをやりたいです。 public T Hoge<T>() { return new T(); }
public T Hoge<T>() : where T : new() { return new T(); } ちなみにこのnew T()はActivator.CreateInstance<T>()のシンタックスシュガー
おお、できたありがとう!
GenericなFactory ですね
498 :
デフォルトの名無しさん :2009/03/08(日) 22:31:15
ジェネリックコレクションに格納されているデータで 引数で渡した値が存在するかをチェックしたいのですが パフォーマンスが良いやり方を教えていただけないでしょうか? ↓こんなんじゃあパフォーマンス悪すぎですよね・・・ private bool Search(string keyword) { foreach(string value in this._data) { if(value == keyword) { return true; } } return false; }
一般にはそれしかない _dataがList<T>や配列ならFindとか使えばいい
std::setみたいのって無いの?
.NET3.5で要素が重複しないならHashSet<T>使えば速いかも
_dataについてIEnumerable<T>型であること以上のことがわからないのであれば,
asでICollection<T>にキャストしてnullなら
>>498 方式,nullでなければICollection<T>.Contains
を使うのが一般に速いはず
LINQが使えるなら何も考えずEnumerable.Containsを使えばいい
(こういう小細工は中でやってくれるから)
main()があるクラスの名前ってどうしてる? IDEの吐くスケルトンのデフォのProgramのままが普通なんだろうか。 あと、グローバルなシングルトンを取得する静的メソッドを寄せ集めたクラスって 定番の名前とかあるのかな。
どっちも絶対にinternalにするので名前なんてどうでもいい
>>504 コードを書く人にとってはそうでも、コードを読む人(3ヶ月後の自分を含む)
にとってはそういう考え方は困る。
少なくとも普通はクラスファイルが数十以上になる、
ある程度実用的なコードを書いてる場合は。
前にも書いたけど、やっぱり2chってトリビアルな知識はなぜか妙に詳しいが
大きなプログラムは書いたことないし書けない人間が多いのかな。
最後の2行がなければ全面的に同意したのに
大きいの作るときにグローバルインスタンス寄せ集めクラスはそもそもどうかと
>>507 個人的には C# だと名前変えるのそんなに大変じゃない場合が
多いから
>>504 とは別の理由で結構無頓着だなぁ
名前ってウダウダ考えるより書いてないときにひょんと来たり
整理してから思いついたりするから後回しにしてそういう時間を
とるほうを優先するかな。
どうでもいいというのは、その状況で適切な名前をつければいいと言うことであるわけで 何か固定の名前を付けるなんて小規模で1人でやってる場合ならいいが
C#からFlashをocxで呼び出して表示させると、 Microsoft OEM Readyプログラムのテスト5で バッファーアンダーランのようなエラーで止まってしまうんですが、 何か良い方法はないのでしょうか。 FlashはAS2とAS3で、それぞれステージだけある空のswfファイルです。 --- *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\Macromed\Flash\Flash10b.ocx - Flash10b+0x3ef4a: 673fef4a 8a08 mov cl,byte ptr [eax] ds:0023:11012000=??
rubyでMechanize使って実装していた処理をC#に移植中なんですが 「Webページのテキストボックスに文字列を入力してsubmitボタンを押す」 というような処理をするときWebBrowserクラスを使うしかないんでしょうか できればDocumentCompleteで待つように別スレッドが発生しないクラスがあればうれしいのですが・・・
多分IronRubyとか使ってRubyのを使えるだけそのまま使った方がいい
なんでC#なんだろ
Linqについて勉強しようと思っているのですが、何かお薦めの本があれば教えてください
もしかしたら、.NET Frameworkのバグ(?)を見つけたかもしれないんですが、 本物か勘違いか、皆さんのご意見を伺いたいです。まずはサンプルコードを。 ----------------------- Type type = typeof(List<string>); // 型は何でもいいです type.GetInterfaces(); // .NET Framework 1.1以降のメソッド type.GetGenericArguments(); // 2.0以降のメソッド Type delegator = new TypeDelegator(type); delegator.GetInterfaces(); // 無問題 delegator.GetGenericArguments(); // NotSupportedExceptionをthrow type.Equals((object)delegator); // false <= ??? type.Equals((Type)delegator); // true delegator.Equals((object)type); // true delegator.Equals((Type)type); // true ----------------------- 解説は次のレスで。
勘違い 以上
ジェネリクスでも、メソッドの引数としてType typeof(T)を渡すとSystem.RuntimeTypeが渡されるけど 同じ場所でtypeof(T).ToString()を渡すとTのクラス名が渡される なぜだ? 坊やだからさ
(2) Type.Equals((object)TypeDelegator)の判定が正常でない? Type.Equals(object)の方を呼んでTypeDelegatorのインスタンスを渡した場合のみ、 同じTypeを指していてもfalseが戻るようです。 こちらは原因がさっぱり分かりませんが、正常な判定ではないような気がします。 --------------------- というのが私の意見なのですが、勘違いぽかったらツッコミをお願いします。
>>520 すいません、もう少し詳しくお願いします。
とあるジェネリクスメソッドGeneticMethod<Nullpo>内で public void Method(Type type)としてMethod(typeof(T))とすると、 MethodにはSystem.RuntimeTypeが渡される 同じジェネリクスメソッド内から public voix Method(string typeName)としてMethod(typeof(T).ToString())とすると、 Methodには、Nullpoが渡される
>>523 申し訳ない、その場合どこが問題なのか分からないです。。
引数として渡しているのは、同じNullpoなのに、片方はなぜかSystem.RuntimeTypeが返るんだぜ なぜだ
526 :
デフォルトの名無しさん :2009/03/09(月) 20:59:00
.NET版のwikipediaってないですか? C#とMSDEとかで作られてるやつ。 社内のシステムに取り入れたいんです。
>>526 Wikipedia はないだろ。Wiki はあるけど。
>>525 typeof(T)がSystem.RuntimeTypeなのは、もちろん当然ですよね。
typeof(T).ToString()がstringなのも、やはり当然ですよね。
具体的に、どの辺が問題だというお話なんでしょう?
531 :
513 :2009/03/09(月) 21:27:58
>514 >515 .NETの機能を使えと上に言われて組んでる感じです 何でなのかは・・・よくわかりません・・・w このレスの感じだとWebBrowser使うしかな下げな感じですかね レスポンスありがとうございました
>>530 typeof(T).ToString()はstringだけどNullpoだって
typeof(T)をTypeとして渡してType(T).ToString()がSystem.RuntimeTypeなら、
typeof(T).ToString()がSystem.RuntimeTypeでないのはなんでだぜ?
>>531 ううん。
HttpWebRequest でリクエストして、結果を受け取って、
さらに Post する。
atmarkIT とかにサンプルあるよ。
話がかみ合ってないんだから、へんなたとえ話するのやめろよ
>>531 WebBrowserはGUIありきなので表示しないのなら使うべきでない
標準ライブラリにはスクレイピング用ライブラリは存在してない
自前で実装するかCodeProjectあたりから拾うかしないと駄目だな
あ、IEを非表示で使う? でもIE7から面倒になったような気がする
>>532 private static void GenericMethod<T>()
{
Method(typeof(T));
Method(typeof(T).ToString());
}
private static void Method(Type type)
{
Console.WriteLine(type);
}
private static void Method(string type)
{
Console.WriteLine(type);
}
GenericMethod<Nullpo>() の出力結果:
Nullpo
Nullpo
>>537 パソコンから「ガッ」って音がしました!
>>537 いやいや
private void Method<T>()
>>537 まだ私が何かわかってないのかもしれませんが、
Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上、
両方とも"Nullpo"というstring型インスタンスとしてWriteLine()に渡るのは、
特に不思議ではないのでは。
私が
>>517-521 で疑問視しているのは、Type型のスーパークラスであるobject型を引数に取る、
Equals(Type)のオーバーロードであるEquals(object)の結果が、Type型のそれと異なっている
のは不自然だし、そもそもEquals()の常識的に考えられる結果と齟齬しているのではないか、
ということなのですが。
>Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上 呼ばれません。WriteLineの引数の型はobject型で中でToStringを呼んでます。
542 :
デフォルトの名無しさん :2009/03/09(月) 22:40:03
コネクションプーリングってやつはado.netが勝手にやってくれるもんなんすか? プログラムでは、DBに接続してSQL発行して切断するというロジックを組んでも 内部的には切断されずに次の処理のためにセッションを保持しててくれるの??
RuntimeTypeがType.Equals(Object)の実装をオーバーライドして 単純な参照比較に変更してるのが原因みたい どう考えても明確な意図があってやってると思われるのでたぶん仕様なんだろう
>type.Equals((object)delegator); // false <= ???…(1) >type.Equals((Type)delegator); // true…(2) >delegator.Equals((object)type); // true…(3) (1)と(2)はともかく,(1)と(3)で結果が違うのはObject.Equalsの要求仕様に反してるね だけど今更こんな基礎的なとこを変えるのはありえないので仕様と考えるしかないな
546 :
デフォルトの名無しさん :2009/03/09(月) 23:17:48
動的にイベントを追加するときに もう既に追加されているかどうか確認してから 追加されてないときだけ、イベントを追加したいのだけど どうすればいいのですか?
547 :
デフォルトの名無しさん :2009/03/09(月) 23:18:08
2ちゃんねる風の掲示板で.net版ってありますか?
>>541 なるほど。
どちらにせよ、該当メソッドの実装意図から考えても不自然な挙動ではないように思います。
>>543 >>545 確かに、これは仕様と考えて対処した方が良さそうですね。
いちおう、TypeDelegatorの件(
>>517 )も気になるので合わせて報告しておきたいのですが、
こういうのってどこに報告すればよいんでしょうか。
>>546 直接には無理。追加したらフラグ立てとくしかない。
イベントというのはそういうもの。
>>548 いやTypeDelegatorは継承して必要なメソッドをオーバーライドするものなので
好きにオーバーライドして使えということだろ
NotSupportedExceptionを投げるのが既定の実装なんだから何もおかしくない
TypeDelegatorってTypeの派生クラス作るときにabstractメンバ全部実装するの面倒だから 既定の丸投げ実装を提供してるだけなんだと思う GetGenericParametersはabstractじゃないんだから当然そのまま GetGenericParametersに限らずTypeの他のvirtualメンバもTypeDelegatorでは実装されてない
551 :
550 :2009/03/09(月) 23:46:01
GetGenericArgumentsだった
>>517 これって、type.Equals()はRuntimeType.Equals()を呼んでいて、delegator.Equals()はType.Equals()を呼んでるから
結果が違うんじゃないの?
RuntimeType.Equals()は
obj == this
だし、Type.Equals()はUnderlyingSystemTypeを比較してるみたいだけど。
TypeDelegatorのUnderlyingSystemTypeはコンストラクタで代入したTypeのインスタンスのUnderlyingSystemTypeを
返してるみたい。
>>545 >Object.Equalsの要求仕様
今まで特に気にして無くて初めて知ったので読んでみたい。詳細キボン
>>549 確かにそれも一理あると思います。
ただ、ドキュメントの一行目に
Type オブジェクトをラップし、『すべての』メソッドをこの型にデリゲートします。
と書いてあるわけで、実際には委譲されないメソッドが存在するのは、
ドキュメントを読んだライブラリ利用者が期待する挙動に即しているとはいえないのでは。
>>552 MSDNのObject.Equalsのページに載ってる
>>553 そういうのは九割九分ドキュメントの方が悪いw
よくあること
重複して登録されるよ。
557 :
555 :2009/03/10(火) 00:02:27
試してみたら重複して登録される...orz。
558 :
555 :2009/03/10(火) 00:05:30
ちょうどObject.Equalsの話が出ているのでついでに書いておくと デリゲートってインスタンスが違くても参照先のメソッドが等しければ 等価って判定されるんだよね。いわゆる値比較ってやつ。 だから、イベントの登録、削除もそれを反映していると勘違いしていた...orz.
>>552 どうもそういうことみたいですね。
>>554 これのせいで2〜3日潰した方としてはかなり文句が言いたい感じですがw
むぅ〜
>>554 thx
今回引っかかってるのは
・x.Equals(y) は y.Equals(x) と同じ値を戻します。
ってやつか。
>>546 remove して add すればいい
+=は?
>>546 どこで追加したかわかってないような設計をまずやめろ
564 :
513 :2009/03/10(火) 09:04:58
>533 >535-536 遅くなったけど ありがトン 勉強してみます
デリゲートが理解できずに苦しんでるんだけど、 昔のvbでいうと、evaluate関数みたいな使い方ができるってこと?
うんにゃ
568 :
567 :2009/03/10(火) 10:18:26
あ、言い忘れてました。 ソースファイルのパスは自宅パソコンのパスになってるので このパスを実行パソコンのソリューションファイルのパスに変更できれば 直るのかなーと思っているんだけど・・・。
Mail.csを追加するときに「リンクとして追加」やってない? 普通にプロジェクトに追加しないと
570 :
567 :2009/03/10(火) 10:21:30
あああ・・・すみません。 もう一つ言い忘れが。 自宅のPCはVistaで.slnを移動して実行しようとしている環境はXPです。
リビルドしたか?
>>567 ソリューションのプロパティ→構成プロパティ→構成
でビルドすべきプロジェクトにチェック入ってる?
573 :
567 :2009/03/10(火) 10:27:18
>>569 早速の解答ありがとうございます。
slnファイルから起動しているので
既にプロジェクトに組み込まれている感じなんですが・・・。
ソリューションエクスプローラー上にもファイルの表示がされているし
Mail.csのプロパティの完全パスっていう項目も
現在のPCのパスになっているから、問題はなさそうなんですが。
一応既存の項目の追加でもう一度Mail.csを読み込んでみましたが
改善はないようです・・・。
574 :
567 :2009/03/10(火) 10:33:30
>>571 デバッグ実行時にMainFormは開けているので、
リビルドというか、ビルド自体は出来てると思うんですが
エラーウィンドウをみる限り、Mail.csを上手く読み込めてない感じかなあ?
>>572 ソリューションのプロパティには
・スタートアッププロジェクト
・プロジェクト依存関係
・デバッグソースファイル
の3項目しか表示されてないんですが
これは自分のIDEがExpressだからでしょうか・・・。
575 :
567 :2009/03/10(火) 10:43:44
うーん・・・ これは現在のPCのネット環境の問題かも知れないですね。 自宅ではGmailに接続できるのに、現在のPCでは接続できないぽ・・・。 メール関連のライブラリはTKMPって奴を使ってるんですけど こういう現象って起こりうる物でしょうか。
>>574 かも。572はPro版を見て言った。
Proでソリューションのプロパティはこうなってる。
→共通プロパティ
→スタートアッププロジェクト
→プロジェクト依存関係
→デバッグソースファイル
→構成プロパティ
→構成
てか「ビルド」メニュー→「構成マネージャ」でもひらける。
>>574 移動したらビルドじゃ駄目だよ。
念のためクリーンしてからリビルドしてみ
.cs,.sln,.csproj以外のファイル全部消してリビルドしてみて
579 :
567 :2009/03/10(火) 11:05:41
多数の返答ありがとうございます。
>>576 あー
ビルド→構成マネージャ の表示がそもそもないですね。
でもこの機能2003pro使ってた時に使ってたんで、おっしゃりたい事はわかりました。
デバッグの際にReleaseかDebugか選ぶ項目ですよね。
Expressにはないみたいですね〜。
>>577 クリーンという作業は
>>578 さんが言っているような事でしょうか・・・
すみません汗
>>578 formのresxっていうのも消したらデバッグエラーが起こるようになってしまい
プログラムが起動しなくなりました。
これも消してよかったんでしょうか。
resxも消しちゃダメ objフォルダとbinフォルダを丸ごと消すだけでいい Expressにもビルド構成はあるけど既定では表示されてないだけ ツールーオプションーすべての設定を表示 プロジェクトおよびソリューションービルド構成の詳細を表示,常にソリューションを表示 にチェック テンプレに入れるべき
581 :
567 :2009/03/10(火) 11:26:12
うは!
繋がりました!
とりあえず、obj bin releaseフォルダを全削除してリビルドを行いました。
それでも接続のセッションが上手く行かなかったんですが
imap から pop にサーバーを変更したら繋がるようになりました^^;
自宅のPCからはimap.google.comに繋がるんですけどね・・・。
不思議な事だ。
みなさんお手間かけさせてすみませんでした
今回の問題の解決にあたり、皆さんの助言のおかげで
副産物がたくさん手に入りました。
とりあえず
>>580 さんのすべての設定を表示はかましときます!
ありがとうございました〜♪
.NET のライブラリのソースコードを、 MSが公開する前から公開してたサイトがあったんだけど、どこだかわかる人います? 以前はググればでてきたんだが、今は「マイクロソフトが公開!」的なブログサイトばかりで見失ったorz
自作コンポーネントを作ってGUI上でコンポーネントを ダブルクリックしたらイベントが自動的に登録されるようなのを 書きたいんですが、分かり易いサンプルないでしょうか。
>>582 SSCLIでググればそれっぽいのが出てくるけど
実際の.NETのソースコードと同じである保証はないし公開範囲も狭いよ
やっぱりデバッグ用に公開されてるのを見る方がいい
NetMassDownloader使えばローカルに一括保存できる
>>583 [System.ComponentModel.DefaultEvent("対象のイベント名")]
class MyControl : Control {
ダウンロードながいな しかもx64もあるからさらに倍か・・
太っ腹ですねデブ
589 :
585 :2009/03/10(火) 19:04:01
早速、ダウンロードしてみたんだけど、.net2.0でSystem.Webが取得できないみたいなんだけど、 他の人もそうかな?.net3.5なら取得できるんかな。 ダウンロードできないので激しくショックだぜ
クラスの破棄について質問なのですが、 ~Class() {} 空のデストラクタを指定するだけでメモリを解放してくれるのでしょうか。 というより、必要がないのですか。
IDisposeのあるものは、Disposeをしたほうがいい。 というより、インスタンス生成時にusing句を使ったほうがいい。 IDisposeのないものは、ガベージコレクタが回収してくれるから、そのままでいい。
デストラクタでDisposeするのは絶対やってはいけないこと そもそもPInvokeでアンマネージリソース抱えてたりしない限りはデストラクタは不要 というかパフォーマンスが落ちるので不要なデストラクタは書いてはいけない
>>591-592 ありがとうございます。
必要ないわけですか。ということは、
C++でやってた後始末みたいな事がまるで不要という事ですね。
IDisposableを実装してようがしてなかろうがGCには回収される Disposeし忘れてもファイナライザで解放処理が呼ばれるように実装するのが普通だからたいがい大丈夫 ファイナライザが呼び出されてるということは今GCが走ってるわけだから, 絶対に他のマネージオブジェクトにアクセスしてはいけないし 余計な気をまわして他のオブジェクトのDisposeを呼ぶ必要もない
>>594 メモリの解放に限ってはそうだが、IDisposableは掴んでるリソースを解放するとか
最後にやらなければならないメソッドの総称という意味もあるので、
Disposeがあれば絶対に実行はすべき
596 :
594 :2009/03/10(火) 19:55:03
すまんわかりにくかったね Disposeしなくていい(してはいけない)というのはファイナライザ(デストラクタ)の中での話 クラスAがIDisposableなオブジェクトBをメンバに持ってるならA自身もIDisposableを実装して A.Disposeの中でBをDisposeするようにしないといけない その場合もファイナライザは不要
>>584 ローカルに保存したソースって、デバッグモード以外で直接見るにはどうすればいいんでしょうか。
>>597 .cs ファイルがあるから、直接見ればいいんでね?
>>599 あら、そんなのあったっけ。。。
確かめてみます。
601 :
デフォルトの名無しさん :2009/03/10(火) 21:34:01
>>595 >Disposeがあれば絶対に実行はすべき
これは明らかに間違いだと思うが。
そう設計されているクラス(よくない設計だが)でもない限りは、
基本的にはGCに任せる方がいいとされる。
もちろん必要ならDisposeやCloseを呼んでもよい。
>>601 >このインターフェイスは主に、アンマネージ リソースを解放するために使用します。
>マネージオブジェクトが使用されなくなると、同オブジェクトに割り当てられているメモリは
>ガベージ コレクタによって自動的に解放されます。
>ただし、ガベージコレクションが行われるタイミングは特定できません。
>また、ガベージ コレクタでは、ウィンドウハンドル、開いたファイルやストリームなどの
>アンマネージ リソースが認識されません。
>ガベージ コレクタを使用して、明示的にアンマネージ リソースを解放するには
>このインターフェイスの Dispose メソッドを使用します。
>オブジェクトがもはや必要でない場合、オブジェクトのコンシューマはこのメソッドを呼び出します。
コピペ君って馬鹿だな、まで読んだ。
604 :
デフォルトの名無しさん :2009/03/10(火) 21:47:21
いやいやお前のほうがバカだろ
>>603 >このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。
内容が微妙だから揚げ足取りになりがちな話題だが、
>>601 の言ってることの方が真実に近いよ。
馬鹿なコピペ君の負け。
馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。
607 :
デフォルトの名無しさん :2009/03/10(火) 21:54:33
>>602 そのどこにも「Disposeがあれば絶対に実行はすべき」
なんて書いてないよね。俺の言ってること分かってるかい?
明示的にDisposeやCloseを呼び出さなければ、
やがてGCがファイナライザを呼び出してアンマネージリソースの
後片付けをさせるってこと分かってるかい?
609 :
デフォルトの名無しさん :2009/03/10(火) 21:56:09
揚げ足取りもなにも、CLR via C# とか読めば普通に書いてあることだよね。
ともかく,必ず呼ばれることを期待した実装にしてはいけない
>>606 >>607 アンマネージ リソース=ウィンドウハンドル、開いたファイルやストリームなど
IDisposableは主にアンマネージ リソースを解放するために使用
>>606 >馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
>デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。
???
デザイン時にコンポーネントを貼り付けると自動的にDisposeが呼ばれるようになるけど
そういう話?
例えばボタンを貼り付けると、InitializeComponent()に
this.Controls.Add(this.button1);
みたいなのが追加される。
で、FormのDisposeでcomponents.Dispose();が呼ばれてる。
>>606 良く読もうな
>クラスで外部リソースを使用するが、そのクラスをデザイン領域では使用しない場合は、
>System.IDisposable を実装するか、あるいは直接または間接的に IDisposable を実装するクラスから派生させます。
>クラスがデザイン可能ではなく、外部リソースを保持していない場合は、IComponent 型や IDisposable 型は不要です。
614 :
デフォルトの名無しさん :2009/03/10(火) 22:05:39
>>611 別にIDisposableを実装していなくても、アンマネージリソースはファイナライザ中で解放すればいい。
IDisposableはGCに頼らずとも明示的にリソースを解放するための手段を与えるためのものだよ。
勘違いしているのでは?
>>612 話が通じない人だなあ。
言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
不要不急の時まで生かしておくことを許すようなことはしないだろう、
ということだよ。
まだ話が通じないとアレなので一応補足するけど、例えば
PrinterSettingDialogとかFileSaveDialogとか、いつもいるわけじゃないでしょ。
フォーム関連は生存期間が長いから少々無駄に長居してもそんなに問題にならない
617 :
615 :2009/03/10(火) 22:09:30
あーなんかわけのわからんクラス名かいちゃったけど PrintDialogとSaveFileDialogだなw
作る側と使う側じゃ、話もかみ合わないな・・・。 作る側は、必ず Dispose() を呼んでくれる、ってのを期待しちゃダメ。 使う側は、Dispose() を忘れちゃダメ。
>>615 >言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
>緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
>不要不急の時まで生かしておくことを許すようなことはしないだろう、
>ということだよ。
ああ、「必ず」とつけた人がいてその人に噛みついていたのか。
それで「必要ではない」例をあげてたと。
しかしまあそれを言うなら
>>601 の
>もちろん必要ならDisposeやCloseを呼んでもよい。
こっちだって明らかに日本語が残念な人だろう。
「必要」な場面で「呼んでもよい」ってwww
必要な場合は必ず呼べよwww
>>615 換言すれば、そのソフトでfileを一度しかopenしないと考えられるのであれば
使い終わってもcloseする必要はないということですね
死ねば?
621 :
デフォルトの名無しさん :2009/03/10(火) 22:18:55
>>618 使う側も、作る側からDisposeの確実な呼び出しが期待されているのでもない限り、
「必ず」呼び出さなきゃいけないわけじゃないよ。
以下は CLR via C# の解説ね。
一応 .NET Frameworkの開発チームにも参加していた人の意見。
一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり
推奨しません。CLRのガベージコレクタはとてもよくできているので、それに任せたほうが
いいからです。ガベージコレクタには、アプリケーションコードがオブジェクトにアクセスし
なくなるタイミングが分かっています。そしてそのタイミングが過ぎたときにだけ、オブジェクト
を回収します。アプリケーションコードでDisposeメソッドやCloseメソッドを呼び出すということは、
アプリケーションは自分がオブジェクトにアクセスする必要がなくなるタイミングが分かっている
と宣言をしていることになります。たいていのアプリケーションでは、オブジェクトが間違いなく
不要になったことがわかることはありません。
例えば、新しいオブジェクトを作成して、その参照を他のメソッドの引数に渡した場合、
そのメソッドが渡された参照を自分のオブジェクトの内部フィールド(これはルートになります)
に格納するかもしれません。メソッドを呼び出した側では、このような動作をしているかどうかは
分かりません。この場合、呼び出し側がDisposeやCloseを呼び出してしまって、その後で
他のコードがそのオブジェクトを利用しようとすると、ObjectDisposedExceptionがスローされる
ことになります。
筆者は、DisposeやCloseを自分のコードで呼び出すのは、次の2つの場合に限ることを
推奨します。1つは、リソースを解放しなければならないことが分かっている時(開いている
ファイルを削除しようとするときなど)です。もう1つは、DisposeまたはCloseを呼び出すことが
間違いなく安全で、しかもオブジェクトをファイナライゼーションリストから削除して、
オブジェクトが昇格するのを防ぐことで、パフォーマンスを向上させたい場合です。
>>619 IDisposableの目的が、主にアンマネージリソースの解放だから、
あれば実行するのは普通だと思うぞ?
この場合、ポトペタのコントロール等を持ち出して実行しなくてもいい例とするほうが狂ってる
>>621 大抵は最後の「2つの場合」に当てはまると思うんだけど
それはその人の意見に過ぎないでしょ。 > たいていのアプリケーションでは、オブジェクトが間違いなく > 不要になったことがわかることはありません。 GC のない言語は全否定? ありえないです。 アンマネージドなリソースを使うから、それらのリソースを解放する 必要があるから、Dispose() を実装する。そう考えれば、Dispose() が 用意されてるなら、不要になった時点で呼ぶべきだと思うよ。
625 :
デフォルトの名無しさん :2009/03/10(火) 22:24:11
>>621 だから
>1つは、リソースを解放しなければならないことが分かっている時(開いているファイルを削除しようとするときなど)です
がDisposeの目的だって書いてあるっていってんの
>>618 ,
>>619 だからさ、揚げ足取りのように聞こえるかもしれんがその「ダメ」とか「必要な場合は必ず」
っていう言い方は正しくないんだよ。
もっと控えめに、
(1) 占有している共有資源を他に譲りたいなら呼べ
(2) Disposeを呼ぶことをあえて避ける理由はなにもない
と表現するのが正しい。
>>601 の言っていることの方が妥当だ。
>>620 君はたぶん学生時代数学が出来なかった子だろうね。
君は必要条件と十分条件の区別がついてない。
Disposeを実装していることは、「使い終わったら必ず開放すべき資源を持っている」
ことの必要条件であっても十分条件じゃない。
つまり、Disposeを実装していることは、そのインスタンスが必ず
「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。
>>621 それどこから引用したの?それとも自分で訳したの?
628 :
デフォルトの名無しさん :2009/03/10(火) 22:27:11
>>623 >>624 君たちのも「意見」に過ぎないよね。
しかも、素人の意見と、MSの多くのソフト開発に関わった人の意見とでは、
どちらを信用すべきか目に見ていると思うが。
(一応出版社もMicrosoftの書籍に書かれていることなので、
MSの準公式見解といっていい)
まともな人の書いた書籍で、絶対にDisposeを呼び出せって言ってるのはあるの?
それを提示しないと説得力ないよね。
>>626 君は今も理屈っぽいとよく他人からバカにされるでしょ。
Disposeの目的の主な利用方法がアンマネージリソースの解放なんだから、
できる時にしておくべき。
630 :
デフォルトの名無しさん :2009/03/10(火) 22:29:21
>>627 日本語版も「プログラミング .NET Framework」という題で出ている。
>>630 原著は持ってるが日本語版を持ってないから聞いたのだが。
こんがらがってきました
つーか、呼び出しても呼び出さなくてもいいなら、 安全面に倒して(リソース不足やらを引き起こさないように) 呼び出した方がいいじゃん。 そんなこともわかんないのかな・・・
>>628 良く嫁
>たいていのアプリケーションでは、オブジェクトが間違いなく不要になったことがわかることはありません。
だから
>一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり推奨しません。
ってことだろ?
間違いなく不要になることはわからないから、一般的に推奨しないわけであって、
明らかに分かってる場合には、実行しても問題じゃないってこった。
従って、アンマネージリソースを抱えている可能性があるわけだから、
必要ないと分かっていれば実行はするべきだということになる。
なんか、原理主義者というか、細かいことにこだわる奴がいるなぁ・・・。
盲目的という感じはするね > 明らかに分かってる場合には、実行しても問題じゃないってこった。 どう考えてもその通り
>>633 そこは誰も否定してないよ。
だから微妙な話だといってるんだけど。。
>>621 の筆者が心配してるようなリソース行方不明状態は作るべきじゃないし
そういう状況は特別に注意して管理するべきであって一般にどうとかいう話じゃないと思うんだ
640 :
デフォルトの名無しさん :2009/03/10(火) 22:38:04
>>639 自分の書いたクラスだけを利用するとは限らないからなあ。
他人の書いたクラスを使う場合は防ぎようがないこともあるだろう。
つーか、言ってもない「必ず」とかの文言を勝手にでっち上げて 議論をふっかける奴って何なんだろう・・・?
「C++みたいに、メモリ解放とかしなくてもいいんですよ。 だから必ずDisposeさせようと思う必要はないんですよ?」 と過去の呪縛から解放させるためのトークが 「Disposeはすべきでない」 と理解されたらたまったもんじゃないな
まぁ、でも、コードレビューとかで「なんで Dispose() しないの?」って質問に > つまり、Disposeを実装していることは、そのインスタンスが必ず > 「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。 とか答える奴とは一緒に仕事をしたくないな。
644 :
デフォルトの名無しさん :2009/03/10(火) 22:45:21
>>640 それ他人に書いたクラスにバグがありますと同じ
Disposeが信じられないのなら、他のメソッドの動作にも信頼がおかけないだろうから、自作するしかないね
>>641 じゃあ
>>595 にある、
>Disposeがあれば絶対に実行はすべき
の絶対と「必ずの違いをとっくりと説明してもらおうじゃないか。
というか、議論にすぐ感情を持ち込む君のような奴ははっきりいって議論の邪魔。
ついでにエンジニアの資格なし。
647 :
デフォルトの名無しさん :2009/03/10(火) 22:50:44
>>645 そうやって論議を他の方向にそらしたい気持ちはわかるが、
Disposeは絶対に必ず間違いなく確実に死んでも実行すべき
もちろん必要なくなったらの話
648 :
デフォルトの名無しさん :2009/03/10(火) 22:55:14
>>647 別に明示的にDispose()を呼ばなくても、ガベコレが動けば、FinalizeがDispose(bool disposing)の方を呼ぶでしょ。
これもDisposeメソッドだから(というより本体)、結局のところDisposeは確実に呼ばれるんだよね〜。
そういう意味では、Disposeメソッドは絶対に呼ばれるべきだし、また通常はそうなっているだろう。
むやみやたらに GC.Collect() するようなコードをたまに見かけるな・・・ そんなのよりは、よっぽど Dispose() を呼び出す方がましな気がする。
Disposeが必要なのは結局のところタイミングの重要なのであって、
その意味で
>>648 の発言は基本がまったく理解できてない
651 :
デフォルトの名無しさん :2009/03/10(火) 22:59:51
わかりやすくいうとこんな感じ ■Disposeしなくてもいいよ派 手洗いをしていないからといって、必ずしもインフルエンザにかかるとは限りません。 手洗い場には人が殺到するので、余計にインフルエンザにかかるリスクが増加します。 ■Disposeしたほうがいいよ派 手洗いをしたほうが手からの感染が少なくなるのでしたほうがいいに決まっています。 混雑した場などに出かけた場合の話をしているのであって、 その場合には手を洗ったほうが感染のリスクが低下します。
652 :
デフォルトの名無しさん :2009/03/10(火) 23:00:38
>>650 Disposeを確実に呼び出すように(あるいは呼び出されるように)しろ、
と言ってる記述があっても、それは広義のDisposeメソッド(bool型を引数に取るような)
を指しているのかもしれんから、必ずDispose()を呼べと言っているのか断定しがたいってことだよ。
>>651 結論
人がいないときに(必要でなくなったら)必ず手洗いしましょう(必ずDisposeしましょう)
>>652 Disposeの実装の主な理由が、必ず実行されるべきアンマネージリソースの解放にあるんだから、
必要なくなったら必ず実装するべきってことだよ
あなたが、必要ないかどうかわからない糞設計をしているのなら、
あなたが断定できないから実行できないということに関しては同意する
>>651 だから違うよ。
わかりやすく、とか言ってる奴が話の筋が読めないってなんの笑い話?
あるクラスがDisposeを実装してるからといって、
必ずしも「必ず」使い終わったら呼ぶ必要があるとは限らないって話だよ。
必ず呼ぶべきクラスもあれば、そうでないクラスもあるってこと。
この程度の簡単な話が理解できない人間はプログラマやってちゃあかんと思うなあ。
656 :
デフォルトの名無しさん :2009/03/10(火) 23:05:12
>>654 必要ないかどうか分からない糞設計とか言い出したら、ガベコレ自体否定している。
そして明示的にマネージオブジェクトを解放できないC#を否定していることになる。
>>655 呼ぶ必要がある、ない、ってのはどうやって判断するの?
658 :
デフォルトの名無しさん :2009/03/10(火) 23:09:46
明示的にDisposeで解放しなくとも、オブジェクトが確実に必要なくなれば、 ガベージコレクタによって保有するリソースは解放されるだろう。 少なくともFCLのクラスは、そこまで待っていても不具合はないだろ。 メモリが惜しけりゃ明示的に呼び出せってだけのことなのでは?
>>655 自分が作成したインスタンスで、そのインスタンスが役目を終えたと判断できたら
Disposeしましょうってことを言ってるんじゃん。
話の流れを読めてないのはお前でしょ
お前ら楽しそうだけど、(初心者用)で盛り上がるネタじゃないと思うんだ
661 :
デフォルトの名無しさん :2009/03/10(火) 23:11:08
言葉が抜けてて誤解を招きかねないので訂正 ガベージコレクタによって「Finalize、そしてDispose(bool)が呼ばれた結果」保有するリソースは解放されるだろう。
かなり前に、GotDotNet で盛り上がったネタだしね。
>>657 MSDNライブラリ+常識
だから、明示的にDisposeすべきかどうかはそのクラスが占有している
共有資源がどの程度希少かという問題と同義で、そんなことは常識でだいたい
わかるじゃん。
>>659 だから、そのテーゼは常に真ではない、という話をずっとしてるんだがな。
悪気はないけど、君はこういう話題をするには頭が悪すぎるみたいだねw
665 :
デフォルトの名無しさん :2009/03/10(火) 23:13:58
>>656 あたまの悪い人だなぁ
>必要ないかどうか分からない糞設計とか言い出したら、ガベコレ自体否定している。
>そして明示的にマネージオブジェクトを解放できないC#を否定していることになる。
アンマネージリソースの解放って言ってるのに、なんでカベコレそのものの否定とかの話になんの?
FileをOpenして、Closeするまでガベコレの動作を待てってどんなソフトなの?
>>663 ぽかーん・・・
そんな各開発者で異なりそうな基準なら、安全側に倒して、
必ず Dispose() すること、って規約にするよ。
>>664 常に真ではないが、ほとんど真だ、という話をずっとしてるんだがな。
悪気はないけど、君はこういう話題をするには頭が悪すぎるみたいだねw
668 :
デフォルトの名無しさん :2009/03/10(火) 23:18:12
>>665 そのファイルを開きっぱなしであることが、
色々な意味でコストがかかるなら、明示的にCloseするだけでしょ。
そうでなく、しかも閉じる必要がなきゃ、別に放置しておいても問題ない。
必要かどうかの管理をプログラマに強いるのはC#の思想じゃないでしょ。
CやC++ならそういう態度でいいけど、C#じゃ基本的にガベコレ任せだ。
アンマネージリソースについては凄く敏感なようだけど、マネージリソースについては何も思わないの?
ガベコレが動くまでメモリを占有し続けたままって。
そういうのが気になるならC++とかやってりゃいいのでは?
確かに、Dispose() で何もしないクラスは存在する。 が、IDisposable() インターフェイスがアンマネージドリソースの解放目的に用意されている以上、 Dispose() メソッドを実装してるなら、それを呼ぶ必要があるってケースの方が多いだろうね。
>>666 それはそれでいいんじゃないの?
それと今の話は別問題だよ。わかるよね?
>>670 イレギュラーケースをたてに、Dispose() を呼ばなくてもいい、って
言い張ってる奴がいる、ってのは理解してます。
>>668 >色々な意味でコストがかかるなら、明示的にCloseするだけでしょ。
必要なくなったら閉じるのが当たり前でしょ。
必要なときに閉じないのは当たり前でしょ。
何言ってるの?
>アンマネージリソースについては凄く敏感なようだけど、マネージリソースについては何も思わないの?
Disposeの実装の主な理由がアンマネージリソースの解放にあるんだから、
アンマネージリソースについて語るのは当たり前でしょ。
GC なしの C#、あったら使ってみたいなぁ。
>>670 なんで?
どこでオブジェクトが再利用されるかわからないから、
Disposeすべきなんじゃなかったの?
だんだん主張がおかしくなってきていますな
>>671 だからそんなことを言ってる奴はいなんだよ。
頭の悪い奴は議論に参加しなくてよろしい。
>>674 訂正
>どこでオブジェクトが再利用されるかわからないから、
>Disposeするべきでないんじゃなかったの?
>>621 の解釈よりw
677 :
デフォルトの名無しさん :2009/03/10(火) 23:25:51
>>672 だから、Dispose()を明示的に呼ばずとも、結局、
最終的にFinalize経由でリソースの解放は行われる。
結局のところタイミングの問題だけでしょ。
Disposeを絶対呼べ、って言ってるぐらいメモリ資源に敏感なのに、
明示的解放のできないマネージリソースは完全にGC任せのC#を使っているのは何故かなあって思うんだが。
アンマネージドリソース = メモリ と間違った理解をしてるのもどうかと思うけどな・・・
>>674 今の話題はDisposeを実装しているクラスは必ずDisposeすべきか。
俺の意見は否だけど、だからといって「必ずDisposeを呼べ」という規約が
ナンセンスとは断定できない。
例えばC#のコンパイラにとってはインデントは無視するだけの存在の「いらない子」だけど、
だからといって「ちゃんとインデントしろなんて規約はナンセンスだ」なんて
誰も言わんでしょ。
それとこれとは別問題だから。
>>675 じゃあ、どこに問題があるか個別に○×つけてくれよ
1 IDisposableは主に、アンマネージ リソースを解放するために使用する
2 アンマネージリソース(File Openなど)を所有していた場合、必要なくなったら解放する必要がある。
3 必要がなくなったらDisposeを実行してリソースを解放すべき
どこがおかしい?
>>675 Finalize が呼んでくれるから、Dispose() は明示的に呼ばなくてもいいんじゃないの?
682 :
デフォルトの名無しさん :2009/03/10(火) 23:30:29
まとめ IDisposableを実装するクラスに求められる最低限度の機能は、 好きなタイミングで明示的にDispose()を呼び出して、アンマネージリソースを解放するということだけ。 この最低限度の実装しかしていないクラスなら、Dispose()は絶対に呼ばなきゃいけない。 でもこれじゃ、もしDispose()を呼び出すのを忘れた場合に、 アンマネージリソースは解放されずに残ってしまう。 そこで安全弁として、まともなクラス(FCLなど)では、 Finalize経由でもDispose(bool disposing)を呼び出してリソースの解放が行われるようになっている。 そういうクラスでは別に明示的にDispose()を絶対に呼び出さなきゃいけないわけではない。
超初心者ですいません visual C♯をやっててコンボボックスの規定値?を表示させるにはどうしたらいいんですか? 普通コンボボックスはドロップダウンのリストから文字を選んだらそれが表示されると思うんですが、 ドロップダウンリストから選ぶ前から既定の文字を表示させておきたいんですがどうやればいいんでしょうか? それとコンボボックスで選んだものによってボタンを押したときの処理を分けるにはどうしたらいいんですか? 説明分かりづらすぎですいません
∧∧ ∩ (`・ω・´)/ ハ_ハ ⊂ ノ ハ_ハ ('(・ω・´∩ (つ ノ ∩`・ω・)') ハ_ハ ヽ 〈 (ノ 〉 / ハ_ハ ('(・ω・´∩ ヽヽ_) (_ノ ノ ∩`・ω・)') O,_ 〈 〉 ,_O `ヽ_) (_/ ´ ハ_ハ 知 ら ん が な ハ_ハ ⊂(・ω・´⊂⌒`⊃ ⊂´⌒⊃`・ω・) ⊃
>>683 SelectedIndex を設定 or 読み取り
>>682 矛盾してるぞ?
>IDisposableを実装するクラスに求められる最低限度の機能は、
>好きなタイミングで明示的にDispose()を呼び出して、アンマネージリソースを解放するということだけ。
>この最低限度の実装しかしていないクラスなら、Dispose()は絶対に呼ばなきゃいけない。
IDisposableを実装していれば、いつかはDisposeは実行されるんだろ?
その理屈なら呼ぶ必要なんてないじゃん
>>682 つーか、そんなのはみんなわかってて、「で、どうすべきか?」って話をしてると思うんだけど。
必要あるかないかが内部実装に依存する以上、呼び出すべきって意見と、
Finalize で呼び出されるんだから、別に呼び出さなくてもいい、って意見だろ。
>>682 返答よろしく
1 IDisposableは主に、アンマネージ リソースを解放するために使用する
2 アンマネージリソース(File Openなど)を所有していた場合、必要なくなったら解放する必要がある。
3 必要がなくなったらDisposeを実行してリソースを解放すべき
どこがおかしい?
>>688 俺は Dispose() するべき派だから、どこも間違ってない(正しい)と思います。
>>682 >そこで安全弁として、まともなクラス(FCLなど)では、
>Finalize経由でもDispose(bool disposing)を呼び出してリソースの解放が行われるようになっている。
>そういうクラスでは別に明示的にDispose()を絶対に呼び出さなきゃいけないわけではない。
こういうケースもあるから一概にそうとも言えないと思うがな。
StreamWriterのFlush/Close/Disposeを呼ばない場合
書き込みキャッシュの内容がフラッシュされないので内容がロストする。
ファイルは確かにクローズされるんだけど。
もちろんStreamWriterにはDispose(bool disposing)があるぜ。
ttp://msdn.microsoft.com/ja-jp/library/ms172236.aspx static class Program
{
static void Main(string[] args)
{
var sw = new StreamWriter(@"c:\test.txt");
sw.Write("A");
}
}
Disposeに関してはもはやアンマネージリソースかどうかに拘っても意味がない気がする。
アンマネージリソースが解放されずに残るわけじゃないとはいえ
このケースでDisposeを呼ばなくて良いと言うのは無理がありすぎる。
どのオブジェクトがどれだけアンマネージリソースでメモリ圧迫してるかなんて GCには全くわからないんだよ GC.AddMemoryPreassureなんて極めてチープな機能があるくらい
692 :
デフォルトの名無しさん :2009/03/10(火) 23:41:54
>>686 違うだろ。IDisposableを実装しているだけじゃ、Disposeが絶対に呼び出されるとは限らない。
例えば自分で作ったクラスでIDisposableを実装して、Finalizeでリソース解放処理をしなければそのまま残る。
しかしFCLやそれに準拠した規範的なクラスでは、確実にFinalize経由でリソース解放されるようになっている。
そういうクラスを使うのであれば、別にDispose()を絶対呼び出す必要があるとまではいえない。
そうでないクラスであり、Finalize経由での解放が保証されていないのであれば、Dispose()は絶対に呼び出すべき。
>>688 別におかしくはないよ。でもそれはIDisposableの「最低限度の実装」をしたクラスについてだよね。
でも実際にIDisposableを実装したクラスは、それ以上の実装をしているのが普通なわけ。
まあ本音と建前みたいなもんだな。
言い争ってる奴ら馬鹿だろ。少しは落ち着けよ
>>692 >別におかしくはないよ。でもそれはIDisposableの「最低限度の実装」をしたクラスについてだよね。
>でも実際にIDisposableを実装したクラスは、それ以上の実装をしているのが普通なわけ。
最低限がアンマネージリソースの解放で、それ以上の実装をしているなら、もっと実行しないと駄目だろ。
695 :
デフォルトの名無しさん :2009/03/10(火) 23:45:45
>>690 それは完全に別問題では?
Flushの動作はIDisposableの実装で求められている動作とは関係ないし。
内容がロストすることが常に不具合とも言い切れないし。
例えばユーザが明示的に「保存」を選択するまで保留するという手もある。
696 :
デフォルトの名無しさん :2009/03/10(火) 23:46:43
>>692 >実際にIDisposableを実装したクラスは、それ以上の実装をしているのが普通
どんなすごい実装をしているかどうかなんてわからんだろ
だからDisposeしろって話になってるのがわからんのか?
697 :
デフォルトの名無しさん :2009/03/10(火) 23:47:06
>>694 それ以上の実装をしていれば、「アンマネージリソースの解放」は
明示的にDispose()を呼ばずともサポートされる。
もちろん明示的に呼び出すこともできる。
>>695 お前が荒らしレベルで、プログラマとして最底辺だということがわかったよ
699 :
デフォルトの名無しさん :2009/03/10(火) 23:49:30
>>696 FCLのクラスについては実質保証されてるでしょ。
心配ならDispose(bool disposing)などが実装されているかMSDNで調べればいい。
原則としてDispose()を呼ぶという態度はいいとしても、
FCLのクラスに対して特別扱いするのは別に不自然じゃないと思うぞ。
基本はGCに任せるほうが必要or不必要の判断に関しては確実だしな。
>>697 へーGCによってDispose()が実行されなくとも、プログラマが明示的にDisposeを呼ばずとも
自動的に解放してくれるわけね
すごいね
>>695 それだと保存が押されたらDisposeすると言っているように感じるが、
その意図でレスしたの?
702 :
デフォルトの名無しさん :2009/03/10(火) 23:51:29
>>698 もしFlush()が確実に必要な処理なら、MicrosoftはファイナライザやDisposeでFlush()されるように実装している。
そうなってないってことは、Flush()は必ずしも必要とされていないということだよ。君こそ大丈夫か?
>>699 >FCLのクラスについては実質保証されてるでしょ。
なんでいきなり条件を付けた論議なの?
と言うかさ、精神衛生上Disposeしないと気持ち悪くない? usingで囲むべきだと思うがね
MS のやることは正しい、MS の開発者の意見は正しい、 って盲目的だなぁ。 Dispose() を呼ぶことで安全が買えるなら、よっぽど その方が楽でしょ。
>>697 どうやって明示的にDispose(closeその他も)しなくて、
アンマネージリソースが会話されるの?
707 :
デフォルトの名無しさん :2009/03/10(火) 23:54:00
>>701 違う。保存が押されてから、Flush()なりClose()なりを呼べということだ。
もちろんソフトによりけりなので、すぐにFlush()やClose()を呼んだほうがいいこともある。
しかし保存が押されてからストリームに反映させたい仕様だと、すぐにFlush()するのは良くないだろう。
>>704 using なしでも、スコープ抜けたら自動的に Dispose() が呼び出されるくらいでいいと思う。
何かしらの理由で呼ばれたくないときだけ、何かのメソッドを呼び出してマークするとか。
>>702 そのために必要なのが、Disposeでしょ?
IDisposableが、なんでインターフェースとして存在しているか理解してる?
>>708 c++/CLRはスコープ抜けるとDisposeが実行されるね
711 :
デフォルトの名無しさん :2009/03/10(火) 23:56:56
>>704 どうしてアンマネージリソースにだけそう思うのか不思議。
>>705 Dispose()を呼び出すことによるその後のトラブルもありうるわけで。
>>706 まともなクラスなら、Finalize()経由でリソースは解放される。
マトモじゃないクラスなら、そんな仕様はないので、
自ら確実にdispose()を呼び出す必要がある。でもそれを忘れると、
メモリリークなどの危険性があるので、そんなクラスの使用はおすすめできない。
Disposeを呼ばないとマネージリソースの不足によって致命的な不具合が 発生する可能性があるけどDisposeを呼ぶことで問題になる可能性はない だから呼ぶべき .NETのGCはマネージリソースを適切に管理するためのもので、 アンマネージリソースに関してはほとんどのクラスで解放までの サポートはあってもそのタイミングに関しては関知しない よってタイミングをGCにまかせるという選択肢はない
>>711 Dispose() を呼び出したことによるトラブル、って今のところ出会ったことがない。
どんなトラブルがあんの?
>>702 >もしFlush()が確実に必要な処理なら、MicrosoftはファイナライザやDisposeでFlush()されるように実装している。
>そうなってないってことは、Flush()は必ずしも必要とされていないということだよ。君こそ大丈夫か?
残念ながらMSの公式見解は違う。
あんまり推測で適当なこと言わない方が良いよ。
ttp://blogs.msdn.com/bclteam/archive/2004/08/13/214405.aspx >The reason is that (normal) finalizers aren't ordered -
>any two objects may be finalized in any order,
>or at the same time if we add multiple finalizer threads in a future version.
というわけで解放順の問題。
>>711 なるほど、FileをOpenするクラスや、データベースへの接続はするべきじゃないということですね。
あんたが普通に開発したこともないプログラマだということがよくわかったよwww
結局
>>678 が真理だったな
「アンマネージドリソース=メモリの消費」
だと思っていたサンデープログラマか。
死んでいいよ。
メモリの消費に関してもDisposeは必要 アンマネージメモリは完全にGCの管理外だから マネージメモリみたいにメモリ使用量と照らし合わせてGCが適切に管理してくれたりしない
>>702 それは違うと思う。
ファイナライザの段階では先に中のStreamが無くなっている可能性があるため、
StreamReaderとWriterはFlushを呼びたくても呼べない。
一般にファイナライザでメンバがまだ残っている保証はないとMSDNにも書いてあるはず。
719 :
デフォルトの名無しさん :2009/03/11(水) 00:03:13
>>715 そこにnormalって書いてあるとおり、それは普通の方法ではの話だろう。
そりゃ普通のFinalizeじゃ他のマネージオブジェクトにアクセスすべきではない。
しかし、もし確実にFlush()される必要があるなら、Attributeなどを使ってでも確実に実行されるようにするよ。
結局しないのは技術的問題というより、そうしないのが自然だからだよね。
>>716 ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、
リソースは解放される。
たかがDisposeごときでこんなに熱くなれるとは
721 :
デフォルトの名無しさん :2009/03/11(水) 00:07:26
>>717 誰もそこは否定していないのでは?
ただ、アンマネージリソースを有するマネージオブジェクトの
寿命自体はGCで判断できるから、GCがそのFinalizeを呼び出してから、
アンマネージリソースを解放するというのでも通常遅くは無い。
それだけの話だと思うが。
>>719 >ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。
>ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。
>ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。
言ってる事理解してる?
>通常遅くは無い。 これが間違い
関係ないけど解放処理が必ず実行されることを保障するには普通のファイナライザでは不十分 CriticalFinalizerObjectを使うことになる
725 :
デフォルトの名無しさん :2009/03/11(水) 00:11:59
>>723 遅くはないな。それが間違いというなら、C#のGC自体を否定しなきゃいけないかも。
GCが参照されていないインスタンスを破棄するタイミングが制御できないといっても、
通常そこまで時間はかからない。必要がなくなりゃどのみち勝手にリソースは解放される。
そのタイムラグが気になる状況なら明示的にDispose()を呼び出せ、としか言いようが無い。
ところで.NET Frameworkってプロセス終了時にすべてのオブジェクトの ファイナライザが呼ばれることが保証されてる?
>>725 >そのタイムラグが気になる状況なら明示的にDispose()を呼び出せ、としか言いようが無い。
この後の及んで着地点かw
保証されてません
usingやfinallyも同様です
>>724 のようにCriticalFinalizerObjectを使う必要があります
>>725 C#のGCはマネージリソースを管理するためのもの
話をまぜるな
>通常そこまで時間はかからない
だから通常とか普通とか適当なこというなって
730 :
デフォルトの名無しさん :2009/03/11(水) 00:15:07
>>727 最初からそういう話だと思うが。
誰もDispose()を呼び出すななんて言ってない。
「絶対呼び出せ」とか言ってる人がいるから叩かれるだけで。
少なくともFCLの多くのクラスでは、絶対に呼び出す必要まではない。
731 :
デフォルトの名無しさん :2009/03/11(水) 00:17:26
所詮おまえらなんか糞プログラマなんだよ
>C#は生産性高い。
>オブジェクト指向と関数型と手続き型が交じり合って溶け出すような見事なソースコードが作れる。
>しかし2chとか見ててもついてけてる奴はあまりいないみたいだな。
>ちょっと前に2chで関数型ユーザーを叩いてみた
ttp://d.hatena.ne.jp/haruyutaka/20090208/p3 「しかし2chとか見ててもついてけてる奴はあまりいないみたいだな。」
これが真実
732 :
デフォルトの名無しさん :2009/03/11(水) 00:17:54
>>729 アンマネージリソースをC#のクラスにラップして利用してるんだから、
マネージリソースやGCは無関係ではないよ。
アンマネージリソースを解放すべきときは、
それをラップしたマネージリソースが不要になるときでもあるからね。
そのクラスのインスタンスが不要かどうかの判断は、
GCが一番良く知っている。GCに頼れば、他から参照が残っていたり、
解放したあとにそのインスタンスを利用することもないだろう。
分からないので教えてください。 カスタムコントロールのリストをもたせたクラス用のCollectionEditorを作っています。 リストはカスタムコントロールの基底クラス(abstract)の集まりなので、 [Attribute]を使って登録する派生クラスのTypeを登録しようかと思ってます。 今、派生クラスの定義のところに [Attribute名(typeof(派生クラス名))] としているのですが、typeof〜の部分なしで同じようなことをする方法はありませんでしょうか? ToolStripとかを見ていると上手くやっているように見えるのですが…
>>730 少なくともお前の作ったソフトだけは使いたくない
これはここにいるすべての人が一致するところ
で、Dispose() を呼び出したことによるトラブルの実例はまだ?
737 :
デフォルトの名無しさん :2009/03/11(水) 00:21:34
>>733 ごく当たり前のことを言ってるに過ぎない。
そもそも、そこまでリソースのマネジメントに敏感にならざるを得ない状況なら、
C/C++などを使うべきだと思うよ。
もちろん、じゃあどんな場合もDisposeするなとも言ってないのであしからず。
>>737 >もちろん、じゃあどんな場合もDisposeするなとも言ってないのであしからず。
どんどん変わってきてるじゃん 主張が
>>737 じゃ、アンマネージドリソースを解放する場合などには、
Disposeする必要があるということは理解したということだな?
740 :
デフォルトの名無しさん :2009/03/11(水) 00:24:13
>>736 上で紹介されてるじゃん。
あるオブジェクトが、他のクラスのメンバから参照されているときに、
そうと知らずにDisposeしてしまうケースとかね。
>>738 最初から同じ主張ですが。
741 :
デフォルトの名無しさん :2009/03/11(水) 00:25:23
>>739 Dispose()じゃなくてDisposeなら、そう。
てか何度も言ってることだが。
Javaでメソッドの終わりに必ずnullを代入しろとかいう(基地外みたいな)話の延長みたいだな
>>731 ソースコードによる自動シリアライズ に噴いたwwこの発想はなかったwww
>>741 じゃ、互いの主張は一致したな。
アンマネージドリソースを使用している可能性があり、
もうこれ以上必要がなくなったらDisposeする
これでいいな?
>>734 言ってることがよくわからない
その属性をどうやって処理するつもり?
というか、必要条件と十分条件の区別程度の知恵もない人間が プログラマやっちゃダメだと思うんだが、このスレ見ると日本のプログラマって 本当底辺の職業なんだなという思いを深くするな。 だから、可及的速やかに開放すべき共有資源を抱えているクラスは必ずDisposeを 実装しているが、逆は真ならず、それだけの話なんだが。。
>>746 「必ず」とは限らない。バグのあるクラスもあるからね。
お前さんの言ってるのは↑こんなレベルなんだが。
>>746 というか、文意や話の流れ程度を読む知恵もない人間が
プログラマやっちゃダメだと思うんだが、このスレ見ると日本のプログラマって
本当底辺の職業なんだなという思いを深くするな。
だから、可及的速やかに開放すべき共有資源を抱えているクラスばかりが必ずDisposeを
実装しているわけじゃないってところをぐだくだ言ってるやつがいるという話なんだが。。
いやソースコードに意味があるのか
ここって一応初心者スレなんだよな・・・ なんか自信なくなってきた 皆凄すぎ やっぱ参考書3,4冊じゃまだ追いつけない
IDisposable継承してるとGC上の世代が繰り上がって 解放が遅れるんじゃなかった?
IDisposableはGCと直接は無関係 実装するとGCのタイミングが遅れるのはファイナライザ
>>751 初心者スレだからこんなことで熱くなるんだよ。
いまどきDisposeでこんな話になるとはね IDisposableはインターフェースで実装されてるんだから あれば実行すべきなんだよ 全部自動なんだぜって話ならobjectにdisposeが実装されてる
冷蔵庫を開けっ放しにしていても、ママンが気付いて閉めてくれるから、自分で閉める必要はないし、 部屋を散らかしていても、ママンが片付けてくれるから、自分で片付ける必要はない。 ってことだろ?
>>753 ありがと
勘違いしてた
必ず一回目のgcで生き残ってしまうため、結果的に世代が上がってしまうって理由もさっき知った
>>756 ママンはちらかった部屋をいつ片付けてくれるかわからない
A. だから自分で片付けたほうがすっきりして気持ちがいいんだぜ
B. でもいつかは片付けてくれるんだから放置しとくんだぜ
ってことじゃね?
759 :
デフォルトの名無しさん :2009/03/11(水) 00:56:01
電機式ストーブに喩えるなら、 ・Dispose別にいらないよ派 「サーモスタットがついてる器具なら、温度は一定以上にならないから、別にこまめに電源切る必要はないよ」 ・Dispose呼んだほうがいいよ派 「サーモスタットついてるかもしれないけど電気代の節約のためにこまめに切ったほうがいいよ。」 ・Dispose絶対要るよ派 「ストーブにそんな機能あるかどうか分からないから、とにかく切ったほうがいいよ」
760 :
デフォルトの名無しさん :2009/03/11(水) 00:58:04
>>758 C#の場合は、
ママが片付けてくれるものは放置してママに任せて、そうでないものは仕方が無いから自分でするしかない
だな。
761 :
デフォルトの名無しさん :2009/03/11(水) 00:58:31
>>758 というより
ママンがいつ冷蔵庫を締めてくれるかわからない
A 冷蔵庫にはアイスが入っていて、溶けると嫌だから自分で締めるぜ
B 冷蔵庫にはアイスが入っていなくてどうでもいいからママンに任せるぜ
ってことかな?
何か違う
>>761 さっきの奴は、アイスが入っているのにBを選択してしまって、
「溶けてはいるが、溶けてもアイスであることに変わりはない」
って主張していたってことか
納得
いや意味不明だろw
アイスが入っているかどうかは、MSDNライブラリと常識で判断しろってさw
「常に呼ぶ」「常に呼ばない」のどちらかに決めようとするからおかしい。
MSDNライブラリには、 アイスが入っている場合に冷蔵庫を締めるためにIMamanableを利用します って書かれているんだが・・・
初心者スレにふさわしい流れにほっこり
>>766 IMamanableは、アイスが入っているので締めてね?というために実装するインターフェースです
従って常にアイスが入っているので、締めないとアイスが溶けちゃうんです
>>767 そうなんだけど、実際にアイスが入ってるかどうかは常識で判断しろ、
って言い張ってる奴がいるのよ。
確かに、レアケースで入っていると見せかけて入ってないことがないわけ
じゃないんだけどさ。
771 :
デフォルトの名無しさん :2009/03/11(水) 01:12:03
そもそもアイスのメタファーが不適切
773 :
デフォルトの名無しさん :2009/03/11(水) 01:14:39
早くリソースを解放したいなら呼び出せばいい。 そうでないなら必ずしもこだわる必要はない。それだけのことだな。
ようは、「常に」「必ず」「絶対」が、100回中100回なのか、 100回中95回なのか、って話。 前者にこだわる原理主義者と、後者でいいじゃんっていう 一般人の戦い。
Dispose呼ばないとおかしくなる可能性がある どのクラスがどれだけヤバいかは内部実装によるので外部仕様から正確な判定は困難 なら、必ず呼んどけ というのは別におかしなことじゃない それを 呼ばなくてもよい場合がある それは常識で判断できる だから呼ぶか呼ばないかは常識で判断しろ なんていうやつがいるから混乱する
>>770 それは、アイスが入っていないのに、アイスが入ってるから締めてねって言うようなもんじゃんw
アイスが入ってると思って締めざるを得ないw
777 :
デフォルトの名無しさん :2009/03/11(水) 01:17:23
>>775 それはクラス設計に問題が…
「Dispose呼んでもバグがある可能性があるから、
呼ばないほうがいい」って言ってるのと、内容は正反対でも同レベルだぞ。
>>774 その残りの5回中にFileStreamを開いたり、DBに接続してたりしてたら
問題になるから回数や割合の問題じゃないんだが・・・
>>775 だからファイナライザでDispose処理をしておくことが推奨されている
IDisposableを実装するなら、別にファイナライザを定義する必要はないが、
最終的にリソースが解放されるようにしておくのは当然
>>777 全然違う
Disposeはインスタンスの寿命が終了することを前提で呼ばれるメソッドで、
設計もそのようになされているから、インスタンスを使わなくなった時に
Disposeを実行して問題が発生するようなら、むしろそのほうがおかしい。
>>778 でも、呼んだら問題が発生するから呼ばないでください、って注意書きがあれば
呼ばないでしょ?
ほら! 100回中100回じゃないじゃないか! って言ってるのが原理主義者。
782 :
デフォルトの名無しさん :2009/03/11(水) 01:22:45
>>779 リソースの即時解放として実行するのはまったく問題ないじゃん
783 :
デフォルトの名無しさん :2009/03/11(水) 01:23:56
>>780 そういうこと言ってるんじゃなくて、Disposeメソッドそのものに
バグがあるかもしれないでしょってことを言ってるんだが
Dispose呼ばなきゃ不具合が起きるクラスなんてそれと同レベル
>>781 それアイスが入ってるけど、冷蔵庫しめないで下さいねって注意するぐらい愚問
785 :
デフォルトの名無しさん :2009/03/11(水) 01:25:51
リソースはアイスではない
786 :
デフォルトの名無しさん :2009/03/11(水) 01:27:46
>>783 終了処理を行わないと問題が起きるAPIなんて糞あるだろ?
その終了処理を行うために実装されるのがIDisposableで、Disposeなんだから、
極端に言えば、Dispose呼ばなきゃいけないと不具合がおきるクラスなんて
腐るほどあるからDisposeしたほうがいいっていってるわけ。
これが、なんで理解できんの?
787 :
デフォルトの名無しさん :2009/03/11(水) 01:30:39
>>786 C使って生API叩いてるなら至極正論だが、
.NETの世界でC#使っているなら、そうじゃいけないだろ。
結局、「メモリを確保したら必ず忘れずに解放しましょう」
っていう単純なルールを守るのが一番難しいし、ガベージコレクタの
無いCのような言語では最もエラーの温床となりやすい。
そのエラーを極力無くしましょうってのがC#なんだから、
終了処理を必須とするクラスの設計は避けたほうがいい。
>>787 >終了処理を必須とするクラスの設計は避けたほうがいい。
だから、終了処理が必須だからDisposeがあるといってるんですw
789 :
デフォルトの名無しさん :2009/03/11(水) 01:32:30
>極端に言えば、Dispose呼ばなきゃいけないと不具合がおきるクラスなんて まずこの具体例を挙げて。どういう状況かもコードつきで詳しく。
790 :
デフォルトの名無しさん :2009/03/11(水) 01:33:52
>>788 終了処理の明示的な呼び出しを忘れてもカバーできるように
設計することが推奨されているし、そうするのが当然。
791 :
デフォルトの名無しさん :2009/03/11(水) 01:36:36
>終了処理が必須だからDisposeがある またデマカセが始まったw
無限ループって怖くね?
>>790 すぐに解放しないと問題がある場合があるから、
すぐにした方がいいっていってるんじゃんかよ
break
>>791 いやMSDN読めば?
そういう目的のために存在するんだから、必須だからDisposeがあると考えるのが必然
>>793 すぐに解放しないと問題が起きるならすぐにすべきに決まってるだろ。アホか?
>>796 >終了処理を必須とするクラスの設計は避けたほうがいい。
って言う奴がいるから、わざわざ指摘してるんでしょうがw
798 :
デフォルトの名無しさん :2009/03/11(水) 01:43:24
>>795 どこにそういうことが書いてあるの?きちんと引用して示してね。
800 :
デフォルトの名無しさん :2009/03/11(水) 01:45:42
>>799 ごまかさないで示せよ
「終了処理が必須だからDisposableがある」なんてどこに載ってるの?
802 :
デフォルトの名無しさん :2009/03/11(水) 01:48:21
>>801 「終了処理」なんて言葉は書かれていないよね。
ごまかさないようにね。
アンマネージリソースの解放 → 終了処理 かもしれないけど、
終了処理 → アンマネージリソースの解放 は成り立たないからね。
十分条件・必要条件も分からないバカが書き込みしてるのかな?
言葉はきちんと使おうね。まあ揚げ足取りだと吠えるしかできないんだろうけどw
>>802 はいどうぞ
>このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。
804 :
デフォルトの名無しさん :2009/03/11(水) 01:50:33
>>803 あのー頭悪いんですか〜?
「終了処理」という言葉を聞いてるんだから、
せめてその言葉が出てくるところを引用しようね。
屁理屈の応酬だあ
>>804 いやいや、明示的なオブジェクトを破棄するためにDisposeを実装するんだから、間違いじゃないだろ?
何いってんだ?ww
>>804 >「終了処理」という言葉を聞いてるんだから、 せめてその言葉が出てくるところを引用しようね。
必要条件とか言ってるんだから、意味を汲む能力ぐらいあんだろ?
808 :
デフォルトの名無しさん :2009/03/11(水) 01:54:33
>>806 横槍だが、どんどん無知が露呈してるぞ
明示的なオブジェクトの破棄ではなく、明示的なアンマネージリソースの破棄な
オブジェクトというとマネージオブジェクトも含むように聞こえる
809 :
デフォルトの名無しさん :2009/03/11(水) 01:55:55
>>807 なんだ、結局「終了処理」ってのは示せないままか。
とんだヘタレだなwww
で、この無意味な言い争いで誰が特をするのか
>>808 暗黙的なガベージコレクタでの破棄はFinalize
明示的なオブジェクトの破棄はDisposeだっていってんだろ?
必要条件とかを覚える知識だけあって、文意を汲み取る能力はゼロかよ。
何を今更
>>809 オブジェクトを解放する処理=終了処理と換言しただけでしょうが。
その言葉を使用した文献が見あたらないと負けなの?w
そういう意味の文献があればいいんでないの?w
しぬの?w
ここまで自演でした。
816 :
デフォルトの名無しさん :2009/03/11(水) 01:59:51
>>811 完全に間違い。
Disposeはマネージオブジェクトを破棄するところではないし、
破棄できるものでもない。オブジェクト≠アンマネージリソースだよ。
カーネルオブジェクトとかだけをさす言葉じゃないから。
聞いてると用語の使い方が甘い印象を受ける。素人さんかな?
817 :
デフォルトの名無しさん :2009/03/11(水) 02:01:14
>>814 だからオブジェクトじゃないと何度言ったら…。
あ、そっか。荒らしだったのか。相手にするだけ無駄だな…。
ここまですべて女子高生の書き込み
>>816 >>817 だから、.netで管理できないリソースを明示的に解放するためにDisposeがあるっていってんの
>>817 >このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。
んで、これに対する返事もらってないんだけど?
ROMってたけど俺みたいな初心者が見てると気持ち悪くなるわ 何が正しいのやら… 口論終わったらまとめてくれるとありがたい じゃ、おやすみノシ
822 :
デフォルトの名無しさん :2009/03/11(水) 02:11:35
>>821 Disposeがあればしておけば間違いない
たったこんだけ
823 :
デフォルトの名無しさん :2009/03/11(水) 02:14:06
顔真っ赤にして書き込みすぎちゃってレスできなくなっちゃったんだろうなぁ ママンはいつまでも面倒みてくれないぞw
むしろ今まで書き込んでる奴全員顔真っ赤に見える
>>824 アンマネージドリソースを解放する目的で存在するのなら、
disposeを実行するのは絶対に必須だと思うぞ?
828 :
デフォルトの名無しさん :2009/03/11(水) 02:23:12
絶対に必須ってなんだよ。日本語勉強してこい。
あーあ反論できなくなっちゃって関係ないこと罵倒し始めたよコイツ
宇宙の真理的な絶対に必須とか俺的に絶対必須とか誰も必要としない必須とかいろいろある
831 :
デフォルトの名無しさん :2009/03/11(水) 02:30:31
一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり 推奨しません。CLRのガベージコレクタはとてもよくできているので、それに任せたほうが いいからです。ガベージコレクタには、アプリケーションコードがオブジェクトにアクセスし なくなるタイミングが分かっています。そしてそのタイミングが過ぎたときにだけ、オブジェクト を回収します。アプリケーションコードでDisposeメソッドやCloseメソッドを呼び出すということは、 アプリケーションは自分がオブジェクトにアクセスする必要がなくなるタイミングが分かっている と宣言をしていることになります。たいていのアプリケーションでは、オブジェクトが間違いなく 不要になったことがわかることはありません。 例えば、新しいオブジェクトを作成して、その参照を他のメソッドの引数に渡した場合、 そのメソッドが渡された参照を自分のオブジェクトの内部フィールド(これはルートになります) に格納するかもしれません。メソッドを呼び出した側では、このような動作をしているかどうかは 分かりません。この場合、呼び出し側がDisposeやCloseを呼び出してしまって、その後で 他のコードがそのオブジェクトを利用しようとすると、ObjectDisposedExceptionがスローされる ことになります。 筆者は、DisposeやCloseを自分のコードで呼び出すのは、次の2つの場合に限ることを 推奨します。1つは、リソースを解放しなければならないことが分かっている時(開いている ファイルを削除しようとするときなど)です。もう1つは、DisposeまたはCloseを呼び出すことが 間違いなく安全で、しかもオブジェクトをファイナライゼーションリストから削除して、 オブジェクトが昇格するのを防ぐことで、パフォーマンスを向上させたい場合です。 これ以上に説得力のある意見言えるやつ、このスレにはいないわな 有名なAdvanced Windowsとか、これまで何冊も出してる重鎮だろ 書籍でFramework Class LibararyやCLRの実装のミスとかも指摘してるぐらいだからなw
どんなに日本語がおかしかろうが、リソース解放にDisposeの実行が明示的に必要なのは変わりない罠
>>831 >リソースを解放しなければならないことが分かっている時
まさに今述べてることじゃん
解放しなければ
834 :
デフォルトの名無しさん :2009/03/11(水) 02:35:44
>>833 は「次の2つの場合に限る」というのを、どうしても「全ての場合」に摩り替えたい低脳
>>834 はオブジェクトの生存期間を自分で管理できない最底辺プログラマ
今来た初心者の素朴な疑問なんですが、(マジで) たとえばDBやhttpなどの接続プールを管理しているファクトリからストリームを貰ったときに 自分が使い終わったからといって、勝手に閉じるとママに怒られると思うんですが そういうケースはどう扱うのが正当ですか?
>>836 そのままほっとけばGCが回収してくれると主張する人がいる
>>834 だ・か・ら
>アプリケーションコードでDisposeメソッドやCloseメソッドを呼び出すということは、
>アプリケーションは自分がオブジェクトにアクセスする必要がなくなるタイミングが分かっていると宣言をしていることになります。
って書いてあるだろ。つまりオブジェクトが必要無くなったときにdisposeするかどうかを論じてるんだから、
最後の2つの場合について論じているわけよ
839 :
660 :2009/03/11(水) 02:57:04
お前らまだ続けてたのか
Disposeしていいと思うのならしとけ していいかわからなかったらするな これでいいよ
しなかったら、ずっとデータベースに接続され続けるんじゃないのか? していいかわからなかったらしておいたほうがいいだろ
A.アイスがチュッチュなら溶けても構わないので、そのまま開けっ放し。 B.アイスがハーゲンダッツなのでちゃんと締める。
>>836 ソース見たわけじゃないけど普通はラップしてんの返して
dispose(){
stream.flush;
再利用していいよ=true;
}
本当のdispose(){
stream.dispose;
}
じゃないかね
上は利用者が使って下はファクトリが使う
結局、初心者はどうすればいいの?
あきらめる
「一般的にはそもそも Dispose の実装不要」と
「Dispose 実装してるクラスの Dispose 呼び出し不要」が
ごちゃまぜになってない?
manage リソースで完結してるなら Dispose そもそも実装しなくてよくて GC まかせ推奨。
unmanage リソースの解放が必要にのみ Dispose とか Close 実装して呼び出す。
ってのが
>>831 の意味だと思うんだけど。
初心者スレ的には Disposeできるならしとけ よくわからないならDispose()を明示的に呼ばないといけないような使い方は避けろ usingが使える使い方で使え
848 :
デフォルトの名無しさん :2009/03/11(水) 08:58:15
おまえらusing使ったことネーノ?
>>831 でDisposeを推奨しないと言ってるのはusingが使えないような場合について
初心者スレ的にはそもそもそういう状況を作らないように気を付けるべきだと思うけど
つうか あるループ内でDataTableをデータベースから取得するだけの部分でチェックしてみたんだが datatable dt; for (int i=0;i<100000;i++) dt = データ取得; これで延々diposeでずに処理するのと データ取得の後にdt.dipose入れるとのでは メモリの使用量が結構違うな 前者の方が使用量が常に多い 当然の結果だとは思うが、メモリ少ないような環境とかだと有効なのかもね
API使って取得したハンドルを変数IntPtr に保持するような クラスの場合Disposeは実装したほうが良いですか? CloseHandleが必要でなければいらない?
一晩で伸びすぎワロタ
>>851 俺ならDispose-Finalize のパターンで確実にハンドル閉じるようにすると思う
Microsoft.Win32.SafeHandles
C#で書庫(zip, rar等)を扱う標準的な方法ってないですか?
標準の意味が.NET Frameworkの標準ライブラリって意味なら、ない
858 :
857 :2009/03/11(水) 13:15:02
rarもだった・・・orz フレームワークにrar扱うライブラリなんてないさ
ZipPackageはzipファイルを扱うためのライブラリじゃないぜ
Zip だけなら CodePlex にゆるゆるライセンスのやつがあったような…
テキストファイル中の100字くらいを変換するソフトを作りたいんですがやり方を教えてください
テキストファイル中の100字くらいを変換するソフトを作ればいいよ
1回しかやったことないから忘れた 保存とかのメソッドありますか? 読み取り→正規表現→保存 でおk?
865 :
567 :2009/03/11(水) 15:09:21
(System.型)変数[i] って書き方ってどういう意味になるんですかね?
>>865 取り敢えずMSDNでC#の演算子を一通り調べて
というか、リファレンス読んで勉強するより、 何か作る物決めてつくっちゃったほうが勉強になる気がするぞ
なんか初心者らしい作品ありませんでしょうか
電卓とか
メモ帳だろJK
メモ帳はVSの練習にはいいけどプログラミングの練習にはならんね 電卓はちょっと難しすぎるかも ○×ゲームとか
必要に迫られてるか、プログラムをおもしろいと思わないと挫折するよな 情報系の学校行っても身につかなくて全然違うことやってる友達とかいるし お前ら作ってておもしろいと思ったものある?
Web系は楽しいな 開発がページ単位なので区切りが付きやすいからメリハリが付く
なにしに学校きたか分からん奴って多いよね 身につかないんじゃなくて身につけないんだよ
勉強だとか練習だとか思ってる時点でry
全部が全部面白いことばかりじゃないけどね つまらなくても勉強しておいたほうが後々役に立つこともある
877 :
デフォルトの名無しさん :2009/03/11(水) 21:07:52
zipってJ#のライブラリつかってできなかったっけ?
質問です C#でつくったDBソフトはフォルダReleaseの部分を使用者のPCにコピペするのが簡単なインストールなのでしょうか?
879 :
デフォルトの名無しさん :2009/03/11(水) 23:24:06
うん
うん
日本語でOK
ポルトガル語でもおk
デスクトップに展開だな
4月から部署異動でC#で開発することになった・・・ C畑で育った俺が果たしてついていけるのか心配だ
むしろCの方がおいらにとっては憧れ C#極めたもっといろいろやりたい人が Cへ行くイメージ お互い頑張りましょう
>>884 俺もつい最近始めたばっか。
Cとアセンブラの泥臭い仕事を10年以上やり続けてたから少し不安だったが、
やってみたらコレが結構楽しいぜ
ふと思ったんだけど、C#で作ったソフトのmdf見たいときsqlserverからみれます? sqlserverマネージメントスタジオから見ようと(ファイル-開く)すると拒否られまくりなんですけど?
俺もCやりたいな CとAPIの参考書は買ってあるんだけど何故か遠い・・・
メモリ管理難しいです><
cめんどくさいよ String s = s1+s2; って書けば済むとこ strlenで大きさ取ってmallocしてstrcpyしてfree
そう、Cは何でもこなせるように機能を後から追加していった感がして C++程ではないが、煩雑化が激しいよ API駆使してソケット使ったアプリとかもうね、、、
C++ はややこしいだけで煩雑ではないぞ。特に C と 比較するんなら
>>893 騙されちゃだめだ。
難しいことしてる気分になれるから自己満足はできるかもしれないけども。
899 :
デフォルトの名無しさん :2009/03/12(木) 00:45:29
どういうときに(string)とかにして()つけるのですか? string なんちゃらって書いてビルドエラーになると()つけて通った通ったじゃ、なんか違う気がしまして。 なんか決まって右辺のような気がするのですが
キャストのこと?
キャストだよね・・・? double → int で小数点以下を切るとか int → string で文字として扱うとか
ポインタが面倒くさくてC#に言った人は居ないか… 最近キャストの括弧も面倒になってきた…
面倒というけれどstatic_cast<>()なんかは明示的で読みやすいかな
905 :
デフォルトの名無しさん :2009/03/12(木) 01:31:23
キャストって言うんだ。明日調べてみます。ありがおt
906 :
デフォルトの名無しさん :2009/03/12(木) 10:02:21
<string>って検索しても見つからなかったのですが、(string)とは何が違うのですか?
<string>はジェネリッククラスの型引数でしょ
>>903 ポインタを使うだけなら簡単だが、
ポインタを使ったプログラムのデバッグは面倒だな
C#なら予想外の挙動(例外発生とか、変数の値がおかしいとか)を辿っていけばバグの原因に辿りつくが、
Cだと全く関係ない場所にバグの影響が現れたりする
909 :
デフォルトの名無しさん :2009/03/12(木) 11:43:14
>>907 ありがとう。ジェネリッククラスで検索してきます
Disposeを全く意識せずに↓のようなコードを動かしていたのですが Disposeを実装した方がいいのでしょうか。また、その場合何をどのように 処理すれば良いのでしょうか…。 [StructLayout(LayoutKind.Sequential)] struct GUITHREADINFO { //省略 } public Point GetCaretPosition() { IntPtr activehWnd = GetForegroundWindow(); int nullProcessId; uint targetThreadId = GetWindowThreadProcessId(activehWnd, out nullProcessId); GUITHREADINFO threadInfo = new GUITHREADINFO(); threadInfo.cbSize = Marshal.SizeOf(threadInfo); GetGUIThreadInfo(targetThreadId, out threadInfo); Point P = new Point(threadInfo.rcCaret.X, threadInfo.rcCaret.Y); bool ret = ClientToScreen(threadInfo.hwndFocus, ref P); return P; }
リソースの解放が不要ならどうでもいいよ
>>904 あれは嫌がらせの意味でわざと糞長くしてるんでしょ
C#には安全じゃないキャストなんかないからそんな必要ないけど
んにゃ、区別したいから名前つけて template 関数と書き方が一緒になった。 おかげでユーザーが種類を増やせた。static_pointer_cast<T> とか。 狙ってたのかどうなのか知らんが。
VS 2008 FormデザイナでColor型のプロパティを変更するときに タブつきのカラーダイアログが表示されると思うんだけど (システム定義 Webとか) ただのABC順のドロップダウンしか表示されなくなったんだけど、 設定の問題?VS2008のバグ?
正規表現で文字列を抜き出したいんですけどindexofとか文字列の長さとかを使うのですか? ぽんと該当箇所を抜き出せるメソッドがあったら教えてください
Regexクラスで検索
また叩いてくれといわんばかりの質問だな
ありがとうございました
OpenGLとWinFormsを使って、 アニメーションするプログラム(GUI付)を作りたいんですが、 どうすればいいのか方法が良く分かりません・・。 マルチスレッドとかしないといけないみたいでややこしいです。
WPF使えば簡単
922 :
デフォルトの名無しさん :2009/03/13(金) 00:16:43
json形式のデータを簡単に扱えるようにする.netframeworkのクラスってないでしょうか?
>922 JavaScriptSerializerとかDataContractJsonSerializerとか。
System.Data.Json
例外処理について聞きたいのですが、特定のメソッドの中でどのような例外が発生する可能性があるかを 簡単に把握する方法ってあるのでしょうか?
使用しているメソッドの例外の型をMSDNで調べる
質問です。 クラスのインスタンスが必要とするメモリサイズを知る方法 ありますか?
ない
体感速度なら・・・
>>928 そうですか。
タスクマネージャーで見るとかしかないですかね。
質問です VS2008のSetupProjectでインストール時に regsvr32 を実行してdllを登録したいのですけど regsvr32.exe xxx.dllを 実行する hoge.exeをつくって カスタム動作でインストール時にコンソールhoge.exeを実行する 方法しか思いつきませんでした。 インストール時に直接コンソールを叩く設定はできますか?
>>930 Marshal.SizeOf()
構造体かStructLayoutAttributeでフィールドの配置方法を明示したクラスに使える
目安でいいみたいだが
タスクマネージャーは目安にもならんからな。
>>927 実装に依存しすぎるからそれぞれ調べないといけないけど、
リフレクションと unsafe コード駆使すればある程度は調べる
ことはできる。やり方?自分でやれ
>>932 それはマーシャリング後のサイズになってしまう
>>932 クラスの中に大きなサイズの画像データへのポインタとかを持ってないんならそんな感じだな
#regionって使いますか? どのぐらいのコード行が入ってるかわからないし、展開したとき入れ子になってたり現在地もわからなくなるんですが 普通はファイルで分けるか、クラスとかメソッドでわけるでいいんですよね? #region使うメリットって事実上あるんですか?
使うけど
ないね 深くつながりあう可能性が高いから同一ファイル内にしているわけで 展開圧縮なんか繰り返すのはめんどくさいし全体を把握するためにずっと展開しっぱなしなのが普通 MSのサンプルなんかは使いまくってるからウザいし、全部展開してもコードが#regionコードがゴミになっててウザい
同じクラスでも、 メンバのprivate変数でまとめたかったり プロパティでまとめたかったり overrideしたメソッドや protectedなメソッドとでまとめたったり、 いろいろあるから人それぞれでしょ。 単純に短くすることができれば見やすくなるから便利。
>>940 細かくregionされててウザイばあいもあるけど、
ソースを把握して表示させる必要のないコードはあると思うから、
そういうのを非表示にできるという意味で便利だと思うけどね
大量のコントロールにイベントハンドラ関連付けするときは#regionでまとめる デザイナがそうなんだからそういう使い方が正しい むしろ変更修正する必要のないものまで表示させとく意味がわからない
俺も使わないな ブックマークで飛びまくった方がすっきりする 展開閉じてると中身忘れるしホイールでぐるぐるやってればいつも目について忘れなくなる
中身の無いプロパティの集まりとかは完全にまとめるよな メンバ変数も必要ないし
>>944 そこは完全にC#というかJavaの糞仕様
使用するメソッドやプロパティをDelphiみたいにヘッダに定義する形にすればよかった
そうすればregionの大きな役割の一つは達成できたはず
> 普通はファイルで分けるか、クラスとかメソッドでわけるでいいんですよね? ここに突っ込むべきでは?
+ボタンを押す時マークが小さくてカーソル合わせるのイライラする 行をダブルクリックで展開するけど逆はできないし 展開したときのendregionの位置が見つからないのがダメすぎる また入れ子かよ!どこがendだよ!みたいな #region内コードに背景色設定が出来るようになるまで使うことはない
なんの修行だよw ショートカット使えよ
別に常に全部展開した状態で使えばいいじゃん? なんで、入れ子とか、どこがendかよみたいに考える必要があるの?
背景色設定っていいね 昔から //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- で区切ったりされてるのになんで視覚的にまとめたいんだってことにMSは気がつかないんだろうね #endregionの場所を探すとか、悪化してるだけだ
endregionを探したいと思うのはなんで?
コピペプログラマー(笑)
regionは上級者向けなんだよ、きっと・・・
#region コメント /////////////////////////////////////////// #endregion こんな感じで使ってれば探す必要ないけど どうでもいい#regionごときにこだわるのはなぜ?
<summary> なんかもっとうざいと思う タグ名指定で表示非表示出来ないとコード上のゴミでしかない
自分が区別しやすいような記述をして、折りたたみたいところにregionすればいいだけじゃん なんで、そこまでregionの必要性を知りたいのかわからない。 <summary>はxmlでの表記の仕様だからしょうがないね。
regionの使い道はあるようでない 普通は範囲選択して折りたたんで終わり しかし、普通はそれすらやる人は少ない こだわるほどの機能じゃない。 結論:わざわざコードを書いてまで使うメリットは無い
可読性のためには有用でしょ 折りたためないより折りたためるほうが良い
<summary>はコードが見難くなるから嫌いだけど、ポップアップで定義がでるから面倒でも書くようにしてる。 で、書いた後に#regionで畳むようにしてる。
こういう雑談も#regionで消せるといいな
お後がよろしいようで
ほらな?
俺は#region使いまくるけどな。
っていうか、使わないコーディングなんて考えられないけど。
まあ小さなコードばっか書いてる人間には不要なのは確かだが。
>>960 そこは#region設定しなくても普通に畳めるよw
知らなかったのか。
俺も#regionは使うけど 入れ子にはあんまりしない
#regionはメソッド内の処理をスコープに関係なく好きな場所で切られるので怖いよ。 #regionが必要なサイズのメソッドに膨れてること自体が問題だし。
メソッド内でregion設定する奴なんていないからw どんな被害妄想だよ
メソッド内でも#region使う。 スコープは考慮するけど。 if (abc) { #region ... #endregion }
それはさすがに「やめとけ」としかいいようがないな・・・ ネタか本気か知らんけど
構造化出来ない人ほどregionを多用して見やすい風を演出する
>>946 ありえない、それこそDelphiのクソ仕様。
そういうのが見たければオブジェクトブラウザがあるだろ。
IDataObjectだのIViewObjectの実装とか、閉じないと邪魔でしょうがない。
アウトラインの「定義に折りたたむ」を多用するので、regionは使う。 ただ、複数行の<summary>は折りたたみ時に「///<summary>...」になってしまって コメントの役割を果たさなくなるのが嫌い。 この辺はVS側がもっと融通聞かせてくれてもイイと思う。
SmartOutline for .Net使い出してから #regionは使わなくなった
WPFで3Dオブジェクトをコードで定義す場合に、頂点、面、テクスチャ座標を それぞれリストに追加していくようなコードになるんだけど、さすがに #regionで区切らないと訳が分からなくなる。メソッドを分けようにも、 どう考えても処理の最小単位で分割できないし。 どうして球とか立方体とか基本的なオブジェクトが用意されていないのか・・・。
>>971 逆だよ
ObjectPascalのように定義すれば、IDEがメソッドやプロパティを自動で書いてくれる
コーディングの手間が省けるし、ソースを見る側はそこさえ見れば中身がだいたいわかる。
超便利。
978 :
デフォルトの名無しさん :2009/03/15(日) 01:52:51
C++はもう古い、これからはC#だ、とか聞くのですけど、C#は.NETが前提ですよね。 .NETアプリって総じて重いイメージがあるのですが、なぜそこは問題視されていないんでしょうか? かなり致命的だと思うのですが…。
致命的なのはドキュメントを読めない馬鹿開発者だ Ngen使えカス
>>978 速度をできるだけ出さなければならないような分野ならともかく
通常の使用ではそれほど問題にならないから。
遅いって言っても純C++の8割くらいは速度出るし。 VB6よりは3倍くらい速いよ。
イメージを検証する前に問題視して致命的と判断するのってどんな気分?
っていうかどう見ても978は釣りでしょ。 話変わるけど次スレ立てようか?
984 :
デフォルトの名無しさん :2009/03/15(日) 02:12:32
>>982 いや実際、小さなフリーソフトでも.NETアプリだと遅いんですよ。
特に起動に数秒かかります。
起動した後は速いですけど、起動しっぱなしでもない限りやはり起動の遅さは気になります。
これはなぜ問題視されていないんでしょうか?
多くのアプリは起動した後に使うものだからだろう。
>>984 のPCスペックに問題があるんじゃねーの?
気になるほど遅いって事も無いと思うんだがな
起動はJITのせいでしょ。 だからネイティブイメージジェネレータ使いんさいと。
c++もmfc使っていれば、.netと同じでdll経由してるから、同じようなもんじゃいの?
>>989 中間コードとJITコンパイラについて勉強しましょう。
992 :
デフォルトの名無しさん :2009/03/15(日) 02:21:16
>>985 でも例えばメモ帳のように、ちょっと起動しては終了しを繰り返すような場合はどうでしょう。
>>986 E6600のメモリ6Gなのでさすがにスペックのせいではないと思います。
>>987-988 ngenがポイントみたいですね。みなさんこれで起動の遅さを解決してるのでしょうか。
>>991 いや起動時の遅さを度外視した場合の話
読めばわかるだろ?誰も起動時の話なんてしちゃいない
ctrl + M + M or Oとか使っているなら畳んだり開いたりメンドクサイなんてこと思わないと思うんだけどな。 俺はVS使ってる限り#regionを使うことは非常に有用だと思うが
>E6600のメモリ6Gなのでさすがにスペックのせいではないと思います。 完全にあなたが神経質なだけですね。
ngenで前処理しておいたからってコールドスタートが早くなるとは限らないだろうけど いずれにしても一度起動しちゃえば再起動しても実用上問題になるほど遅くは無いでしょ
>>992 その程度の遅さが気になるならPCを買い換えたほうがいい
スペックが足りないと思う
盛り上がってきましたねw
>>992 raidにするか デフラグしていないか
ウィルスに感染してないか?
余計な常駐が動作していないか?
だか残念ながらウメス
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。