5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

ふらっとC#,C♯,C#(初心者用) Part38

1 :デフォルトの名無しさん:2009/03/01(日) 08:45:30
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

前スレ
ふらっとC#,C♯,C#(初心者用) Part37
http://pc11.2ch.net/test/read.cgi/tech/1234017654/

2 :デフォルトの名無しさん:2009/03/01(日) 08:45:43
C#, C♯, C#相談室 Part51
http://pc11.2ch.net/test/read.cgi/tech/1233757615/

WPF(XAML,XBAP,.NET3.5)GUIプログラミング
http://pc11.2ch.net/test/read.cgi/tech/1211453941/

初心者のためのプログラミング言語ガイド Part13
http://pc11.2ch.net/test/read.cgi/tech/1232286278/

3 :デフォルトの名無しさん:2009/03/01(日) 08:45:53
参考サイト。まずはここで検索してから。
http://www.google.co.jp/
http://msdn.microsoft.com/ja-jp/library/default.aspx
http://homepage3.nifty.com/midori_no_bike/CS/
http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html
http://dobon.net/vb/dotnet/
http://jeanne.wankuma.com/tips/
http://www.labasp.net/CsharpNote/


4 :デフォルトの名無しさん:2009/03/01(日) 09:26:32
>> http://pc11.2ch.net/test/read.cgi/tech/1234017654/989
> 例えばゲームなんかだとそれぞれに独立したカウンタなんかを持たせたい時に必要です。 
> それすらも別クラスにわけろというなら著しく生産性が落ちまくります。
OOPL的には”それぞれ”はオブジェクトなので,「独立したカウンタ」をするオブジェクトがあればいいと思うんだけど.

あと,内部的に完全に隠蔽されている変数って,なんかとてもキモいんだがその辺はどうやって折り合いつけるの?
(外から初期化したいときとか,値を変更したいときとか)

5 :デフォルトの名無しさん:2009/03/01(日) 10:55:18
フィールドと変数は同じ意味ですか?

6 :デフォルトの名無しさん:2009/03/01(日) 11:00:54
>>5
変数は意味が広い。フィールドもローカル変数も変数と呼ばれることもある

7 :デフォルトの名無しさん:2009/03/01(日) 11:52:55
dockの優先度がさっぱりわかりません。
優先順を設定する方法はありますか?

8 :デフォルトの名無しさん:2009/03/01(日) 12:28:52
ZOrder、つまりControlsへの挿入順
右クリックから前にとか後ろにとか
あとControlsのSetChildIndex

9 :デフォルトの名無しさん:2009/03/01(日) 12:43:33
前スレの>>986が言った
> メソッドの中でしか使わないけど値を保持しておきたいローカル変数ってたまにありますけど、

これは正しいよ。
なぜかC#しかやってない人は頑なに否定する傾向があるようだけど。

例えばこれが可能だと、シングルトンパターンとか、IDisposable.Disposeを実装したときありがちな
2回目以降の呼び出しはスルーする処理が綺麗に安全に書ける。

10 :デフォルトの名無しさん:2009/03/01(日) 12:46:25
つまり関数の呼び出しをカウントするための変数ってことですね

インスタンスフィールドでFAじゃ・・・ないの?
綺麗?安全?だからか

11 :デフォルトの名無しさん:2009/03/01(日) 12:47:10
使い道はあるかもしれないけど複雑になるのが嫌だから省いただけだろ
もともと過去の名残で残ってるだけだし

12 :デフォルトの名無しさん:2009/03/01(日) 13:56:08
>9
JavaScriptみたいに匿名メソッドを返す匿名メソッドを実行する形で
メンバ変数のdelegateを初期化すれば実現できると思うけどコンパイルが通らない。
こんな感じになると思うのだけど。
public static Func<int> TestFunc = (() => {int i = 0; return (() => i++);})();

13 :デフォルトの名無しさん:2009/03/01(日) 14:04:24
型推論に失敗してるだけだろ
適当にActionとかヒント与えたら通る

14 :デフォルトの名無しさん:2009/03/01(日) 14:06:55
すまんActionじゃなくてFunc<int>か
public static Func<int> TestFunc = new Func<Func<int>>(() => { int i = 0; return new Func<int>(() => i++); })();
こうだな

15 :デフォルトの名無しさん:2009/03/01(日) 14:25:13
>>9
あるよって言うのは半分同意せんでもないが、使っているとこに
手を入れるときにメンバに直すこともかなりの割合で経験上
発生するので実質いらんと思う。
否定する人ですが、こういったらいいですかね?C# だけしか
やっていなくて否定している人ばかりではないですよと

ちなみにお前が挙げた例で、IDisposable.Dispose の例、その
フラグを後で他から参照したくなることは多くて結局 IsDisposed
実装したりだとかな(というか ObjectDisposedException どうする
んだよそれしたら)。
つまり、乱用もよく見かけるってことか。なので初めからメンバに
持ってろと。

16 :デフォルトの名無しさん:2009/03/01(日) 14:28:39
人をいきなり「お前」呼ばわりする奴ってどうして例外なく馬鹿なんだろ。

「こういう場合は」必要だ、って主張の反論に「こういう場合」と違う場面を
挙げてそれって反論として成立してると思ってるのかな。

17 :デフォルトの名無しさん:2009/03/01(日) 14:33:31
何でもいいけど和やかなカンジで頼む

18 :デフォルトの名無しさん:2009/03/01(日) 14:33:34
最大の理由は「Javaに無いから」なんだろうなきっと
意図的に捨てたんだから無いもんは無い

19 :デフォルトの名無しさん:2009/03/01(日) 14:36:33
プログラミングC# 第5版の日本語版が出たらしいのですが、
JavaをやってたC#初心者には難しいですか?
Webの入門サイトだけじゃなく、手元に本が欲しくなってしまって

20 :デフォルトの名無しさん:2009/03/01(日) 14:42:54
難しかったらJavaをやってたとは言えない

21 :デフォルトの名無しさん:2009/03/01(日) 14:47:34
別に難しくはないと思う。
パラパラと見ただけなんだけど印象としては、
説明が親切なつもりなんだろうけど回りっくどいだけで全然分りやすくない。
あと冒頭で同性愛をカミングアウトするのはいらないと思った。
誰も著者の私生活になんて興味ないのに。

22 :デフォルトの名無しさん:2009/03/01(日) 14:48:17
>>16
気分害した、解りにくいなら謝りますが、本旨は「挙げた例にすら乱用してる
っぽい感じのものがあるよ」って話です。
これで「たまに」のラインが変わってくるのですよ

23 :デフォルトの名無しさん:2009/03/01(日) 14:58:52
>>22
過剰反応だったかなごめん。
まあ確かにそんなに有用な場面が多いわけではないのは俺も認めるところ。
あった方がいいとは思うけどなくてもそんなに困らないのは確か。

24 :デフォルトの名無しさん:2009/03/01(日) 14:59:34
何でもいいけど和やかなカンジで頼む

25 :デフォルトの名無しさん:2009/03/01(日) 15:05:03
IDisposable実装するときは、private bool _disposed; を
フィールドにしとくのが定石なんじゃないの?
http://msdn2.microsoft.com/en-us/library/fs2xkftw.aspx

26 :デフォルトの名無しさん:2009/03/01(日) 15:14:26
>>23
さらにいえばなんつーかな、C++ とかだと時間を経るごとにこういう
ので見えるところ消えていくんだよなぁってのがあり。楽する機能として
使っているところな。テンプレートライブラリやらマクロやらではどうして
も必要なときがあってそういうのは残るけども。

そして突っ込んでいくと、後から考えるに明らかに乱用だったなぁと思う
わけだが、事前にこれを予測するのは難しかったなぁってことで結局
状態単位が class スコープに絞るほうが混乱がなくていい気がするんだよ

もちろん単純に経験からくる感覚なので常に正しいとは言わないが

27 :デフォルトの名無しさん:2009/03/01(日) 15:14:31
コードでタイトルの文字を変える方法がよくわかりません
プロパティで変えるのは出来ますが、起動中に変えたいのです
普通に考えてform1.text=だと思ってたんですがそれだといかんようで。。。

28 :デフォルトの名無しさん:2009/03/01(日) 15:21:25
form1はクラスだろ
インスタンスじゃねえだろ

29 :デフォルトの名無しさん:2009/03/01(日) 15:24:24
>>27
ヒントはthisそして省略


30 :デフォルトの名無しさん:2009/03/01(日) 15:54:23
全然わかりません・・・

31 :デフォルトの名無しさん:2009/03/01(日) 16:14:57
>>4
外から初期化したり変更出来ないメンバ変数なんて普通にあると思うけど。
特定のメソッドからしか参照できないメンバ変数って革命的じゃない?
宣言だけ明確にしてれば変数名に悩む必要ない!

32 :デフォルトの名無しさん:2009/03/01(日) 16:19:20
言語をそういう風に拡張するのは難しくはないのだろうが、下のどっちの機能が欲しいんだ?
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++;



33 :デフォルトの名無しさん:2009/03/01(日) 16:22:59
>>31
クラス分けすれば済むんじゃないか。
そんな変な機能は迷惑

34 :デフォルトの名無しさん:2009/03/01(日) 16:47:43
>>32
staticだとオブジェクトを複数生成した時困るよ。

>>33
糖衣構文だよ。
匿名型とかラムダ式だってクラスわけすれば済むけどもっと手軽に書けるようになったじゃん。

35 :デフォルトの名無しさん:2009/03/01(日) 16:57:01
そのうちC#にも糖衣構文でmoduleが欲しいとか言い出しそうだな。
そろそろすれ違いだこの辺にしよう。

36 :デフォルトの名無しさん:2009/03/01(日) 17:32:29
>14
やはり省略できないのか。
もうちょい型推論頑張ってくれと思うけど仕方がないか。

37 :デフォルトの名無しさん:2009/03/01(日) 17:45:15
C#でマップエディタ作ろうと思うんだけど
marshalとか必要になってくるかな?
C#ってそんなに重くない?

38 :デフォルトの名無しさん:2009/03/01(日) 17:48:48
要らない
重くない


39 :デフォルトの名無しさん:2009/03/01(日) 17:54:15
ありがとうございます

40 :1:2009/03/01(日) 18:01:37
どうでもいいけど俺への感謝はないのか

41 :デフォルトの名無しさん:2009/03/01(日) 18:03:45
thx

42 :デフォルトの名無しさん:2009/03/01(日) 18:04:01
>>1
ペッ

43 :デフォルトの名無しさん:2009/03/01(日) 18:07:24
>>40
死ね

44 :デフォルトの名無しさん:2009/03/01(日) 19:14:53
ジェネリッククラスのwhere節でなぜSystem.ValueTypeは指定できないんですか?

45 :19:2009/03/01(日) 19:18:39
>>20
>>21
本屋でチェックしてみます
ありがとうございました

46 :デフォルトの名無しさん:2009/03/01(日) 21:06:06
IDisposableを実装するのは、破棄すべきアンマネージリソースがあるからであって、
その状態をきちんとマークしておけば、わざわざフラグなんか持つには及ばないと思うんだ。

たとえば、内部的に何かのWin32ハンドルを使っているとすれば、↓こんな感じで。

if (_hProc != IntPtr.Zero)
{
  bool success = CloseHandle(_hProc);
  if (success)
  {
    _hProc = IntPtr.Zero;
  }
  else
  {
    throw new Win32Exception();
  }
}

47 :デフォルトの名無しさん:2009/03/01(日) 21:12:36
Disposeが例外投げちゃ駄目だろ。
ディスク容量不足の時のFileStreamみたいな悲惨なことになるぞ。

48 :デフォルトの名無しさん:2009/03/01(日) 21:47:48
C#2.0でForm上に区切り線を設置したいのですが、どうすればいいですか?
Penオブジェクトやらを用意して、Form上に描画しないとならないのでしょうか。

49 :デフォルトの名無しさん:2009/03/01(日) 21:55:03
>>44
where T : struct
>>48
標準の方法はありません

50 :デフォルトの名無しさん:2009/03/01(日) 21:57:18
>>48
http://www.atmarkit.co.jp/fdotnet/dotnettips/310linecontrol/linecontrol.html

51 :デフォルトの名無しさん:2009/03/01(日) 22:06:04
>>50
Win95のころからある手法なのに知らない人多いのかな

52 :デフォルトの名無しさん:2009/03/01(日) 22:11:13
>>49
工エエェェ(´д`)ェェエエ工工

>>50
ありがとうございます。便利だけど関係ないtextboxがあるのは、なんかいやですね・・

>>51
不便ですね。直接描画できると良いのに。

53 :デフォルトの名無しさん:2009/03/01(日) 22:18:17
Splitterコントロール使ったら?

54 :デフォルトの名無しさん:2009/03/01(日) 22:19:56
>>52
直接描画したいのなら最初からそうすりゃいいじゃんw
言ってること意味不明だよ。

55 :デフォルトの名無しさん:2009/03/01(日) 22:24:02
Visual Basic PowerPackにLineって無かったっけ?

56 :デフォルトの名無しさん:2009/03/01(日) 22:24:17
>52
Visual Basic Power PacksにLineShapeコントロールがあるよ。

57 :デフォルトの名無しさん:2009/03/01(日) 22:26:08
屈辱的な11文字だなw

58 :デフォルトの名無しさん:2009/03/01(日) 22:30:32
VS2008だけじゃないの?
http://www.atmarkit.co.jp/fdotnet/dotnettips/781winlineshape/winlineshape.html

59 :デフォルトの名無しさん:2009/03/02(月) 00:13:24
>>44
>>49 で出てるけど where T : struct。
細かい話をすると同時に new() 制約フラグとか valuetype 制約フラグ
とか必要といった話になるので直接 ValueType から継承なクラス指定は
しない。

>>46
根っこはな。Component も IEnumerator<T> も実装していたりする
ので一概に言えるものじゃない。


60 :デフォルトの名無しさん:2009/03/02(月) 00:35:39
>58
2005でも追加でインストールすれば使えなかったっけ?

61 :デフォルトの名無しさん:2009/03/02(月) 01:15:35
>>59
でもC++/CLIだとSystem.ValueTypeだけを指定ってのもできるんだよな


62 :デフォルトの名無しさん:2009/03/02(月) 01:25:43
>>61
それ、C# だと struct 制約のことなんでは。
C# で
class GenericTest<T> where T: struct {}
をコンパイルして逆アセすると、
.class private auto ansi beforefieldinit GenericTest`1<valuetype .ctor ([mscorlib]System.ValueType) T>
になる。

63 :デフォルトの名無しさん:2009/03/02(月) 03:27:02
すいません質問です。

OpenFileDialogやSaveFileDialogをフォームデザイナから追加したのですが、最後に検索したフォルダの位置を記憶しているようなのです。
もしかしてレジストリとかに最後のフォルダの位置とか記憶してたりするのでしょうか?

64 :デフォルトの名無しさん:2009/03/02(月) 03:53:43
>>63
インスタンスのプロパティで設定できる。
詳しくはMSDN読め

65 :デフォルトの名無しさん:2009/03/02(月) 03:56:06
記憶してるのが気味悪いって意味だと主

66 :デフォルトの名無しさん:2009/03/02(月) 03:58:45
RestoreDirectoryで設定できるって意味だとおも

67 :デフォルトの名無しさん:2009/03/02(月) 04:34:25
みなさんサンクス。言いたかったことは>>65です。
そしてRestoreDirectoryを少なくともデザイナからの変更した状態では、何も変わっていないような気もして凄く気味が悪いです。

68 :デフォルトの名無しさん:2009/03/02(月) 04:59:21
イェーイ俺天才

>>64>>66
バーカバーカ

69 :デフォルトの名無しさん:2009/03/02(月) 05:30:54
変わらないってこと自体おかしいと思うんだが
まさかfalseにして変わらないとか言ってないだろうね

70 :デフォルトの名無しさん:2009/03/02(月) 07:42:26
カレントディレクトリが変わるからな

71 :デフォルトの名無しさん:2009/03/02(月) 09:03:10
>>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にする

72 :デフォルトの名無しさん:2009/03/02(月) 12:42:43
>>69,70
あー理解しました、ありがとうございます。
カレントディレクトリとFileDialogが固有に保存するディレクトリ位置をごっちゃにしてました。
ただこうなるとFileDialogが固有の値がどこに保存してるかホントにわかりませんね


73 :デフォルトの名無しさん:2009/03/02(月) 12:49:05
普通にレジストリだけどな

74 :デフォルトの名無しさん:2009/03/02(月) 14:03:59
最後に検索したディレクトリ=CurrentDirectoryだろ?
固有の値ってなんじぇすか?

75 :デフォルトの名無しさん:2009/03/02(月) 14:05:56
いいえ

76 :デフォルトの名無しさん:2009/03/02(月) 14:48:38
>>56
そんなのがあるんだ。

77 :デフォルトの名無しさん:2009/03/02(月) 15:21:50
>>74
System.IO.Directory.GetCurrentDirectory()静的メソッドで取得できるのがカレントディレクトリ。通常は起動したアプリの位置。
以下さっき確認した方法をば。

1、WindowsFormAppricationを新規作成
2、フォームデザイナ表示して、ツールボックス>適当にOpenFileDialogを追加。
3、フォームのクライアント領域をフォーカスして、適当にプロパティ>Clickイベントを追加。ハンドラでダイアログをShowDialogる。
4、ShowDialog()の前後をMessageBoxでカレントディレクトリ情報を表示。
5、ダイアログのRestoreDirectoryプロパティがtrueとfalseのときの挙動を見比べる。

78 :デフォルトの名無しさん:2009/03/02(月) 19:15:08
XMLファイルの暗号・復号で行き詰まってしまいました。
ちょっと長くなるのでテキストファイルにして上げました。
一度見てもらえれば幸いです。よろしくお願いします。
http://uproda.2ch-library.com/1103101x4/lib110310.txt
表示できない場合はしたのURLからお願いします。DLキーはそのまま「1」です。
http://uproda.2ch-library.com/lib110310.txt.shtml


79 :デフォルトの名無しさん:2009/03/02(月) 20:03:39
質問
System.Windows.Forms.WebBrowserコントロールで
Navigate("url string") でHtml表示できますが、
Proxyサーバを経由するときはどうしたらいいのですか?
Proxyプロパティを持っているWebClientを使用して
試しにyahoo.co.jpを
WebClientからDownloadData⇒byte[]をstreamに変換
DocumentStreamにセット
DownloadString⇒DocumentTextにセット
とかやってみたんですがスクリプト関係が読み込めないようです。

80 :デフォルトの名無しさん:2009/03/02(月) 20:12:31
一番楽なのはインターネットオプションで設定しとくことだが

81 :デフォルトの名無しさん:2009/03/02(月) 21:05:22
>>78
test1.xml
はどんな出力になっているの?

82 :78:2009/03/02(月) 21:41:32
>>81
ファイルの中身でしょうか?このようになっています。
※改行規制に引っかかったので適当に改行しました。

ちなみに、暗号化されていると思われる部分は毎回内容が違っています。

<root>
<EncryptedData Id="EncryptedElement1" Type="http://www.w3.org/2001/04/xmlen
c#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorith
m="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /><CipherData><CipherValue>ZdxQ
9vVJIP9l94JL5p+Y8Wth3TZpgPnn/5Ta48lKRBdhsaL87ywnN8lVPcSZYm5emTnWChPk5IiL2iIqClD
tvxzv84ko/9XsbHtj4cv7yLYLH4MZUmX3ds3AEiDIondHwst9EPk7YK5UUERaIPx8rEksIKcOpc8dJb
vB3celcTw=</CipherValue></CipherData></EncryptedData>
</root>


83 :デフォルトの名無しさん:2009/03/02(月) 21:54:06
>>82
http://msdn.microsoft.com/ja-jp/library/ms229919(VS.80).aspx
には、
><EncryptedData> 要素の <EncryptedKey> 要素に格納されたセッション キーを
>復号化します。次に、セッション キーを使用して XML 要素を復号化します。
って書いてあるけれど、<EncryptedKey> 要素がないよね?

暗号化は出来ているようだ、って書いてあったけど、その認識が多分誤り
なんじゃないかな。長いのでチェックしきりれないんだけど、多分間違いが
あるのはEncryptメソッドの方だと思う。

84 :デフォルトの名無しさん:2009/03/02(月) 22:02:26
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>
ってなった。これで、キーが埋め込まれたっぽくない?

88 :デフォルトの名無しさん:2009/03/02(月) 22:46:15
XMLの要素だけを暗号化してくれるのか
項目を自分で暗号化してxmlに保存するでもいいけど、
一括して暗号化してくれるなら、ライブラリ化しとけば後で便利そうだな

89 :デフォルトの名無しさん:2009/03/02(月) 22:49:39
まあ、MSDNのサンプルなので間違いも多いってこった。

#MSDNのコードって、何故か、バグはあってもビルドだけはばっちり通るんだよなあ。

90 :デフォルトの名無しさん:2009/03/02(月) 23:14:48
>>61>>71
そうなのか
C++/CLIでできることをC#では禁止する理由がわからんな

91 :78:2009/03/02(月) 23:21:43
>>87
ありがとうございます。
お蔭さまで無事解決しました!感謝感謝です!!

それにしても公式のサンプルでも間違いはあるのか。

92 :デフォルトの名無しさん:2009/03/02(月) 23:24:22
>>90
できたところで全く意味がない
混乱を生むだけ
CILではできるのにC++/CLIではできないことだって当然いくらでもある

93 :87:2009/03/02(月) 23:32:05
MSDNに関する限り、「公式のサンプル"でも"」という認識は改めるべき。
 
バグがあるとかいう以前にそもそもヘルプに直書きしてテストしていないような
雰囲気のコードが多い。

94 :デフォルトの名無しさん:2009/03/02(月) 23:35:17
>>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()とかを全部の列にやっても小さい枠が残っちゃうんですよね。

96 :デフォルトの名無しさん:2009/03/02(月) 23:44:48
それをSQLのクエリに書くのが普通でしょ
もしくはDataTable.Select("", "");を使う

97 :デフォルトの名無しさん:2009/03/03(火) 00:04:04
こんな質問していいかわからんのですが
普段windows認証でsql serverにつないでるのですが
今回sql server接続にチャレンジしたのですが、つながりません・・・・
「ユーザーhogeは接続できませんでした。このユーザーはsql serverの信頼関係接続と関連づけられてません」と帰ってくるのですが
hogeに問題があると思うのですが、通常hogeは何なんでしょう?

ぎ・・・ギブ 日本語・・おkだな



98 :デフォルトの名無しさん:2009/03/03(火) 00:10:01
hogeに接続権限がないとか?

99 :デフォルトの名無しさん:2009/03/03(火) 00:12:22
>>98
・・・ということは
SQLマネージメントスタジオで設定するんですか?^^;ひー

100 :デフォルトの名無しさん:2009/03/03(火) 00:14:03
管理ツールで設定すれば大丈夫です。


101 :デフォルトの名無しさん:2009/03/03(火) 00:19:45
>>100
SQL Server構成マネージャのことですか?
試行錯誤中

102 :デフォルトの名無しさん:2009/03/03(火) 00:24:42
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でいいじゃん

105 :デフォルトの名無しさん:2009/03/03(火) 01:08:53
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(); // コネクションのオープン
}

106 :デフォルトの名無しさん:2009/03/03(火) 01:16:38
>>105
それじゃ自分自身のインスタンスになってんじゃないの?
バーチャルPCに対してならIPアドレスか、バーチャルPCのドメインとか、
PC名で指定する必要があるんじゃないか?

107 :デフォルトの名無しさん:2009/03/03(火) 01:24:02
>>106
むむむ
しらべてあす報告します
ありがとうです

108 :デフォルトの名無しさん:2009/03/03(火) 02:34:16
char c = 'a';

string s = Convert.ToString(c);

string s = c.Tostring();

上ができないのは何でなんだぜ?

109 :デフォルトの名無しさん:2009/03/03(火) 02:37:56
2回もキャストするの?

110 :デフォルトの名無しさん:2009/03/03(火) 02:52:00
>>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はキャスト演算子使えない?

114 :デフォルトの名無しさん:2009/03/03(火) 03:07:38
キャストはコンバートじゃありません
根本的に勘違いしてるんじゃないかなあ

115 :デフォルトの名無しさん:2009/03/03(火) 03:46:32
>>110
Object.ToString()

116 :デフォルトの名無しさん:2009/03/03(火) 04:03:43
>>115
ごめん、そりゃそうだ
エラーになると思い込んでたのでorz

117 :デフォルトの名無しさん:2009/03/03(火) 04:06:18
>>113
ちなみに(int)cは出来る。
といった辺りから考えてみてくださいな。

118 :デフォルトの名無しさん:2009/03/03(火) 04:27:16
あー、わかった
stringはcharの配列だけどcharは値型、stringは参照型だからキャストできないってこと?
charは16bitのUnicodeだし

119 :デフォルトの名無しさん:2009/03/03(火) 08:03:13
変換演算子が定義されてないからキャストできないだけで
値型とか幅とか何も関係ない

120 :デフォルトの名無しさん:2009/03/03(火) 09:25:56
うん
できたからといって別におかしいことはない
できるようにされてないだけ

121 :デフォルトの名無しさん:2009/03/03(火) 09:58:26
ファイル読み込みについて質問なんですが、
拡張子ではなく中身でテキストファイルかバイナリファイルかを
判別する方法ってありますか?

122 :デフォルトの名無しさん:2009/03/03(火) 10:01:33
テキストファイルだってバイナリだろ

123 :デフォルトの名無しさん:2009/03/03(火) 10:04:09
IMultiLanguage2に食わせてみる

124 :デフォルトの名無しさん:2009/03/03(火) 10:05:02
メソッド名抜けた。DetectInputCodepage

125 :デフォルトの名無しさん:2009/03/03(火) 13:06:42
このへんかな?
まぁテキストかバイナリかを見分けると言われれば>>122が正しいんだが
ちょっとエスパーしてみた
ttp://dobon.net/vb/dotnet/string/detectcode.html


126 :デフォルトの名無しさん:2009/03/03(火) 14:04:57
FindMimeFromData()じゃないの?

127 :デフォルトの名無しさん:2009/03/03(火) 14:10:53
DBから指定したテーブルのIDフィールドとNAMEフィールドを取得して
NAMEフィールドをコンボボックスに表示したいと思っています。
その時にNAMEフィールドのデータに紐付くIDフィールドも保持して
コンボボックスを操作した際に、IDフィールドも同時に制御するような処理を作りたいのですが
どのように作ればいいのでしょうか?

コンボボックスを2つ用意して片方を非表示にして制御する方法しか思いつきませんでした
宜しくお願い致します

128 :デフォルトの名無しさん:2009/03/03(火) 14:25:20
>>127
つコレクション

129 :デフォルトの名無しさん:2009/03/03(火) 14:45:21
DataTable使ってねーの?

130 :デフォルトの名無しさん:2009/03/03(火) 15:30:30
めんどくさいからバインドしちゃえよw

131 :デフォルトの名無しさん:2009/03/03(火) 15:30:54
>127
DisplayMemberにName
ValueMemberにID

SelectedChanged(で合ってるのかな)イベントにハンドラ追加して
ComboBox.SelectedValueでIDが取得できるんじゃね?
データバインドのときに限るが。

それかEntityクラス作って ToStringメソッドをオーバーライドして
ToStringでNameを返すようにする。
Entityクラスのオブジェクトをコンボにセットすれば
ToString()したときの文字列がコンボに表示される。
あとはSelectedChangedで(Entity)キャストしてオブジェクトを取り出す。

132 :デフォルトの名無しさん:2009/03/03(火) 20:07:59
List(要素数は50個)を
List1(0〜25)とList2(25〜50)に分割するにはどうやったらいいのでしょうか?

133 :デフォルトの名無しさん:2009/03/03(火) 20:16:13
GetRange使えば?

134 :デフォルトの名無しさん:2009/03/03(火) 20:22:03
ありがとうございます
GetRangeなら出来そうですね
やってみます

135 :デフォルトの名無しさん:2009/03/03(火) 20:27:14
list.GroupBy(i => i < 25);

136 :デフォルトの名無しさん:2009/03/03(火) 21:01:10
>>135
それは違うだろ。値じゃなく添え字で分けたいんだから。

137 :デフォルトの名無しさん:2009/03/03(火) 21:12:14
そういえばGroupByにindexくれるFuncを使えるのが無いのは何でなんだろ

138 :デフォルトの名無しさん:2009/03/03(火) 21:12:46
>>136
すまん、そのとおりだ。
長くなるけどこっちで。
list.Select((value, index) => new { value, index }).GroupBy(t => t.index <= 25, t => t.value);

139 :デフォルトの名無しさん:2009/03/03(火) 22:59:25
生年月日と指定した日付を渡すと
指定した日付の時の年齢を返すようなのってどうやりますか?

140 :デフォルトの名無しさん:2009/03/03(火) 23:00:25
引き算

141 :デフォルトの名無しさん:2009/03/03(火) 23:08:45
DateTimeクラスなんかで年齢を返すメソッドがあってもいいような・・・
あんま需要ないのか?

142 :デフォルトの名無しさん:2009/03/03(火) 23:18:03
それは需要があるとしてもTimeSpanか、あるいは年齢専用のクラス(Ageクラス?)
でやるべきじゃないのかな

143 :デフォルトの名無しさん:2009/03/03(火) 23:18:56
誕生日って閏年とかあったから、単純に引き算だとへんな年齢になることなかったっけ?
正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。

144 :デフォルトの名無しさん:2009/03/03(火) 23:19:31
VB だったらそういうメソッドも普通に定義されてるかもな。

145 :デフォルトの名無しさん:2009/03/03(火) 23:21:32
日本の法律では、誕生日の前日に年を取る

豆知識

146 :デフォルトの名無しさん:2009/03/03(火) 23:23:55
>>145
法律的に年利計算は閏年の翌日?前日?

147 :デフォルトの名無しさん:2009/03/03(火) 23:30:11
>閏年の翌日?前日?


148 :デフォルトの名無しさん:2009/03/03(火) 23:35:42
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;
}

149 :デフォルトの名無しさん:2009/03/03(火) 23:36:04
税金関係は1年=365日で定数だった気が

誕生日の前日に年取るのは閏日生まれの為だし

150 :デフォルトの名無しさん:2009/03/03(火) 23:42:56
>>106
詳しく!
ヘルプミー
今日で約1週間!俺はアホなのかー♪;;

151 :デフォルトの名無しさん:2009/03/03(火) 23:48:42
>誕生日の前日に年取る
これじゃ不正確
民法の試験じゃ×になる

152 :デフォルトの名無しさん:2009/03/03(火) 23:50:26
だからなんだよ。司法関係者にでもなるのか?

153 :デフォルトの名無しさん:2009/03/03(火) 23:52:06
うん
応援してね

154 :デフォルトの名無しさん:2009/03/03(火) 23:54:27
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

          あなたの後ろに落ちてたこれを、






        ∧__,,∧                         ∧__,,∧
      (`・ω・ ) ミ                   (`・ω・´)
        (     つ  ⌒ヽ               と   ,u、つ
      `u―u'     夢               `u´夢
                YY⌒Y
         こうして、                   こうして、



                    ∧__,,∧
            _     (ω・´ )
         夢 三ニ ☆ __,(    )つ
              ̄    `ー―‐u'

                 こうだ !


155 :デフォルトの名無しさん:2009/03/04(水) 00:01:14
>>150
Data Source=***.***.***.***,????;Initial Catalog=++++;Persist Security Info=True;User ID=--;Password=\\\\

***.***.***.*** ipaddress
+++ データベース名
-- 接続するユーザ名
\\\\ 接続するユーザ名のパスワード

で接続できた。インスタンスは規定のインスタンスだから指定なし

156 :デフォルトの名無しさん:2009/03/04(水) 00:02:31
>>151
んでシステム上ではどうするのが正解なんだい

157 :デフォルトの名無しさん:2009/03/04(水) 00:03:39
すまん
????はポート

158 :デフォルトの名無しさん:2009/03/04(水) 00:18:44
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                  回収!!


159 :デフォルトの名無しさん:2009/03/04(水) 00:20:33
ポート・・・?うーん勉強してきます・・・
ありがとう

160 :デフォルトの名無しさん:2009/03/04(水) 00:20:54
  ∧_∧
  ( ・∀・)
 と    )シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



161 :デフォルトの名無しさん:2009/03/04(水) 00:29:25
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                もう離すものか!!
                だれにも渡さない!



162 :デフォルトの名無しさん:2009/03/04(水) 00:31:26
      ∧_∧
   ∧_(∀゚ ; )
  ( ・∀・)   つ
  (っ夢⊂≡て ヽ よこせ
  して_)_ノw (_)

  ∧_∧
  ( ・∀・)
 と    )       シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



163 :デフォルトの名無しさん:2009/03/04(水) 00:35:28
いつも思うんだが、お絵かきできてうれしくなっちゃう奴って
精神年齢が幼稚園時代で止まってるのか?

本気で理解できんよ。

164 :デフォルトの名無しさん:2009/03/04(水) 00:37:57
コピペネタにマジレスかよw

165 :デフォルトの名無しさん:2009/03/04(水) 00:40:47
                  .∧__,,∧
                 (´・ω・`)
                  (つポート
                  `u―u´
ポートとは何ぞや!

166 :デフォルトの名無しさん:2009/03/04(水) 00:41:35
コピペだろうが何だろうがマジレスしてもらえるだけありがたいだろ

167 :デフォルトの名無しさん:2009/03/04(水) 00:42:42
わりい間違えた 
×マジレス
○キチガイレス
だわ

168 :デフォルトの名無しさん:2009/03/04(水) 00:44:22
>>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--;

169 :デフォルトの名無しさん:2009/03/04(水) 00:45:07
>>163
お絵かき楽しいだろ。
素直になれよ。

170 :デフォルトの名無しさん:2009/03/04(水) 09:49:54
>>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
それでもつなげないなら接続先のファイアウォールが邪魔してると思われる。

171 :デフォルトの名無しさん:2009/03/04(水) 10:12:34
そもそもManageMentStudioExpressとかで繋げてるのかな…・?

172 :デフォルトの名無しさん:2009/03/04(水) 10:46:18
>>159
>>171も言ってるように、SSMSとかサーバーエクスプローラとかで接続してみるのが先だな。
てか、TCP接続ってデフォルトでOFFじゃなかったか?

それにしても斬新な区切り方だな>>171

173 :デフォルトの名無しさん:2009/03/04(水) 11:39:32
C#でアッカーマン関数を計算させようとしていますが、スタックオーバーフローが
起きます。C#でスタック領域を広げるにはどうすればいいのですか?

174 :デフォルトの名無しさん:2009/03/04(水) 11:55:25
多倍長計算させて、それでスタックが足りなくなってるの?
それとも、普通にInt32なりInt64なりを使っていて、再帰が
深くなりすぎてスタックが足りなくなってるの?

後者だとしたら、どうせ計算可能な部分はめちゃめちゃ限られているので、
アッカーマン関数の値を計算していく順序を工夫すべきだと思う。

http://www.google.co.jp/search?q=アッカーマン関数&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
これ見ると分かるけど、m=3以降に関しては、頑張っても報われないよ?


175 :デフォルトの名無しさん:2009/03/04(水) 11:59:52
>>173
>>174で答えが出てるけど、どうしてもスタック領域を広げたいという話であれば
Threadクラスのコンストラクタで指定できるらしい。試してないけど。
http://msdn.microsoft.com/ja-jp/library/system.threading.thread.thread.aspx


176 :デフォルトの名無しさん:2009/03/04(水) 12:01:22
>>174
再帰が深くなりすぎます

>>175
具体的にはどのようなコードを書けば良いのでしょうか?さっぱりわかりません

177 :デフォルトの名無しさん:2009/03/04(水) 12:02:40
例えば大きな配列を確保する時など、後学のためにスタックサイズを
広げる方法を知っておきたいのです。C/C++ならリンカオプションで
簡単に出来るのですがC#では何かよくわかりません

178 :デフォルトの名無しさん:2009/03/04(水) 12:06:58
Threadクラスの(ThreadStart, Int32)のコンストラクタ

179 :デフォルトの名無しさん:2009/03/04(水) 12:07:08
.NETの配列はヒープに領域を取るのでスタック関係なし
再帰はスタックサイズの変更よりループに展開することを考えた方がいい

180 :デフォルトの名無しさん:2009/03/04(水) 12:07:47
>>178
それはヘルプを見て確認していますが、使い方がわからないのです
短いコードで良いので具体的な使い方を教えていただきたいのです

181 :デフォルトの名無しさん:2009/03/04(水) 12:09:45
別のスレッドを作ってそっちで動かすってこと
C# スレッド でググれ

182 :デフォルトの名無しさん:2009/03/04(水) 12:10:34
>>181
もちろん既にぐぐっていますがよくわからないのです

183 :デフォルトの名無しさん:2009/03/04(水) 12:12:09
スレッドが分からないくらいだったら
スタックサイズとか変なこと考える前に基礎をやれとしか

184 :デフォルトの名無しさん:2009/03/04(水) 12:17:16
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()
{
//...
}
}


185 :デフォルトの名無しさん:2009/03/04(水) 12:27:24
>>184
ありがとうございます
助かりました
これを参考に作り直してみます

186 :デフォルトの名無しさん:2009/03/04(水) 12:31:13
Stack<T>でも使って引数だけでもヒープに置くようにしたらだいぶマシなんじゃない
>このコンストラクタのオーバーロードを使用しないでください。
だし

187 :デフォルトの名無しさん:2009/03/04(水) 12:53:12
遅そうだけど素直に展開したらこんな感じか
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();

188 :デフォルトの名無しさん:2009/03/04(水) 14:12:06
>>139-143

20090304 - 19870305 = 219999

これを10000で割った商が年齢になる。
別にうるう年とか全然関係ない。
このスレは算数もできない文系プログラマばっかりなのか?


189 :デフォルトの名無しさん:2009/03/04(水) 14:20:49
算数や数学の問題じゃないだろうw
ともかくそれで正確な答えが出るんだったら便利だな

190 :デフォルトの名無しさん:2009/03/04(水) 14:41:44
>>188
すげーw
おまえ天才だなw

191 :デフォルトの名無しさん:2009/03/04(水) 15:04:33
結局、月を比較して同月なら日を比較してるだけじゃん

192 :デフォルトの名無しさん:2009/03/04(水) 15:11:11
>>191
何を言っているんだ?

193 :デフォルトの名無しさん:2009/03/04(水) 15:13:56
さすがC#スレ
レベルが低すぎる
日曜プログラマならぬなんちゃってぷry

194 :デフォルトの名無しさん:2009/03/04(水) 15:23:20

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).CompareTo(dt2) < 0) { ydiff--; }



195 :デフォルトの名無しさん:2009/03/04(水) 15:24:52
どうみても算数や数学の問題だろう。
極論を言えば、
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++;

197 :デフォルトの名無しさん:2009/03/04(水) 15:42:47
                    } 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を色々変えるとベンチマークにもなるかも。

198 :デフォルトの名無しさん:2009/03/04(水) 16:06:39
>>192
構造上、比較の優先順構造が桁の上下に投射されているだけだという話だろ

199 :デフォルトの名無しさん:2009/03/04(水) 16:14:13
ASP.NET でC#使ってます。VS2008。
Default.aspxが呼ばれたときに
それがWebClientからの要求かブラウザからの要求かを
見極める方法はありますか?
WebClientからの要求がTrueでその他はFalseと判断したいです。
ブラウザプロパティを見てみると
WebCleintの場合は"Unknown"と出るんですが、
新しいブラウザが開発されたらUnknownになるかなと思ったんです。
QueryStringによる判断は不可です。
ブラウザで直打ちされたらtrueになるので。
どなたかよろしくお願いします。

200 :デフォルトの名無しさん:2009/03/04(水) 16:33:00
HTTPリクエストヘッダなんかいくらでも詐称できる

201 :デフォルトの名無しさん:2009/03/04(水) 16:36:26
>>188
言ってることはわかるし、凄いとも思うんだが、C#のコードで表現すると
さほどシンプルでもないんじゃね。
int age = ((today.Year * 10000 + today.Month * 100 + today.Day)
  - (birthday.Year * 10000 + birthday.Month * 100 + birthday.Day)) / 10000;



202 :デフォルトの名無しさん:2009/03/04(水) 16:41:10
>>195
「引き算」と書かれてそれを鵜呑みに信じることこそが、真の思考を放棄していないプログラマなんだな。
楽だな。

203 :デフォルトの名無しさん:2009/03/04(水) 16:44:54
>>201 引き算だってC#で書けるだろ。
>>188はyyyyMMddを引き算すればいいじゃんってことを言っているわけで
わざわざ>>201みたいなコード書く必要ないよ、ってことだよ。
どう考えても>>188がシンプルで >>188の勝ちであることは否めない。
君の負け。

204 :デフォルトの名無しさん:2009/03/04(水) 16:46:16
>>201
年未満の線形性を切り捨てる代わり、うるう年を考えなくてもいいというのが利点

205 :デフォルトの名無しさん:2009/03/04(水) 16:48:17
勝ちとか負けとかガキかよw

206 :デフォルトの名無しさん:2009/03/04(水) 16:48:46
>>203
yyyyMMddをどこから持ってくるかという話でしょ。
intで定義されてるなら>201みたいな操作が必要だし、
Stringでとるならそれでもいいし。

207 :デフォルトの名無しさん:2009/03/04(水) 16:53:17
>>202
そんな悪態ついてないで素直になれよ。
最も合理的な解決策を見つけるのもプログラマの仕事ってことを言ってるんだろ。
それが積もってパフォーマンスに影響してくるんだからさ。
悔しいのは分かるけど、プライドでプログラムやるもんじゃない。


208 :デフォルトの名無しさん:2009/03/04(水) 16:57:00
>>206 どこから持ってくるも何も
int.Parse(DateTime.ToString("yyyyMMdd"))
とかでいいじゃん。Convert.ToInt32でもいいよ。


209 :デフォルトの名無しさん:2009/03/04(水) 16:57:31
>>203
で、コードは?

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;

どうみてもシンプルだと思うが。。。
スレ住人のセンスを疑うな・・・

211 :デフォルトの名無しさん:2009/03/04(水) 16:59:50
日付→文字列→数値と変換するオーバーヘッドを気にする俺は古い人間なのか?

212 :デフォルトの名無しさん:2009/03/04(水) 16:59:51
>>209
そんなコードも考えられないようなお前の脳みそを疑うよ・・・

213 :デフォルトの名無しさん:2009/03/04(水) 17:00:21
>>207
「引き算」と言われて何も疑わず信じることが思考停止でなくてなんなんだ?

214 :デフォルトの名無しさん:2009/03/04(水) 17:01:59
>>210
完全にトドネト脳だな

215 :デフォルトの名無しさん:2009/03/04(水) 17:02:07
int.Parse(DateTime.ToString("yyyyMMdd"))
これだけの操作の裏で、どれだけ複雑な操作が行われているか想像できない方が
プログラマとして不適格だろ。

216 :デフォルトの名無しさん:2009/03/04(水) 17:04:18
>>213
必死だなお前w
「引き算」と言われて、>>143みたいに
「引き算だとうるう年とかあるからダメだぜ?分かってねぇなあ。俺みたいにきちんとやるのが正しいんだよ!」
というような、
自分のやり方が一番正しいとして他人の意見をくみ取りもしないことが思考停止って言ってんの。

217 :デフォルトの名無しさん:2009/03/04(水) 17:06:43
>>207
>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。

>20090304 - 19870305 = 219999
はやり方が違うだけで言ってることは同じ。

下4桁の引き算がif (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day)) にあたり、
その結果、単に引くだけか、-1するかの違いだからな。

218 :デフォルトの名無しさん:2009/03/04(水) 17:07:49
雑談はよそでやれよ

219 :デフォルトの名無しさん:2009/03/04(水) 17:08:04
>>211
気になったら後でリファクタリングすればいい
まあある程度の規模になるなら、線形性がないという問題を抱え込んだままにしておくのは怖いが。

220 :デフォルトの名無しさん:2009/03/04(水) 17:08:10
>>213 お前プライドの塊だな。めんどくさいやつだな。

221 :デフォルトの名無しさん:2009/03/04(水) 17:09:45
>>216
だからその結果が正しいかどうかを疑わず信じろというのは思考停止だろ?
本当にそれで可能かどうか検討もせず受け入れるのが思考停止でなくてなんなんだ?

222 :デフォルトの名無しさん:2009/03/04(水) 17:11:12
>>216 結果が正しいかどうかはデバッグすればわかるだろ・・・
頭悪すぎるぞこいつ・・・。

223 :222:2009/03/04(水) 17:12:02
間違えた
×>>216
>>221


224 :デフォルトの名無しさん:2009/03/04(水) 17:13:12
>>223
>結果が正しいかどうかはデバッグすればわかるだろ・・・
この時点で正しいかどうか疑ってるからデバッグするわけだろ?
思考停止じゃないじゃん。


225 :デフォルトの名無しさん:2009/03/04(水) 17:14:51
年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
盲目的に受け入れるほうがおかしい。

226 :デフォルトの名無しさん:2009/03/04(水) 17:15:30
>>210
>>194のほうがシンプルじゃないかい?
そのままだと2月29日と2月28日を比較したときに、
2月29日の時刻が比較対象より前だと間違いになるので、
(そもそも時刻成分を考慮する必要がない気がするけど念のため)
ちょっと修正して:

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).Date.CompareTo(dt2.Date) <
0) { ydiff--; }



227 :デフォルトの名無しさん:2009/03/04(水) 17:18:32
馬鹿にされた文系プログラマがわんさか湧いててワロスwww

>年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
うん

>盲目的に受け入れるほうがおかしい。
うん、だから「閏年を考慮したら引き算ではつじつまが合わなくなる」という
自分の意見が正しいという意見を盲目的に信じるのはおかしいよな?

228 :デフォルトの名無しさん:2009/03/04(水) 17:20:16
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;


たいしてかわらん。

229 :デフォルトの名無しさん:2009/03/04(水) 17:21:18
>>227
そこから検算してああ正しいんだなと理解すれば問題ないじゃんw
言われてはいそうですかじゃアホだろ

230 :デフォルトの名無しさん:2009/03/04(水) 17:23:29
おいおい、なんでこんな厨臭くなってるんだw
初心者スレで言い合いすんなよガキだな

231 :デフォルトの名無しさん:2009/03/04(水) 17:24:57
エレガントな解を示したつもりが、あまり賞賛されなかったので拗ねているんです。

232 :デフォルトの名無しさん:2009/03/04(水) 17:27:15
結局>>217が真理
計算方法が違うだけで意味はどちらも同じ

233 :デフォルトの名無しさん:2009/03/04(水) 17:34:10
意味がどちらも同じなのはみんな分かってるよ。
今話題になっているのはコードの美しさと可読性だろ?
俺は少なくとも>>148>>228みたいなコードを見比べたら、
>>228の方がデキるプログラマって感じがするけどな。

234 :デフォルトの名無しさん:2009/03/04(水) 17:36:56
>>233

>>148が文系プログラマ、>>228が理系プログラマですね、わかります。

235 :デフォルトの名無しさん:2009/03/04(水) 17:38:55
ラムダ式って美しいんですか?(スマートな解という意味で)
美しいなら勉強するよ!

236 :228:2009/03/04(水) 17:40:31
× x.Year * 1000
○ x.Year * 10000

プギャー(AAry

237 :デフォルトの名無しさん:2009/03/04(水) 17:46:46
>>235
ぼちぼち美しい

238 :デフォルトの名無しさん:2009/03/04(水) 17:54:00
動的に処理を差し替えるような必要があればラムダ式は有効だけど
>>228のケースでは意味がないな。違いはメソッドより効率が悪いこと。
長くなるのを避けてるだけだと思う。

239 :デフォルトの名無しさん:2009/03/04(水) 18:06:02
>>235
まあ>228レベルならC的関数定義の別の書式に等しい。
マ的には現代的関数型言語みたいに、ラムダ計算後にインライン化とか末尾最適化が言語で保障されているなら嬉しいけど。

240 :デフォルトの名無しさん:2009/03/04(水) 18:18:54
知識はあってもかしこくない
だめだこりゃ
関数がいやならC#やるな

241 :デフォルトの名無しさん:2009/03/04(水) 18:31:11
どこをどう読んだら誰が関数が嫌なんて言ってるように見えるんだろう

242 :デフォルトの名無しさん:2009/03/04(水) 18:48:32
ラムダ式は超美しい。

243 :デフォルトの名無しさん:2009/03/04(水) 18:54:43
どうでもいいよ

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 {

246 :デフォルトの名無しさん:2009/03/04(水) 18:58:25
アッカーマン関数なんて使わないし

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;
                        }
                    }

248 :デフォルトの名無しさん:2009/03/04(水) 19:01:34
                    Ack[argM.Pop()][argN.Pop()] = value;
                    continue;
                }
            }
            return Ack[m][n];
        }
終わり。Ackermann(3,20);あたりで速さが実感できるぜ!。
あと、>>244の「>>174のコード」ってところ、アンカーミスで>>196のコードね。

>>246
>>173を思い出してあげてください。

249 :デフォルトの名無しさん:2009/03/04(水) 19:08:28
Dictionary<int, Dictionary<int, int>>は効率悪いな
struct Key { public int M; public int N; public override int GetHashCode() { return M ^ N } }
こういうのをキーにしたらDictionary<Key, int>で済むのに

250 :デフォルトの名無しさん:2009/03/04(水) 19:15:09
>>249
一般にはそうだろうけど、そもそも話題がアッカーマン関数だから、
mはどうせ0から5くらいまでしかとらないんだよね。だから別に
これでかまわないんじゃないかな。

あと、ハッシュ値の衝突って詳しくないんだけど、そういう衝突しまくる
ハッシュ関数って効率はどうなっているの?

251 :デフォルトの名無しさん:2009/03/04(水) 20:49:39
ファイルを選択して、それを別のコンソールプログラムに読み込ませて
その結果の出力(文字列)を別ウィンドウに表示したいのですが、どうやればいいですか?
ファイル選択まではいいのですが、別のプログラムを起動してそいつに引数を
渡すにはどうすればよいですか?



252 :デフォルトの名無しさん:2009/03/04(水) 20:51:32
Process

253 :デフォルトの名無しさん:2009/03/04(水) 20:52:30
>>251
Process のヘルプをじっくり見る。

254 :デフォルトの名無しさん:2009/03/04(水) 21:12:30
>>228はマイナスの年齢が出るから間違いだろそもそも

255 :デフォルトの名無しさん:2009/03/04(水) 21:22:08
>>238
別にメソッドと比べて効率悪くならないよ。

モノホンのラムダ式であるリスト構造に基づく関数定義から
実行時に動的にメソッドを生成する、なんて事は行われていない。

匿名メソッドの名前どおり、コンパイル時にコンパイラが勝手な
メソッド名を割り当ててメソッドを作る。自分でメソッド定義する
のと何も違いはない。


256 :デフォルトの名無しさん:2009/03/04(水) 21:27:19
デリゲート呼び出しが入る
最適化もできなくなるから使い方にもよるけど多かれ少なかれ確実に遅くはなる
その小さい差の意味は置いといて

257 :デフォルトの名無しさん:2009/03/04(水) 21:31:18
まじ?>>228のhoge(ほにゃらら)みたいなのって、匿名メソッドの呼び出し
として最適化されるんじゃなくて.Invokeされちゃうの?

ちょっとリフレクタで確かめてみる。

258 :デフォルトの名無しさん:2009/03/04(水) 21:39:14
ほんとだ。C時代のプリプロセッサマクロに代わる、スコープがあって上位スコープ
にアクセスできる素性の良いマクロとして利用する事がたびたびあったから、
ちょっとショック。

259 :デフォルトの名無しさん:2009/03/04(水) 21:52:18
>>251
P/Invokeを駆使して共有メモリ経由でやりとりする。
{Tcp,Http,Ipc}Channelクラスを使って通信する。
特定の位置にファイル作って監視させる。
アプリケーション構成ファイルを動的に書き換えて起動する。
ProcessStartInfo.Argumentsを設定してProcessオブジェクトのStartを呼ぶ。
Process.Start(string,string)を呼ぶ。

260 :デフォルトの名無しさん:2009/03/04(水) 23:01:02
>>259
何故難しい順に書く・・・

261 :デフォルトの名無しさん:2009/03/04(水) 23:06:21
理系プログラマだからさ

262 :デフォルトの名無しさん:2009/03/04(水) 23:10:49
かっこいい

263 :デフォルトの名無しさん:2009/03/04(水) 23:15:38
VS2005を使っているのですが2008にすると
C#3.0とかになっちゃうの?
今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?
.NET2.0用で作ってたのが.NET3.5になっても無問題?

264 :デフォルトの名無しさん:2009/03/04(水) 23:18:25
>>263
> VS2005を使っているのですが2008にすると
> C#3.0とかになっちゃうの?

も、使える

> 今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?

可能

> .NET2.0用で作ってたのが.NET3.5になっても無問題?

没問題

というか、.NET 3.5 って、.NET 2.0 上で動作する拡張なだけだから。

265 :デフォルトの名無しさん:2009/03/04(水) 23:19:44
>>263
C# 3.0 になる。
2005 → 2008 へのプロジェクトのアップグレードで失敗したって話は見たことも聞いたこともない。
.NET 2.0 が 3.5 になっても問題ない。

266 :デフォルトの名無しさん:2009/03/04(水) 23:34:30
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 および名前付きパイプ・・・
にチェックは言っているんですけどねー

まだまだ頑張る・・・応援よろしく


267 :デフォルトの名無しさん:2009/03/04(水) 23:49:24
>>263
ただ、Windows2000は.Net2.0までしか入らないから
その辺のサポートするならVS2008にしても.Net2.0で作り続ける必要がある。

プロパティ打つのがたるいし型推論も使えない。。orz

268 :デフォルトの名無しさん:2009/03/04(水) 23:53:50
>>266
まず、MSSQLSMSEで、IPアドレスで接続できるかどうか試してみれよ
サーバ名にIPアドレス、認証はSQL認証で、設定したアカウントを設定しれ。

269 :デフォルトの名無しさん:2009/03/05(木) 00:03:50
MSSQLSMSE<<とりあえず ぐぐってみる・・・・
まだまだ ど素人だな俺って・・・


270 :デフォルトの名無しさん:2009/03/05(木) 00:06:21
やっぱりC#使う場合はDBをSQLServerにすることが多い?

271 :デフォルトの名無しさん:2009/03/05(木) 00:15:47
269だけど
Accessとかもありじゃないでしょうか
おいらはAccess買えない貧乏仕様
定額給付でSqlServer2008でも買うか…

272 :デフォルトの名無しさん:2009/03/05(木) 00:18:02
実行後に実行プログラム自身を削除するのってどうすればいいですか?

273 :デフォルトの名無しさん:2009/03/05(木) 00:22:44
SQL Server 2008 Expressでいいんじゃないの?
無料だし、商用にも使えるし

274 :デフォルトの名無しさん:2009/03/05(木) 00:23:51
実行プログラムを実行して削除するプログラムを作る

275 :デフォルトの名無しさん:2009/03/05(木) 00:25:34
>>267
.NETとC#のバージョンがごっちゃになってないか?

276 :デフォルトの名無しさん:2009/03/05(木) 00:29:01
>>267
varはコンパイラの機能だから.NET Framework 2.0対象でも使えるはずだよ。

277 :デフォルトの名無しさん:2009/03/05(木) 00:33:50
>>268
なんかちょっとわかった!^^進展してないけど明日チャレンジします
ね・・・ねむけが

278 :267:2009/03/05(木) 00:38:45
あ!そうかも。
LINQが参照できなくて色々できないあたりから
色々思考停止してる。さんくす!

279 :デフォルトの名無しさん:2009/03/05(木) 00:42:06
ILのレベルでは何も代わっていないのだから、3.5で追加されたクラスライブラリを
使っているかどうかだけが問題なのだと思う。

Linq to ObjectはSystem.Linq.Enumerableクラスの拡張メソッドだから
.NET3.5専用。

でも、拡張メソッド機能自体は、.NET2.0でも使える(多分)、など。
型推論も自動プロパティも匿名メソッドも全部.NET2.0で使えるんじゃないかな(未確認)。

280 :デフォルトの名無しさん:2009/03/05(木) 00:46:27
>>279
ラムちゃんは?

281 :デフォルトの名無しさん:2009/03/05(木) 00:50:26
>>279
拡張メソッドは構文糖じゃないし、専用のアトリビュートが必要なのでダメでせう

282 :デフォルトの名無しさん:2009/03/05(木) 00:55:11
拡張メソッドは構文糖だよ。

283 :デフォルトの名無しさん:2009/03/05(木) 00:58:43
今日日何が糖衣構文とそうでないものの境界もあいまいな気もする。
糖衣というより、コンパイラが提供する機能と言った方が適切じゃないのか

284 :デフォルトの名無しさん:2009/03/05(木) 00:58:56
>>252-253
ありがとうございます。出来たのですが、コマンドプロンプト内に表示される出力内容を
取得できません。どうやればいいですか?


285 :デフォルトの名無しさん:2009/03/05(木) 00:59:02
>>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からなんだね。


288 :デフォルトの名無しさん:2009/03/05(木) 01:07:03
varって何が原因でいけないの?

289 :デフォルトの名無しさん:2009/03/05(木) 01:07:55
いないいない

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がローカル変数のみに有効ということを知らなかった。
メンバで試してエラーが出たのでダメと判断してた。
色々勉強になった、ありがとう。

292 :デフォルトの名無しさん:2009/03/05(木) 01:21:36
varはVBのvariantと違うんだ。他の変数同様に厳密な型付けはされる。

型推論によって型を明示しなくてもコンパイラがわかってくれるという
場合にだけ有効。

293 :デフォルトの名無しさん:2009/03/05(木) 01:25:05
IDEが優秀であれば問題ないかもしれんが、
紙で見てる分にはvarじゃ何の変数だかわからんので困らんのかな

294 :デフォルトの名無しさん:2009/03/05(木) 01:30:49
紙で見るとかw

295 :デフォルトの名無しさん:2009/03/05(木) 01:31:12
>>293
まあ、var にして型が何か分かりにくくなるようならやっぱ使わない方がいいと思う。


296 :デフォルトの名無しさん:2009/03/05(木) 01:35:32
少なくともwebや解説本、MSDNのサンプルプログラムで書かれてたらえらい迷惑

297 :デフォルトの名無しさん:2009/03/05(木) 01:41:08
.NET2.0の範囲で使えるC#3.0
推論型、匿名型, 暗黙型付け配列
コレクションのイニシャライザ、オブジェクトのイニシャライザ
パーシャルクラス、パーシャルメソッド
自動プロパティ、ラムダ式

.NET3.xが必要になる機能
ラムダ式でFunc<>, Expression<>を使用
LINQクエリ式他
拡張メソッド

>>281
拡張メソッドが使えないのはExtensionAttributeが3.5に含まれるから。
という事で、System.Runtime.CompilerServices.ExtensionAttributeを自分で定義してやれば2.0でも使える。
インテリセンスにゃ出ないけど、まぁそのくらいは我慢できるだろう。

298 :デフォルトの名無しさん:2009/03/05(木) 01:45:39
>>拡張メソッド、Func<>
ぶっちゃけSystem.Core.dllをローカルコピー=trueにして参照しちゃえば良いんじゃ・・・


299 :デフォルトの名無しさん:2009/03/05(木) 02:01:05
>>297
なんで必死なのかわからない

300 :デフォルトの名無しさん:2009/03/05(木) 02:10:52
>>299
なんで必死なのかわからない

301 :デフォルトの名無しさん:2009/03/05(木) 02:16:06
>>299
>>300
これだから文系は

302 :デフォルトの名無しさん:2009/03/05(木) 02:22:34
>>301
なんで必死なのかわからない

303 :デフォルトの名無しさん:2009/03/05(木) 02:34:48
ど、ど、ど童貞ちゃうわ!

304 :デフォルトの名無しさん:2009/03/05(木) 02:36:07
>299-303の話の流れがさぱりわからないんだが・・・

305 :デフォルトの名無しさん:2009/03/05(木) 02:41:10
触るな危険。放っておけ

306 :デフォルトの名無しさん:2009/03/05(木) 02:41:58
>>305
なんで必死なのかわからない

307 :デフォルトの名無しさん:2009/03/05(木) 02:51:15
>>306
これだから文系は

308 :デフォルトの名無しさん:2009/03/05(木) 02:51:58
>>307
なんで必死なのかわからない

309 :デフォルトの名無しさん:2009/03/05(木) 02:53:10
>>308
↓文系

310 :デフォルトの名無しさん:2009/03/05(木) 02:59:54
>>309
なんで必死なのかわからない

311 :デフォルトの名無しさん:2009/03/05(木) 03:00:42
OpenFileDialogでファイルを選択して、コンソールプログラムの引数に与えて実行しようとしています。
ファイルのパス名に空白が含まれるときは、どうすればいいですか?


312 :デフォルトの名無しさん:2009/03/05(木) 03:08:23
>>311
ダブルクォーテーション?

↓文系

313 :デフォルトの名無しさん:2009/03/05(木) 03:09:15
>>312
なんで必死なのかわからない



314 :デフォルトの名無しさん:2009/03/05(木) 03:15:02
変数に入ってるので、ダブルクォーテーションができないみたいなんですが、、
こんな感じ。
String s = OpenFileDialog.FileName;
ProcesStartInfo.Arguments = s;
こうやって、ProcessをStartすると、ファイル名のパスに空白があるとそこで引数が終わりと判断されてしまいます。


315 :デフォルトの名無しさん:2009/03/05(木) 03:24:46
その変数を括ったらどうなる?

316 :デフォルトの名無しさん:2009/03/05(木) 03:26:11
>>315
なんで必死なのかわからない


317 :デフォルトの名無しさん:2009/03/05(木) 03:27:35
String s = "\""+OpenFileDialog.FileName+"\"";

318 :デフォルトの名無しさん:2009/03/05(木) 03:28:59
えー、括ったら単なる文字列になってしまいませんか?
やってみたら、Visual Studioの作業ディレクトリ+"s"というファイル名
をオープンしようとして失敗する、という結果でした。

319 :デフォルトの名無しさん:2009/03/05(木) 03:30:49
>>318
>>317のように、文字列として括れってこと

320 :デフォルトの名無しさん:2009/03/05(木) 03:31:21
>>319
なんで必死なのかわからない

321 :デフォルトの名無しさん:2009/03/05(木) 03:31:28
>>317
できました!
なるほど、そうやるんですか。
ありがとうございました。

322 :デフォルトの名無しさん:2009/03/05(木) 03:34:04
なんで荒らしがわいてんだ?

323 :デフォルトの名無しさん:2009/03/05(木) 03:35:05
>>322
なんで荒らしがわいてんのかわからない

324 :デフォルトの名無しさん:2009/03/05(木) 03:36:49
>>322
自称エレガントな解法を示したつもりが、
誰にも相手にされなかった可哀想な一般人らしい

325 :デフォルトの名無しさん:2009/03/05(木) 03:38:30
>>324
なんで必死なのかわからない

326 :デフォルトの名無しさん:2009/03/05(木) 03:41:02
>>324
とりあえずNG登録だな
番号飛ぶけど

327 :デフォルトの名無しさん:2009/03/05(木) 03:42:19
日曜プログラマ、まだ粘ってたんか

328 :デフォルトの名無しさん:2009/03/05(木) 03:44:14
なんで文系という言葉に反応するんだろう?

329 :デフォルトの名無しさん:2009/03/05(木) 03:45:51
>>325
>>326
>>327
>>328
これだから文系は

330 :デフォルトの名無しさん:2009/03/05(木) 03:48:55
いいえ短小包茎です

331 :デフォルトの名無しさん:2009/03/05(木) 03:51:50
string.Format("\"{0}\"", path);

332 :デフォルトの名無しさん:2009/03/05(木) 07:26:57
ToolStripMenuItem で選択後、自動で閉じないようにしたいのですが
どうしたらいいのですか?



333 :デフォルトの名無しさん:2009/03/05(木) 09:37:28
その奇抜なUIの設計思想を変える

334 :デフォルトの名無しさん:2009/03/05(木) 10:08:16
自分でパネルにでもラベルとか作って完全に自作して実装すれば?

というかクリックして閉じないとか・・・どうやって閉じるんだ?
Windowsライクな実装の方が使い手も違和感ないと思うんだけど?

335 :デフォルトの名無しさん:2009/03/05(木) 11:03:21
継承してWndProcをフックすればいけそうな気はする


336 :デフォルトの名無しさん:2009/03/05(木) 11:23:00
DataGridViewにDataTableをバインドしています。
DataTableの更新が終わるまで描画処理を止めたいのですが、
ListBoxで言うところのBeginUpdate()のようなメソッドってありますか?


337 :デフォルトの名無しさん:2009/03/05(木) 11:43:50
データソースをBindingSource使うようにして
RaiseListChangedEventsプロパティで一時的にイベント通知無効化して
最後にResetBindingsで更新

338 :デフォルトの名無しさん:2009/03/05(木) 11:56:13
>>337
ありがとうございます。試してみます。

339 :デフォルトの名無しさん:2009/03/05(木) 11:58:30
>>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の存在意義を語って存在意義を否定してしまった。

340 :デフォルトの名無しさん:2009/03/05(木) 12:00:30
>>339
あれって良し悪しだよな・・・・

341 :デフォルトの名無しさん:2009/03/05(木) 12:02:58
varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。

342 :デフォルトの名無しさん:2009/03/05(木) 12:04:14
>>341
グッドアイデア!

343 :デフォルトの名無しさん:2009/03/05(木) 12:05:15
それヘジたんがC#3.0についてのインタビューで言ってたことだけどなぜか実装されなかった

344 :デフォルトの名無しさん:2009/03/05(木) 12:05:53
リファクタメニューに「ソリューション内のvarを実際の型名に置換」機能があったら、バリバリ使っちゃう。

345 :デフォルトの名無しさん:2009/03/05(木) 12:08:21
VSってアドイン作れるよね?しかも.NETで。誰か作ってよ。(他力本願)

346 :デフォルトの名無しさん:2009/03/05(木) 12:10:28
IDEの問題で解決できるなら、入力候補の推測機能ってことで実装すればいいのに。

? total = 0m;

という入力を許可し、;を入力した段階でIDEが?を推論した型に置き換える。
上の例だと、自動的に

decimal total = 0m;

に置き換わる。駄目?

347 :デフォルトの名無しさん:2009/03/05(木) 12:14:06
型を書くかvarを書くかという極端な判断が必要だから
その場に応じて使い分けるというのがどうしてもしづらいんだよな
var total : decimal = 0m;
はじめからこういうスタイルにしとけば型を省略しても誰も違和感を抱かなかった
今作り直したらこうなりそう

348 :デフォルトの名無しさん:2009/03/05(木) 12:16:44
なるほど、varを変数宣言の開始句として、:の後に型を書くのか。
で、:を入力した時点でInteliSenseが働くと。

でも、そこを弄ったらもう、"C"#じゃないんじゃ。

349 :デフォルトの名無しさん:2009/03/05(木) 12:20:23
よし、:はクラスやインタフェースの継承に使うし、最近は冗長でも
IDEの入力支援頼みでコードを英語の文章に近付けるのが流行だから、

var total as decimal=10m;

で行こう。あれ?どっかで見たことあるぞ。

350 :デフォルトの名無しさん:2009/03/05(木) 12:23:23
varの存在で一歩またVBに近づいた!
閣下、我々の陰謀は成功を収めつつあります。

351 :デフォルトの名無しさん:2009/03/05(木) 12:24:48
実際その点についてはVBのほうが自然だと思うよ
CスタイルのメリットはCやJavaと同じであることくらい

352 :デフォルトの名無しさん:2009/03/05(木) 12:29:11
型名 変数名;
って、
Animal dog;
でしょ?どう考えても英文法的におかしい。やっぱり、英文との類似性
よりも構文の単純さやキーワードの短さが尊ばれた時代の名残だよね。


353 :デフォルトの名無しさん:2009/03/05(木) 12:33:53
でも、VBのdimキーワードも、配列宣言からの流用だったりして
英単語的には怪しかったりする。やっぱキーワードはvarで。


354 :デフォルトの名無しさん:2009/03/05(木) 12:36:43
省略は良くない
今はIDEがあるのだからvarもvariableにするべきだ

355 :デフォルトの名無しさん:2009/03/05(木) 12:40:50
define a variable dog which is an Animal and let it be a new instance of Animal whose name is "dog";

356 :デフォルトの名無しさん:2009/03/05(木) 12:47:22
おいおい、文末はピリオドに決まってるだろ

357 :デフォルトの名無しさん:2009/03/05(木) 12:50:52
そうすると、フィールド、プロパティ参照のピリオドを取りやめないとな。
let the name of the dog be "ポチ".

358 :デフォルトの名無しさん:2009/03/05(木) 12:50:54
文頭に挨拶を書くのが礼儀だろ
dear my computer

359 :デフォルトの名無しさん:2009/03/05(木) 12:57:28
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 "ポチ".

360 :デフォルトの名無しさん:2009/03/05(木) 13:03:34
それじゃ面倒だから、これでいいよ

a d = n a("d")
d.n = "ポ"

361 :デフォルトの名無しさん:2009/03/05(木) 16:10:12
C#ってC++の一種とかんがえていいの?

362 :デフォルトの名無しさん:2009/03/05(木) 16:28:10
C++とC#は伯父と甥ぐらいの位置
とても一種とはいえない

363 :デフォルトの名無しさん:2009/03/05(木) 16:36:58
.NET言語は、CLRありきだから、多言語との親戚関係とかの議論は意味が
ないと思う。とりあえず、C++のサブセットでもスーパーセットでもない。
シンタックスがC由来の別物言語と捉えるべき。

それに、Cを拡張して言語仕様を肥大化させてオブジェクト指向を取り入れる
C++的なアプローチとは違い、JAVAを意識した自由度より構造性を優先させた
言語になっている。そのために、JAVA的な、やりたい事に対して解法が唯一つ的
な部分がある。

のわりに、P/Invokeなど泥臭いアプローチをしてでも自由度を確保する貪欲さもあって、
やりたい事ができないという事態も滅多に生じないようになっている。

良い所だけ挙げるならば、こんな感じでバランスの取れた構造的な言語。

プリプロセッサで変態マクロが定義できるC++なんか、もう見たくもないやい。

364 :デフォルトの名無しさん:2009/03/05(木) 16:53:35
VSのウイザードで作るCOMやらMFCの雛形はひどかった

365 :デフォルトの名無しさん:2009/03/05(木) 16:55:21
たまたまwin32のAPIと自分が作った関数名が衝突したので
名前空間で分けたらそれでも衝突して、調べて見たらマクロ定義
だった時の憤りといったら・・・

366 :デフォルトの名無しさん:2009/03/05(木) 16:57:39
C++でマクロを使う奴は馬鹿

367 :デフォルトの名無しさん:2009/03/05(木) 18:34:26
だからと言って避けて通れないのがC++のどうしようもない点なわけで。

368 :デフォルトの名無しさん:2009/03/05(木) 18:38:31
なにしろwin32APIが・・・MFCが・・・

369 :デフォルトの名無しさん:2009/03/05(木) 18:39:26
過去を引きずるのは大変だねとだけ

370 :デフォルトの名無しさん:2009/03/05(木) 19:01:25
10の位を切り上げる処理をするのに

y= Math.Ceiling (x / 10) * 10;

と書いてるんですが他にいい書き方とかありますか
括弧の使い方とかなんか不安なんですが・・・

371 :デフォルトの名無しさん:2009/03/05(木) 19:29:09
>>370
>>210をリスペクトして
y = Int32.Parse(String.Format("{0:d}0", (x + 9) / 10));
とか。

(ごめん、冗談だ、念のため。別に>>370の通りで問題ないよ)


372 :デフォルトの名無しさん:2009/03/05(木) 19:35:17
xが整数以外なら問題あるでしょ。
っていうか整数なら9足すだけなんだけど。。

さて質問。
Windows Form のOnLoadとか適当な場所に

DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
listBox1.DataSource = ar;
comboBox1.DataSource = ar;

のようなコードを書くと、コンボボックスとリストボックスの選択が相互に
連動するんだけど、この仕組みと、こういう仕様の意図が知りたい。

373 :デフォルトの名無しさん:2009/03/05(木) 19:46:27
データバインディング
GUIなんてデータ表示するだけなんだからわざわざTextだのItemsだの使うより
データを汎用的な形で関連付けられた方がいいよねという考え
カレント行の共有はCurrencyManager使ってコントロールの親子関係に基づいて行われる

374 :デフォルトの名無しさん:2009/03/05(木) 19:54:30
>>373
ごめん、その思想自体はよくわかるんだけど、知りたいのは
2つのまったく無関係のコントロールの選択されているアイテムが連動する仕組みと、
そのような仕様にしてある意図なんだ。

375 :デフォルトの名無しさん:2009/03/05(木) 19:56:20
windows formsだとそうなんだ。
WPFの場合
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
list1.DataContext = ar;
list1.SetBinding(ListBox.ItemsSourceProperty, "");
list2.DataContext = ar;
list2.SetBinding(ListBox.ItemsSourceProperty, "");
だと選択行は共有されないね。


376 :デフォルトの名無しさん:2009/03/05(木) 22:41:17
>>341
>varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。

それ似たのがReSharperにあるよ。

377 :デフォルトの名無しさん:2009/03/05(木) 22:42:44
似たようなのじゃためなんだ
僕らはC#に汚染されているんだ!

378 :デフォルトの名無しさん:2009/03/05(木) 22:46:21
>>377
ReSharperはVS用のアドインだよ。確か。

まあこちとら趣味プログラマのexpress edition使い。
たっかいツールなんか使う機会なんざねーんだけどね。

379 :デフォルトの名無しさん:2009/03/06(金) 00:03:40
>>268
ダメポ 続きは明日・・・・

380 :デフォルトの名無しさん:2009/03/06(金) 00:09:08
ちょっと最後に質問SQL serverでLanやりたい場合一般的にDBの配置は
C:\Program Files\Microsoft SQL Serverの配下ですか?
自分で作ったC:\aaaみたいなフォルダでもいいんですかね・・・・

381 :デフォルトの名無しさん:2009/03/06(金) 00:21:34
>>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イベントを抜けたら
次はクリックイベントが走るよというのを知る方法はありますか?

383 :デフォルトの名無しさん:2009/03/06(金) 00:52:34
>>382
初期化したいのに、PostBackしたときもPage_Loadが呼ばれるから、
ボタンを押した時はPage_Loadは呼んで欲しくないということだろうけど、
そのためのIsPostBackだから、それで判断すればいいのでは?

ASP.NETの場合は、表示するたびに、そのページの新しいインスタンスが生成される。
これはwebという仕組み上仕方のないことなので、Page_Loadを実行せずに
インスタンスが生成する方法は基本的にはない。
クリックイベントが発生するということは、IsPostBackが必ずTrueだから、
それで判断すれば?

・・という意味でなかったら、contextとかみれば、イベントがあるかどうか
わかったほうほうがあるはず・・

384 :デフォルトの名無しさん:2009/03/06(金) 10:01:27
>>374
無関係じゃないよ。同じ親コントロールに属して同じデータソースを参照してるじゃん。
無関係だと主張したいなら明示的にしないとだめ(Control.BindingContextプロパティ)。
仕組みはCurrencyManagerとかBindingManagerBaseとか調べれ。
意図? MSの人じゃないから答えられん。
まあ親とデータソースが同じなら現在行共有できた方が便利じゃねと思ったんじゃない?

.NET 2.0になってBindingSourceが追加されてデータソース主導になったけどな。

385 :デフォルトの名無しさん:2009/03/06(金) 11:57:01
web上にあるファイルのサイズを簡単に取得する方法はありますか。
ダウンロードする前に知りたいのです。

386 :デフォルトの名無しさん:2009/03/06(金) 12:00:40
簡単かどうかはその人次第だからなんとも
取得方法はそのファイルがどういうプロトコルで公開されているのかによるからなんとも
サイズ情報が公開されているかどうかはサーバ次第だからなんとも

387 :デフォルトの名無しさん:2009/03/06(金) 12:04:25
HTTPならHEADで返してくれればいいけどな

388 :デフォルトの名無しさん:2009/03/06(金) 15:00:26
HttpWebResponseのContent-Length
駄目な場合もあるけど

389 :デフォルトの名無しさん:2009/03/06(金) 17:33:22
匿名メソッドと、ジェネリクス(Listなどのコレクション以外)で
うまいこと使用している例や、より利点がわかりやすく紹介されている
サイトがあったら教えてください教えてください。

390 :デフォルトの名無しさん:2009/03/06(金) 17:43:46
>389
宿題?

391 :デフォルトの名無しさん:2009/03/06(金) 17:49:54
MSDNでいいんじゃね?

392 :デフォルトの名無しさん:2009/03/06(金) 18:06:45
匿名メソッドは自分だけが見るソースなら短いイベントハンドラの
定義に使うけど、推奨はできないなあ。

Button1.Click+=delegate{MessageBox.Show("Clicked!");};

とか。

処理の一部をカスタムできるメソッドを作るために使う例を
示せれば良いんだけど、できるだけLINQとか標準機能に落とし
込むようにしているので良い例がない。

ジェネリクスはやっぱり、独自のコレクションを作るとかが
多いんじゃない?

あと、幾つかデータの種類があって、それらのデータが更新された
時に更新値を受け取るコールバックを登録するメソッドが、
データの型をパラメタにとるジェネリックメソッドになっていた
のを見た事ある。でもこの場合、データの種類毎にメソッドを
用意するのと比べた場合の利点がさっぱり分からないコードだった。

393 :デフォルトの名無しさん:2009/03/06(金) 18:17:46
Regex.Replaceなんかまさに匿名メソッドとかラムダ式の出番

394 :デフォルトの名無しさん:2009/03/06(金) 19:08:52
>>390
宿題ではないです。

>>391
MSDNではサンプルが少ないのと、こういう時に使うと便利というのが、
イマイチよくわからないので。イベント的なコールバック用途というのは
意味はわかります。

>>392
ありがとうございます。
なるほど。自分も匿名メソッドにあまり利点を見いだせない一人です。
そのためサンプルがみたいと思ったのですが、
いいものがないということで残念です。

ジェネリクスもやはり独自コレクションがメインですか・・
コレクション以外の便利な使い方がイマイチ思いつかないので、
サンプルをお聞きしました。

395 :デフォルトの名無しさん:2009/03/06(金) 19:30:11
前に複素数のジェネリック型なんて議論されていたよね。
それは特殊でかつ有用な使い方なんじゃないかな。

396 :デフォルトの名無しさん:2009/03/06(金) 20:34:37
別に無理に利点を発見する必要は無いんじゃないの

必要に迫られたら使えばいい程度のものじゃないかね

397 :デフォルトの名無しさん:2009/03/06(金) 21:38:25
System.Linq.Enumerableで嫌と言うほど出てくるよ
結局はコレクション操作だから微妙だけどな
くだらない例だけどEventHandler<TEventArgs>とか

398 :デフォルトの名無しさん:2009/03/06(金) 21:49:34
Hoge a = 共通の前処理();
//aを使った固有の処理
共通の後処理(a);
こういうのが各所に出てきたから
void 共通の処理(Action<Hoge> action) { Hoge a = 共通の前処理(); action(a); 共通の後処理(a); }
こんなメソッドを定義して
共通の処理(a => { /*aを使った固有の処理*/ });みたいにしたことがある

399 :デフォルトの名無しさん:2009/03/06(金) 21:56:13
>>394
・とくめいめそっど
Win Forms やら WPF の非同期部分で大活躍?

・じぇねりくす
基本、型を爆発させないためにある。これを踏まえると
Func<T> とかなかなかに便利な使い方じゃないか?

400 :デフォルトの名無しさん:2009/03/06(金) 22:02:27
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");って記述すればいいと思っちゃうんだけど
わざわざこのように書く理由を教えてください。


402 :デフォルトの名無しさん:2009/03/06(金) 22:21:19
短く書けるからって言ってんじゃん。アホかよ。

403 :デフォルトの名無しさん:2009/03/06(金) 22:21:48
それだけかよw糞じゃん。

404 :デフォルトの名無しさん:2009/03/06(金) 22:22:19
だから推奨はできないって言ってるだろw

405 :デフォルトの名無しさん:2009/03/06(金) 22:24:25
糞すぎじゃん。
何でこんな機能つけたんだ。

406 :デフォルトの名無しさん:2009/03/06(金) 22:26:37
つLINQ
ラムダ式で同じことがもっと簡潔に書けるから匿名メソッドは不要になった
そのうち非推奨だとコンパイラが警告出すようになってもおかしくない

407 :デフォルトの名無しさん:2009/03/06(金) 22:28:19
状態によって、異なるクリックイベントを割り当てるのに便利かも。

状態をどこかのメンバ変数に保存して、同じメソッド内でメンバ変数の値によって分岐させるより、
処理そのものを差し替える感じ。
特に汎用できて処理を委譲できる場合なら尚更。

408 :デフォルトの名無しさん:2009/03/06(金) 22:30:25
C#3.0以降なら
Click += (sender, e) => { MessageBox.Show("Clicked!") };
と書くべき
匿名メソッドと違って引数省略できないのが時々不便に感じるけど

409 :デフォルトの名無しさん:2009/03/06(金) 22:52:26
匿名メソッドは List<T> 周りのメソッド眺めてみりゃどういう
感じに使うのかわかる気もするが…あえてイベントハンドラなら
一時オブジェクトに使う。WebClient とか

410 :デフォルトの名無しさん:2009/03/06(金) 22:55:40
>>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なり
をいじるイベントハンドラを書く方が自然なのでちょっと
人為的かな。

411 :デフォルトの名無しさん:2009/03/06(金) 22:59:54
何の断りもなく当然のように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スタイルとか良くは知らない趣味プログラマだけど、
こんな感覚でやっています。


414 :デフォルトの名無しさん:2009/03/06(金) 23:10:40
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が表示される、って事を知っておいて。
匿名メソッドで一番重要なのはこれなんだけど、脇に逸れ過ぎた。

非同期処理なんかをする場合には超超超〜重要なはずなので
誰か例を書いてくれ。

416 :デフォルトの名無しさん:2009/03/06(金) 23:29:48
わかりづらいんであんまりそういうのは多用しない方がいいと思うよ
>>415の中でs++したりするとわけがわからなくなる(サンプルとしては面白いけどね)
ローカル変数を取り込めるメリットは,>>398のようなパターンが自然に使えること

417 :デフォルトの名無しさん:2009/03/06(金) 23:36:52
引継でC#やる事になったんだけど、1ファイル5000行を越えるようなものがざらにあります。
一カ所直すのにも不要なものが目に付いて頭がグワングワンしてきます。
プロパティ、イベント、その他のメソッドという分類でファイル分割しようと思ってるんだけど、君らはどうしてるの?



418 :デフォルトの名無しさん:2009/03/06(金) 23:40:42
#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等のショートカットは知っておくと吉。

420 :デフォルトの名無しさん:2009/03/06(金) 23:51:42
>>413
> 本来は処理を適当な粒度で分割したメソッドを定義して、
> イベントハンドラはそれらを呼び出すだけの簡潔なもので
> あるべき。

理念的にはその通りだと思うんだけど、若干反発も感じるのは
その基本に忠実な書き方をすると、ベタにイベントハンドラに書いた場合と比べて
「その処理」がイベントハンドラからのみ実行される処理だという明示性が
失われるんだよね。

421 :デフォルトの名無しさん:2009/03/06(金) 23:59:16
>>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>
だけ。

423 :デフォルトの名無しさん:2009/03/07(土) 00:30:28
それ全部100にならない?

424 :423:2009/03/07(土) 00:33:36
100じゃなくて5050か

425 :423:2009/03/07(土) 00:52:09
確認したけどやっぱり意味的に間違ってる
匿名メソッドは現在のスコープの変数そのものを取り込むんだ
ループ内で生成される全ての匿名メソッドが同一のsを参照してるから
ただ一つのsのインスタンスを共有することになる
ループの中でint ss = s;みたいに宣言し直してそっちを取り込むようにしないとだめ

426 :デフォルトの名無しさん:2009/03/07(土) 00:56:32
え、ちゃんとくるくると1から5050まで行くけど。
コンピュータが速過ぎるんじゃない?

こういう、継続を必要とするデリゲートの場合
インナークラスが暗黙に定義されて、それがメソッドと
フィールドを持っている。デリゲートのインスタンス作成時には
このインナークラスのインスタンスが作成されて、フィールドに
必要な変数がコピーされる。これが参照型だと話がまたややこしく
なるけれど、値型ならば問題はないはず。

427 :デフォルトの名無しさん:2009/03/07(土) 01:02:18
いや>>422のコードだと確実にsのインスタンス(sを保持する自動生成されたクラスのインスタンス)は
一つしか作られないよ。IL見ればわかる。
何でうまくいくのかは知らないけど意味的には確実に間違ってる。

428 :デフォルトの名無しさん:2009/03/07(土) 01:12:10
ごめん、BeginInvokeじゃないから同期実行になっていた。
なんじゃこのオチ。

429 :デフォルトの名無しさん:2009/03/07(土) 01:24:19
スレッドの非同期処理しか役に立たないってのもなんか寂しいな

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しか表示されないんだけど、
ディスパッチャスレッドの優先度って低いの?

431 :デフォルトの名無しさん:2009/03/07(土) 02:02:54
ようはメソッド内で使用するだけの、クラスのメンバに加えるまでもないメソッドを定義するのに便利ってこと?

432 :デフォルトの名無しさん:2009/03/07(土) 02:03:06
タイムスライス内で終わってしまうからだろ。
ループもっと長くしろよ

433 :デフォルトの名無しさん:2009/03/07(土) 02:06:09
あいからわずLanでつながらない…


ところで>>155さんのIPアドレスってつなぎたいSQL SERVERのPcでコマンドプロンプトIPCONFIGででる
IP アドレスですか?

おれは一体何週間これをやってるんだろうか
いろんなスレ放浪して迷惑掛けまくりで


>>170 SQL Serverのポート番号は Express Edition場合動的で コンフィグレイションマネージャーで固定する遺体です



434 :デフォルトの名無しさん:2009/03/07(土) 02:12:48
>>433
まず、SQLSMSEで接続できるのか確かめなさいってば。
できた?

435 :デフォルトの名無しさん:2009/03/07(土) 02:17:55
えっと・・ちょっとまって

436 :デフォルトの名無しさん:2009/03/07(土) 02:19:38
サーバ名にIPアドレス、
SQLServer認証で、
設定したログイン名とパスワードで接続できる?

437 :デフォルトの名無しさん:2009/03/07(土) 02:28:35
MS server management studio expressで
ファイル−オブジェクトエクスプローラで接続を選択
サーバー名を
コマンドプロンプトipconfigで得たipV4のアドレスを入れる

認証を:SQL Server認証する
ログイン:コントロールパネルのシステムにでてるフルコンピュータ名
パスワード:パソコンにログインするパスワード


でやったら・・・だめでした・・・
どこが違うのでしょう?

438 :デフォルトの名無しさん:2009/03/07(土) 02:31:24
むむむ:設定した<<ログイン名>>これが、よくわかってない気がします・・・


439 :デフォルトの名無しさん:2009/03/07(土) 02:33:17
フォームに関してです、BackColorにTransparencyKeyに設定した色を設定した場合、
同じバイナリを実行したときにwindows XPでは透明部分をクリックするとその背後にある別のアプリケーションをクリックすることができます。
windows vistaでは透明な部分をクリックするとそのフォームをクリックします。
vistaでxpと同様にするためにはどうすればいいでしょうか?

440 :デフォルトの名無しさん:2009/03/07(土) 02:34:25
>>437
SQL Server認証は、SQL Server自体に設定する、
Windows認証(パソコンのコンピュータ名と、パソコンにログインするパスワード)とは別。
SQL ServerにSQL Server認証用のアカウントを別途設定して、
そのアカウントでログインする必要がある。

Windows認証でログインするのは、なんていうのかな、
アクティブディレクトリとか組んで、社内のネットワークに接続するのに必要な認証のことで、
それを認証の変わりと見なすってこと。
(SQLとネットワークの両方で認証したら面倒だから、ネットワークにログインする認証を
ユーザとして認めるっていうこと。Windows認証で今自分のアカウントで接続できるのはそういうこと。)

今は普通に家で勉強しているような感じだと思うので、
ネットワーク越しに接続するのにはWindows認証は関係ない。

441 :デフォルトの名無しさん:2009/03/07(土) 02:43:13
SQL Server自体に設定する<<ここがよくわからないところです
MS server management studio expressで設定するのでしょうか?

442 :デフォルトの名無しさん:2009/03/07(土) 02:45:14
わ もう3時か!
付きあわえて申し訳ない
もう少しググッテみます
でわっ

443 :デフォルトの名無しさん:2009/03/07(土) 02:45:52
>>432
和を取るの100000までににしてみたら、ずっとマウスポインタが砂時計に
なって、最後の結果だけが表示された。

タイムスライスってそんなに長いの?数10ms単位で切り替わるんじゃないの?


444 :デフォルトの名無しさん:2009/03/07(土) 02:48:48
>>441
SQL SMSEの左ペインのツリービューで、セキュリティ−ログインから設定する。
ログインを右クリして、新しいログインを作って、ログイン名を入力して、
SQL Server認証を選択して、パスワードを設定する。

さっきのリモートでのSMSEの接続には、ここで設定したSQL Server認証の
ログイン名とパスワードを設定すると接続できるということ。

バーチャルPCは、あなたのPCとは別のPCだから、
あなたのPCにログインするアカウントで、バーチャルPC内のSQLに接続はできないということ。
ただし、あなたのPCにインストされてるSQLServerは、あなたのPCにログインしているユーザを
SQLServerのユーザとしても認める設定をしているので、自分のPCのアカウントでも
ログインできましたってこと。

445 :デフォルトの名無しさん:2009/03/07(土) 03:03:59
自PcからSQL Server認証試したけれどだめでした
Ipv6じゃないと だめなのかな?

446 :デフォルトの名無しさん:2009/03/07(土) 03:07:40
だめですねー
V4V6同様に下記エラー

Microsoft SQL Server、エラー: 18452

444さんの通り新しいログイン作ったんですが

ミスったかな
試行錯誤してきます



447 :デフォルトの名無しさん:2009/03/07(土) 03:09:37
V4でいける
SQL Server認証で通らないのなら、なんかの設定がおかしいんでしょ
バーチャルPCのファイアーウォール機能が働いていて、そもそも接続できないとか、
SQLの設定でTCP/IPの接続をそもそも許可していないとか、考えるときりがない。

448 :デフォルトの名無しさん:2009/03/07(土) 03:11:16
>>446
その前にバーチャルPC上のSMSEで、そのSQLServerのアカウントでログインできる?
サーバ名に、そのバーチャルPCに割り当てられたIPアドレスを入力して。

449 :デフォルトの名無しさん:2009/03/07(土) 03:14:55
いや今は自Pc(ローカル)でチャレンジ中
>>448 ハイ ちょいとおまちを

450 :デフォルトの名無しさん:2009/03/07(土) 03:21:14
うは バーチャルpcにSMSEないや・・・・
ごめん

451 :デフォルトの名無しさん:2009/03/07(土) 03:23:03
バーチャルPCにSMSEがないのに、
どうやってアカウントを設定できるんだ?

452 :デフォルトの名無しさん:2009/03/07(土) 03:29:38
ベースのVISTA、ほうでアカウント設定したので  汗;


環境(Vista アルティメット(SMSEあり) <=  (ヴァーチャルPC Xp home (SMSEなし))

453 :デフォルトの名無しさん:2009/03/07(土) 03:35:08
VirtualPCのSQLServerにアカウント設定しなきゃ、
UltimetのSMSEから接続できないでしょうよ

VirtualPCは、まったく別のところにあるPCだと思わなきゃだめよ

454 :デフォルトの名無しさん:2009/03/07(土) 03:44:49
いや
VirtualPCのPGからUltimetのフォルダにあるMDFにコネクトしたいので・・・

うーん
VirtualPC側にアカウント必要なんですか?

455 :デフォルトの名無しさん:2009/03/07(土) 03:46:06
遅くまでありがとう
もう少し頑張る気力がわきました

456 :デフォルトの名無しさん:2009/03/07(土) 04:00:16
まだ起きてるなら、しばらく付き合ってやるけど?

457 :デフォルトの名無しさん:2009/03/07(土) 04:01:38
>>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を非同期的に更新する処理を匿名メソッドの
「継続」の利点を生かして簡潔に書く例になりました。

459 :デフォルトの名無しさん:2009/03/07(土) 04:39:04
>>443
切り替わっても Dispatcher キュー処理するほうが時間かかってる
だけだろそれ。WPF は基本保持モード

460 :デフォルトの名無しさん:2009/03/07(土) 05:36:38
>>459
そうです。マウスポインタが砂時計に変わることから、ようやく、
これ、UIスレッドの方が滞っているんじゃん、と気が付けました。

461 :デフォルトの名無しさん:2009/03/07(土) 06:27:10
>>458
引数いらないなら、こっちの方が良いんじゃないか。(インテリセンスに出ないけど)

 Dispatcher.BeginInvoke(DispatcherPriority, Delegate)

あと、DispatcherExtensions クラスにある拡張メソッド使うと、

 Dispatcher.BeginInvoke(Action, DispatcherPriority)

が使えるらしい。(型推論が効く)


462 :デフォルトの名無しさん:2009/03/07(土) 08:23:33
>>457 了解SMSEインストールしてきま・・

463 :デフォルトの名無しさん:2009/03/07(土) 10:19:21
>>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);
と三つも。なんでこんな事になっているんだ?

464 :デフォルトの名無しさん:2009/03/07(土) 16:22:37
疑問に思ったんだが、WPF の Dispatcher.Invoke には WinForms の
EventHandler、MethodInvoker、WaitCallback みたいに、
特別扱いされてるデリゲートは無いのかな

今夜にでもソース読んでみるか

465 :デフォルトの名無しさん:2009/03/07(土) 16:41:02
>>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; }
        }
    }
}

466 :デフォルトの名無しさん:2009/03/07(土) 16:46:03
匿名メソッドに関しては、別スレッドで画像がロードされたときに
メインのUIのサムネールを更新する例として(これはいままで議論されてたのと
基本的に同等のものだが)

Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal,
(Action)delegate { OnPropertyChanged("Thumbnail"); }


467 :デフォルトの名無しさん:2009/03/07(土) 17:19:16
>>457

SMSEインスト完了  く^^


アカウント作れない・・・
このバージョンの Microsoft Windows では、MUST_CHANGE オプションはサポートされません。
がーん



468 :デフォルトの名無しさん:2009/03/07(土) 17:21:16
SMSEはインストできたんだから、アカウントつくれる方に接続すればいいじゃん

469 :デフォルトの名無しさん:2009/03/07(土) 18:51:15

>>468
むむむ諦めていたところに
良意見
試行錯誤中

470 :デフォルトの名無しさん:2009/03/07(土) 19:05:47
C#になんの関係もないことに、そろそろ気付けよ・・・

471 :デフォルトの名無しさん:2009/03/07(土) 19:07:45
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及びパイプ)変更
サービス停止再起動

結果 上記と同じ・・・・だああああああああああああああああ<<<今ここ

473 :デフォルトの名無しさん:2009/03/07(土) 19:15:11
他の方法でちゃんとつながるようになってから来い、ってことだわな。

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
つぶってくれ ・・・

477 :デフォルトの名無しさん:2009/03/07(土) 19:23:50
>>472
他の要因が原因に成りにくい方法から、一つずつ確実にテストしなくちゃだめだな。
なんで、VistaのSQLSMSEで、VistaのSQLに、SQL認証で、そのアカウントで接続できるかどうかが第一点。
1)接続できなかったら、アカウントの設定が間違ってる。
2)接続できたら、アカウントの設定は正しいので、ネットワーク越しの接続に不備がある。
・この場合、VistaやXPのファイアーウォールやアンチウィルスのファイアーウォールの可能性
・SQLServerの設定でTCP/IP越しの接続ができなくなってる
・SQLServer2005だと、Advanveなんちゃらをインストしてないと、リモート接続が許可されないとか、
そんなのもあった気がする。

478 :デフォルトの名無しさん:2009/03/07(土) 19:26:07
アカウントってなんだよ・・・
SQL Server 認証に NT アカウントは関係ないぞ。(TCP/IP なら)

479 :デフォルトの名無しさん:2009/03/07(土) 19:33:24
ログイン名:ja

↑こんなログイン作ったのか? 最初からあるのは「sa」だぞ?

あとは、ポート 1433 を開けてあるのか確認すれ。

480 :469:2009/03/07(土) 20:25:54
うん
簡単にできたから面白くて
maとjaとか作った

vistaの
コンフィグレーションマネージャーで動的ポート消して
IPALLを1433に変えて再起動

ダメ
というより
ローカル(vista内)でさえSQLserver認証できてないような信頼がどうのかとか

481 :デフォルトの名無しさん:2009/03/07(土) 20:30:31
もういいでしょ。SQLサーバの設定正しくできるようになってから、またおいで。

482 :469:2009/03/07(土) 20:33:56
わかった
すまなかったごめんな
皆さん急がしいところ2週間もありがとうございました


483 :デフォルトの名無しさん:2009/03/07(土) 20:52:54
>>481
本当に役立たずだなお前

484 :デフォルトの名無しさん:2009/03/07(土) 21:06:56
在日がイライラしてんだろ察してやれ

485 :デフォルトの名無しさん:2009/03/07(土) 21:09:32
うわ・・・

486 :デフォルトの名無しさん:2009/03/08(日) 00:18:13
スレ違いは別にいいんだけどさ、勝手な略語を書き込みまくるのはやめれ

ttp://msdn.microsoft.com/ja-jp/library/ms365247(SQL.90).aspx

487 :デフォルトの名無しさん:2009/03/08(日) 01:42:23
C#でWindows Formアプリーケーションを作成し、WebBrowserコンポーネントを
乗せています。
そこにSVGファイルを表示させたいのですが、実行するとコンポーネント内には

--------------------------------------------------------------------
取り消されたアクション

Internet Explorer は、要求された Web ページにリンクできませんでした。
要求された Web ページは現在、利用できない可能性があります。
--------------------------------------------------------------------

と表示され、別途IEが起動します。
別途起動したIEには「セキュリティ保護のため、コンピュータにアクセス
できる・・・」といういつものメッセージが表示され、
「ブロックされているコンテンツを許可」を選択すると正常に表示されます。

そのファイルをHTMLでラップするとIEの起動は止められますが、
コンポーネント内には空白と赤×のアイコンが出るだけです。

恐らくブラウザコンポーネントのセキュリティ設定の問題だと思うのですが
Windows Formアプリケーションから呼び出したときだけセキュリティの
レベルを下げることは可能なのでしょうか?
それとも別の開放があるのでしょうか?

ちなみに読み込ませるファイルはローカルにあり、自分で書いた安全な物です。

488 :デフォルトの名無しさん:2009/03/08(日) 01:58:59
>>487
http://codezine.jp/article/detail/246?p=1

489 :464:2009/03/08(日) 02:16:10
ttp://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatcheroperationcallback.aspx
> ディスパッチャ操作にこのデリゲートを使用する必要はありませんが、
> DispatcherOperationCallback と SendOrPostCallback は動的な呼び出しを使用します。

この文章がまじで意味不明だったんだが、大体分かった。
DispatcherOperationCallback と SendOrPostCallback *以外は* DynamicInvoke() される。

で、>>461の DispatcherExtensions クラスの拡張メソッド BeginInvoke() を使うと、
Action を DispatcherOperationCallback でラップしてくれる。

490 :デフォルトの名無しさん:2009/03/08(日) 02:30:09
>>488
COMですか・・・。
と言うことはWebBrowserコンポーネントじゃなく、COMのaxWebBrowserを
使うということでしょうか?
後、これは.Net 3.5、Visual Studio 2008でも通用するテクニックなのでしょうか?
明日試してみます。ありがとうございました。

491 :488:2009/03/08(日) 03:15:24
>>490
ごめん、自分で実装したことはないから詳細は不明
とりあえず、
webbrowser IInternetSecurityManager
のキーワードで検索するといろいろ引っかかるから使えるかどうか調べてみてください

492 :デフォルトの名無しさん:2009/03/08(日) 03:23:31
>>491
はい。とりあえずやってみます。

正直COMはあんまり良く理解してないのでWebBrowserコンポーネントで
何とかできるとありがたいのですが・・・。

493 :デフォルトの名無しさん:2009/03/08(日) 12:47:41
>>489
型推論が効くって説明は誤っていると思っていたので気になって
いたんだけど、了解した。
Dispatcher.BeginInvoke((Action)delegate{},優先度);
って書くと呼び出しが高速になるって事だね。それで引数が必要ならば
拡張メソッドじゃない標準のBeginInvokeを使って
DispatcherOperationCallbackかSendOrPostCallback
を使えば良いと。

ところで、
using System.Windows.Threading;
しても、この拡張メソッドがInteliSenseに出てこなくて拡張メソッドが
有効になっていない気配だったので気になって調べて見たら
System.Windows.Presentation
への参照を追加するのが必要なのね。これでめでたくInteliSense
に出てきました。

494 :デフォルトの名無しさん:2009/03/08(日) 13:45:57
C#2.0、ジェネリクスメソッドで、型のインスタンスを生成して返すことってできますか?
できるのなら、どうすればいいでしょうか。こんなことをやりたいです。

public T Hoge<T>()
{
 return new T();
}

495 :デフォルトの名無しさん:2009/03/08(日) 13:53:14
public T Hoge<T>() : where T : new() { return new T(); }
ちなみにこのnew T()はActivator.CreateInstance<T>()のシンタックスシュガー

496 :デフォルトの名無しさん:2009/03/08(日) 14:48:35
おお、できたありがとう!

497 :デフォルトの名無しさん:2009/03/08(日) 19:56:56
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;
}


499 :デフォルトの名無しさん:2009/03/08(日) 22:35:47
一般にはそれしかない
_dataがList<T>や配列ならFindとか使えばいい

500 :デフォルトの名無しさん:2009/03/08(日) 22:39:21
std::setみたいのって無いの?

501 :デフォルトの名無しさん:2009/03/08(日) 22:39:44
.NET3.5で要素が重複しないならHashSet<T>使えば速いかも

502 :デフォルトの名無しさん:2009/03/08(日) 22:47:37
_dataについてIEnumerable<T>型であること以上のことがわからないのであれば,
asでICollection<T>にキャストしてnullなら>>498方式,nullでなければICollection<T>.Contains
を使うのが一般に速いはず
LINQが使えるなら何も考えずEnumerable.Containsを使えばいい
(こういう小細工は中でやってくれるから)

503 :デフォルトの名無しさん:2009/03/08(日) 23:59:18
main()があるクラスの名前ってどうしてる?
IDEの吐くスケルトンのデフォのProgramのままが普通なんだろうか。

あと、グローバルなシングルトンを取得する静的メソッドを寄せ集めたクラスって
定番の名前とかあるのかな。

504 :デフォルトの名無しさん:2009/03/09(月) 00:01:24
どっちも絶対にinternalにするので名前なんてどうでもいい

505 :デフォルトの名無しさん:2009/03/09(月) 00:05:15
>>503
クラス名・変数名に迷ったら書き込むスレ。Part14
http://pc11.2ch.net/test/read.cgi/tech/1230477632/l50


506 :デフォルトの名無しさん:2009/03/09(月) 00:06:35
>>505
なにこの俺にぴったりのスレ。

507 :デフォルトの名無しさん:2009/03/09(月) 00:21:07
>>504
コードを書く人にとってはそうでも、コードを読む人(3ヶ月後の自分を含む)
にとってはそういう考え方は困る。

少なくとも普通はクラスファイルが数十以上になる、
ある程度実用的なコードを書いてる場合は。

前にも書いたけど、やっぱり2chってトリビアルな知識はなぜか妙に詳しいが
大きなプログラムは書いたことないし書けない人間が多いのかな。

508 :デフォルトの名無しさん:2009/03/09(月) 00:22:48
最後の2行がなければ全面的に同意したのに

509 :デフォルトの名無しさん:2009/03/09(月) 00:25:42
大きいの作るときにグローバルインスタンス寄せ集めクラスはそもそもどうかと

510 :デフォルトの名無しさん:2009/03/09(月) 00:57:31
>>507
個人的には C# だと名前変えるのそんなに大変じゃない場合が
多いから >>504 とは別の理由で結構無頓着だなぁ

名前ってウダウダ考えるより書いてないときにひょんと来たり
整理してから思いついたりするから後回しにしてそういう時間を
とるほうを優先するかな。

511 :デフォルトの名無しさん:2009/03/09(月) 09:40:54
どうでもいいというのは、その状況で適切な名前をつければいいと言うことであるわけで
何か固定の名前を付けるなんて小規模で1人でやってる場合ならいいが

512 :デフォルトの名無しさん:2009/03/09(月) 16:55:32
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=??


513 :デフォルトの名無しさん:2009/03/09(月) 17:42:59
rubyでMechanize使って実装していた処理をC#に移植中なんですが
「Webページのテキストボックスに文字列を入力してsubmitボタンを押す」
というような処理をするときWebBrowserクラスを使うしかないんでしょうか

できればDocumentCompleteで待つように別スレッドが発生しないクラスがあればうれしいのですが・・・

514 :デフォルトの名無しさん:2009/03/09(月) 17:49:00
多分IronRubyとか使ってRubyのを使えるだけそのまま使った方がいい

515 :デフォルトの名無しさん:2009/03/09(月) 17:50:47
なんでC#なんだろ

516 :デフォルトの名無しさん:2009/03/09(月) 18:38:40
Linqについて勉強しようと思っているのですが、何かお薦めの本があれば教えてください

517 :デフォルトの名無しさん:2009/03/09(月) 19:13:43
もしかしたら、.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
-----------------------

解説は次のレスで。

518 :デフォルトの名無しさん:2009/03/09(月) 19:16:00
勘違い
以上

519 :デフォルトの名無しさん:2009/03/09(月) 19:25:00
http://msdn.microsoft.com/ja-jp/library/system.reflection.typedelegator.aspx
> TypeDelegator クラス
> Type オブジェクトをラップし、すべてのメソッドをこの型にデリゲートします。

という継承用のヘルパークラスなんですが、以下の二点について。

(1) Typeクラスのメソッドのうち、.NET 2.0以降でサポートされたメソッドをサポートしていない?

きちんと確かめたわけではないのですが、TypeDelegatorでは.NET 1.1の時点で
Typeがサポートしていたメソッド以外について委譲(デリゲート)を実装していないように見えます。

通常は、Type.GetGenericArguments()を呼ぶと、実行時にはSystem.RuntimeTypeの実装を呼ぶので
問題ないのですが、TypeDelegatorから呼ぶと、継承元のメソッドであるType.GetGenericArguments()
が呼ばれます

また、SSCLIにあるコードによれば、Typeでの実装は
http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System&type=Type
> public virtual Type[] GetGenericArguments()
> {
>   throw new NotSupportedException(Environment.GetResourceString("NotSupported_SubclassOverride"));
> }
となっているらしいので、TypeDelegator.GetGenericArguments()を呼ぶと
NotSupportedException(「派生クラスには実装を指定しなければなりません。」)が投げられてしまうようです。

520 :デフォルトの名無しさん:2009/03/09(月) 19:38:51
ジェネリクスでも、メソッドの引数としてType typeof(T)を渡すとSystem.RuntimeTypeが渡されるけど
同じ場所でtypeof(T).ToString()を渡すとTのクラス名が渡される

なぜだ?
坊やだからさ

521 :デフォルトの名無しさん:2009/03/09(月) 19:39:16
(2) Type.Equals((object)TypeDelegator)の判定が正常でない?

Type.Equals(object)の方を呼んでTypeDelegatorのインスタンスを渡した場合のみ、
同じTypeを指していてもfalseが戻るようです。
こちらは原因がさっぱり分かりませんが、正常な判定ではないような気がします。

---------------------
というのが私の意見なのですが、勘違いぽかったらツッコミをお願いします。

522 :デフォルトの名無しさん:2009/03/09(月) 19:48:26
>>520
すいません、もう少し詳しくお願いします。

523 :デフォルトの名無しさん:2009/03/09(月) 20:04:35
とあるジェネリクスメソッドGeneticMethod<Nullpo>内で
public void Method(Type type)としてMethod(typeof(T))とすると、
MethodにはSystem.RuntimeTypeが渡される
同じジェネリクスメソッド内から
public voix Method(string typeName)としてMethod(typeof(T).ToString())とすると、
Methodには、Nullpoが渡される

524 :デフォルトの名無しさん:2009/03/09(月) 20:11:34
>>523
申し訳ない、その場合どこが問題なのか分からないです。。

525 :デフォルトの名無しさん:2009/03/09(月) 20:18:10
引数として渡しているのは、同じNullpoなのに、片方はなぜかSystem.RuntimeTypeが返るんだぜ
なぜだ

526 :デフォルトの名無しさん:2009/03/09(月) 20:59:00
.NET版のwikipediaってないですか?
C#とMSDEとかで作られてるやつ。
社内のシステムに取り入れたいんです。

527 :デフォルトの名無しさん:2009/03/09(月) 21:04:23
>>526
Wikipedia はないだろ。Wiki はあるけど。

528 :デフォルトの名無しさん:2009/03/09(月) 21:10:32
>>527
wikiを教えてください。

529 :デフォルトの名無しさん:2009/03/09(月) 21:17:58
ぐぐったら 三番目にでてきた

http://csharp-source.net/open-source/wiki-engines

DotNetNuke(DNN) にも、Wiki の機能はあったはず。

530 :デフォルトの名無しさん:2009/03/09(月) 21:24:08
>>525
typeof(T)がSystem.RuntimeTypeなのは、もちろん当然ですよね。
typeof(T).ToString()がstringなのも、やはり当然ですよね。

具体的に、どの辺が問題だというお話なんでしょう?

531 :513:2009/03/09(月) 21:27:58
>514 >515
.NETの機能を使えと上に言われて組んでる感じです
何でなのかは・・・よくわかりません・・・w

このレスの感じだとWebBrowser使うしかな下げな感じですかね
レスポンスありがとうございました

532 :デフォルトの名無しさん:2009/03/09(月) 21:29:13
>>530
typeof(T).ToString()はstringだけどNullpoだって

typeof(T)をTypeとして渡してType(T).ToString()がSystem.RuntimeTypeなら、
typeof(T).ToString()がSystem.RuntimeTypeでないのはなんでだぜ?

533 :デフォルトの名無しさん:2009/03/09(月) 21:39:39
>>531
ううん。

HttpWebRequest でリクエストして、結果を受け取って、
さらに Post する。

atmarkIT とかにサンプルあるよ。

534 :デフォルトの名無しさん:2009/03/09(月) 21:41:48
話がかみ合ってないんだから、へんなたとえ話するのやめろよ

535 :デフォルトの名無しさん:2009/03/09(月) 21:43:19
>>531
WebBrowserはGUIありきなので表示しないのなら使うべきでない
標準ライブラリにはスクレイピング用ライブラリは存在してない
自前で実装するかCodeProjectあたりから拾うかしないと駄目だな

あ、IEを非表示で使う? でもIE7から面倒になったような気がする

536 :デフォルトの名無しさん:2009/03/09(月) 21:49:42
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/318webpost/webpost.html

基本はこの辺かな?

537 :デフォルトの名無しさん:2009/03/09(月) 21:50:16
>>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

538 :デフォルトの名無しさん:2009/03/09(月) 22:17:06
>>537
パソコンから「ガッ」って音がしました!

539 :デフォルトの名無しさん:2009/03/09(月) 22:21:04
>>537
いやいや
private void Method<T>()

540 :デフォルトの名無しさん:2009/03/09(月) 22:21:26
>>537
まだ私が何かわかってないのかもしれませんが、
Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上、
両方とも"Nullpo"というstring型インスタンスとしてWriteLine()に渡るのは、
特に不思議ではないのでは。

私が>>517-521で疑問視しているのは、Type型のスーパークラスであるobject型を引数に取る、
Equals(Type)のオーバーロードであるEquals(object)の結果が、Type型のそれと異なっている
のは不自然だし、そもそもEquals()の常識的に考えられる結果と齟齬しているのではないか、
ということなのですが。

541 :デフォルトの名無しさん:2009/03/09(月) 22:32:15
>Type型インスタンスをstring型の引数に渡したら、暗黙にToString()が呼ばれる以上
呼ばれません。WriteLineの引数の型はobject型で中でToStringを呼んでます。


542 :デフォルトの名無しさん:2009/03/09(月) 22:40:03
コネクションプーリングってやつはado.netが勝手にやってくれるもんなんすか?
プログラムでは、DBに接続してSQL発行して切断するというロジックを組んでも
内部的には切断されずに次の処理のためにセッションを保持しててくれるの??

543 :デフォルトの名無しさん:2009/03/09(月) 22:41:51
RuntimeTypeがType.Equals(Object)の実装をオーバーライドして
単純な参照比較に変更してるのが原因みたい
どう考えても明確な意図があってやってると思われるのでたぶん仕様なんだろう

544 :デフォルトの名無しさん:2009/03/09(月) 22:46:23
>>542
はい。設定は、接続文字列でやります。

545 :デフォルトの名無しさん:2009/03/09(月) 23:01:38
>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版ってありますか?

548 :デフォルトの名無しさん:2009/03/09(月) 23:18:48
>>541
なるほど。
どちらにせよ、該当メソッドの実装意図から考えても不自然な挙動ではないように思います。

>>543
>>545
確かに、これは仕様と考えて対処した方が良さそうですね。

いちおう、TypeDelegatorの件(>>517)も気になるので合わせて報告しておきたいのですが、
こういうのってどこに報告すればよいんでしょうか。

549 :デフォルトの名無しさん:2009/03/09(月) 23:37:06
>>546
直接には無理。追加したらフラグ立てとくしかない。
イベントというのはそういうもの。
>>548
いやTypeDelegatorは継承して必要なメソッドをオーバーライドするものなので
好きにオーバーライドして使えということだろ
NotSupportedExceptionを投げるのが既定の実装なんだから何もおかしくない

550 :デフォルトの名無しさん:2009/03/09(月) 23:45:09
TypeDelegatorってTypeの派生クラス作るときにabstractメンバ全部実装するの面倒だから
既定の丸投げ実装を提供してるだけなんだと思う
GetGenericParametersはabstractじゃないんだから当然そのまま
GetGenericParametersに限らずTypeの他のvirtualメンバもTypeDelegatorでは実装されてない

551 :550:2009/03/09(月) 23:46:01
GetGenericArgumentsだった

552 :デフォルトの名無しさん:2009/03/09(月) 23:46:13
>>517
これって、type.Equals()はRuntimeType.Equals()を呼んでいて、delegator.Equals()はType.Equals()を呼んでるから
結果が違うんじゃないの?
RuntimeType.Equals()は
obj == this
だし、Type.Equals()はUnderlyingSystemTypeを比較してるみたいだけど。
TypeDelegatorのUnderlyingSystemTypeはコンストラクタで代入したTypeのインスタンスのUnderlyingSystemTypeを
返してるみたい。

>>545
>Object.Equalsの要求仕様
今まで特に気にして無くて初めて知ったので読んでみたい。詳細キボン

553 :デフォルトの名無しさん:2009/03/09(月) 23:50:24
>>549
確かにそれも一理あると思います。
ただ、ドキュメントの一行目に

  Type オブジェクトをラップし、『すべての』メソッドをこの型にデリゲートします。

と書いてあるわけで、実際には委譲されないメソッドが存在するのは、
ドキュメントを読んだライブラリ利用者が期待する挙動に即しているとはいえないのでは。

554 :デフォルトの名無しさん:2009/03/09(月) 23:52:09
>>552
MSDNのObject.Equalsのページに載ってる
>>553
そういうのは九割九分ドキュメントの方が悪いw
よくあること

555 :デフォルトの名無しさん:2009/03/09(月) 23:55:44
>>546
別に重複して登録されたりはしないよ。

556 :デフォルトの名無しさん:2009/03/10(火) 00:00:24
重複して登録されるよ。

557 :555:2009/03/10(火) 00:02:27
試してみたら重複して登録される...orz。


558 :555:2009/03/10(火) 00:05:30
ちょうどObject.Equalsの話が出ているのでついでに書いておくと
デリゲートってインスタンスが違くても参照先のメソッドが等しければ
等価って判定されるんだよね。いわゆる値比較ってやつ。

だから、イベントの登録、削除もそれを反映していると勘違いしていた...orz.

559 :デフォルトの名無しさん:2009/03/10(火) 00:05:40
>>552
どうもそういうことみたいですね。

>>554
これのせいで2〜3日潰した方としてはかなり文句が言いたい感じですがw
むぅ〜

560 :デフォルトの名無しさん:2009/03/10(火) 00:12:39
>>554
thx
今回引っかかってるのは

・x.Equals(y) は y.Equals(x) と同じ値を戻します。

ってやつか。

561 :デフォルトの名無しさん:2009/03/10(火) 03:16:14
>>546
remove して add すればいい

562 :デフォルトの名無しさん:2009/03/10(火) 07:13:11
+=は?

563 :デフォルトの名無しさん:2009/03/10(火) 07:53:07
>>546
どこで追加したかわかってないような設計をまずやめろ


564 :513:2009/03/10(火) 09:04:58
>533 >535-536
遅くなったけど ありがトン
勉強してみます

565 :デフォルトの名無しさん:2009/03/10(火) 10:06:00
デリゲートが理解できずに苦しんでるんだけど、
昔のvbでいうと、evaluate関数みたいな使い方ができるってこと?

566 :デフォルトの名無しさん:2009/03/10(火) 10:16:56
うんにゃ

567 :デフォルトの名無しさん:2009/03/10(火) 10:17:25
http://up2.viploader.net/pic2/src/viploaderf151559.gif
自宅にあるVS2008expressから別パソコンにソリューションファイルを移して
これまたVs2008expressで起動したんだけど
こういう表示がでて、上手くプログラムが動かないんだが・・・。
具体的にはgmailのサーバーにつなげるセッションが完了しない。
解決法ご存じの方いますか。


568 :567:2009/03/10(火) 10:18:26
あ、言い忘れてました。
ソースファイルのパスは自宅パソコンのパスになってるので
このパスを実行パソコンのソリューションファイルのパスに変更できれば
直るのかなーと思っているんだけど・・・。

569 :デフォルトの名無しさん:2009/03/10(火) 10:20:31
Mail.csを追加するときに「リンクとして追加」やってない?
普通にプロジェクトに追加しないと

570 :567:2009/03/10(火) 10:21:30
あああ・・・すみません。
もう一つ言い忘れが。
自宅のPCはVistaで.slnを移動して実行しようとしている環境はXPです。

571 :デフォルトの名無しさん:2009/03/10(火) 10:22:22
リビルドしたか?

572 :デフォルトの名無しさん:2009/03/10(火) 10:23:27
>>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って奴を使ってるんですけど

こういう現象って起こりうる物でしょうか。


576 :デフォルトの名無しさん:2009/03/10(火) 10:55:02
>>574
かも。572はPro版を見て言った。
Proでソリューションのプロパティはこうなってる。

→共通プロパティ
 →スタートアッププロジェクト
 →プロジェクト依存関係
 →デバッグソースファイル
→構成プロパティ
 →構成

てか「ビルド」メニュー→「構成マネージャ」でもひらける。

577 :デフォルトの名無しさん:2009/03/10(火) 10:55:37
>>574
移動したらビルドじゃ駄目だよ。
念のためクリーンしてからリビルドしてみ

578 :デフォルトの名無しさん:2009/03/10(火) 10:56:37
.cs,.sln,.csproj以外のファイル全部消してリビルドしてみて

579 :567:2009/03/10(火) 11:05:41
多数の返答ありがとうございます。

>>576
あー
ビルド→構成マネージャ の表示がそもそもないですね。
でもこの機能2003pro使ってた時に使ってたんで、おっしゃりたい事はわかりました。
デバッグの際にReleaseかDebugか選ぶ項目ですよね。
Expressにはないみたいですね〜。

>>577
クリーンという作業は>>578さんが言っているような事でしょうか・・・
すみません汗

>>578
formのresxっていうのも消したらデバッグエラーが起こるようになってしまい
プログラムが起動しなくなりました。
これも消してよかったんでしょうか。

580 :デフォルトの名無しさん:2009/03/10(火) 11:20:52
resxも消しちゃダメ
objフォルダとbinフォルダを丸ごと消すだけでいい

Expressにもビルド構成はあるけど既定では表示されてないだけ
ツールーオプションーすべての設定を表示
プロジェクトおよびソリューションービルド構成の詳細を表示,常にソリューションを表示 にチェック
テンプレに入れるべき

581 :567:2009/03/10(火) 11:26:12
うは!
繋がりました!

とりあえず、obj bin releaseフォルダを全削除してリビルドを行いました。
それでも接続のセッションが上手く行かなかったんですが

imap から pop にサーバーを変更したら繋がるようになりました^^;
自宅のPCからはimap.google.comに繋がるんですけどね・・・。
不思議な事だ。

みなさんお手間かけさせてすみませんでした
今回の問題の解決にあたり、皆さんの助言のおかげで
副産物がたくさん手に入りました。

とりあえず >>580さんのすべての設定を表示はかましときます!

ありがとうございました〜♪


582 :デフォルトの名無しさん:2009/03/10(火) 13:51:35
.NET のライブラリのソースコードを、
MSが公開する前から公開してたサイトがあったんだけど、どこだかわかる人います?
以前はググればでてきたんだが、今は「マイクロソフトが公開!」的なブログサイトばかりで見失ったorz

583 :デフォルトの名無しさん:2009/03/10(火) 14:13:08
自作コンポーネントを作ってGUI上でコンポーネントを
ダブルクリックしたらイベントが自動的に登録されるようなのを
書きたいんですが、分かり易いサンプルないでしょうか。

584 :デフォルトの名無しさん:2009/03/10(火) 14:19:44
>>582
SSCLIでググればそれっぽいのが出てくるけど
実際の.NETのソースコードと同じである保証はないし公開範囲も狭いよ
やっぱりデバッグ用に公開されてるのを見る方がいい
NetMassDownloader使えばローカルに一括保存できる
>>583
[System.ComponentModel.DefaultEvent("対象のイベント名")]
class MyControl : Control {

585 :デフォルトの名無しさん:2009/03/10(火) 14:44:43
>>584
よーしダウンロードしてみるぜ!

586 :デフォルトの名無しさん:2009/03/10(火) 15:12:15
ダウンロードながいな しかもx64もあるからさらに倍か・・

587 :デフォルトの名無しさん:2009/03/10(火) 15:52:30
ちんこ大きいからサンプルも置いといてやろう
ttp://msdn.microsoft.com/ja-jp/library/system.componentmodel.defaulteventattribute(VS.80).aspx

588 :デフォルトの名無しさん:2009/03/10(火) 16:09:28
太っ腹ですねデブ

589 :585:2009/03/10(火) 19:04:01
早速、ダウンロードしてみたんだけど、.net2.0でSystem.Webが取得できないみたいなんだけど、
他の人もそうかな?.net3.5なら取得できるんかな。
ダウンロードできないので激しくショックだぜ

590 :デフォルトの名無しさん:2009/03/10(火) 19:09:18
クラスの破棄について質問なのですが、
~Class()
{}
空のデストラクタを指定するだけでメモリを解放してくれるのでしょうか。
というより、必要がないのですか。

591 :デフォルトの名無しさん:2009/03/10(火) 19:13:31
IDisposeのあるものは、Disposeをしたほうがいい。
というより、インスタンス生成時にusing句を使ったほうがいい。
IDisposeのないものは、ガベージコレクタが回収してくれるから、そのままでいい。


592 :デフォルトの名無しさん:2009/03/10(火) 19:19:28
デストラクタでDisposeするのは絶対やってはいけないこと
そもそもPInvokeでアンマネージリソース抱えてたりしない限りはデストラクタは不要
というかパフォーマンスが落ちるので不要なデストラクタは書いてはいけない

593 :デフォルトの名無しさん:2009/03/10(火) 19:34:18
>>591-592
ありがとうございます。
必要ないわけですか。ということは、
C++でやってた後始末みたいな事がまるで不要という事ですね。

594 :デフォルトの名無しさん:2009/03/10(火) 19:35:29
IDisposableを実装してようがしてなかろうがGCには回収される
Disposeし忘れてもファイナライザで解放処理が呼ばれるように実装するのが普通だからたいがい大丈夫
ファイナライザが呼び出されてるということは今GCが走ってるわけだから,
絶対に他のマネージオブジェクトにアクセスしてはいけないし
余計な気をまわして他のオブジェクトのDisposeを呼ぶ必要もない

595 :デフォルトの名無しさん:2009/03/10(火) 19:44:01
>>594
メモリの解放に限ってはそうだが、IDisposableは掴んでるリソースを解放するとか
最後にやらなければならないメソッドの総称という意味もあるので、
Disposeがあれば絶対に実行はすべき

596 :594:2009/03/10(火) 19:55:03
すまんわかりにくかったね
Disposeしなくていい(してはいけない)というのはファイナライザ(デストラクタ)の中での話
クラスAがIDisposableなオブジェクトBをメンバに持ってるならA自身もIDisposableを実装して
A.Disposeの中でBをDisposeするようにしないといけない
その場合もファイナライザは不要

597 :デフォルトの名無しさん:2009/03/10(火) 20:14:30
>>584
ローカルに保存したソースって、デバッグモード以外で直接見るにはどうすればいいんでしょうか。

598 :デフォルトの名無しさん:2009/03/10(火) 20:15:03
WPFのExpanderのようなttps://www.sociomedia.co.jp/1682
は C# .NET 2.0でも実装できますか?

599 :デフォルトの名無しさん:2009/03/10(火) 20:32:35
>>597
.cs ファイルがあるから、直接見ればいいんでね?

600 :デフォルトの名無しさん:2009/03/10(火) 20:39:16
>>599
あら、そんなのあったっけ。。。
確かめてみます。

601 :デフォルトの名無しさん:2009/03/10(火) 21:34:01
>>595
>Disposeがあれば絶対に実行はすべき

これは明らかに間違いだと思うが。

そう設計されているクラス(よくない設計だが)でもない限りは、
基本的にはGCに任せる方がいいとされる。
もちろん必要ならDisposeやCloseを呼んでもよい。

602 :デフォルトの名無しさん:2009/03/10(火) 21:37:02
>>601
>このインターフェイスは主に、アンマネージ リソースを解放するために使用します。
>マネージオブジェクトが使用されなくなると、同オブジェクトに割り当てられているメモリは
>ガベージ コレクタによって自動的に解放されます。
>ただし、ガベージコレクションが行われるタイミングは特定できません。
>また、ガベージ コレクタでは、ウィンドウハンドル、開いたファイルやストリームなどの
>アンマネージ リソースが認識されません。

>ガベージ コレクタを使用して、明示的にアンマネージ リソースを解放するには
>このインターフェイスの Dispose メソッドを使用します。
>オブジェクトがもはや必要でない場合、オブジェクトのコンシューマはこのメソッドを呼び出します。

603 :デフォルトの名無しさん:2009/03/10(火) 21:46:09
コピペ君って馬鹿だな、まで読んだ。

604 :デフォルトの名無しさん:2009/03/10(火) 21:47:21
いやいやお前のほうがバカだろ

605 :デフォルトの名無しさん:2009/03/10(火) 21:48:34
>>603
>このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。

606 :デフォルトの名無しさん:2009/03/10(火) 21:52:11
内容が微妙だから揚げ足取りになりがちな話題だが、
>>601の言ってることの方が真実に近いよ。
馬鹿なコピペ君の負け。

馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。

607 :デフォルトの名無しさん:2009/03/10(火) 21:54:33
>>602
そのどこにも「Disposeがあれば絶対に実行はすべき」
なんて書いてないよね。俺の言ってること分かってるかい?

明示的にDisposeやCloseを呼び出さなければ、
やがてGCがファイナライザを呼び出してアンマネージリソースの
後片付けをさせるってこと分かってるかい?

608 :デフォルトの名無しさん:2009/03/10(火) 21:55:55
>>598
作ればできるでしょ

609 :デフォルトの名無しさん:2009/03/10(火) 21:56:09
揚げ足取りもなにも、CLR via C# とか読めば普通に書いてあることだよね。

610 :デフォルトの名無しさん:2009/03/10(火) 21:58:45
ともかく,必ず呼ばれることを期待した実装にしてはいけない

611 :デフォルトの名無しさん:2009/03/10(火) 21:59:00
>>606
>>607
アンマネージ リソース=ウィンドウハンドル、開いたファイルやストリームなど
IDisposableは主にアンマネージ リソースを解放するために使用

612 :デフォルトの名無しさん:2009/03/10(火) 22:01:41
>>606
>馬鹿なコピペ君の言うとおりなら、例えばWindows Formのデザイナで
>デザイン時にコンポーネントを貼り付けるような使い方をMSはわざわざ用意しないだろう。

???
デザイン時にコンポーネントを貼り付けると自動的にDisposeが呼ばれるようになるけど
そういう話?

例えばボタンを貼り付けると、InitializeComponent()に
this.Controls.Add(this.button1);
みたいなのが追加される。

で、FormのDisposeでcomponents.Dispose();が呼ばれてる。

613 :デフォルトの名無しさん:2009/03/10(火) 22:02:35
>>606
良く読もうな

>クラスで外部リソースを使用するが、そのクラスをデザイン領域では使用しない場合は、
>System.IDisposable を実装するか、あるいは直接または間接的に IDisposable を実装するクラスから派生させます。

>クラスがデザイン可能ではなく、外部リソースを保持していない場合は、IComponent 型や IDisposable 型は不要です。

614 :デフォルトの名無しさん:2009/03/10(火) 22:05:39
>>611
別にIDisposableを実装していなくても、アンマネージリソースはファイナライザ中で解放すればいい。
IDisposableはGCに頼らずとも明示的にリソースを解放するための手段を与えるためのものだよ。
勘違いしているのでは?

615 :デフォルトの名無しさん:2009/03/10(火) 22:05:58
>>612
話が通じない人だなあ。

言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
不要不急の時まで生かしておくことを許すようなことはしないだろう、
ということだよ。

まだ話が通じないとアレなので一応補足するけど、例えば
PrinterSettingDialogとかFileSaveDialogとか、いつもいるわけじゃないでしょ。

616 :デフォルトの名無しさん:2009/03/10(火) 22:08:09
フォーム関連は生存期間が長いから少々無駄に長居してもそんなに問題にならない

617 :615:2009/03/10(火) 22:09:30
あーなんかわけのわからんクラス名かいちゃったけど
PrintDialogとSaveFileDialogだなw

618 :デフォルトの名無しさん:2009/03/10(火) 22:10:07
作る側と使う側じゃ、話もかみ合わないな・・・。

作る側は、必ず Dispose() を呼んでくれる、ってのを期待しちゃダメ。
使う側は、Dispose() を忘れちゃダメ。

619 :デフォルトの名無しさん:2009/03/10(火) 22:13:53
>>615
>言いたかったのは、もしIDisposable.Disposeが、不要になれば「必ず」呼ぶ必要があるほどの
>緊急性があることを表すメソッドであるのなら、それを実装したクラスのインスタンスを
>不要不急の時まで生かしておくことを許すようなことはしないだろう、
>ということだよ。

ああ、「必ず」とつけた人がいてその人に噛みついていたのか。
それで「必要ではない」例をあげてたと。

しかしまあそれを言うなら>>601

>もちろん必要ならDisposeやCloseを呼んでもよい。

こっちだって明らかに日本語が残念な人だろう。
「必要」な場面で「呼んでもよい」ってwww
必要な場合は必ず呼べよwww

620 :デフォルトの名無しさん:2009/03/10(火) 22:14:17
>>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を呼び出すことが
間違いなく安全で、しかもオブジェクトをファイナライゼーションリストから削除して、
オブジェクトが昇格するのを防ぐことで、パフォーマンスを向上させたい場合です。

622 :デフォルトの名無しさん:2009/03/10(火) 22:20:36
>>619
IDisposableの目的が、主にアンマネージリソースの解放だから、
あれば実行するのは普通だと思うぞ?
この場合、ポトペタのコントロール等を持ち出して実行しなくてもいい例とするほうが狂ってる

623 :デフォルトの名無しさん:2009/03/10(火) 22:23:10
>>621
大抵は最後の「2つの場合」に当てはまると思うんだけど

624 :デフォルトの名無しさん:2009/03/10(火) 22:23:37
それはその人の意見に過ぎないでしょ。

> たいていのアプリケーションでは、オブジェクトが間違いなく
> 不要になったことがわかることはありません。

GC のない言語は全否定? ありえないです。

アンマネージドなリソースを使うから、それらのリソースを解放する
必要があるから、Dispose() を実装する。そう考えれば、Dispose() が
用意されてるなら、不要になった時点で呼ぶべきだと思うよ。

625 :デフォルトの名無しさん:2009/03/10(火) 22:24:11
>>621
だから
>1つは、リソースを解放しなければならないことが分かっている時(開いているファイルを削除しようとするときなど)です
がDisposeの目的だって書いてあるっていってんの

626 :デフォルトの名無しさん:2009/03/10(火) 22:24:18
>>618,>>619
だからさ、揚げ足取りのように聞こえるかもしれんがその「ダメ」とか「必要な場合は必ず」
っていう言い方は正しくないんだよ。

もっと控えめに、

(1) 占有している共有資源を他に譲りたいなら呼べ
(2) Disposeを呼ぶことをあえて避ける理由はなにもない

と表現するのが正しい。>>601の言っていることの方が妥当だ。

>>620
君はたぶん学生時代数学が出来なかった子だろうね。
君は必要条件と十分条件の区別がついてない。


Disposeを実装していることは、「使い終わったら必ず開放すべき資源を持っている」
ことの必要条件であっても十分条件じゃない。

つまり、Disposeを実装していることは、そのインスタンスが必ず
「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。

627 :デフォルトの名無しさん:2009/03/10(火) 22:24:19
>>621
それどこから引用したの?それとも自分で訳したの?

628 :デフォルトの名無しさん:2009/03/10(火) 22:27:11
>>623
>>624
君たちのも「意見」に過ぎないよね。
しかも、素人の意見と、MSの多くのソフト開発に関わった人の意見とでは、
どちらを信用すべきか目に見ていると思うが。
(一応出版社もMicrosoftの書籍に書かれていることなので、
 MSの準公式見解といっていい)

まともな人の書いた書籍で、絶対にDisposeを呼び出せって言ってるのはあるの?
それを提示しないと説得力ないよね。

629 :デフォルトの名無しさん:2009/03/10(火) 22:27:41
>>626
君は今も理屈っぽいとよく他人からバカにされるでしょ。

Disposeの目的の主な利用方法がアンマネージリソースの解放なんだから、
できる時にしておくべき。

630 :デフォルトの名無しさん:2009/03/10(火) 22:29:21
>>627
日本語版も「プログラミング .NET Framework」という題で出ている。

631 :デフォルトの名無しさん:2009/03/10(火) 22:30:53
>>630
原著は持ってるが日本語版を持ってないから聞いたのだが。

632 :デフォルトの名無しさん:2009/03/10(火) 22:30:54
こんがらがってきました

633 :デフォルトの名無しさん:2009/03/10(火) 22:31:11
つーか、呼び出しても呼び出さなくてもいいなら、
安全面に倒して(リソース不足やらを引き起こさないように)
呼び出した方がいいじゃん。

そんなこともわかんないのかな・・・

634 :デフォルトの名無しさん:2009/03/10(火) 22:31:28
>>628
良く嫁

>たいていのアプリケーションでは、オブジェクトが間違いなく不要になったことがわかることはありません。
だから
>一般論として、筆者はDisposeメソッドやCloseメソッドの呼び出しを強制するのはあまり推奨しません。
ってことだろ?

間違いなく不要になることはわからないから、一般的に推奨しないわけであって、
明らかに分かってる場合には、実行しても問題じゃないってこった。

従って、アンマネージリソースを抱えている可能性があるわけだから、
必要ないと分かっていれば実行はするべきだということになる。

635 :デフォルトの名無しさん:2009/03/10(火) 22:32:09
なんか、原理主義者というか、細かいことにこだわる奴がいるなぁ・・・。

636 :デフォルトの名無しさん:2009/03/10(火) 22:32:38
リソースをカプセル化したオブジェクトを使ったコードを記述する場合は、オブジェクトが不要になった時点で、
そのオブジェクトの Dispose メソッドが必ず呼び出されるようにする必要があります。

ついで
http://social.msdn.microsoft.com/Search/ja-JP/?query=Dispose%20%E5%BF%85%E3%81%9A&ac=3


637 :デフォルトの名無しさん:2009/03/10(火) 22:33:15
盲目的という感じはするね

> 明らかに分かってる場合には、実行しても問題じゃないってこった。
どう考えてもその通り

638 :デフォルトの名無しさん:2009/03/10(火) 22:34:12
>>633
そこは誰も否定してないよ。
だから微妙な話だといってるんだけど。。

639 :デフォルトの名無しさん:2009/03/10(火) 22:35:54
>>621の筆者が心配してるようなリソース行方不明状態は作るべきじゃないし
そういう状況は特別に注意して管理するべきであって一般にどうとかいう話じゃないと思うんだ

640 :デフォルトの名無しさん:2009/03/10(火) 22:38:04
>>639
自分の書いたクラスだけを利用するとは限らないからなあ。
他人の書いたクラスを使う場合は防ぎようがないこともあるだろう。

641 :デフォルトの名無しさん:2009/03/10(火) 22:40:36
つーか、言ってもない「必ず」とかの文言を勝手にでっち上げて
議論をふっかける奴って何なんだろう・・・?

642 :デフォルトの名無しさん:2009/03/10(火) 22:42:15
「C++みたいに、メモリ解放とかしなくてもいいんですよ。
だから必ずDisposeさせようと思う必要はないんですよ?」
と過去の呪縛から解放させるためのトークが
「Disposeはすべきでない」
と理解されたらたまったもんじゃないな


643 :デフォルトの名無しさん:2009/03/10(火) 22:42:49
まぁ、でも、コードレビューとかで「なんで Dispose() しないの?」って質問に

> つまり、Disposeを実装していることは、そのインスタンスが必ず
> 「使い終わったら必ず開放すべき資源を持っている」ことを意味しない。

とか答える奴とは一緒に仕事をしたくないな。

644 :デフォルトの名無しさん:2009/03/10(火) 22:45:21
>>640
それ他人に書いたクラスにバグがありますと同じ
Disposeが信じられないのなら、他のメソッドの動作にも信頼がおかけないだろうから、自作するしかないね

645 :デフォルトの名無しさん:2009/03/10(火) 22:45:31
>>641
じゃあ>>595にある、

>Disposeがあれば絶対に実行はすべき
の絶対と「必ずの違いをとっくりと説明してもらおうじゃないか。

というか、議論にすぐ感情を持ち込む君のような奴ははっきりいって議論の邪魔。
ついでにエンジニアの資格なし。

646 :デフォルトの名無しさん:2009/03/10(火) 22:48:06
>>595=>>641 ってわけでもないだろうし、感情的になってるのは
どっちもどっちじゃない?

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メソッドは絶対に呼ばれるべきだし、また通常はそうなっているだろう。

649 :デフォルトの名無しさん:2009/03/10(火) 22:57:42
むやみやたらに GC.Collect() するようなコードをたまに見かけるな・・・
そんなのよりは、よっぽど Dispose() を呼び出す方がましな気がする。

650 :デフォルトの名無しさん:2009/03/10(火) 22:57:44
Disposeが必要なのは結局のところタイミングの重要なのであって、
その意味で>>648の発言は基本がまったく理解できてない

651 :デフォルトの名無しさん:2009/03/10(火) 22:59:51
わかりやすくいうとこんな感じ

■Disposeしなくてもいいよ派

手洗いをしていないからといって、必ずしもインフルエンザにかかるとは限りません。
手洗い場には人が殺到するので、余計にインフルエンザにかかるリスクが増加します。

■Disposeしたほうがいいよ派

手洗いをしたほうが手からの感染が少なくなるのでしたほうがいいに決まっています。
混雑した場などに出かけた場合の話をしているのであって、
その場合には手を洗ったほうが感染のリスクが低下します。

652 :デフォルトの名無しさん:2009/03/10(火) 23:00:38
>>650
Disposeを確実に呼び出すように(あるいは呼び出されるように)しろ、
と言ってる記述があっても、それは広義のDisposeメソッド(bool型を引数に取るような)
を指しているのかもしれんから、必ずDispose()を呼べと言っているのか断定しがたいってことだよ。

653 :デフォルトの名無しさん:2009/03/10(火) 23:01:06
>>651
結論

人がいないときに(必要でなくなったら)必ず手洗いしましょう(必ずDisposeしましょう)

654 :デフォルトの名無しさん:2009/03/10(火) 23:03:28
>>652
Disposeの実装の主な理由が、必ず実行されるべきアンマネージリソースの解放にあるんだから、
必要なくなったら必ず実装するべきってことだよ

あなたが、必要ないかどうかわからない糞設計をしているのなら、
あなたが断定できないから実行できないということに関しては同意する

655 :デフォルトの名無しさん:2009/03/10(火) 23:04:26
>>651
だから違うよ。
わかりやすく、とか言ってる奴が話の筋が読めないってなんの笑い話?

あるクラスがDisposeを実装してるからといって、
必ずしも「必ず」使い終わったら呼ぶ必要があるとは限らないって話だよ。

必ず呼ぶべきクラスもあれば、そうでないクラスもあるってこと。

この程度の簡単な話が理解できない人間はプログラマやってちゃあかんと思うなあ。

656 :デフォルトの名無しさん:2009/03/10(火) 23:05:12
>>654
必要ないかどうか分からない糞設計とか言い出したら、ガベコレ自体否定している。
そして明示的にマネージオブジェクトを解放できないC#を否定していることになる。

657 :デフォルトの名無しさん:2009/03/10(火) 23:07:05
>>655
呼ぶ必要がある、ない、ってのはどうやって判断するの?

658 :デフォルトの名無しさん:2009/03/10(火) 23:09:46
明示的にDisposeで解放しなくとも、オブジェクトが確実に必要なくなれば、
ガベージコレクタによって保有するリソースは解放されるだろう。

少なくともFCLのクラスは、そこまで待っていても不具合はないだろ。
メモリが惜しけりゃ明示的に呼び出せってだけのことなのでは?

659 :デフォルトの名無しさん:2009/03/10(火) 23:10:26
>>655
自分が作成したインスタンスで、そのインスタンスが役目を終えたと判断できたら
Disposeしましょうってことを言ってるんじゃん。

話の流れを読めてないのはお前でしょ

660 :デフォルトの名無しさん:2009/03/10(火) 23:10:35
お前ら楽しそうだけど、(初心者用)で盛り上がるネタじゃないと思うんだ

661 :デフォルトの名無しさん:2009/03/10(火) 23:11:08
言葉が抜けてて誤解を招きかねないので訂正

ガベージコレクタによって「Finalize、そしてDispose(bool)が呼ばれた結果」保有するリソースは解放されるだろう。

662 :デフォルトの名無しさん:2009/03/10(火) 23:11:37
かなり前に、GotDotNet で盛り上がったネタだしね。

663 :デフォルトの名無しさん:2009/03/10(火) 23:12:07
>>657
MSDNライブラリ+常識

だから、明示的にDisposeすべきかどうかはそのクラスが占有している
共有資源がどの程度希少かという問題と同義で、そんなことは常識でだいたい
わかるじゃん。

664 :デフォルトの名無しさん:2009/03/10(火) 23:13:25
>>659
だから、そのテーゼは常に真ではない、という話をずっとしてるんだがな。
悪気はないけど、君はこういう話題をするには頭が悪すぎるみたいだねw

665 :デフォルトの名無しさん:2009/03/10(火) 23:13:58
>>656
あたまの悪い人だなぁ

>必要ないかどうか分からない糞設計とか言い出したら、ガベコレ自体否定している。
>そして明示的にマネージオブジェクトを解放できないC#を否定していることになる。

アンマネージリソースの解放って言ってるのに、なんでカベコレそのものの否定とかの話になんの?
FileをOpenして、Closeするまでガベコレの動作を待てってどんなソフトなの?

666 :デフォルトの名無しさん:2009/03/10(火) 23:14:12
>>663
ぽかーん・・・

そんな各開発者で異なりそうな基準なら、安全側に倒して、
必ず Dispose() すること、って規約にするよ。

667 :デフォルトの名無しさん:2009/03/10(火) 23:15:02
>>664
常に真ではないが、ほとんど真だ、という話をずっとしてるんだがな。
悪気はないけど、君はこういう話題をするには頭が悪すぎるみたいだねw

668 :デフォルトの名無しさん:2009/03/10(火) 23:18:12
>>665
そのファイルを開きっぱなしであることが、
色々な意味でコストがかかるなら、明示的にCloseするだけでしょ。
そうでなく、しかも閉じる必要がなきゃ、別に放置しておいても問題ない。

必要かどうかの管理をプログラマに強いるのはC#の思想じゃないでしょ。
CやC++ならそういう態度でいいけど、C#じゃ基本的にガベコレ任せだ。

アンマネージリソースについては凄く敏感なようだけど、マネージリソースについては何も思わないの?
ガベコレが動くまでメモリを占有し続けたままって。
そういうのが気になるならC++とかやってりゃいいのでは?

669 :デフォルトの名無しさん:2009/03/10(火) 23:19:12
確かに、Dispose() で何もしないクラスは存在する。

が、IDisposable() インターフェイスがアンマネージドリソースの解放目的に用意されている以上、
Dispose() メソッドを実装してるなら、それを呼ぶ必要があるってケースの方が多いだろうね。

670 :デフォルトの名無しさん:2009/03/10(火) 23:19:53
>>666
それはそれでいいんじゃないの?
それと今の話は別問題だよ。わかるよね?

671 :デフォルトの名無しさん:2009/03/10(火) 23:22:09
>>670
イレギュラーケースをたてに、Dispose() を呼ばなくてもいい、って
言い張ってる奴がいる、ってのは理解してます。

672 :デフォルトの名無しさん:2009/03/10(火) 23:22:21
>>668
>色々な意味でコストがかかるなら、明示的にCloseするだけでしょ。
必要なくなったら閉じるのが当たり前でしょ。
必要なときに閉じないのは当たり前でしょ。
何言ってるの?

>アンマネージリソースについては凄く敏感なようだけど、マネージリソースについては何も思わないの?
Disposeの実装の主な理由がアンマネージリソースの解放にあるんだから、
アンマネージリソースについて語るのは当たり前でしょ。

673 :デフォルトの名無しさん:2009/03/10(火) 23:23:19
GC なしの C#、あったら使ってみたいなぁ。

674 :デフォルトの名無しさん:2009/03/10(火) 23:24:12
>>670
なんで?
どこでオブジェクトが再利用されるかわからないから、
Disposeすべきなんじゃなかったの?

だんだん主張がおかしくなってきていますな

675 :デフォルトの名無しさん:2009/03/10(火) 23:24:24
>>671
だからそんなことを言ってる奴はいなんだよ。
頭の悪い奴は議論に参加しなくてよろしい。

676 :デフォルトの名無しさん:2009/03/10(火) 23:25:39
>>674
訂正

>どこでオブジェクトが再利用されるかわからないから、
>Disposeするべきでないんじゃなかったの?

>>621の解釈よりw

677 :デフォルトの名無しさん:2009/03/10(火) 23:25:51
>>672
だから、Dispose()を明示的に呼ばずとも、結局、
最終的にFinalize経由でリソースの解放は行われる。

結局のところタイミングの問題だけでしょ。

Disposeを絶対呼べ、って言ってるぐらいメモリ資源に敏感なのに、
明示的解放のできないマネージリソースは完全にGC任せのC#を使っているのは何故かなあって思うんだが。

678 :デフォルトの名無しさん:2009/03/10(火) 23:27:57
アンマネージドリソース = メモリ

と間違った理解をしてるのもどうかと思うけどな・・・

679 :デフォルトの名無しさん:2009/03/10(火) 23:28:17
>>674
今の話題はDisposeを実装しているクラスは必ずDisposeすべきか。

俺の意見は否だけど、だからといって「必ずDisposeを呼べ」という規約が
ナンセンスとは断定できない。

例えばC#のコンパイラにとってはインデントは無視するだけの存在の「いらない子」だけど、
だからといって「ちゃんとインデントしろなんて規約はナンセンスだ」なんて
誰も言わんでしょ。

それとこれとは別問題だから。

680 :デフォルトの名無しさん:2009/03/10(火) 23:29:08
>>675
じゃあ、どこに問題があるか個別に○×つけてくれよ

1 IDisposableは主に、アンマネージ リソースを解放するために使用する
2 アンマネージリソース(File Openなど)を所有していた場合、必要なくなったら解放する必要がある。
3 必要がなくなったらDisposeを実行してリソースを解放すべき

どこがおかしい?

681 :デフォルトの名無しさん:2009/03/10(火) 23:29:31
>>675
Finalize が呼んでくれるから、Dispose() は明示的に呼ばなくてもいいんじゃないの?

682 :デフォルトの名無しさん:2009/03/10(火) 23:30:29
まとめ

IDisposableを実装するクラスに求められる最低限度の機能は、
好きなタイミングで明示的にDispose()を呼び出して、アンマネージリソースを解放するということだけ。
この最低限度の実装しかしていないクラスなら、Dispose()は絶対に呼ばなきゃいけない。

でもこれじゃ、もしDispose()を呼び出すのを忘れた場合に、
アンマネージリソースは解放されずに残ってしまう。

そこで安全弁として、まともなクラス(FCLなど)では、
Finalize経由でもDispose(bool disposing)を呼び出してリソースの解放が行われるようになっている。

そういうクラスでは別に明示的にDispose()を絶対に呼び出さなきゃいけないわけではない。

683 :デフォルトの名無しさん:2009/03/10(火) 23:32:23
超初心者ですいません
visual C♯をやっててコンボボックスの規定値?を表示させるにはどうしたらいいんですか?

普通コンボボックスはドロップダウンのリストから文字を選んだらそれが表示されると思うんですが、
ドロップダウンリストから選ぶ前から既定の文字を表示させておきたいんですがどうやればいいんでしょうか?

それとコンボボックスで選んだものによってボタンを押したときの処理を分けるにはどうしたらいいんですか?



説明分かりづらすぎですいません

684 :デフォルトの名無しさん:2009/03/10(火) 23:33:07
                   ∧∧ ∩
                  (`・ω・´)/
             ハ_ハ   ⊂   ノ    ハ_ハ
           ('(・ω・´∩  (つ ノ   ∩`・ω・)')
       ハ_ハ   ヽ  〈    (ノ    〉  /     ハ_ハ
     ('(・ω・´∩  ヽヽ_)        (_ノ ノ   ∩`・ω・)')
     O,_  〈                      〉  ,_O
       `ヽ_)                     (_/ ´
   ハ_ハ           知 ら ん が な             ハ_ハ
⊂(・ω・´⊂⌒`⊃                       ⊂´⌒⊃`・ω・) ⊃


685 :デフォルトの名無しさん:2009/03/10(火) 23:34:13
>>683
SelectedIndex を設定 or 読み取り

686 :デフォルトの名無しさん:2009/03/10(火) 23:35:13
>>682
矛盾してるぞ?

>IDisposableを実装するクラスに求められる最低限度の機能は、
>好きなタイミングで明示的にDispose()を呼び出して、アンマネージリソースを解放するということだけ。
>この最低限度の実装しかしていないクラスなら、Dispose()は絶対に呼ばなきゃいけない。

IDisposableを実装していれば、いつかはDisposeは実行されるんだろ?
その理屈なら呼ぶ必要なんてないじゃん


687 :デフォルトの名無しさん:2009/03/10(火) 23:35:32
>>682
つーか、そんなのはみんなわかってて、「で、どうすべきか?」って話をしてると思うんだけど。

必要あるかないかが内部実装に依存する以上、呼び出すべきって意見と、
Finalize で呼び出されるんだから、別に呼び出さなくてもいい、って意見だろ。

688 :デフォルトの名無しさん:2009/03/10(火) 23:36:07
>>682
返答よろしく

1 IDisposableは主に、アンマネージ リソースを解放するために使用する
2 アンマネージリソース(File Openなど)を所有していた場合、必要なくなったら解放する必要がある。
3 必要がなくなったらDisposeを実行してリソースを解放すべき

どこがおかしい?

689 :デフォルトの名無しさん:2009/03/10(火) 23:38:12
>>688
俺は Dispose() するべき派だから、どこも間違ってない(正しい)と思います。

690 :デフォルトの名無しさん:2009/03/10(火) 23:39:55
>>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を呼ばなくて良いと言うのは無理がありすぎる。

691 :デフォルトの名無しさん:2009/03/10(火) 23:41:29
どのオブジェクトがどれだけアンマネージリソースでメモリ圧迫してるかなんて
GCには全くわからないんだよ
GC.AddMemoryPreassureなんて極めてチープな機能があるくらい

692 :デフォルトの名無しさん:2009/03/10(火) 23:41:54
>>686
違うだろ。IDisposableを実装しているだけじゃ、Disposeが絶対に呼び出されるとは限らない。
例えば自分で作ったクラスでIDisposableを実装して、Finalizeでリソース解放処理をしなければそのまま残る。

しかしFCLやそれに準拠した規範的なクラスでは、確実にFinalize経由でリソース解放されるようになっている。
そういうクラスを使うのであれば、別にDispose()を絶対呼び出す必要があるとまではいえない。
そうでないクラスであり、Finalize経由での解放が保証されていないのであれば、Dispose()は絶対に呼び出すべき。

>>688
別におかしくはないよ。でもそれはIDisposableの「最低限度の実装」をしたクラスについてだよね。
でも実際にIDisposableを実装したクラスは、それ以上の実装をしているのが普通なわけ。
まあ本音と建前みたいなもんだな。

693 :デフォルトの名無しさん:2009/03/10(火) 23:43:27
言い争ってる奴ら馬鹿だろ。少しは落ち着けよ

694 :デフォルトの名無しさん:2009/03/10(火) 23:45:09
>>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()を呼ばずともサポートされる。

もちろん明示的に呼び出すこともできる。

698 :デフォルトの名無しさん:2009/03/10(火) 23:47:46
>>695
お前が荒らしレベルで、プログラマとして最底辺だということがわかったよ

699 :デフォルトの名無しさん:2009/03/10(火) 23:49:30
>>696
FCLのクラスについては実質保証されてるでしょ。
心配ならDispose(bool disposing)などが実装されているかMSDNで調べればいい。

原則としてDispose()を呼ぶという態度はいいとしても、
FCLのクラスに対して特別扱いするのは別に不自然じゃないと思うぞ。
基本はGCに任せるほうが必要or不必要の判断に関しては確実だしな。

700 :デフォルトの名無しさん:2009/03/10(火) 23:50:34
>>697
へーGCによってDispose()が実行されなくとも、プログラマが明示的にDisposeを呼ばずとも
自動的に解放してくれるわけね

すごいね

701 :デフォルトの名無しさん:2009/03/10(火) 23:50:58
>>695
それだと保存が押されたらDisposeすると言っているように感じるが、
その意図でレスしたの?

702 :デフォルトの名無しさん:2009/03/10(火) 23:51:29
>>698
もしFlush()が確実に必要な処理なら、MicrosoftはファイナライザやDisposeでFlush()されるように実装している。
そうなってないってことは、Flush()は必ずしも必要とされていないということだよ。君こそ大丈夫か?

703 :デフォルトの名無しさん:2009/03/10(火) 23:52:03
>>699
>FCLのクラスについては実質保証されてるでしょ。
なんでいきなり条件を付けた論議なの?

704 :デフォルトの名無しさん:2009/03/10(火) 23:53:23
と言うかさ、精神衛生上Disposeしないと気持ち悪くない?
usingで囲むべきだと思うがね

705 :デフォルトの名無しさん:2009/03/10(火) 23:53:24
MS のやることは正しい、MS の開発者の意見は正しい、
って盲目的だなぁ。

Dispose() を呼ぶことで安全が買えるなら、よっぽど
その方が楽でしょ。

706 :デフォルトの名無しさん:2009/03/10(火) 23:53:36
>>697
どうやって明示的にDispose(closeその他も)しなくて、
アンマネージリソースが会話されるの?

707 :デフォルトの名無しさん:2009/03/10(火) 23:54:00
>>701
違う。保存が押されてから、Flush()なりClose()なりを呼べということだ。
もちろんソフトによりけりなので、すぐにFlush()やClose()を呼んだほうがいいこともある。
しかし保存が押されてからストリームに反映させたい仕様だと、すぐにFlush()するのは良くないだろう。

708 :デフォルトの名無しさん:2009/03/10(火) 23:54:25
>>704
using なしでも、スコープ抜けたら自動的に Dispose() が呼び出されるくらいでいいと思う。
何かしらの理由で呼ばれたくないときだけ、何かのメソッドを呼び出してマークするとか。

709 :デフォルトの名無しさん:2009/03/10(火) 23:54:40
>>702
そのために必要なのが、Disposeでしょ?
IDisposableが、なんでインターフェースとして存在しているか理解してる?

710 :デフォルトの名無しさん:2009/03/10(火) 23:55:23
>>708
c++/CLRはスコープ抜けるとDisposeが実行されるね

711 :デフォルトの名無しさん:2009/03/10(火) 23:56:56
>>704
どうしてアンマネージリソースにだけそう思うのか不思議。

>>705
Dispose()を呼び出すことによるその後のトラブルもありうるわけで。

>>706
まともなクラスなら、Finalize()経由でリソースは解放される。
マトモじゃないクラスなら、そんな仕様はないので、
自ら確実にdispose()を呼び出す必要がある。でもそれを忘れると、
メモリリークなどの危険性があるので、そんなクラスの使用はおすすめできない。

712 :デフォルトの名無しさん:2009/03/10(火) 23:56:59
>>710
訂正
C++/cli

713 :デフォルトの名無しさん:2009/03/10(火) 23:57:55
Disposeを呼ばないとマネージリソースの不足によって致命的な不具合が
発生する可能性があるけどDisposeを呼ぶことで問題になる可能性はない
だから呼ぶべき

.NETのGCはマネージリソースを適切に管理するためのもので、
アンマネージリソースに関してはほとんどのクラスで解放までの
サポートはあってもそのタイミングに関しては関知しない
よってタイミングをGCにまかせるという選択肢はない

714 :デフォルトの名無しさん:2009/03/10(火) 23:58:12
>>711
Dispose() を呼び出したことによるトラブル、って今のところ出会ったことがない。
どんなトラブルがあんの?

715 :デフォルトの名無しさん:2009/03/10(火) 23:58:18
>>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.

というわけで解放順の問題。

716 :デフォルトの名無しさん:2009/03/10(火) 23:59:14
>>711
なるほど、FileをOpenするクラスや、データベースへの接続はするべきじゃないということですね。
あんたが普通に開発したこともないプログラマだということがよくわかったよwww

結局>>678が真理だったな
「アンマネージドリソース=メモリの消費」
だと思っていたサンデープログラマか。

死んでいいよ。

717 :デフォルトの名無しさん:2009/03/11(水) 00:01:46
メモリの消費に関してもDisposeは必要
アンマネージメモリは完全にGCの管理外だから
マネージメモリみたいにメモリ使用量と照らし合わせてGCが適切に管理してくれたりしない

718 :デフォルトの名無しさん:2009/03/11(水) 00:02:51
>>702
それは違うと思う。
ファイナライザの段階では先に中のStreamが無くなっている可能性があるため、
StreamReaderとWriterはFlushを呼びたくても呼べない。
一般にファイナライザでメンバがまだ残っている保証はないとMSDNにも書いてあるはず。

719 :デフォルトの名無しさん:2009/03/11(水) 00:03:13
>>715
そこにnormalって書いてあるとおり、それは普通の方法ではの話だろう。
そりゃ普通のFinalizeじゃ他のマネージオブジェクトにアクセスすべきではない。
しかし、もし確実にFlush()される必要があるなら、Attributeなどを使ってでも確実に実行されるようにするよ。
結局しないのは技術的問題というより、そうしないのが自然だからだよね。

>>716
ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、
リソースは解放される。

720 :デフォルトの名無しさん:2009/03/11(水) 00:07:03
たかがDisposeごときでこんなに熱くなれるとは

721 :デフォルトの名無しさん:2009/03/11(水) 00:07:26
>>717
誰もそこは否定していないのでは?

ただ、アンマネージリソースを有するマネージオブジェクトの
寿命自体はGCで判断できるから、GCがそのFinalizeを呼び出してから、
アンマネージリソースを解放するというのでも通常遅くは無い。

それだけの話だと思うが。

722 :デフォルトの名無しさん:2009/03/11(水) 00:08:52
>>719

>ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。
>ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。
>ファイルにしろデータベースにしろ、普通は明示的にDispose()を呼ばなくても、リソースは解放される。

言ってる事理解してる?

723 :デフォルトの名無しさん:2009/03/11(水) 00:09:10
>通常遅くは無い。
これが間違い

724 :デフォルトの名無しさん:2009/03/11(水) 00:10:09
関係ないけど解放処理が必ず実行されることを保障するには普通のファイナライザでは不十分
CriticalFinalizerObjectを使うことになる

725 :デフォルトの名無しさん:2009/03/11(水) 00:11:59
>>723
遅くはないな。それが間違いというなら、C#のGC自体を否定しなきゃいけないかも。
GCが参照されていないインスタンスを破棄するタイミングが制御できないといっても、
通常そこまで時間はかからない。必要がなくなりゃどのみち勝手にリソースは解放される。

そのタイムラグが気になる状況なら明示的にDispose()を呼び出せ、としか言いようが無い。

726 :デフォルトの名無しさん:2009/03/11(水) 00:12:43
ところで.NET Frameworkってプロセス終了時にすべてのオブジェクトの
ファイナライザが呼ばれることが保証されてる?

727 :デフォルトの名無しさん:2009/03/11(水) 00:13:13
>>725
>そのタイムラグが気になる状況なら明示的にDispose()を呼び出せ、としか言いようが無い。
この後の及んで着地点かw



728 :デフォルトの名無しさん:2009/03/11(水) 00:13:27
保証されてません
usingやfinallyも同様です
>>724のようにCriticalFinalizerObjectを使う必要があります

729 :デフォルトの名無しさん:2009/03/11(水) 00:14:29
>>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に頼れば、他から参照が残っていたり、
解放したあとにそのインスタンスを利用することもないだろう。

733 :デフォルトの名無しさん:2009/03/11(水) 00:18:52
>>732
もう言ってる事が支離滅裂だな

734 :デフォルトの名無しさん:2009/03/11(水) 00:19:27
分からないので教えてください。
カスタムコントロールのリストをもたせたクラス用のCollectionEditorを作っています。
リストはカスタムコントロールの基底クラス(abstract)の集まりなので、
[Attribute]を使って登録する派生クラスのTypeを登録しようかと思ってます。
今、派生クラスの定義のところに
[Attribute名(typeof(派生クラス名))]
としているのですが、typeof〜の部分なしで同じようなことをする方法はありませんでしょうか?
ToolStripとかを見ていると上手くやっているように見えるのですが…

735 :デフォルトの名無しさん:2009/03/11(水) 00:20:01
>>730
少なくともお前の作ったソフトだけは使いたくない
これはここにいるすべての人が一致するところ

736 :デフォルトの名無しさん:2009/03/11(水) 00:20:29
で、Dispose() を呼び出したことによるトラブルの実例はまだ?

737 :デフォルトの名無しさん:2009/03/11(水) 00:21:34
>>733
ごく当たり前のことを言ってるに過ぎない。
そもそも、そこまでリソースのマネジメントに敏感にならざるを得ない状況なら、
C/C++などを使うべきだと思うよ。

もちろん、じゃあどんな場合もDisposeするなとも言ってないのであしからず。

738 :デフォルトの名無しさん:2009/03/11(水) 00:22:14
>>737
>もちろん、じゃあどんな場合もDisposeするなとも言ってないのであしからず。
どんどん変わってきてるじゃん 主張が

739 :デフォルトの名無しさん:2009/03/11(水) 00:23:21
>>737
じゃ、アンマネージドリソースを解放する場合などには、
Disposeする必要があるということは理解したということだな?

740 :デフォルトの名無しさん:2009/03/11(水) 00:24:13
>>736
上で紹介されてるじゃん。
あるオブジェクトが、他のクラスのメンバから参照されているときに、
そうと知らずにDisposeしてしまうケースとかね。

>>738
最初から同じ主張ですが。

741 :デフォルトの名無しさん:2009/03/11(水) 00:25:23
>>739
Dispose()じゃなくてDisposeなら、そう。
てか何度も言ってることだが。

742 :デフォルトの名無しさん:2009/03/11(水) 00:26:34
Javaでメソッドの終わりに必ずnullを代入しろとかいう(基地外みたいな)話の延長みたいだな

743 :デフォルトの名無しさん:2009/03/11(水) 00:26:50
>>731
ソースコードによる自動シリアライズ に噴いたwwこの発想はなかったwww

744 :デフォルトの名無しさん:2009/03/11(水) 00:30:41
>>741
じゃ、互いの主張は一致したな。

アンマネージドリソースを使用している可能性があり、
もうこれ以上必要がなくなったらDisposeする

これでいいな?

745 :デフォルトの名無しさん:2009/03/11(水) 00:32:13
>>734
言ってることがよくわからない
その属性をどうやって処理するつもり?

746 :デフォルトの名無しさん:2009/03/11(水) 00:32:58
というか、必要条件と十分条件の区別程度の知恵もない人間が
プログラマやっちゃダメだと思うんだが、このスレ見ると日本のプログラマって
本当底辺の職業なんだなという思いを深くするな。

だから、可及的速やかに開放すべき共有資源を抱えているクラスは必ずDisposeを
実装しているが、逆は真ならず、それだけの話なんだが。。

747 :デフォルトの名無しさん:2009/03/11(水) 00:37:32
>>746
「必ず」とは限らない。バグのあるクラスもあるからね。

お前さんの言ってるのは↑こんなレベルなんだが。

748 :デフォルトの名無しさん:2009/03/11(水) 00:38:01
>>746
というか、文意や話の流れ程度を読む知恵もない人間が
プログラマやっちゃダメだと思うんだが、このスレ見ると日本のプログラマって
本当底辺の職業なんだなという思いを深くするな。

だから、可及的速やかに開放すべき共有資源を抱えているクラスばかりが必ずDisposeを
実装しているわけじゃないってところをぐだくだ言ってるやつがいるという話なんだが。。

749 :デフォルトの名無しさん:2009/03/11(水) 00:38:05
>>731
>>743
なんという発想w
どうせならCodeDOMじゃなくてLCG使おうぜ

750 :デフォルトの名無しさん:2009/03/11(水) 00:38:55
いやソースコードに意味があるのか

751 :デフォルトの名無しさん:2009/03/11(水) 00:40:39
ここって一応初心者スレなんだよな・・・
なんか自信なくなってきた 皆凄すぎ
やっぱ参考書3,4冊じゃまだ追いつけない

752 :デフォルトの名無しさん:2009/03/11(水) 00:43:02
IDisposable継承してるとGC上の世代が繰り上がって
解放が遅れるんじゃなかった?


753 :デフォルトの名無しさん:2009/03/11(水) 00:44:03
IDisposableはGCと直接は無関係
実装するとGCのタイミングが遅れるのはファイナライザ

754 :デフォルトの名無しさん:2009/03/11(水) 00:48:58
>>751
初心者スレだからこんなことで熱くなるんだよ。

755 :デフォルトの名無しさん:2009/03/11(水) 00:51:57
いまどきDisposeでこんな話になるとはね
IDisposableはインターフェースで実装されてるんだから
あれば実行すべきなんだよ

全部自動なんだぜって話ならobjectにdisposeが実装されてる

756 :デフォルトの名無しさん:2009/03/11(水) 00:52:41
冷蔵庫を開けっ放しにしていても、ママンが気付いて閉めてくれるから、自分で閉める必要はないし、
部屋を散らかしていても、ママンが片付けてくれるから、自分で片付ける必要はない。

ってことだろ?

757 :デフォルトの名無しさん:2009/03/11(水) 00:53:40
>>753
ありがと
勘違いしてた

必ず一回目のgcで生き残ってしまうため、結果的に世代が上がってしまうって理由もさっき知った

758 :デフォルトの名無しさん:2009/03/11(水) 00:55:04
>>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 冷蔵庫にはアイスが入っていなくてどうでもいいからママンに任せるぜ

ってことかな?

762 :デフォルトの名無しさん:2009/03/11(水) 01:01:18
何か違う

763 :デフォルトの名無しさん:2009/03/11(水) 01:03:39
>>761
さっきの奴は、アイスが入っているのにBを選択してしまって、
「溶けてはいるが、溶けてもアイスであることに変わりはない」
って主張していたってことか

納得

764 :デフォルトの名無しさん:2009/03/11(水) 01:05:00
いや意味不明だろw

765 :デフォルトの名無しさん:2009/03/11(水) 01:06:15
アイスが入っているかどうかは、MSDNライブラリと常識で判断しろってさw

766 :デフォルトの名無しさん:2009/03/11(水) 01:07:26
「常に呼ぶ」「常に呼ばない」のどちらかに決めようとするからおかしい。


767 :デフォルトの名無しさん:2009/03/11(水) 01:08:26
MSDNライブラリには、
アイスが入っている場合に冷蔵庫を締めるためにIMamanableを利用します
って書かれているんだが・・・

768 :デフォルトの名無しさん:2009/03/11(水) 01:08:33
初心者スレにふさわしい流れにほっこり

769 :デフォルトの名無しさん:2009/03/11(水) 01:10:48
>>766
IMamanableは、アイスが入っているので締めてね?というために実装するインターフェースです
従って常にアイスが入っているので、締めないとアイスが溶けちゃうんです

770 :デフォルトの名無しさん:2009/03/11(水) 01:11:05
>>767
そうなんだけど、実際にアイスが入ってるかどうかは常識で判断しろ、
って言い張ってる奴がいるのよ。

確かに、レアケースで入っていると見せかけて入ってないことがないわけ
じゃないんだけどさ。

771 :デフォルトの名無しさん:2009/03/11(水) 01:12:03
そもそもアイスのメタファーが不適切

772 :デフォルトの名無しさん:2009/03/11(水) 01:13:45
>>771
アイスだけにシンタックスシュガーです

773 :デフォルトの名無しさん:2009/03/11(水) 01:14:39
早くリソースを解放したいなら呼び出せばいい。
そうでないなら必ずしもこだわる必要はない。それだけのことだな。

774 :デフォルトの名無しさん:2009/03/11(水) 01:14:50
ようは、「常に」「必ず」「絶対」が、100回中100回なのか、
100回中95回なのか、って話。

前者にこだわる原理主義者と、後者でいいじゃんっていう
一般人の戦い。

775 :デフォルトの名無しさん:2009/03/11(水) 01:15:12
Dispose呼ばないとおかしくなる可能性がある
どのクラスがどれだけヤバいかは内部実装によるので外部仕様から正確な判定は困難
なら、必ず呼んどけ

というのは別におかしなことじゃない

それを
呼ばなくてもよい場合がある
それは常識で判断できる
だから呼ぶか呼ばないかは常識で判断しろ
なんていうやつがいるから混乱する

776 :デフォルトの名無しさん:2009/03/11(水) 01:15:50
>>770
それは、アイスが入っていないのに、アイスが入ってるから締めてねって言うようなもんじゃんw
アイスが入ってると思って締めざるを得ないw

777 :デフォルトの名無しさん:2009/03/11(水) 01:17:23
>>775
それはクラス設計に問題が…
「Dispose呼んでもバグがある可能性があるから、
 呼ばないほうがいい」って言ってるのと、内容は正反対でも同レベルだぞ。

778 :デフォルトの名無しさん:2009/03/11(水) 01:17:48
>>774
その残りの5回中にFileStreamを開いたり、DBに接続してたりしてたら
問題になるから回数や割合の問題じゃないんだが・・・

779 :デフォルトの名無しさん:2009/03/11(水) 01:20:42
>>775
だからファイナライザでDispose処理をしておくことが推奨されている
IDisposableを実装するなら、別にファイナライザを定義する必要はないが、
最終的にリソースが解放されるようにしておくのは当然

780 :デフォルトの名無しさん:2009/03/11(水) 01:21:07
>>777
全然違う
Disposeはインスタンスの寿命が終了することを前提で呼ばれるメソッドで、
設計もそのようになされているから、インスタンスを使わなくなった時に
Disposeを実行して問題が発生するようなら、むしろそのほうがおかしい。

781 :デフォルトの名無しさん:2009/03/11(水) 01:21:21
>>778
でも、呼んだら問題が発生するから呼ばないでください、って注意書きがあれば
呼ばないでしょ?

ほら! 100回中100回じゃないじゃないか! って言ってるのが原理主義者。

782 :デフォルトの名無しさん:2009/03/11(水) 01:22:45
>>779
リソースの即時解放として実行するのはまったく問題ないじゃん

783 :デフォルトの名無しさん:2009/03/11(水) 01:23:56
>>780
そういうこと言ってるんじゃなくて、Disposeメソッドそのものに
バグがあるかもしれないでしょってことを言ってるんだが
Dispose呼ばなきゃ不具合が起きるクラスなんてそれと同レベル

784 :デフォルトの名無しさん:2009/03/11(水) 01:24:29
>>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#なんだから、
終了処理を必須とするクラスの設計は避けたほうがいい。

788 :デフォルトの名無しさん:2009/03/11(水) 01:31:39
>>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

792 :デフォルトの名無しさん:2009/03/11(水) 01:37:08
無限ループって怖くね?

793 :デフォルトの名無しさん:2009/03/11(水) 01:39:24
>>790
すぐに解放しないと問題がある場合があるから、
すぐにした方がいいっていってるんじゃんかよ

794 :デフォルトの名無しさん:2009/03/11(水) 01:40:04
break

795 :デフォルトの名無しさん:2009/03/11(水) 01:40:33
>>791
いやMSDN読めば?
そういう目的のために存在するんだから、必須だからDisposeがあると考えるのが必然

796 :デフォルトの名無しさん:2009/03/11(水) 01:41:08
>>793
すぐに解放しないと問題が起きるならすぐにすべきに決まってるだろ。アホか?

797 :デフォルトの名無しさん:2009/03/11(水) 01:42:16
>>796
>終了処理を必須とするクラスの設計は避けたほうがいい。
って言う奴がいるから、わざわざ指摘してるんでしょうがw


798 :デフォルトの名無しさん:2009/03/11(水) 01:43:24
>>795
どこにそういうことが書いてあるの?きちんと引用して示してね。

799 :デフォルトの名無しさん:2009/03/11(水) 01:44:10
>>798
リファレンス引く事も出来ないバカ

800 :デフォルトの名無しさん:2009/03/11(水) 01:45:42
>>799
ごまかさないで示せよ
「終了処理が必須だからDisposableがある」なんてどこに載ってるの?

801 :デフォルトの名無しさん:2009/03/11(水) 01:46:05
>>798
なんども出てるけど、はいどうぞ

>このインターフェイスは主に、アンマネージ リソースを解放するために使用します。
http://msdn.microsoft.com/ja-jp/library/system.idisposable.aspx

802 :デフォルトの名無しさん:2009/03/11(水) 01:48:21
>>801
「終了処理」なんて言葉は書かれていないよね。
ごまかさないようにね。

アンマネージリソースの解放 → 終了処理 かもしれないけど、
終了処理 → アンマネージリソースの解放 は成り立たないからね。

十分条件・必要条件も分からないバカが書き込みしてるのかな?
言葉はきちんと使おうね。まあ揚げ足取りだと吠えるしかできないんだろうけどw

803 :デフォルトの名無しさん:2009/03/11(水) 01:49:05
>>802
はいどうぞ

>このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。

804 :デフォルトの名無しさん:2009/03/11(水) 01:50:33
>>803
あのー頭悪いんですか〜?

「終了処理」という言葉を聞いてるんだから、
せめてその言葉が出てくるところを引用しようね。

805 :デフォルトの名無しさん:2009/03/11(水) 01:51:57
屁理屈の応酬だあ

806 :デフォルトの名無しさん:2009/03/11(水) 01:52:44
>>804
いやいや、明示的なオブジェクトを破棄するためにDisposeを実装するんだから、間違いじゃないだろ?
何いってんだ?ww

807 :デフォルトの名無しさん:2009/03/11(水) 01:53:59
>>804
>「終了処理」という言葉を聞いてるんだから、 せめてその言葉が出てくるところを引用しようね。
必要条件とか言ってるんだから、意味を汲む能力ぐらいあんだろ?


808 :デフォルトの名無しさん:2009/03/11(水) 01:54:33
>>806
横槍だが、どんどん無知が露呈してるぞ
明示的なオブジェクトの破棄ではなく、明示的なアンマネージリソースの破棄な
オブジェクトというとマネージオブジェクトも含むように聞こえる

809 :デフォルトの名無しさん:2009/03/11(水) 01:55:55
>>807
なんだ、結局「終了処理」ってのは示せないままか。
とんだヘタレだなwww

810 :デフォルトの名無しさん:2009/03/11(水) 01:56:53
で、この無意味な言い争いで誰が特をするのか

811 :デフォルトの名無しさん:2009/03/11(水) 01:56:53
>>808
暗黙的なガベージコレクタでの破棄はFinalize
明示的なオブジェクトの破棄はDisposeだっていってんだろ?

必要条件とかを覚える知識だけあって、文意を汲み取る能力はゼロかよ。

812 :デフォルトの名無しさん:2009/03/11(水) 01:57:13
さっきから>>788=>>806=>>807が1人で荒らしているような気がしてきた

813 :デフォルトの名無しさん:2009/03/11(水) 01:57:44
何を今更

814 :デフォルトの名無しさん:2009/03/11(水) 01:58:38
>>809
オブジェクトを解放する処理=終了処理と換言しただけでしょうが。

その言葉を使用した文献が見あたらないと負けなの?w
そういう意味の文献があればいいんでないの?w
しぬの?w

815 :デフォルトの名無しさん:2009/03/11(水) 01:58:38
ここまで自演でした。

816 :デフォルトの名無しさん:2009/03/11(水) 01:59:51
>>811
完全に間違い。
Disposeはマネージオブジェクトを破棄するところではないし、
破棄できるものでもない。オブジェクト≠アンマネージリソースだよ。
カーネルオブジェクトとかだけをさす言葉じゃないから。

聞いてると用語の使い方が甘い印象を受ける。素人さんかな?

817 :デフォルトの名無しさん:2009/03/11(水) 02:01:14
>>814
だからオブジェクトじゃないと何度言ったら…。
あ、そっか。荒らしだったのか。相手にするだけ無駄だな…。

818 :デフォルトの名無しさん:2009/03/11(水) 02:02:23
ここまですべて女子高生の書き込み

819 :デフォルトの名無しさん:2009/03/11(水) 02:04:09
>>816
>>817
だから、.netで管理できないリソースを明示的に解放するためにDisposeがあるっていってんの

820 :デフォルトの名無しさん:2009/03/11(水) 02:06:25
>>817
>このインターフェイスは、Disposeメソッドだけを定義している。
>使い終わったら確実に資源を解放する処理が必要なクラスは、
>このインターフェイスを実装して、解放処理を記述するのが.NET Frameworkでのお約束である。

んで、これに対する返事もらってないんだけど?

821 :デフォルトの名無しさん:2009/03/11(水) 02:09:57
ROMってたけど俺みたいな初心者が見てると気持ち悪くなるわ
何が正しいのやら…
口論終わったらまとめてくれるとありがたい
じゃ、おやすみノシ

822 :デフォルトの名無しさん:2009/03/11(水) 02:11:35
>>821
Disposeがあればしておけば間違いない
たったこんだけ

823 :デフォルトの名無しさん:2009/03/11(水) 02:14:06
顔真っ赤にして書き込みすぎちゃってレスできなくなっちゃったんだろうなぁ
ママンはいつまでも面倒みてくれないぞw

824 :デフォルトの名無しさん:2009/03/11(水) 02:15:59
>>823
今頃>>788は顔真っ赤だろうなw

825 :デフォルトの名無しさん:2009/03/11(水) 02:18:10
>>824
逆だろ>>787が顔真っ赤だろ

826 :デフォルトの名無しさん:2009/03/11(水) 02:21:29
むしろ今まで書き込んでる奴全員顔真っ赤に見える

827 :デフォルトの名無しさん:2009/03/11(水) 02:21:56
>>824
アンマネージドリソースを解放する目的で存在するのなら、
disposeを実行するのは絶対に必須だと思うぞ?

828 :デフォルトの名無しさん:2009/03/11(水) 02:23:12
絶対に必須ってなんだよ。日本語勉強してこい。

829 :デフォルトの名無しさん:2009/03/11(水) 02:26:13
あーあ反論できなくなっちゃって関係ないこと罵倒し始めたよコイツ

830 :デフォルトの名無しさん:2009/03/11(水) 02:28:36
宇宙の真理的な絶対に必須とか俺的に絶対必須とか誰も必要としない必須とかいろいろある

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

832 :デフォルトの名無しさん:2009/03/11(水) 02:30:52
どんなに日本語がおかしかろうが、リソース解放にDisposeの実行が明示的に必要なのは変わりない罠

833 :デフォルトの名無しさん:2009/03/11(水) 02:33:49
>>831
>リソースを解放しなければならないことが分かっている時
まさに今述べてることじゃん
解放しなければ

834 :デフォルトの名無しさん:2009/03/11(水) 02:35:44
>>833は「次の2つの場合に限る」というのを、どうしても「全ての場合」に摩り替えたい低脳

835 :デフォルトの名無しさん:2009/03/11(水) 02:42:30
>>834はオブジェクトの生存期間を自分で管理できない最底辺プログラマ


836 :デフォルトの名無しさん:2009/03/11(水) 02:43:49
今来た初心者の素朴な疑問なんですが、(マジで)
たとえばDBやhttpなどの接続プールを管理しているファクトリからストリームを貰ったときに
自分が使い終わったからといって、勝手に閉じるとママに怒られると思うんですが
そういうケースはどう扱うのが正当ですか?

837 :デフォルトの名無しさん:2009/03/11(水) 02:49:42
>>836
そのままほっとけばGCが回収してくれると主張する人がいる

838 :デフォルトの名無しさん:2009/03/11(水) 02:52:08
>>834
だ・か・ら
>アプリケーションコードでDisposeメソッドやCloseメソッドを呼び出すということは、
>アプリケーションは自分がオブジェクトにアクセスする必要がなくなるタイミングが分かっていると宣言をしていることになります。
って書いてあるだろ。つまりオブジェクトが必要無くなったときにdisposeするかどうかを論じてるんだから、
最後の2つの場合について論じているわけよ

839 :660:2009/03/11(水) 02:57:04
お前らまだ続けてたのか

840 :デフォルトの名無しさん:2009/03/11(水) 02:59:52
Disposeしていいと思うのならしとけ
していいかわからなかったらするな

これでいいよ

841 :デフォルトの名無しさん:2009/03/11(水) 03:07:10
しなかったら、ずっとデータベースに接続され続けるんじゃないのか?
していいかわからなかったらしておいたほうがいいだろ

842 :デフォルトの名無しさん:2009/03/11(水) 04:32:20
A.アイスがチュッチュなら溶けても構わないので、そのまま開けっ放し。
B.アイスがハーゲンダッツなのでちゃんと締める。

843 :デフォルトの名無しさん:2009/03/11(水) 05:00:01
>>836
ソース見たわけじゃないけど普通はラップしてんの返して
dispose(){
 stream.flush;
 再利用していいよ=true;
}
本当のdispose(){
 stream.dispose;
}
じゃないかね
上は利用者が使って下はファクトリが使う

844 :デフォルトの名無しさん:2009/03/11(水) 05:51:53
結局、初心者はどうすればいいの?

845 :デフォルトの名無しさん:2009/03/11(水) 06:58:56
あきらめる

846 :デフォルトの名無しさん:2009/03/11(水) 07:50:07
「一般的にはそもそも Dispose の実装不要」と
「Dispose 実装してるクラスの Dispose 呼び出し不要」が
ごちゃまぜになってない?

manage リソースで完結してるなら Dispose そもそも実装しなくてよくて GC まかせ推奨。
unmanage リソースの解放が必要にのみ Dispose とか Close 実装して呼び出す。
ってのが >>831 の意味だと思うんだけど。


847 :デフォルトの名無しさん:2009/03/11(水) 08:32:45
初心者スレ的には
Disposeできるならしとけ
よくわからないならDispose()を明示的に呼ばないといけないような使い方は避けろ
usingが使える使い方で使え

848 :デフォルトの名無しさん:2009/03/11(水) 08:58:15
おまえらusing使ったことネーノ?

849 :デフォルトの名無しさん:2009/03/11(水) 09:02:17
>>831でDisposeを推奨しないと言ってるのはusingが使えないような場合について
初心者スレ的にはそもそもそういう状況を作らないように気を付けるべきだと思うけど

850 :デフォルトの名無しさん:2009/03/11(水) 09:22:22
つうか

あるループ内でDataTableをデータベースから取得するだけの部分でチェックしてみたんだが

datatable dt;
for (int i=0;i<100000;i++)

dt = データ取得;

これで延々diposeでずに処理するのと

データ取得の後にdt.dipose入れるとのでは
メモリの使用量が結構違うな
前者の方が使用量が常に多い

当然の結果だとは思うが、メモリ少ないような環境とかだと有効なのかもね



851 :デフォルトの名無しさん:2009/03/11(水) 11:27:03
API使って取得したハンドルを変数IntPtr に保持するような
クラスの場合Disposeは実装したほうが良いですか?
CloseHandleが必要でなければいらない?

852 :デフォルトの名無しさん:2009/03/11(水) 11:30:26
一晩で伸びすぎワロタ

853 :デフォルトの名無しさん:2009/03/11(水) 11:44:40
>>851
俺ならDispose-Finalize のパターンで確実にハンドル閉じるようにすると思う


854 :デフォルトの名無しさん:2009/03/11(水) 12:57:18
Microsoft.Win32.SafeHandles

855 :デフォルトの名無しさん:2009/03/11(水) 13:02:50
C#で書庫(zip, rar等)を扱う標準的な方法ってないですか?

856 :デフォルトの名無しさん:2009/03/11(水) 13:12:20
標準の意味が.NET Frameworkの標準ライブラリって意味なら、ない

857 :デフォルトの名無しさん:2009/03/11(水) 13:13:42
>>855
これじゃだめ?
ttp://msdn.microsoft.com/ja-jp/library/system.io.packaging.zippackage(VS.80).aspx


858 :857:2009/03/11(水) 13:15:02
rarもだった・・・orz
フレームワークにrar扱うライブラリなんてないさ

859 :デフォルトの名無しさん:2009/03/11(水) 13:28:28
ZipPackageはzipファイルを扱うためのライブラリじゃないぜ

860 :デフォルトの名無しさん:2009/03/11(水) 13:47:32
http://slashdot.jp/~saeki-k/journal/432460
おっぉー!

861 :デフォルトの名無しさん:2009/03/11(水) 14:10:22
Zip だけなら CodePlex にゆるゆるライセンスのやつがあったような…

862 :デフォルトの名無しさん:2009/03/11(水) 14:57:01
テキストファイル中の100字くらいを変換するソフトを作りたいんですがやり方を教えてください

863 :デフォルトの名無しさん:2009/03/11(水) 15:03:30
テキストファイル中の100字くらいを変換するソフトを作ればいいよ

864 :デフォルトの名無しさん:2009/03/11(水) 15:08:41
1回しかやったことないから忘れた
保存とかのメソッドありますか?
読み取り→正規表現→保存
でおk?


865 :567:2009/03/11(水) 15:09:21
(System.型)変数[i]

って書き方ってどういう意味になるんですかね?

866 :デフォルトの名無しさん:2009/03/11(水) 15:10:51
>>865
取り敢えずMSDNでC#の演算子を一通り調べて

867 :デフォルトの名無しさん:2009/03/11(水) 15:21:18
というか、リファレンス読んで勉強するより、
何か作る物決めてつくっちゃったほうが勉強になる気がするぞ

868 :デフォルトの名無しさん:2009/03/11(水) 20:05:41
なんか初心者らしい作品ありませんでしょうか

869 :デフォルトの名無しさん:2009/03/11(水) 20:17:09
電卓とか

870 :デフォルトの名無しさん:2009/03/11(水) 20:18:27
メモ帳だろJK

871 :デフォルトの名無しさん:2009/03/11(水) 20:23:22
メモ帳はVSの練習にはいいけどプログラミングの練習にはならんね
電卓はちょっと難しすぎるかも
○×ゲームとか

872 :デフォルトの名無しさん:2009/03/11(水) 20:28:56
必要に迫られてるか、プログラムをおもしろいと思わないと挫折するよな
情報系の学校行っても身につかなくて全然違うことやってる友達とかいるし
お前ら作ってておもしろいと思ったものある?

873 :デフォルトの名無しさん:2009/03/11(水) 20:31:36
Web系は楽しいな
開発がページ単位なので区切りが付きやすいからメリハリが付く

874 :デフォルトの名無しさん:2009/03/11(水) 20:39:06
なにしに学校きたか分からん奴って多いよね
身につかないんじゃなくて身につけないんだよ

875 :デフォルトの名無しさん:2009/03/11(水) 20:58:56
勉強だとか練習だとか思ってる時点でry

876 :デフォルトの名無しさん:2009/03/11(水) 21:03:37
全部が全部面白いことばかりじゃないけどね
つまらなくても勉強しておいたほうが後々役に立つこともある

877 :デフォルトの名無しさん:2009/03/11(水) 21:07:52
zipってJ#のライブラリつかってできなかったっけ?

878 :デフォルトの名無しさん:2009/03/11(水) 23:18:24
質問です
C#でつくったDBソフトはフォルダReleaseの部分を使用者のPCにコピペするのが簡単なインストールなのでしょうか?

879 :デフォルトの名無しさん:2009/03/11(水) 23:24:06
うん

880 :デフォルトの名無しさん:2009/03/11(水) 23:24:24
うん

881 :デフォルトの名無しさん:2009/03/11(水) 23:24:27
日本語でOK

882 :デフォルトの名無しさん:2009/03/11(水) 23:25:02
ポルトガル語でもおk

883 :デフォルトの名無しさん:2009/03/11(水) 23:27:22
デスクトップに展開だな

884 :デフォルトの名無しさん:2009/03/11(水) 23:31:14
4月から部署異動でC#で開発することになった・・・
C畑で育った俺が果たしてついていけるのか心配だ

885 :デフォルトの名無しさん:2009/03/11(水) 23:38:39
むしろCの方がおいらにとっては憧れ
C#極めたもっといろいろやりたい人が
Cへ行くイメージ お互い頑張りましょう

886 :デフォルトの名無しさん:2009/03/11(水) 23:43:18
>>884
俺もつい最近始めたばっか。
Cとアセンブラの泥臭い仕事を10年以上やり続けてたから少し不安だったが、
やってみたらコレが結構楽しいぜ

887 :デフォルトの名無しさん:2009/03/11(水) 23:44:36
ふと思ったんだけど、C#で作ったソフトのmdf見たいときsqlserverからみれます?
sqlserverマネージメントスタジオから見ようと(ファイル-開く)すると拒否られまくりなんですけど?

888 :デフォルトの名無しさん:2009/03/11(水) 23:45:09
俺もCやりたいな
CとAPIの参考書は買ってあるんだけど何故か遠い・・・

889 :デフォルトの名無しさん:2009/03/11(水) 23:47:14
>>887
見られるよ


890 :デフォルトの名無しさん:2009/03/11(水) 23:48:20
メモリ管理難しいです><

891 :デフォルトの名無しさん:2009/03/11(水) 23:49:57
cめんどくさいよ
String s = s1+s2;
って書けば済むとこ
strlenで大きさ取ってmallocしてstrcpyしてfree


892 :デフォルトの名無しさん:2009/03/11(水) 23:50:25
>>889
どうやって?!・・・??

893 :デフォルトの名無しさん:2009/03/11(水) 23:51:05
>>891
なんか かっこいい・・・

894 :デフォルトの名無しさん:2009/03/11(水) 23:54:10
そう、Cは何でもこなせるように機能を後から追加していった感がして
C++程ではないが、煩雑化が激しいよ
API駆使してソケット使ったアプリとかもうね、、、

895 :デフォルトの名無しさん:2009/03/12(木) 00:10:35
C++ はややこしいだけで煩雑ではないぞ。特に C と
比較するんなら

896 :デフォルトの名無しさん:2009/03/12(木) 00:22:08
>>893
騙されちゃだめだ。
難しいことしてる気分になれるから自己満足はできるかもしれないけども。

897 :デフォルトの名無しさん:2009/03/12(木) 00:26:24
>>889
できないぉ

898 :デフォルトの名無しさん:2009/03/12(木) 00:42:27
>>897
できたよ

899 :デフォルトの名無しさん:2009/03/12(木) 00:45:29
どういうときに(string)とかにして()つけるのですか?
string なんちゃらって書いてビルドエラーになると()つけて通った通ったじゃ、なんか違う気がしまして。
なんか決まって右辺のような気がするのですが

900 :デフォルトの名無しさん:2009/03/12(木) 00:47:47
キャストのこと?

901 :デフォルトの名無しさん:2009/03/12(木) 00:50:04
キャストだよね・・・?

double → int で小数点以下を切るとか
int → string で文字として扱うとか

902 :デフォルトの名無しさん:2009/03/12(木) 01:00:21
>>898 おしえて師匠

903 :デフォルトの名無しさん:2009/03/12(木) 01:00:26
ポインタが面倒くさくてC#に言った人は居ないか…
最近キャストの括弧も面倒になってきた…

904 :デフォルトの名無しさん:2009/03/12(木) 01:08:41
面倒というけれどstatic_cast<>()なんかは明示的で読みやすいかな

905 :デフォルトの名無しさん:2009/03/12(木) 01:31:23
キャストって言うんだ。明日調べてみます。ありがおt

906 :デフォルトの名無しさん:2009/03/12(木) 10:02:21
<string>って検索しても見つからなかったのですが、(string)とは何が違うのですか?

907 :デフォルトの名無しさん:2009/03/12(木) 10:08:29
<string>はジェネリッククラスの型引数でしょ

908 :デフォルトの名無しさん:2009/03/12(木) 11:00:04
>>903
ポインタを使うだけなら簡単だが、
ポインタを使ったプログラムのデバッグは面倒だな

C#なら予想外の挙動(例外発生とか、変数の値がおかしいとか)を辿っていけばバグの原因に辿りつくが、
Cだと全く関係ない場所にバグの影響が現れたりする

909 :デフォルトの名無しさん:2009/03/12(木) 11:43:14
>>907 ありがとう。ジェネリッククラスで検索してきます

910 :デフォルトの名無しさん:2009/03/12(木) 12:49:23
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;
}

911 :デフォルトの名無しさん:2009/03/12(木) 12:55:49
リソースの解放が不要ならどうでもいいよ

912 :デフォルトの名無しさん:2009/03/12(木) 15:17:37
>>904
あれは嫌がらせの意味でわざと糞長くしてるんでしょ
C#には安全じゃないキャストなんかないからそんな必要ないけど

913 :デフォルトの名無しさん:2009/03/12(木) 16:44:44
んにゃ、区別したいから名前つけて template 関数と書き方が一緒になった。
おかげでユーザーが種類を増やせた。static_pointer_cast<T> とか。
狙ってたのかどうなのか知らんが。

914 :デフォルトの名無しさん:2009/03/12(木) 18:25:21
VS 2008 FormデザイナでColor型のプロパティを変更するときに
タブつきのカラーダイアログが表示されると思うんだけど
(システム定義 Webとか)
ただのABC順のドロップダウンしか表示されなくなったんだけど、
設定の問題?VS2008のバグ?

915 :デフォルトの名無しさん:2009/03/12(木) 20:13:07
正規表現で文字列を抜き出したいんですけどindexofとか文字列の長さとかを使うのですか?
ぽんと該当箇所を抜き出せるメソッドがあったら教えてください

916 :デフォルトの名無しさん:2009/03/12(木) 20:17:30
Regexクラスで検索

917 :デフォルトの名無しさん:2009/03/12(木) 20:18:11
また叩いてくれといわんばかりの質問だな

918 :デフォルトの名無しさん:2009/03/12(木) 20:18:23
http://www.atmarkit.co.jp/fdotnet/dotnettips/579regexmatch/regexmatch.html

こんなのかな。
正規表現ってほかにもやりかたが存在していそうだけれど。

919 :デフォルトの名無しさん:2009/03/12(木) 20:21:11
ありがとうございました

920 :デフォルトの名無しさん:2009/03/12(木) 22:59:26
OpenGLとWinFormsを使って、
アニメーションするプログラム(GUI付)を作りたいんですが、
どうすればいいのか方法が良く分かりません・・。
マルチスレッドとかしないといけないみたいでややこしいです。

921 :デフォルトの名無しさん:2009/03/12(木) 23:01:42
WPF使えば簡単

922 :デフォルトの名無しさん:2009/03/13(金) 00:16:43
json形式のデータを簡単に扱えるようにする.netframeworkのクラスってないでしょうか?

923 :デフォルトの名無しさん:2009/03/13(金) 00:22:32
>922
JavaScriptSerializerとかDataContractJsonSerializerとか。

924 :デフォルトの名無しさん:2009/03/13(金) 00:23:37
System.Data.Json

925 :デフォルトの名無しさん:2009/03/13(金) 01:41:29
例外処理について聞きたいのですが、特定のメソッドの中でどのような例外が発生する可能性があるかを
簡単に把握する方法ってあるのでしょうか?

926 :デフォルトの名無しさん:2009/03/13(金) 01:58:44
使用しているメソッドの例外の型をMSDNで調べる

927 :デフォルトの名無しさん:2009/03/13(金) 16:06:47
質問です。
クラスのインスタンスが必要とするメモリサイズを知る方法
ありますか?


928 :デフォルトの名無しさん:2009/03/13(金) 16:07:55
ない

929 :デフォルトの名無しさん:2009/03/13(金) 16:11:52
体感速度なら・・・

930 :デフォルトの名無しさん:2009/03/13(金) 16:12:23
>>928
そうですか。
タスクマネージャーで見るとかしかないですかね。


931 :デフォルトの名無しさん:2009/03/13(金) 16:25:52
質問です
VS2008のSetupProjectでインストール時に
regsvr32 を実行してdllを登録したいのですけど
regsvr32.exe xxx.dllを
実行する hoge.exeをつくって
カスタム動作でインストール時にコンソールhoge.exeを実行する
方法しか思いつきませんでした。
インストール時に直接コンソールを叩く設定はできますか?

932 :デフォルトの名無しさん:2009/03/13(金) 16:33:50
>>930
Marshal.SizeOf()
構造体かStructLayoutAttributeでフィールドの配置方法を明示したクラスに使える

933 :デフォルトの名無しさん:2009/03/13(金) 16:38:07
>>932
目安にしかならんだろ

934 :デフォルトの名無しさん:2009/03/13(金) 16:47:17
目安でいいみたいだが

935 :デフォルトの名無しさん:2009/03/13(金) 17:38:44
タスクマネージャーは目安にもならんからな。

936 :デフォルトの名無しさん:2009/03/13(金) 23:15:36
>>927
実装に依存しすぎるからそれぞれ調べないといけないけど、
リフレクションと unsafe コード駆使すればある程度は調べる
ことはできる。やり方?自分でやれ

>>932
それはマーシャリング後のサイズになってしまう

937 :デフォルトの名無しさん:2009/03/13(金) 23:41:58
>>932
クラスの中に大きなサイズの画像データへのポインタとかを持ってないんならそんな感じだな

938 :デフォルトの名無しさん:2009/03/14(土) 01:40:29
#regionって使いますか?
どのぐらいのコード行が入ってるかわからないし、展開したとき入れ子になってたり現在地もわからなくなるんですが
普通はファイルで分けるか、クラスとかメソッドでわけるでいいんですよね?
#region使うメリットって事実上あるんですか?

939 :デフォルトの名無しさん:2009/03/14(土) 01:47:30
使うけど

940 :デフォルトの名無しさん:2009/03/14(土) 01:47:40
ないね
深くつながりあう可能性が高いから同一ファイル内にしているわけで
展開圧縮なんか繰り返すのはめんどくさいし全体を把握するためにずっと展開しっぱなしなのが普通
MSのサンプルなんかは使いまくってるからウザいし、全部展開してもコードが#regionコードがゴミになっててウザい

941 :デフォルトの名無しさん:2009/03/14(土) 01:48:07
同じクラスでも、
メンバのprivate変数でまとめたかったり
プロパティでまとめたかったり
overrideしたメソッドや
protectedなメソッドとでまとめたったり、
いろいろあるから人それぞれでしょ。

単純に短くすることができれば見やすくなるから便利。

942 :デフォルトの名無しさん:2009/03/14(土) 01:52:19
>>940
細かくregionされててウザイばあいもあるけど、
ソースを把握して表示させる必要のないコードはあると思うから、
そういうのを非表示にできるという意味で便利だと思うけどね

943 :デフォルトの名無しさん:2009/03/14(土) 01:53:18
大量のコントロールにイベントハンドラ関連付けするときは#regionでまとめる
デザイナがそうなんだからそういう使い方が正しい
むしろ変更修正する必要のないものまで表示させとく意味がわからない

944 :デフォルトの名無しさん:2009/03/14(土) 01:55:02
俺も使わないな
ブックマークで飛びまくった方がすっきりする
展開閉じてると中身忘れるしホイールでぐるぐるやってればいつも目について忘れなくなる

945 :デフォルトの名無しさん:2009/03/14(土) 01:58:19
中身の無いプロパティの集まりとかは完全にまとめるよな
メンバ変数も必要ないし

946 :デフォルトの名無しさん:2009/03/14(土) 02:03:20
>>944
そこは完全にC#というかJavaの糞仕様
使用するメソッドやプロパティをDelphiみたいにヘッダに定義する形にすればよかった
そうすればregionの大きな役割の一つは達成できたはず

947 :デフォルトの名無しさん:2009/03/14(土) 02:09:31
> 普通はファイルで分けるか、クラスとかメソッドでわけるでいいんですよね?

ここに突っ込むべきでは?

948 :デフォルトの名無しさん:2009/03/14(土) 02:11:45
+ボタンを押す時マークが小さくてカーソル合わせるのイライラする
行をダブルクリックで展開するけど逆はできないし
展開したときのendregionの位置が見つからないのがダメすぎる
また入れ子かよ!どこがendだよ!みたいな
#region内コードに背景色設定が出来るようになるまで使うことはない

949 :デフォルトの名無しさん:2009/03/14(土) 02:13:15
なんの修行だよw

ショートカット使えよ

950 :デフォルトの名無しさん:2009/03/14(土) 02:21:44
別に常に全部展開した状態で使えばいいじゃん?
なんで、入れ子とか、どこがendかよみたいに考える必要があるの?


951 :デフォルトの名無しさん:2009/03/14(土) 02:22:43
背景色設定っていいね
昔から
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
で区切ったりされてるのになんで視覚的にまとめたいんだってことにMSは気がつかないんだろうね
#endregionの場所を探すとか、悪化してるだけだ

952 :デフォルトの名無しさん:2009/03/14(土) 02:27:53
endregionを探したいと思うのはなんで?

953 :デフォルトの名無しさん:2009/03/14(土) 02:29:43
コピペプログラマー(笑)

954 :デフォルトの名無しさん:2009/03/14(土) 02:29:54
regionは上級者向けなんだよ、きっと・・・

955 :デフォルトの名無しさん:2009/03/14(土) 02:31:38

#region コメント ///////////////////////////////////////////

#endregion

こんな感じで使ってれば探す必要ないけど
どうでもいい#regionごときにこだわるのはなぜ?

956 :デフォルトの名無しさん:2009/03/14(土) 02:38:08
<summary>
なんかもっとうざいと思う
タグ名指定で表示非表示出来ないとコード上のゴミでしかない


957 :デフォルトの名無しさん:2009/03/14(土) 02:46:00
自分が区別しやすいような記述をして、折りたたみたいところにregionすればいいだけじゃん
なんで、そこまでregionの必要性を知りたいのかわからない。

<summary>はxmlでの表記の仕様だからしょうがないね。

958 :デフォルトの名無しさん:2009/03/14(土) 02:59:40
regionの使い道はあるようでない
普通は範囲選択して折りたたんで終わり
しかし、普通はそれすらやる人は少ない
こだわるほどの機能じゃない。

結論:わざわざコードを書いてまで使うメリットは無い

959 :デフォルトの名無しさん:2009/03/14(土) 03:01:50
可読性のためには有用でしょ
折りたためないより折りたためるほうが良い

960 :デフォルトの名無しさん:2009/03/14(土) 03:04:41
<summary>はコードが見難くなるから嫌いだけど、ポップアップで定義がでるから面倒でも書くようにしてる。
で、書いた後に#regionで畳むようにしてる。

961 :デフォルトの名無しさん:2009/03/14(土) 04:19:02
こういう雑談も#regionで消せるといいな

962 :デフォルトの名無しさん:2009/03/14(土) 04:31:51
お後がよろしいようで

963 :デフォルトの名無しさん:2009/03/14(土) 04:32:38
ほらな?

964 :デフォルトの名無しさん:2009/03/14(土) 13:26:54
俺は#region使いまくるけどな。
っていうか、使わないコーディングなんて考えられないけど。
まあ小さなコードばっか書いてる人間には不要なのは確かだが。

>>960
そこは#region設定しなくても普通に畳めるよw
知らなかったのか。

965 :デフォルトの名無しさん:2009/03/14(土) 13:30:58
俺も#regionは使うけど
入れ子にはあんまりしない

966 :デフォルトの名無しさん:2009/03/14(土) 13:36:51
#regionはメソッド内の処理をスコープに関係なく好きな場所で切られるので怖いよ。
#regionが必要なサイズのメソッドに膨れてること自体が問題だし。

967 :デフォルトの名無しさん:2009/03/14(土) 13:40:50
メソッド内でregion設定する奴なんていないからw
どんな被害妄想だよ

968 :デフォルトの名無しさん:2009/03/14(土) 13:48:36
メソッド内でも#region使う。
スコープは考慮するけど。
if (abc)
{
#region
...
#endregion
}

969 :デフォルトの名無しさん:2009/03/14(土) 13:50:31
それはさすがに「やめとけ」としかいいようがないな・・・
ネタか本気か知らんけど

970 :デフォルトの名無しさん:2009/03/14(土) 14:33:25
構造化出来ない人ほどregionを多用して見やすい風を演出する

971 :デフォルトの名無しさん:2009/03/14(土) 15:02:58
>>946
ありえない、それこそDelphiのクソ仕様。
そういうのが見たければオブジェクトブラウザがあるだろ。

972 :デフォルトの名無しさん:2009/03/14(土) 15:06:35
IDataObjectだのIViewObjectの実装とか、閉じないと邪魔でしょうがない。

973 :デフォルトの名無しさん:2009/03/14(土) 15:08:18
アウトラインの「定義に折りたたむ」を多用するので、regionは使う。
ただ、複数行の<summary>は折りたたみ時に「///<summary>...」になってしまって
コメントの役割を果たさなくなるのが嫌い。
この辺はVS側がもっと融通聞かせてくれてもイイと思う。

974 :デフォルトの名無しさん:2009/03/14(土) 16:37:33
SmartOutline for .Net使い出してから
#regionは使わなくなった

975 :デフォルトの名無しさん:2009/03/14(土) 16:55:53
WPFで3Dオブジェクトをコードで定義す場合に、頂点、面、テクスチャ座標を
それぞれリストに追加していくようなコードになるんだけど、さすがに
#regionで区切らないと訳が分からなくなる。メソッドを分けようにも、
どう考えても処理の最小単位で分割できないし。
どうして球とか立方体とか基本的なオブジェクトが用意されていないのか・・・。

976 :デフォルトの名無しさん:2009/03/15(日) 01:11:51
>>973
VBみたいにしてくれたらいいのにな。

977 :デフォルトの名無しさん:2009/03/15(日) 01:33:28
>>971
逆だよ
ObjectPascalのように定義すれば、IDEがメソッドやプロパティを自動で書いてくれる
コーディングの手間が省けるし、ソースを見る側はそこさえ見れば中身がだいたいわかる。
超便利。

978 :デフォルトの名無しさん:2009/03/15(日) 01:52:51
C++はもう古い、これからはC#だ、とか聞くのですけど、C#は.NETが前提ですよね。
.NETアプリって総じて重いイメージがあるのですが、なぜそこは問題視されていないんでしょうか?
かなり致命的だと思うのですが…。

979 :デフォルトの名無しさん:2009/03/15(日) 01:55:20
致命的なのはドキュメントを読めない馬鹿開発者だ
Ngen使えカス

980 :デフォルトの名無しさん:2009/03/15(日) 01:58:11
>>978
速度をできるだけ出さなければならないような分野ならともかく
通常の使用ではそれほど問題にならないから。

981 :デフォルトの名無しさん:2009/03/15(日) 01:59:21
遅いって言っても純C++の8割くらいは速度出るし。
VB6よりは3倍くらい速いよ。

982 :デフォルトの名無しさん:2009/03/15(日) 01:59:37
イメージを検証する前に問題視して致命的と判断するのってどんな気分?

983 :デフォルトの名無しさん:2009/03/15(日) 02:01:10
っていうかどう見ても978は釣りでしょ。

話変わるけど次スレ立てようか?

984 :デフォルトの名無しさん:2009/03/15(日) 02:12:32
>>982
いや実際、小さなフリーソフトでも.NETアプリだと遅いんですよ。
特に起動に数秒かかります。
起動した後は速いですけど、起動しっぱなしでもない限りやはり起動の遅さは気になります。
これはなぜ問題視されていないんでしょうか?

985 :デフォルトの名無しさん:2009/03/15(日) 02:14:34
多くのアプリは起動した後に使うものだからだろう。

986 :デフォルトの名無しさん:2009/03/15(日) 02:15:09
>>984のPCスペックに問題があるんじゃねーの?
気になるほど遅いって事も無いと思うんだがな

987 :デフォルトの名無しさん:2009/03/15(日) 02:15:29
>>984
これを使うんだ
http://www.forest.impress.co.jp/article/2008/11/19/unofficialngengui.html

988 :デフォルトの名無しさん:2009/03/15(日) 02:16:30
起動はJITのせいでしょ。
だからネイティブイメージジェネレータ使いんさいと。

989 :デフォルトの名無しさん:2009/03/15(日) 02:18:50
c++もmfc使っていれば、.netと同じでdll経由してるから、同じようなもんじゃいの?

990 :デフォルトの名無しさん:2009/03/15(日) 02:20:16
返事が無いから立てたYO

ふらっとC#,C♯,C#(初心者用) Part39
http://pc11.2ch.net/test/read.cgi/tech/1237051173/

991 :デフォルトの名無しさん:2009/03/15(日) 02:20:38
>>989
中間コードとJITコンパイラについて勉強しましょう。

992 :デフォルトの名無しさん:2009/03/15(日) 02:21:16
>>985
でも例えばメモ帳のように、ちょっと起動しては終了しを繰り返すような場合はどうでしょう。

>>986
E6600のメモリ6Gなのでさすがにスペックのせいではないと思います。

>>987-988
ngenがポイントみたいですね。みなさんこれで起動の遅さを解決してるのでしょうか。

993 :デフォルトの名無しさん:2009/03/15(日) 02:22:01
>>991
いや起動時の遅さを度外視した場合の話
読めばわかるだろ?誰も起動時の話なんてしちゃいない

994 :デフォルトの名無しさん:2009/03/15(日) 02:22:35
ctrl + M + M or Oとか使っているなら畳んだり開いたりメンドクサイなんてこと思わないと思うんだけどな。
俺はVS使ってる限り#regionを使うことは非常に有用だと思うが

995 :デフォルトの名無しさん:2009/03/15(日) 02:23:02
>E6600のメモリ6Gなのでさすがにスペックのせいではないと思います。

完全にあなたが神経質なだけですね。

996 :デフォルトの名無しさん:2009/03/15(日) 02:23:05
ngenで前処理しておいたからってコールドスタートが早くなるとは限らないだろうけど
いずれにしても一度起動しちゃえば再起動しても実用上問題になるほど遅くは無いでしょ

997 :デフォルトの名無しさん:2009/03/15(日) 02:23:19
>>992
その程度の遅さが気になるならPCを買い換えたほうがいい
スペックが足りないと思う

998 :デフォルトの名無しさん:2009/03/15(日) 02:24:10
盛り上がってきましたねw

999 :デフォルトの名無しさん:2009/03/15(日) 02:25:02
>>992
raidにするか デフラグしていないか
ウィルスに感染してないか?
余計な常駐が動作していないか?

1000 :デフォルトの名無しさん:2009/03/15(日) 02:25:04
だか残念ながらウメス

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

277 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)