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

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

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

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

(,,゜Д゜)∩先生助けてくださいです! 
....世の中には貴方の助けを必要としている人がいるぽ....
2 名前: デフォルトの名無しさん [sage] 投稿日: 2007/08/08(水
2デフォルトの名無しさん:2007/09/04(火) 11:56:43
>>1
3デフォルトの名無しさん:2007/09/04(火) 12:01:53
前スレ999

やりたいことは
int[] intData = new int[]{ 5,4,3 ];
これだけで済むと思うよ
Console.WriteLine(intData[0]); //5
Console.WriteLine(intData[1]); //4
Console.WriteLine(intData[2]); //3

for(int i = 0; i < 3; ++i)
{
Console.WriteLine(intData[i]);
}
こんなふうにも出来る
4デフォルトの名無しさん:2007/09/04(火) 12:09:11
もっというと

int[] intData = new int[]{ 5,4,3 };

int[] intData2 = new int[4];

for(int i = 0; i < 3; i++){
intData2[i + 1] = intData[i];
}

こんな感じかね
5デフォルトの名無しさん:2007/09/04(火) 12:09:14
前スレのラストに来た質問、今読んだけど微笑ましいなw
自分のしたいことと、ポインタ/配列の概念がうまく結びついてない感じがする
6デフォルトの名無しさん:2007/09/04(火) 12:10:29
多分動的に変数名を指定できるスクリプトから来たんだと思うなあ
7996:2007/09/04(火) 12:43:08
前スレ996です。
999を書いたのは私と別人なようで…。。。
>>3-4
回答ありがとうございます。
ただ…。やりたいことと微妙にズレがあります。
動的に変数名を指定という言葉が近いのかと思いますが、
for(int i = 0; i < 3 ;i++){
  [intData + i] = i * 5;
}
といった感じに左辺を動的に指定したいのです。
8デフォルトの名無しさん:2007/09/04(火) 12:50:28
> 動的に変数名を指定
変数ってのは入れ物であって、値じゃないのよ?
↓じゃダメなの?

for(int i=0; i<3 ;i++)
  intData[i] = i * 5;
9デフォルトの名無しさん:2007/09/04(火) 12:52:37
よろしくお願いします

ListViewコントロール をdetailで使用しています。

したいことは、選択されたItemが、常にListViewコントロールの真ん中に表示できるようにしたいです。
矢印キーを押して、行をスクロールさせた時に、選択された行の下3,4行くらいも見える(コントロール内に出てくる)ようにするようにしたいということです。


Item数が少なく、Itemを構成する行がListView内に収まる場合は、すべてが見えてるので問題ありません。
10デフォルトの名無しさん:2007/09/04(火) 12:54:07
>>7
>ただ…。やりたいことと微妙にズレがあります。

この手の質問ってC#スレで頻出なんですが
残念(に思われるのは996さんだけかもしれませんが)ながら
C#の仕様だと無理なのですよ。

もうみんなうんざりなので最短ルートとして「C#でどう書くか」が
提示されまくってるのをお察し下さいませ。
11デフォルトの名無しさん:2007/09/04(火) 12:55:10
どうしてもっていうなら Dictinoary<string,int> でも使ってろってこったな
12デフォルトの名無しさん:2007/09/04(火) 13:09:21
変数名がintDataで、その後に数字が続くだけなら、
配列で出来る。
配列はあらかじめ大きさを指定しなきゃならないので、
それがまずいときは

List<int> list = new List<int>();

for(int i = 0; i < 3; ++i){
list.Add(intData[i] * 5);
}
動的に大きさが増える配列であるListを使えば出来る。

後、変数以外の名前も指定したければ、その変数を持ったクラスを新しく作って、
そのクラスの配列やListを使う
13996:2007/09/04(火) 13:24:36
お答えいただいた皆さんありがとうございました。
色々と提示してもらえて助かりました。
どの方法を使うのかが最適か試してみます。
14デフォルトの名無しさん:2007/09/04(火) 13:32:29
*頻出質問*

 ・コントロールを名前の文字列から取得したいんですが
 ・VB6みたいなコントロール配列ってどうやるんですか
 ・変数を名前で指定したいんですが
 ・フォーム間でデータを渡したいんですが
 ・イベントが発生しません。これはバグですね?
 ・参照型と値渡しと値型と参照渡しがよくわかりません><
15デフォルトの名無しさん:2007/09/04(火) 13:52:51
>>10
> もうみんなうんざりなので

これからも頻出質問は出続けると思うのでそういうのをまとめたものを作りませんか。
答えるほうもそこへのリンクさすだけで手間無く済みそうですし。一挙両得
>>14さんも挙げられてるようにこういうものがあればなと思われてる方も
少なからずいるのではないでしょうか。
よろしくお願いします。
16デフォルトの名無しさん:2007/09/04(火) 13:59:47
>>3
996がやりたいこととは全然違うだろ。
とどのつまり前スレ999さんのいってる事の解決が事件をとく鍵だと思う
17デフォルトの名無しさん:2007/09/04(火) 13:59:51
>>9
ListViewItem item = ほにゃらら;
item.EnsureVisible();
18デフォルトの名無しさん:2007/09/04(火) 14:04:12
文字列からなんとしてでも変数を取得したい、
と思ってるやつにはどう答えたらいいんだろう。

それは間違ってるよ、と代替案を提示すべきなのか
リフレクション使え、と突き放すべきなのか
19デフォルトの名無しさん:2007/09/04(火) 14:07:42
C#は静的にコンパイルされてチェックされるのがいいところだからな
動的に変数名を文字列で指定しなきゃならないようなケースは普通ないし
そういう場合にはリフレクションなりDictionaryなり使えという話になるな
20デフォルトの名無しさん:2007/09/04(火) 14:08:05
>リフレクション使え
それはないだろ
21デフォルトの名無しさん:2007/09/04(火) 14:20:53
それはない
22デフォルトの名無しさん:2007/09/04(火) 14:25:49
>>15
そんなのいらん
このスレは質問者がある特化した質問をして、その特化したシチュエーションに対応する回答を
スレ住人がしてくれるから存在価値があるんだろ

つか、大抵はググれば済むんだから…
23デフォルトの名無しさん:2007/09/04(火) 14:30:23
動的にクラスを生成しろという話になるのかな
やりかた知らんけど
24デフォルトの名無しさん:2007/09/04(火) 14:31:04
>>18
もう一段前があって、多分こんな感じなんじゃないかな。

1.ループを使えば綺麗に書けるのに
2.ピコーン 「文字列から変数が取れれば解決じゃん?」
3.やり方わかんね -> 2ch

「ループを使えば綺麗に書けるのに」というときの定石には
言語ごとにかなりクセがある。
C#だとそれは最初からループ対応の変数(配列とかListとか)を使うであったり
アクセス用のメソッドを用意するであったりするわけだ。

一方で緩い言語では変数の名前空間自体が一種のDictionaryになっていて
命名ルールを工夫するだけで複数の変数をループ処理できるものもある。

そこまで緩くないC#としては、
「C#でループを書くときの定石を学べ」か
「.NETの機能を駆使して自分でパターンを作れ」になるんだろうなぁ。
25デフォルトの名無しさん:2007/09/04(火) 14:34:33
>>22
すんませんでした。
”頻出質問”に”うんざり”ということだったので、
あれば便利かなと思って先走ってしまいました。
それではみんなでれっつうんざり!
26デフォルトの名無しさん:2007/09/04(火) 14:58:45
つーか普通配列で十分だしな
なんでそんなことやろうとしてるのかわからん。
あおり楽しかったけどw
27デフォルトの名無しさん:2007/09/04(火) 16:42:09
ぶっちゃけ、なんかニヤッとする面白い質問だた
28デフォルトの名無しさん:2007/09/04(火) 16:48:48
class MyObjectBase {
public IDictionary<string,object> Properties{get;};
public IDictionary<string,Delegate> Methods{get;};
}
もう全部これを継承するようにするとか
29デフォルトの名無しさん:2007/09/04(火) 20:10:16
こんばんは。
早速ですが質問させていただきます。
C#を用いてExcelを扱うアプリを作ってるんですが
既存のシステムにはCOMを使用し、直接Excelを開いてRangeオブジェクトを
ToString()などして値を取得していたんですが、先輩曰くそのやり方は非常に駄目だから
VBS使えといわれました。
Excelのデータはデータベースに入れてるんですが
VBSを用いて同じことしたいんですがどのようにすればいいでしょうか。
30デフォルトの名無しさん:2007/09/04(火) 20:15:39
VC#2005で開発しているのですが
VScrollBarをフォームにくっつけているのですが
上下左右キーを押した際にスクロールバーにフォーカスを
持って行かれてしまいます。これを回避することは可能でしょうか。

フォームでキー処理をしたいのですがフォーカスをVScrollbarに取られてしまい
キーイベントが来ないので困っています。
31デフォルトの名無しさん:2007/09/04(火) 20:43:53
---色々---  上
---Panel---  |
---Form---  下

とか?
32デフォルトの名無しさん:2007/09/04(火) 20:47:31
KeyPreview = Trueで普通にいけるでしょ。
3330:2007/09/04(火) 21:05:55
フォームのIsInputKeyをoverrideすることで解決しました
34デフォルトの名無しさん:2007/09/04(火) 21:40:45
アクセスキーにFunctionキーを割り付けるにはどうしたらいいですか?
お願いします。
35デフォルトの名無しさん:2007/09/04(火) 22:17:31
>>29
確かにc#だと上手くやらないとゴミ残りまくり。
VBSの使い方?
すれ違い

>>34
アクセラレータ キー?

ショートカットキー?
36デフォルトの名無しさん:2007/09/04(火) 22:31:49
[intData + i.ToString()] ってどの言語?
37デフォルトの名無しさん:2007/09/04(火) 22:36:18
何の言語かはわからんがC#コードの一部としてでも有り得る
38デフォルトの名無しさん:2007/09/04(火) 22:38:20
そういうコードってスクリプト言語の宣伝によく使われる感じがするけど
C#でそういうのはほとんど見かけないよな
39デフォルトの名無しさん:2007/09/04(火) 22:41:19
D言語でもつかってろよ
40デフォルトの名無しさん:2007/09/04(火) 23:39:51
スクリプト言語では変数名の後に整数の変数を文字列化したものをくっつけて
配列の変数のように使うことも多い
4134:2007/09/04(火) 23:56:16
>>35
ショートカットキーです。
でもアクセラレータキーも教えてください。
調べたら「便利だな」って思いました
42デフォルトの名無しさん:2007/09/05(水) 01:01:22
DoubleBufferedプロパティを有効にすれば
Paintイベントをバックバッファでやってくれるからちらつかない
なんて聞いたんでTrueにしてみたがFalseのときよりちらつくようになった
漏れ、だまされたんでしょうか?
それとも手法がいけないんでしょうか?
43デフォルトの名無しさん:2007/09/05(水) 04:07:39
片方のバッファにしか描いてないんだろうw
44デフォルトの名無しさん:2007/09/05(水) 04:10:48
つか、OnPaintの外で描いてる?
45デフォルトの名無しさん:2007/09/05(水) 04:15:53
ふと思ったが、PaintEventArgs e の
e.Graphics 使ってる?
46デフォルトの名無しさん:2007/09/05(水) 04:18:34
CreateGraphics()とe.Graphicsじゃ結果が変わるね
47デフォルトの名無しさん:2007/09/05(水) 05:07:42
ッタリメー
48デフォルトの名無しさん:2007/09/05(水) 08:14:39
ダブルバッファの有効範囲をきちんと理解してないからだろう。
コントロールのと描画の範囲は抑えておきましょう。
49デフォルトの名無しさん:2007/09/05(水) 11:28:58
全画面で実行される別アプリ(ゲーム)の補助ツールを作ろうと思うのですが
その別アプリが例外エラーで落ちるときに、エクスプローラのタスクバーが消えたままになってしまうため、
それを常駐させておいた補助プログラムで自動的に検出して、タスクバーの復帰を解決しようと思うのですが、
これらの処理について調べるには、どのようなキーワードで検索すれば良いでしょうか?

稚拙な質問ですがよろしくお願いします。
50デフォルトの名無しさん:2007/09/05(水) 12:32:51
>49
例外で落ちてタスクバーが消える事が問題なんじゃない
なぜ例外をキャッチしてないのかと問いたい
51デフォルトの名無しさん:2007/09/05(水) 12:38:06
何か障害が発生した場合、最初にすべきことは原因の特定。
>>49は、障害を覆い隠すのではなく、障害の原因を特定し、その解決を考えてみるべきでしょ。
52デフォルトの名無しさん:2007/09/05(水) 12:38:25
別アプリの例外とかキャッチ出来るの?
53デフォルトの名無しさん:2007/09/05(水) 12:39:19
ましてゲームと書いてあるのにw
54デフォルトの名無しさん:2007/09/05(水) 12:40:30
>52
だから本アプリでキャッチしようよ。
触れない理由でもあるんかな?
55デフォルトの名無しさん:2007/09/05(水) 12:42:04
>全画面で実行される別アプリ(ゲーム)の補助ツール

よく読みましょう。
56デフォルトの名無しさん:2007/09/05(水) 12:43:22
>55
いや、読んだ。だから別アプリが問題だっていってるわけだが?
57デフォルトの名無しさん:2007/09/05(水) 12:45:01
本当はチートツールですちゃんと嫁
58デフォルトの名無しさん:2007/09/05(水) 12:46:34
>57
そうか、なら死ね
59デフォルトの名無しさん:2007/09/05(水) 12:50:22
うるせぇ解決策だせもしねえでお前がしね
60デフォルトの名無しさん:2007/09/05(水) 12:54:12
>59
DirectX SDK
でぐぐれ馬鹿
61デフォルトの名無しさん:2007/09/05(水) 12:55:40
>>49
explorer.exeのプロセスを定期的に調べて死んでたら起動するとかでは?
62デフォルトの名無しさん:2007/09/05(水) 13:10:39
消えたタスクボタンを復活させるフリーソフトがあったような。
6349:2007/09/05(水) 14:00:02
>>56
別アプリはあくまでも別(ゲームなのでソースは公開されてない)なので、
どういう原因で例外が発生しているのかはタイミングを含めてほとんど不明です。
なのでその不慮の自体からの回避をするための補助ツールをと思いまして。

>>57,58
結果的にチート扱いになってしまうかも分かりませんが、今回はタスクバーの
表示回復だけが目的です。

>>60
ググって見ます。

>>61
explorer.exeは生きてる状態で、タスクバーが消えてる以外は問題なく動いています。
(Windowsキーを押すとスタートメニューが表示されます。)

>>62
その機能を、補助ツールを常駐させることで自動的に回復したいのです。
64デフォルトの名無しさん:2007/09/05(水) 14:05:36
>63
もう一度ゲームを起動して正常終了してもタスクバーは消えたままですか?
65デフォルトの名無しさん:2007/09/05(水) 14:06:33
>>60はノイズだよ
そんなんぐぐっても何も出てこんぜ
66デフォルトの名無しさん:2007/09/05(水) 14:08:32
>65
いや出てくるが?
6749:2007/09/05(水) 14:11:52
>>64
その場合はタスクバーも表示されています。
68デフォルトの名無しさん:2007/09/05(水) 14:13:34
プロセス終了時にShell_TrayWndかなんかがVisibleか調べて
表示させればいいんじゃない
69デフォルトの名無しさん:2007/09/05(水) 14:16:08
>>63
んーじゃあ最初にタスクバーのハンドルを取得して
非表示になってたらShowWindowするとか。
非表示じゃなくて存在自体なくなってたらexplorer.exeをkillして再起動とか。
後者はあまり好ましくないかも知れんがやむを得ないと思われ
70デフォルトの名無しさん:2007/09/05(水) 14:27:31
>>68,69
ありがとうございます。
その方法で調べて試してみます。

>>69
確かにexplorerのkillは最終手段ですね^^;
71デフォルトの名無しさん:2007/09/05(水) 15:29:47
>67
DirectXで画面にクリア処理

それで終わるよ
72デフォルトの名無しさん:2007/09/05(水) 17:04:32
>>45-46
CreateGraphics()で書いてました
e.Graphicsじゃないといかんのですね
ありがとうございました
73デフォルトの名無しさん:2007/09/05(水) 17:08:21
どういたしまして^^
74デフォルトの名無しさん:2007/09/05(水) 17:13:21
>72
ヒント
最大化
最小化

createグラフィックが正解

あとはわかるね
75デフォルトの名無しさん:2007/09/05(水) 17:26:53
>>49
そのゲームの作者かメーカーに修正依頼するのが筋じゃねーの
76デフォルトの名無しさん:2007/09/05(水) 17:38:16
それが作者は昨年死亡したもので・・・
77デフォルトの名無しさん:2007/09/05(水) 18:00:09
owata
78デフォルトの名無しさん:2007/09/05(水) 18:44:41
ユーザーコントロールのプロパティに独自に作成したクラスの配列を指定する方法を教えてください。
コンパイルは通るけど、プロパティで設定した値が保存されません。string型の配列とかだと問題ないのですが orz

・TestClass.cs
public class dataClass{
 private string _member;
 public string Member{
  set { _member = value; }
  get { return _member;}
 }
}

・ユーザーコントロール.cs
private dataClass[] _test;
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public dataClass[] Test{
 set { _test = value;}
get { return _test;}
}
79デフォルトの名無しさん:2007/09/05(水) 19:02:13
>>78
このコードでちゃんと値取れたが、Testへはどうやって値入れてるんだ?
80デフォルトの名無しさん:2007/09/05(水) 20:31:28
エロビデオ専用のプレイヤー作りたいのですが
ムービー再生の命令ってありますか?
81デフォルトの名無しさん:2007/09/05(水) 20:33:02
命令^^
82デフォルトの名無しさん:2007/09/05(水) 20:34:37
何か間違ってますか?
83デフォルトの名無しさん:2007/09/05(水) 20:47:10
>>41

(&1)
(&2)

(&12
84デフォルトの名無しさん:2007/09/05(水) 20:47:18
>>79
ユーザーコントロールを新規のフォームに配置 ⇒ プロパティシートから設定しています。
85デフォルトの名無しさん:2007/09/05(水) 20:47:50
>>80
すまんが、エロビデオのモザイク除去コマンドしか知らね
他スレを当たってみてくれ
そして二度と来んな
86デフォルトの名無しさん:2007/09/05(水) 20:54:57
知らないならレスしないでください!
87デフォルトの名無しさん:2007/09/05(水) 20:55:23
>>84
???
プロパティシートからどうやって?
string?
88デフォルトの名無しさん:2007/09/05(水) 21:10:43
>>85
くだらねぇ
面白いと思ってんのか?
お前が二度とくんな
89デフォルトの名無しさん:2007/09/05(水) 21:17:37
>78
そのSET処理にメッセージボックスを置けばすぐ解るよ
90デフォルトの名無しさん:2007/09/05(水) 22:41:50
C#で
String型で誕生日が入っている場合
その誕生日から現在日付を計算して
年齢を取得するにはどうすればいいのでしょうか?

つまり誕生日が
"1991/09/06"の場合
今日実行すれば、15歳を表示
明日実行すれば、16歳を表示
91デフォルトの名無しさん:2007/09/05(水) 22:44:30
プロパティシートから?プロパティグリッドのことか?
92デフォルトの名無しさん:2007/09/05(水) 22:58:01
>>90
DateTimeにパースして
現在の年月日と比較したら?
93デフォルトの名無しさん:2007/09/05(水) 22:58:46
>>90
>"1991/09/06"の場合
>今日実行すれば、15歳を表示
>明日実行すれば、16歳を表示

これはどうやって計算した?
基本的にはその計算した過程をプログラムすれば良い。

ここが参考になるんじゃない
ttp://jeanne.wankuma.com/tips/datetime/
94デフォルトの名無しさん:2007/09/05(水) 22:59:15
>>90
こんなかんじか?

string tanjyo = "1979/01/27";
DateTime dt = DateTime.Parse(tanjyo);
TimeSpan ts = DateTime.Now - dt;
int nenrei = (int)ts.TotalDays / 365;
MessageBox.Show(nenrei.ToString());
95デフォルトの名無しさん:2007/09/05(水) 23:01:02
閏年は?
96デフォルトの名無しさん:2007/09/05(水) 23:02:53
年と月日を別々に比較しないとだめぽ
97デフォルトの名無しさん:2007/09/05(水) 23:07:51
Calendarがやってくれない?
9872:2007/09/06(木) 00:38:06
Paintイベントで
CreateGraphics()で描いていたのを
e.Graphicsを使って描いてDoubleBufferdをTrueにする事で
ダブルバッファリングを有効にすることができましたが

意図的にPaintイベントを発生させたいときに
Paint(null,null)で呼び出していた手法が使えなくなってしまいました
(PaintEventArgs e が nullになってしまうため)

何かいい方法はないでしょうか?
99デフォルトの名無しさん:2007/09/06(木) 00:43:23
>>98
そういうのは
・スレッドをブロックして即座に描画するんならControl.Refresh
・非同期的に描画するんならControl.Invalidate
を呼ぶ。
通常は後者
100デフォルトの名無しさん:2007/09/06(木) 00:49:22
>>99
嗚呼、Refreshでよかったのか〜
Invalidateは初めて知りまつた
ありがとうございました
101デフォルトの名無しさん:2007/09/06(木) 09:18:28
年齢は前日でプラス1だよ
102デフォルトの名無しさん:2007/09/06(木) 09:47:12
Refresh は、 Invalidate して Update してる
103デフォルトの名無しさん:2007/09/06(木) 09:51:03
>>101

あれ、満年齢って誕生日の前日に数えるんじゃなかったっけ?
104デフォルトの名無しさん:2007/09/06(木) 10:01:26
>>101

すまん、前日+1と読み誤っていた。
前日でプラス1、その通りでございます。

105デフォルトの名無しさん:2007/09/06(木) 10:06:16
VC#2005を使って簡単なブラウザを作りたいんですけど、とりあえずFormに
textboxやbuttonとか貼り付けて、buttonの名前を「移動]「戻る」「進む」と
名づけたんだけど、そのボタンにどうやったらその機能を付けたらいいのかが
わからないんです。
navigate()やGoback()などのメソッドを使うことは分かったんだけど、実際に
どのように記述すればいいのか…
106デフォルトの名無しさん:2007/09/06(木) 10:25:58
>>105
レンダリングエンジンを自作するつもりでなければ、
WebBrowserコントロールを貼り付ける。
あとはWebBrowserコントロールでググればいろいろ出てくるだろ。
107デフォルトの名無しさん:2007/09/06(木) 10:29:00
108デフォルトの名無しさん:2007/09/06(木) 10:48:33
>>107
おおっ!ありがとうございます。
参考になります♪
109デフォルトの名無しさん:2007/09/06(木) 11:17:40
>>87
>>91
プロパティグリッドというのですかね。正確な名称はわかりませんが、
コレクションエディタ? でメンバを追加しています。
>>78
メンバを追加してもメッセージは表示されません。。
110109:2007/09/06(木) 11:41:39
CollectionBase を派生させたクラスを使用すればよかったみたいですね。
お騒がせしました。
111デフォルトの名無しさん:2007/09/06(木) 11:55:36
>>107のサイトを見て一応作ったんだけど、この場合だとcomboBoxのプロパティitemに
登録したサイトのみ閲覧できるってことなんですよね?
そうではなくIEみたいにアドレスや検索語をtextBoxに入力して移動buttunを押せば
そのページに飛ぶようなブラウザをつくりたいんですけど、どうすれば…?

どのようにメソッドを記述すればいいんでしょうか?
112デフォルトの名無しさん:2007/09/06(木) 11:58:44
取りあえず、いきなりブラウザじゃなくて普通に
簡易なソフトを組むところから始めて見た方が良いのでは…。
113デフォルトの名無しさん:2007/09/06(木) 12:01:45
いきなり自分だけで作ってみるよりも、VisualC#入門 みたいな書籍やサイトを回って
軽く練習してからの方が早いよ
114デフォルトの名無しさん:2007/09/06(木) 12:09:38
応用のきかないやっちゃ
115デフォルトの名無しさん:2007/09/06(木) 12:14:48
>>113
嫌です
というかウェブブラウザ以外以外作るきはないんです
一度きりのプログラミングなので知る必要はないと思います
116デフォルトの名無しさん:2007/09/06(木) 12:16:17
>>115
>>111程度のこともできないんじゃ無理だね
117デフォルトの名無しさん:2007/09/06(木) 12:16:51
ってまあ騙りなんだろうけど、釣られてみたw
118デフォルトの名無しさん:2007/09/06(木) 12:18:10
誰だって初めからできるわけじゃないでしょが!!
119デフォルトの名無しさん:2007/09/06(木) 12:35:50
これが所謂ゆとりってやつかね。
120デフォルトの名無しさん:2007/09/06(木) 12:42:18
中身がわからないもの作って何が面白いんだろうか
もし入門書を読むのが苦痛ならプログラマには向いていないってことだよ
121デフォルトの名無しさん:2007/09/06(木) 12:47:04
webBrowser1.Navigate(comboBox1.SelectedItem.ToString());

webBrowser1.Navigate(textBox1.Text);

がんばれ
122デフォルトの名無しさん:2007/09/06(木) 13:39:40
>>120
誰でも苦痛だと思うが
123デフォルトの名無しさん:2007/09/06(木) 13:44:57
えー、苦痛ならほんとに向いてないでしょ
124デフォルトの名無しさん:2007/09/06(木) 13:57:27
入門書を読むのはまあ苦痛だろう。
苦痛じゃなくなるのは程よく慣れて思い通りになってくるだいぶ後の話だ。
苦痛だと思ったらプログラマに向いてないなんてちょい言い過ぎ。

>>115を読むとこいつは人間的にどうかと思うがな。
125デフォルトの名無しさん:2007/09/06(木) 14:07:37
>>118ワロタ
だから練習しろといってるw
126デフォルトの名無しさん:2007/09/06(木) 14:20:20
というか騙りじゃなけりゃ、スキルなくてやる気もないんだから発注しろよって話だな
127デフォルトの名無しさん:2007/09/06(木) 16:59:46
webBrowser1.DocumentText = "<html><body></body></html>";
HtmlElement he = webBrowser1.Document.Body;
if (he == null) {
MessageBox.Show("error");
return;
}
he.InnerHtml += "a";

これを行うとhe==nullがtrueになってしまいます。
Bodyを取得するにはどうしたらよいのでしょうか?
128デフォルトの名無しさん:2007/09/06(木) 17:39:16
よくgenericの例の説明で

Swap<T>(ref T,ref T);

なんてのがありますけど、

実際にSwapクラス?ってどこかの名前空間にあります?
129デフォルトの名無しさん:2007/09/06(木) 18:04:10
普通に自作のジェネリクスメソッドじゃね?
130128:2007/09/06(木) 18:13:49
いやまぁ作るのは簡単なんだけど・・・

誰が作っても同じだし、汎用的な処理なんであるに決まってると思い込んでた
131デフォルトの名無しさん:2007/09/06(木) 18:28:26
そんな事までクラスで面倒見ないといけないのか・・・?
132デフォルトの名無しさん:2007/09/06(木) 18:39:35
使わないだろ
欲しいと思ったことも無いなSwap
133デフォルトの名無しさん:2007/09/06(木) 18:44:40
コルーチンの説明でフィボナッチ数列求めるようなもんだろ。
134128:2007/09/06(木) 18:53:26
あぁ、そうか
C#みたいな言語では例外安全とかあんまり考えなくていいのね

だからSwapも要らないと
135デフォルトの名無しさん:2007/09/06(木) 20:15:57
考えなくていいわけじゃないけど
Swap1こだけあってもそんなにありがたくないような気がする
そういうの集めたライブラリとかなら知らんが。
136デフォルトの名無しさん:2007/09/06(木) 20:18:03
ていうかどのレベルで考えるかによるけとな。
Swapだけそんなに安全に使えてもあんまり意味ないし
137デフォルトの名無しさん:2007/09/06(木) 20:21:23
例外安全も考えたこと無いな
GCされるだけだし、
構造体のコンストラクタでは例外投げられないし
138デフォルトの名無しさん:2007/09/06(木) 20:43:43
例外安全ってどういうこと?
例外が発生するかどうかはこの場合関係ないような気がするけど・・・
誰か詳しい人教えて
139デフォルトの名無しさん:2007/09/06(木) 21:04:44
>138
OutOfMemoryExceptionやThreadAbortExceptionみたいな
いつでも起きうる例外もあるから。
例えばAPIでMutexを作って変数に代入する前に例外が起きたりして解放する機会を失ったりとかすると致命傷になる。
swapなら何かのIntPtrを例外安全に入れ替えたいときに必要なのかもしれず。C#使っててそんな機会はまずないかもしれないけど。

まぁ、ThreadAbortExceptionなんかAbortを叩くやつが悪いと思うし
本当のメモリ不足のOutOfMemoryExceptionは例外安全を考えるまでもなく復旧できないだろうし
こいつらはあんまり考えなくてもいいかもね。
他にいつでも割り込んで起きうる例外ってあったかなぁ?
140デフォルトの名無しさん:2007/09/06(木) 21:11:16
例えば片方入れ替えたところで何らかの例外が発生してしまうと、
変数の状態が不正になる
ローカル変数とかは普通に書いてりゃ問題ないけど
寿命の長いオブジェクトのフィールドだったりすると
例外が起こった処理以外に影響を与えてしまう。

まあ可能性は普通ものすごく低いので
ここまで考慮することはまあそうそうないけどね。
本当にクリティカルなオブジェクトだったりすると
そこまで考えなきゃならないこともあったりはする

普通はコード上で想定される例外くらいの考慮でしますけどね
Swapは普通問題が起こるのはまれな部類なので
そこまで考慮しないのがほとんど
141デフォルトの名無しさん:2007/09/06(木) 21:15:39
例えばASP.NET環境だと、処理に時間がかかりすぎると
スレッドがアボートされるので
思いもよらんところで例外が発生する可能性はある

そこまで考慮するかどうかはまた別の問題だが。
142デフォルトの名無しさん:2007/09/06(木) 21:17:51
どうでもいいし脇道なんだがCERあるのでその辺は「いつでも」は起こらない
2.0になる時に信頼性に関してはかなり手を加えられてたりする、ひっそり
まあSQLサーバーのせいだろうけど。
143デフォルトの名無しさん:2007/09/06(木) 21:18:28
だいたいアンマネージが絡むようなところか
セキュリティ上まずいことになる可能性があるところくらいかな
ロックなんかが関わってくるところもあるかもしれない
144デフォルトの名無しさん:2007/09/06(木) 21:20:20
>>142
それはつまりちゃんと対応した場合の話じゃないの?
ってか対応しる手段としてそういうのがあれ
145デフォルトの名無しさん:2007/09/06(木) 21:20:36
Compact上でのWebResponseの質問なんですが、
WebRequest.Create()でWebRequestを作成した後、GetResponse()で
WebResponseを作成するまではいいのですが、ファイルをダウンロード後に
Close()しようとしてもなぜかそこでハングしてしまい、WebResponseを閉じる
ことが出来ません。試しにGetResponseStream()で取得したStreamの方を
Close()してみたのですが、こっちの方でもハングしてしまい止まってしまいました。
ダウンロード対象はファイルとストリーミングデータ両方です。
何かヒントだけでもいただけないでしょうか?
146138:2007/09/06(木) 21:22:42
>>139-140
なるほどー。そういう問題があったとは気づかなかった。
でもSwapをメソッドにしてもそういう問題は変わらないんじゃない?
それともInterlockedクラスみたいに内部的な処理として実装するって意味なのかな
147デフォルトの名無しさん:2007/09/06(木) 21:50:37
>>127
判らないけど処理に時間がかかるんじゃないか。
148デフォルトの名無しさん:2007/09/06(木) 21:51:00
そういうことでしょう。
149デフォルトの名無しさん:2007/09/06(木) 21:51:30
>>146そういうことでしょう。
のつもりだったのですよ。
150デフォルトの名無しさん:2007/09/06(木) 21:53:41
すみません。どれが自作自演でしょうか?
151デフォルトの名無しさん:2007/09/06(木) 22:04:24
いや、多分、C++では例外安全なプログラムを書くためには
Swapが頻出するから、そのメソッドが用意されてないのはなんでじゃろ、
といった程度の話じゃないのかな
C++だとSwap以外のほとんどの処理が例外を投げる可能性があって大変らしい
StackのPopにいたっては例外安全に記述する方法がないという
152デフォルトの名無しさん:2007/09/06(木) 22:23:00
>>145
Compactは知らないが、その手のコードはあちこちにある。
それで試したら?

つーかストリーミングの処理はどうやってるのか非常に興味ある。
出来てなさそう。
153デフォルトの名無しさん:2007/09/06(木) 22:25:28
>>151
C++は基本的に例外安全か否かの2値しか考えないからねぇ。

ttp://msdn2.microsoft.com/ja-jp/library/system.runtime.constrainedexecution.consistency(VS.80).aspx

これで言うと、C++な人たちの世界では
Consistency.WillNotCorruptState
Consistency.MayCorruptProcess
のどちらか。

そうじゃなくて、状態の一貫性が失われることはあるのは前提で、
どこまで状態が不定になるかを分類するというアプローチもあると。
154デフォルトの名無しさん:2007/09/06(木) 22:28:19
そりゃそうだろ。
メモリだって100%確実に書き込みできるわけじゃないし。
155デフォルトの名無しさん:2007/09/06(木) 22:29:05
>>152
PC上で同じコードを実行した場合はハングせずに切断できるので
多分Compact上でやるのがいけないのか、CE機の方に原因がある
のかもしれません。
一応探してみます。

ストリーミングといってもただフレーム単位で流れてくるmp3を
スレッドに分けてConnectStreamから読んでるだけなんですけどね orz
156デフォルトの名無しさん:2007/09/06(木) 22:34:46
>>151
C++のstd::swapもコピーコンストラクタの実装によっては例外が出ると思うけど・・・
そういうことではない?
157デフォルトの名無しさん:2007/09/06(木) 22:37:30
c++のスレでどうぞ。
158デフォルトの名無しさん:2007/09/06(木) 22:39:09
変数名+1という式を実行したいのです
すなわちなぜ数字の1と文字列型の1が存在し区別する必要があるのかということです?
すごく面倒です
159デフォルトの名無しさん:2007/09/06(木) 22:46:26
ツマンネ
160デフォルトの名無しさん:2007/09/06(木) 22:47:01
釣れますか
161デフォルトの名無しさん:2007/09/06(木) 22:47:05
ゴメンネ
162デフォルトの名無しさん:2007/09/06(木) 22:53:20
>>161>>159に絶妙のレスを入れようとしたのに>>160の野郎が邪魔しやがって、
と思っているに違いない。

>>160は女。
163デフォルトの名無しさん:2007/09/06(木) 22:54:40
野郎なのに女とはこれいかに
164デフォルトの名無しさん:2007/09/06(木) 22:58:22
Mutexを使って多重起動を抑止したのはいいんだが

・多重起動してるかチェックしたときにすでに同じEXEが起動してた
・かつ起動済みのEXEが最小化されてる

こんなとき、すでに起動済みのEXEのほうの最小化を解除することは可能?
165デフォルトの名無しさん:2007/09/06(木) 23:03:30
可能だな
166デフォルトの名無しさん:2007/09/06(木) 23:11:03
>>164
プロセス間通信する必要がある。
IpcChannelとかその辺
167デフォルトの名無しさん:2007/09/06(木) 23:17:07
168デフォルトの名無しさん:2007/09/06(木) 23:23:12
まあでもchar型の数値と整数型の数字があるって不思議だよな!
たとえばprintに渡せないし
プログラムしない人にはわからないと思うぜ
169デフォルトの名無しさん:2007/09/06(木) 23:24:57
>>167
なにその参考先
二回目以降に起動したやつは存在するプロセスに通知するだけにすればいいのに
170デフォルトの名無しさん:2007/09/06(木) 23:25:12
158==168?
171デフォルトの名無しさん:2007/09/06(木) 23:34:13
>>158は前スレのベストセレクションだな
172デフォルトの名無しさん:2007/09/07(金) 00:33:32
int iに年代を入れてカレンダーを作るプログラムを作ったんだけど、
もし i におかしな数字を入れられた時はもう一度入力させるようにwhile文でまわすつもりが、
数字じゃなくてaaaaみたいな文字列を入れられて延々ループが始まってしまいました。
これを防ぐにはどうしたらいいですか?
173デフォルトの名無しさん:2007/09/07(金) 00:38:45
>はもう一度入力させるようにwhile文でまわすつもりが
意味分からんからコード書いてみ
174デフォルトの名無しさん:2007/09/07(金) 00:44:18
どのような処理か分かりかねるけど、普通はループ中に条件変わらなければ
ループ入る前に評価するのでは?
175デフォルトの名無しさん:2007/09/07(金) 00:53:25
>>173

int i;

scanf("%d",i);

while( i>1 || i<9999 )
 {
 printf("もう一度入力してください");
 scanf("%d",&y);
 }


こんな感じです。
176デフォルトの名無しさん:2007/09/07(金) 00:54:14
>>172
どんなコードかすごい興味あるw
177デフォルトの名無しさん:2007/09/07(金) 00:54:43
あ、すいません
最初のscanfの括弧内のiの前に&書き忘れです。
178デフォルトの名無しさん:2007/09/07(金) 00:56:34
たびたびすいません・・・・
whileの条件の不等号が逆です・・・
179デフォルトの名無しさん:2007/09/07(金) 00:56:47
Cかよ
180デフォルトの名無しさん:2007/09/07(金) 00:58:07
つーかなんで1個目のscanfはiで2個目はyなの
181デフォルトの名無しさん:2007/09/07(金) 00:59:23
1<i<9999 なら無限ループしたいの?
182175:2007/09/07(金) 01:03:59
>>180

ぐは;・・・・ちょっとミスしすぎですね。。
yはもともとのコードをyで書いてたんでその癖でそのまま書き写してしまいました・・・
183デフォルトの名無しさん:2007/09/07(金) 01:04:40
スレ違い
CとC#は別の言語だよ
自分が勉強してる言語の名前くらいちゃんと覚えとけ
この質問は>>180でFAだが次からこっち行けよ
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
184175:2007/09/07(金) 01:06:45
>>181
すいません、i<1 || i>9999 の時に正しく入力されるまでループさせたいんです。
でもaaaaなどの文字列を入れられてしまうとなぜかバグみたいに”もう一度入力してください”が延々流れ続けるようになってしまうんです。
185デフォルトの名無しさん:2007/09/07(金) 01:07:27
scanfじゃね?と冗談で書こうとしたらマジかよ
186175:2007/09/07(金) 01:07:30
すいません、失礼いたしました。
187デフォルトの名無しさん:2007/09/07(金) 01:09:29
まあまあどうせ暇なんだし答えてやろうぜ。
ってかすでに無限ループする以外の選択肢しかないだろこれはw
188デフォルトの名無しさん:2007/09/07(金) 01:11:28
>>186
いや構わんよ
自分はCのスレにも居るから何かあれば遠慮なく聞いて
189デフォルトの名無しさん:2007/09/07(金) 01:12:04
こんな感じのソースじゃなくてそのものがないとなんともいえんな
処理自体は間違ってないように見える
190デフォルトの名無しさん:2007/09/07(金) 01:19:55
191デフォルトの名無しさん:2007/09/07(金) 01:24:58
scanfってこんなんだっけ
もうすっかり忘れてるなw

なるほどこれはダメだ
192デフォルトの名無しさん:2007/09/07(金) 01:28:19
こういうの見るとC#やっててよかったと思うわ>scanf
193デフォルトの名無しさん:2007/09/07(金) 01:33:36
scanfのfってなんですか?
194デフォルトの名無しさん:2007/09/07(金) 01:36:41
フォーマットのfじゃね?

scanf 懐かしいな、講義で教わったときは「使うな」だったけど。
195デフォルトの名無しさん:2007/09/07(金) 01:44:28
教えといて使うなってのもなw
まぁ知らなきゃ使ってしまうかもしれないし当然だが
196デフォルトの名無しさん:2007/09/07(金) 04:06:43
ファイルの保存ですがオブジェクトを複数個リストにいれてそれを保存なんてことできますか?
取り出し方が思いつかないですけど
197デフォルトの名無しさん:2007/09/07(金) 04:12:56
シリアライズでぐぐれ
198デフォルトの名無しさん:2007/09/07(金) 05:09:53
前スレの透過キー問題、結構重要じゃね?
リサイズが出来なくなるのは仕様で済ましちゃ問題あると思うんだが。
199デフォルトの名無しさん:2007/09/07(金) 08:05:44
24bitバグが絡んでると思ったが16bitでも発生するみたいだ
200デフォルトの名無しさん:2007/09/07(金) 09:14:16
これ釣りですから
201デフォルトの名無しさん:2007/09/07(金) 09:15:02
202デフォルトの名無しさん:2007/09/07(金) 09:54:42
誤爆に10ゲイツ
203デフォルトの名無しさん:2007/09/07(金) 11:27:00
>>197
正直だめもとで質問したのですが便利なものがあるんですね。難しいけど
ありがとうございました
204デフォルトの名無しさん:2007/09/07(金) 11:55:10
あるプロジェクトがマネージドなのかアンマネージドなのかを判別する方法あるのでしょうか?
単純に、DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、
アンマネージドになるのであって、
明示的に、VisualStudioのビルドプロパティのどっかにフラグで指定されているわけでは無いですよね?
205デフォルトの名無しさん:2007/09/07(金) 12:35:57
プロジェクトファイルの拡張子からして違うように見えるのは俺の気のせいか?
206デフォルトの名無しさん:2007/09/07(金) 13:48:21
C#(というか.NET)で作ってたらDllImport使ってようとunsafe使ってようと
マネージドには違いないだろ
207デフォルトの名無しさん:2007/09/07(金) 13:51:32
>>204
>DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、
>アンマネージドになる

ならなねーよ
208デフォルトの名無しさん:2007/09/07(金) 14:20:27
http://www.atmarkit.co.jp/icd/root/18/21224318.html
ここの>CLRに準処 の意味がわからん
CLIに準処したCLR上で動作する の間違いか?
209デフォルトの名無しさん:2007/09/07(金) 14:52:05
>>204
アンセーフとごっちゃにしてない?
アンセーフかどうかならプロジェクトのプロパティにあるよ
Win32APIはたしかにアンマネージだが呼び出し側がアンマネージになるわけではない
210デフォルトの名無しさん:2007/09/07(金) 14:59:23
文字列の配列またはListの要素を結合する方法ってありますか?
arrray.Joint("区切り文字")
見たいなメソッドがあれば一番良いのですが。。。
今はループで回して+=で結合してるのですあ、もっと良い方法がないかな、と思って
211デフォルトの名無しさん:2007/09/07(金) 15:03:14
Strings.Join
212デフォルトの名無しさん:2007/09/07(金) 15:04:08
String.Join
213デフォルトの名無しさん:2007/09/07(金) 15:07:09
>>210
ちなみに要素数にもよるがループ中で文字列連結はよくない。
要素数だけゴミ(一時オブジェクト)が生成されるので。
そういうときは代わりにStringBuilderを使う。
214デフォルトの名無しさん:2007/09/07(金) 15:15:09
文字列の連結は今回は関係なおのでは
215213:2007/09/07(金) 15:18:40
>>214
まあ関係ないけど、一応言っといて損はないでしょ
216デフォルトの名無しさん:2007/09/07(金) 15:22:46
要素数があらかじめ決まっているならstringの方が最適化されて効率がよくなるらしいよ
217デフォルトの名無しさん:2007/09/07(金) 15:57:55
>>216
それは"a" + "b" + "c"がstring.Concat("a", "b", "c")になるというだけでは?
ループの連結では関係ないよ
218デフォルトの名無しさん:2007/09/07(金) 16:25:28
ループでも回数が決まってれば展開される最適化が行われることがあるだろ
そしてstring の += が全部一つにまとまってちょっぱやになるだろ
219204:2007/09/07(金) 16:33:10
皆様、確かにアンセーフとごっちゃにしていました。申し訳ありませんでした。
多分、以下のようになります。

アンマネージ :
  昔のDLLなどがアンマネージコード。
  .NETから呼び出しても、呼び出した側はマネージドコードのまま。

アンセーフ :
  ポインタなどを使ったコードで、unsafe{}句で記述する。
  ビルドプロパティで許可の設定をしないとビルドエラーとなる。
220デフォルトの名無しさん:2007/09/07(金) 16:53:15
>>218
なんねーよ
ループの展開ってどれだけ膨大なコードになるんだw
221デフォルトの名無しさん:2007/09/07(金) 17:29:59
JITでループが展開されることはあるんじゃなかったっけ
まあstringの連結の展開には無関係だけど
222デフォルトの名無しさん:2007/09/07(金) 17:31:09
繰り返し構造が3回以内なら展開される
223デフォルトの名無しさん:2007/09/07(金) 23:26:05
最小化されているFormを元の状態に戻すにはどうしたらいいんでしょうか?
もとの状態が最大化だったら最大化した状態に戻したいのですが。
224デフォルトの名無しさん:2007/09/07(金) 23:44:45
ShowWindow( hWnd, SW_RESTORE );
225デフォルトの名無しさん:2007/09/08(土) 01:31:23
>>224
どうもです。
やっぱWin32APIを使わないと無理なんでしょうかね?
226デフォルトの名無しさん:2007/09/08(土) 01:46:02
なんでだよw
要は最小化される前の状態を「覚えて」おけばいつでも元に戻せるだろ?
小学校1年生でもわかる理屈だと思うけど
227223:2007/09/08(土) 02:29:21
>>226
そうなんですけど覚えておける状況にあるとは限らないんで。
228155:2007/09/08(土) 02:37:48
すいません、詰ったのでもう一度質問させてください orz

あの後、いろいろ実験したのですが、どうやらファイルを完全にダウンロード完了しないと
回線が切断されないようで、単品のファイルをダウンロードする場合はちゃんと切断できるの
ですが、ラジオ放送などの終わりがいつになるかわからないものだと放送が終了するまで
切断できないようです。
ですが、さすがにそれだと通信帯域的や、コネクション数の制限的にまずいのでどうにかして
切断したいのですが、どうしたらいいでしょうか?
229デフォルトの名無しさん:2007/09/08(土) 03:49:50
適当に強制Closeしてやりゃいいんじゃねーの?
230デフォルトの名無しさん:2007/09/08(土) 04:25:25
>>229
usingで囲ってるのですが、どうしてもそうするとClose出来なくて
ハングしてしまい抜け出せません orz
231デフォルトの名無しさん:2007/09/08(土) 13:37:04
スレッドを作ってその中からClose
232デフォルトの名無しさん:2007/09/08(土) 18:04:50
>>223
ウインドウステートプロパティで
最大化か最小化か普通か取得できるからそれみて
最小化されてたら設定かえてやるだけでよくね?
233デフォルトの名無しさん:2007/09/08(土) 18:10:13
まあ、「覚えておけない状態」っていうのがどういう状態のことなのか
227に聞いてみたいものだねw
234デフォルトの名無しさん:2007/09/08(土) 18:26:45
>>231
スレッドは嫌韓雑誌なのでNGです
テコンダー朴がすごすぎです
235デフォルトの名無しさん:2007/09/08(土) 19:00:06
C#を無料で入手できるサイトってありますか?
236デフォルトの名無しさん:2007/09/08(土) 19:05:16
>>235
ネタ?
.Net framework sdkかC# Expressで検索。
237223:2007/09/08(土) 19:27:09
>>233
単に対象のフォームを作成時から面倒みれるわけではないというだけです。
まあライブラリ的なもんだと考えてもらえばわかりやすいかと。

>>232
元の状態がわからないのでそれではできないです。
238デフォルトの名無しさん:2007/09/08(土) 19:30:47
Form.WindowStateプロパティで取れるっていってんだろうがボケナス
239223:2007/09/08(土) 19:48:34
>>238
いや、だから現在の状態は取得できても元の状態は取得できないんですが・・・
240デフォルトの名無しさん:2007/09/08(土) 19:51:06
なら元の状態を記録しておけよ?
241223:2007/09/08(土) 19:59:41
>>240
とりあえず>>237の前半を読んでもらえないですかね?
242デフォルトの名無しさん:2007/09/08(土) 20:01:08
223はプログラマ向いてないんじゃないか?
なんかネタじゃなさそうだし....
243デフォルトの名無しさん:2007/09/08(土) 20:16:26
ズレてるのは>>238だろ
public void RestoreWindow(Form f) {
 if (f.WindowState == FormWindowState.Minimized) {
  //
 }
}
これをどう書くかって話だろ?
まあ多分ShowWindow使うしかないと思うけど。
244デフォルトの名無しさん:2007/09/08(土) 20:19:11
なんで事前にインスタンスを登録しとく形ではダメなの?
245デフォルトの名無しさん:2007/09/08(土) 20:22:25
きっと「クラス」ライブラリという考え方が理解できないのでしょうw
ライブラリといえばスタティックメソッドのことだと思い込んでるんだよ
246デフォルトの名無しさん:2007/09/08(土) 20:24:05
C#で各プロジェクト共通に使えるクラスを作成して
そのクラスをまとめて格納するフォルダを作りました。
それを別フォルダにあるプロジェクトからそのフォルダにあるクラスを
プロジェクト→既存項目の追加で追加すると同じプロジェクト内の
フォルダへコピーされてしまいました。
やりたい事はコピーでなくその共通フォルダにあるクラスそのものを参照して
共通フォルダのクラスを変更するだけですべてのプロジェクトが修正されている
仕組みにしたいのですがやり方がわかりません。VB6なら汎用モジュールを格納する
フォルダを作りその中のファイルをIDEで追加するとできたのですが・・・
コピーされてしまうと各プロジェクト分同じファイルができてしまい
メンテナンスが大変になりそうなので・・・
どなたか、共通ファイルを複数プロジェクトで共有する方法を教えて下さい。
247デフォルトの名無しさん:2007/09/08(土) 20:27:13
追加するときのファイルダイアログの「追加」ボタンの右の三角をクリック
リンクとして追加(だったかな)を選ぶ

DLLにした方がいいと思うけどね
248デフォルトの名無しさん:2007/09/08(土) 20:28:21
>>246
プロジェクトとリソルーションの区別がついてないと見た。
まずはそれを理解するのが先決だと思う。
249デフォルトの名無しさん:2007/09/08(土) 20:29:56
>>246
共通ファイルをクラスライブラリーにしてそのDLLを各プロジェクトで参照すればいいんじゃね
250223:2007/09/08(土) 20:41:52
>>243
大体そんな感じです。やっぱAPI使うしかないですね。

>>244
API使えばわざわざそういう方式にする必要もないので。

>>245
ライブラリって言葉はまずかったですかね?
でもそれはあくまでも補足で、その前の一行を読めば十分わかると思ったんですけどね。

まあというわけでWin32APIを使うことにします。
どうもありがとうございました。
251デフォルトの名無しさん:2007/09/08(土) 20:42:00
>>246
共通に使えるクラスを集めたプロジェクトを作って
そのプロジェクト自体をソリューションに追加するといいよ
ファイルを直接参照するんじゃなくてDLLができちゃうけど気にするな
DLLの存在は全く意識せずに扱えるようになってるから
252デフォルトの名無しさん:2007/09/08(土) 20:47:40
>>250
馬鹿なくせに頑なお方だねえw

>その前の一行を読めば十分わかると思ったんですけどね。
じゃないよw
何もわかってないのはお前さんの方。

君のような性格の奴はぜったに伸びないよ。

>>251
246が望んでいるのは、恐らく複数の「リソルーション」から同じクラスライブラリを
参照することで、君がいっているようなこととは微妙に違うと思うよ。
253デフォルトの名無しさん:2007/09/08(土) 20:51:11
ごめん

×リソルーション
○ソルーション(ソリューション)
254251:2007/09/08(土) 20:52:55
>>252
>複数の「リソルーション」から同じクラスライブラリを参照すること
いやその意味で言ったんだ
>>251の「そのプロジェクト」は利用側じゃなくて
「共通に使えるクラスを集めたプロジェクト」を指してるつもりだった
255デフォルトの名無しさん:2007/09/08(土) 21:07:43
>>247
回答ありがとうございます。
256デフォルトの名無しさん:2007/09/08(土) 21:24:15
どうみても馬鹿は>>252です。ありがたくない。
257デフォルトの名無しさん:2007/09/08(土) 21:28:35
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
258デフォルトの名無しさん:2007/09/08(土) 21:42:07
>>256
君223か?あるいは>>243?
このレベルのことが理解できなお馬鹿がそんなに多いとも思えない。

まあこれ以上騒がれてももうっとうしいから
一応簡単に223のどこが「馬鹿」か書くことにする。

223は、フォームが最小化される前の状態がわからないからできない、
と言っているがこれは愚かな発言だ。

わからない(不可知)なのではなく、223にわかるようなコードが書けないだけだ。
「わかる」ようなコードを書けよ。

>>257
くだらない質問をするのは問題ないが、無知を認められない頑なさ故に
自ら答えを知ろうとしない人間をなだめすかして手取り足取り教えてやるほど
誰もお人よしじゃないだろ。
259デフォルトの名無しさん:2007/09/08(土) 21:48:37
おまえら、もうほっといてやれよ
これから相手にしたやつも同じくらいバカってことで↓
260デフォルトの名無しさん:2007/09/08(土) 21:54:23
>>258
放置できないんなら君もヽ( ・∀・)人(・∀・ )ノナカーマ
261デフォルトの名無しさん:2007/09/08(土) 22:07:01
つーか
ShowWindow( hWnd, SW_RESTORE );

fm.WindowState= FormWindowState.Normal;
って挙動いっしょじゃないのか?
262155:2007/09/08(土) 22:36:19
>>231
返信遅れてしまってすいません。
元からThreadで回す予定だったので長くとも1分以内に切れてくれるならいいのですが、
いつまで経っても切れないのでメインスレッドに持って来て実験すると案の定
Closeのところでハングしてるんです orz
263デフォルトの名無しさん:2007/09/08(土) 23:58:04
ACSESSをC#からオートメーションで動かしたいのですが
VB6だと
'AccessをVB6でオートメーションで動かす
Public Sub AutoAccess()
Dim objAcc As Access.Application
Set objAcc = CreateObject("Access.Application")

With objAcc
.OpenCurrentDatabase "C:\test\test.mdb"
.DoCmd.OpenQuery "Q_クエリーテスト"
.CloseCurrentDatabase
End With
End Sub

となります。
C#だとどう書けばよろしいのでしょうか?
264デフォルトの名無しさん:2007/09/08(土) 23:59:27
VSTO
265デフォルトの名無しさん:2007/09/09(日) 00:14:26
>>264
VSTOはありません。ACCESS97です。
266デフォルトの名無しさん:2007/09/09(日) 00:31:20
つ Visual C# .NET を使用して Office オートメーション サーバーのウィンドウ ハン…
http://support.microsoft.com/kb/302295/ja
267デフォルトの名無しさん:2007/09/09(日) 00:51:55
>263
VB.NETを使って書いて作ったdllをC#から呼ぶ。
Missing.Valueが面倒なんだよねぇ……
268デフォルトの名無しさん:2007/09/09(日) 00:57:53
>>267
Missing.Valueとは何でしょうか?
269デフォルトの名無しさん:2007/09/09(日) 01:32:03
Valueさんがいなくて寂しいわ
270デフォルトの名無しさん:2007/09/09(日) 03:09:44
>>266
具体的なコード例があれば助かるのですが・・・
271デフォルトの名無しさん:2007/09/09(日) 03:17:23
272デフォルトの名無しさん:2007/09/09(日) 08:41:35
System.Runtime.InteropServices
273デフォルトの名無しさん:2007/09/09(日) 09:56:07
いいかげんしろや
簡単なことだったらググレカス。
キーワード位判るだろ!!!!

c# access オートメーション

ttp://support.microsoft.com/kb/317114/ja

でもな、c#からoffice使うのは勧めない。VB6やVBAからのほうがよい。
274デフォルトの名無しさん:2007/09/09(日) 11:47:55
文字列の
"$実行("hoge",1,"nage")"
を解析して
「$実行」

「"hoge"」「1」「"nage"」
を返してほしいのだがどうすればよいでしょうか?
正規表現でやれると思うけど引数部分が何回繰り返されるかわからないのです。
この引数の部分はobject[]に格納したいです。
275デフォルトの名無しさん:2007/09/09(日) 11:50:27
その前に文字列になってないような…
276デフォルトの名無しさん:2007/09/09(日) 11:55:48
>>274
地道にコード書けば?
277デフォルトの名無しさん:2007/09/09(日) 11:56:21
Match と Group 使いこなせばどうとでもなる
確か @IT に .NET の正規表現講座があったからそれで勉強してみれ
278デフォルトの名無しさん:2007/09/09(日) 11:59:28
正規表現使わないほうが楽なんでないの?

"hoge"に [ , ( ) ]が含まれているかも知れないし。
279デフォルトの名無しさん:2007/09/09(日) 12:01:19
それは面倒ではないが、" のエスケープがあると面倒だな
280デフォルトの名無しさん:2007/09/09(日) 12:12:07
TextFieldParser で超手抜きw
281デフォルトの名無しさん:2007/09/09(日) 12:28:47
なんかC#からExcelとかAccess使うのは
かなり評判が悪いみたいですね
COM開放しわすれて残骸が残るから?
それとも遅いから?
VSTOつかえといっても高いしアレ

おとなしくVSスクリプトでも使ってなさいってこと?
282デフォルトの名無しさん:2007/09/09(日) 12:30:47
追加:Missing.Value面倒
283デフォルトの名無しさん:2007/09/09(日) 13:54:14
初心者です。どなたか教えてください。

interfaceを作って、そのままクラスの中で宣言して使ってる
サンプルソースによく出くわすのですが、
interfaceってクラスで実装して初めて使えるものではないのでしょうか?

たとえば、IShellLinkのサンプルやseasarのオマケでついてくるサンプルなどです。

よろしくお願いします。
284デフォルトの名無しさん:2007/09/09(日) 13:57:30
COM参照のインターフェイスは特別
seasarのおまけとやらは知らん
285デフォルトの名無しさん:2007/09/09(日) 14:00:25
>>283
ちとエスパーしてみるが、
ファクトリが返してきたインスタンスをインターフェイスで受けてるケースのことか?
インターフェイスだけでインスタンスは作れないが、変数(参照の受け皿)は宣言できる。

IABC abc = ABC.Factory();
286デフォルトの名無しさん:2007/09/09(日) 14:13:00
もっと端的に書けばこういうこと。
interface IAbc {}
class Abc : IAbc {}
IAbc abc = new Abc();
287デフォルトの名無しさん:2007/09/09(日) 14:14:03
そのためのインターフェースだしな
288デフォルトの名無しさん:2007/09/09(日) 15:01:23
みなさまありがとうございます。
>>286であれば理解できるのですが、

 class Abc : IAbc {}

にあたる部分が見当たらないのです。

強いていえば、interfaceのはじめに

[ComImport]
[Guid("000214EE-0000-0000-C000-000000000046")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IShellLinkA

メソッドなどの宣言では、
void GetWorkingDirectory( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir, int cch );

みたいに書いてあるのですが。
その後は実装なしにinterfaceの型で変数を宣言してそのまま使ってるように見えます。
>>284さんの言われるように特別な例なのでしょうか?
よろしくお願いします。
289デフォルトの名無しさん:2007/09/09(日) 15:08:07
宣言はそりゃできるわさ。問題は初期化。
CoClass 属性がなけりゃ直接 new はできんはずだが。

ていうかそのサンプルってのはどこにあるのさ?
290デフォルトの名無しさん:2007/09/09(日) 15:16:52
>>288
特別な例なので半年後ぐらいに見直すといいよ。
言語の機能というよりはランタイムライブラリの機能だし。
291デフォルトの名無しさん:2007/09/09(日) 15:23:18
>>289
たしかにコクラスというのがあります!

他サイトへのリンクについて言及していないようなので貼ってみます。
以下のサイトのサンプルです。
http://smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips043.html

コクラスについて調べてみましたがさっぱり意味がわかりませんでした。
この機能の目的についてだけでも教えていただけますか?
あとは参考にすればよい本などがあれば・・・

よろしくお願いします。

>>290
半年後ですか・・・なにもせずに半年というわけではなく、
その間、充分勉強してスキルアップしろという意味でしょうね。
真摯に受け止めます。ありがとうございます。
292デフォルトの名無しさん:2007/09/09(日) 15:31:12
COM っていう昔使われてた(今も使われてるけど)異言語間のやり取り用の取り決めがあって、
.NET でその取り決めに従うための特別な記述だ。
まああんまり今は気にするな。結局大して役に立たんし。
293デフォルトの名無しさん:2007/09/09(日) 15:34:15
>>291
>その間、充分勉強してスキルアップしろという意味でしょうね。

まあCOMについて半年も勉強してても飽きると思うが。

COMを知らなくてもC#の勉強はできるし、
普通なら先に知るべきことはたくさんあるので
半年ぐらい忘れてもいいぐらいだと思う。
294デフォルトの名無しさん:2007/09/09(日) 15:37:39
そのページはCOMInteropを自作してるのか(笑)
初心者向きじゃないと思うぞ。
ヒントを言えばShellLinkクラスはCOMオブジェクトそのものじゃなくて、
COMオブジェクトをC#から利用するための中間クラス。
インターフェイスの実装はCOMモジュールの中にあるから安心しろ。
295291:2007/09/09(日) 15:39:36
>>292
今の私には「決まり」としてしか理解できないようです。
おまじないのようなものだと思っておきます。
アドバイスありがとうございました。

>>293
ありがとうございます。
まずはもっとほかの事を勉強してみます。
296291:2007/09/09(日) 15:47:18
>>294
COMってDLLの一種というくらいの認識しかないのですが、
COMが実装してryinterfaceの仕様をCOMをりようするプログラムのほうで
書き直しているのでしょうか?でもinterfaceを書き直しても実装してるプログラムには
影響ないように思えるのですが。

書いててよくわかんなくなってきました・・・

もしよろしければコクラスの機能だけでも教えていただけたらと思います。

よろしくお願いします。
297デフォルトの名無しさん:2007/09/09(日) 16:18:34
>>296
[
  uuid(11219420-1768-11D1-95BE-00609797EA4F),
  helpstring("Shell Link object")
]
coclass ShellLinkObject {
  [default] interface IShellLinkDual;
};

VC++/ATLでCOMサーバーを作れるようになったらも一回挑戦してみろ。
上のIDLが読めないようだと理解は無理。

ちなみにCOMInteropは「参照の追加」「COM」「Microsoft Shell Controls and Automation」で
自動的にDLLにしてくれるからこれを使うのが普通。
298デフォルトの名無しさん:2007/09/09(日) 16:23:03
>>296

ごめん。
COMとは10年以上のつきあいだけどそれでも質問の意味がわかんねぇす。

いわゆる入門書は先にC++の仮想関数テーブルとかIUnknownを説明した上で
その後「coclassとは」みたいな流れを踏むので、
いきなりcoclassだけ説明して下さいってのは無理ってもんだし
かえって遠回りなんじゃないかな。

忠告を無視してまでどうしても知りたければ
この辺の本読んでみるところから初めてみたらいいんじゃない?

http://www.amazon.co.jp/dp/4881356992
http://www.amazon.co.jp/dp/4756132804
http://www.amazon.co.jp/dp/4881357557

C++も分からなければもちろんC++の基礎も勉強と。

そのあと『Essential .NET』と『プログラミングMicrosoft .NET Framework 第2版』
を読破すると。

そこまでやってくれれば、多分ここの書き込み文字数制限程度の分量で
coclassの説明もできると思う。
299デフォルトの名無しさん:2007/09/09(日) 16:24:36
>>297
レスありがとうございます。
VC、ATL、COMサーバー・・・どれひとつマスターしておりません・・・。
でもプログラムとう世界の奥深さは実感できました。
いつか理解できる日を夢見ていろいろ勉強してみます。

ありがとうございました!
300デフォルトの名無しさん:2007/09/09(日) 16:30:41
>>298
ただ混乱しているだけの質問をしてご迷惑をおかけしております。

たくさんの書籍の紹介ありがとうございます。
今の私には真に理解できるとは思えませんが、
少しずつでも勉強したいと思っております。

ありがとうございました。
301デフォルトの名無しさん:2007/09/09(日) 18:29:00
>281
解放忘れでオブジェクトの残骸が残ってしまうのはVB.NETでも共通だけど、
やっぱ、単純に書きづらいんだよ。
VBでは省略可能な引数をMissing.Valueで埋めなきゃいけない。
普段全引数を指定とかしないから気づかないけどOfficeのバージョンによって引数の数がさりげなく違うなんてこともある。
これがVB.NETならVB6までと同じように書けるようにできている。
同じことができてもっと楽に扱えるVB.NETがあるのにC#で無理に書かなくてもいいんでない?
302デフォルトの名無しさん:2007/09/09(日) 18:43:36
俺はType.Missingを使ってるけどMissing.Value派のひとも多そうだな。
どっちが推奨なんだろ。
303デフォルトの名無しさん:2007/09/09(日) 18:46:52
> Missing フィールドは、パラメータの既定値を取得するリフレクションによる呼び出しのために使用します。
だから、普通のときは Missing.Value なんじゃね
304デフォルトの名無しさん:2007/09/09(日) 18:49:34
MethodInfo.InvokeでやっちゃってるMSのサンプルを見た覚えがある
305デフォルトの名無しさん:2007/09/09(日) 19:01:19
それはレイトバインドのサンプルだろ多分。
306304:2007/09/09(日) 19:16:06
http://support.microsoft.com/kb/306683/ja
ちょっと記憶が違ってたけど見つけた
307デフォルトの名無しさん:2007/09/09(日) 19:18:36
しかしいつ見てもこの oMissing の羅列はありえないよな
308デフォルトの名無しさん:2007/09/09(日) 19:26:04
オーバーロードのソースコード生成するしかないか
309デフォルトの名無しさん:2007/09/09(日) 19:43:09
private object InvokeMethod(object obj, string name, params object[] args){
return oApp.GetType().InvokeMember(name, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
}
oBook = (Excel._Workbook)InvokeMethod(oBooks, "Open", "c:\\book1.xls");
>>360によると、こうすればmissing付けなくてもいいみたいだよ
310デフォルトの名無しさん:2007/09/09(日) 20:11:34
>302
そもそもインスタンスは1つしかないのでどっちも同じだろ。
Missing.Valueを使ったサンプルの方が圧倒的に多いと思うが。

>309
遅延バインディングだな。
311デフォルトの名無しさん:2007/09/09(日) 21:13:32
VSTO用のプロジェクトを作るとmissingというのが自動生成されていてこれを使えということらしい。
global::System.Object missing = global::System.Type.Missing;

英語のドキュメントをみるとどちらの量もどっこいなのだが、
日本語化されてるドキュメントだとSystem.Refrection.Missing.Valueが多い。

System.Type.MissingのMSDNのリフレクション云々のくだりはVB前提で書かれていて、
VBであってもリフレクションを使う場合はOptionalにはType.Missingが必要になりますの意味。
結局同じものだからどちらでもいいのだろう。MSも混乱してるし。
312デフォルトの名無しさん:2007/09/09(日) 21:30:53
office2007ってXML形式のファイルに対応してるらしいけど
既存のバイナリファイルいじるのでなければ
直接XMLなファイルを生成するプログラムにしたほうが
COMでがんばるよりはるかに楽な気がしまつ
ExcelはCOMつかわないでCSVでがんばってる人も多いと勝手に妄想
313デフォルトの名無しさん:2007/09/09(日) 21:36:00
すみません。
イベントとデリゲートについてよく分かりません。
デリゲートはインスタンス化したもののアドレスを入れるもの(?)
と認識しました。

イベントとデリゲートの関係がよくわからず、イベントがさっぱり分かりません。

どなたか簡単に教えていただけないでしょうか?

変なお願いと思いますが、どうしてもわからなくて。
どうやったらイベントのメソッドに飛んでいくのかが全然わからない
状況です
314デフォルトの名無しさん:2007/09/09(日) 21:47:15
デリゲートはメソッド呼び出し手続きそのものをオブジェクトにすることでほかのオブジェクトとのやり取りに使用できるようにしたもの。
イベントはデリゲートを利用してあるタイミングを通知してもらうための機構。
って言葉で言っても理解できないと思うけど。

・このインスタンスのこのメソッドを呼び出す手続きはこのデリゲートにある。
 これさえあれば元のインスタンスもメソッドも知る必要はない。
てのがデリゲート(とそのデリゲートの実体)。
・このデリゲートを渡しておくから、こういう状況が発生したときに登録した手続きを呼んでくれ。
てのがイベント。
ますます分からんな。
315デフォルトの名無しさん:2007/09/09(日) 21:54:56
マルチキャストデリゲートが事態をややこしくしているのは間違いない。
316デフォルトの名無しさん:2007/09/09(日) 22:03:54
デリゲートは「型」。intとかStringとかclass ほにゃららと一緒。

delegate void Foo();
↑これが class Foo{...} とかと同じ、型の「定義」。

イベントは型の「メンバー」の種類のひとつ。フィールドやメソッド、
プロパティと一緒。

event Foo Bar;
↑これが int Bar() {...} (この場合メソッド)とかと一緒でイベントメンバーの定義。
317313:2007/09/09(日) 22:05:59
>>314
さっそくありがとうございます。確かにまだまだわかりません。
質問させてください

例えばデリゲートA、オブジェクトB、オブジェクトCがあったとして、
オブジェクトB,CにデリゲートAを持たせるということですか?
なんかインターフェースと同じ感じがするんですが、見当違いのこと言ってますか?

>>これさえあれば元のインスタンスもメソッドも知る必要はない。
ということは、何かの手続き(一連の流れ)を実行するものがデリゲート?
ってことですか?
318デフォルトの名無しさん:2007/09/09(日) 22:13:17
じゃあ、メソッドが一つだけのインターフェイスのようなものだといったらわかる?
Javaなんかだといちいち内部クラスでインターフェイスを実装したりしてたけど、
それが面倒だから言語に組み込んだだけ。
イベントはイベントハンドラを登録するメソッドと削除するメソッドを
一つにまとめたプロパティみたいなもの
319313:2007/09/09(日) 22:19:07
>>315
マルチキャストデリゲートですか?
ちょっとくぐってみます。ご指摘ありがとうございます。

>>316
classとintやstringが一緒ですか?
ちょっとこんがらがってきちゃいました。
classについてもう一度調べてみます
ありがとうございます
320デフォルトの名無しさん:2007/09/09(日) 22:30:26
class String (クラス型)
struct Int32 (構造体型)
enum Keys (列挙型)
delegate EventHandler (デリゲート型)
上の二つは今作った言葉だから使わないでね
321デフォルトの名無しさん:2007/09/09(日) 22:31:43
デリゲートは、
ある型の引数を取りある型の戻り値を返すメソッドを
なんでもいいから受け取って(インスタンスメソッドでも
スタティックメソッドでもいい)、それを受け取った側が
好きなタイミング(ボタンが押された時とか)で実行できる仕組み

delegateとeventはほとんと同じものだが、
eventに対しては+=と-=しか出来ない。

class Hoge{
public Action<int> Delegate;
public event Action<int> Event;
}

Hoge hoge = new Hoge();
hoge.Delegate = new Action<int>(...); //ok
hoge.Event = new Action<int>(...); //代入はNG
hoge.Event += new Action<int>(...); //ok
hoge.Event -= new Action<int>(...); //ok
hoge.Delegate += new Action<int>(...); //ok.+=や-=もdelegateでも出来る。
322デフォルトの名無しさん:2007/09/09(日) 22:34:59
> delegateとeventはほとんと同じものだが、
これはねーだろ、折角>>316が解説してくれたのに
delegateとそのインスタンスはこういう場合きっちり言葉を区別しようや
323313:2007/09/09(日) 22:35:29
みなさん、親切にありがとうございます。
ただ私、ただいま頭がパンクしそうです。
一個ずつ整理していますので、レス遅れます。
すみません。
324313:2007/09/09(日) 22:41:08
>>318
そうなると、インターフェースとデリゲートは一緒ということ?
例えばどんな場合にインターフェースでどんな時にデリゲートを使うんでしょうか?
325デフォルトの名無しさん:2007/09/09(日) 22:47:20
しかしdelegateのインスタンスもデリゲートというのだよな

デリゲートの使い方1

public delegate Result Hoge(Arg1 arg1, Arg2 arg2);

こんな感じで引数と戻り値の型を規定する機能

デリゲートの使い方2
規定された型のメソッドを実際に保持するものもデリゲートという

class Foo{
public Hoge Delegate;
public event Hoge Event;
}

//実際のメソッド
Result Method(Arg1 arg1, Arg2 arg2){ ... }

Foo foo = new Foo();
foo.Delegate = new Hoge(Method);
foo.Delegate = Method; //こうでもいい
foo.Event += Method;
326デフォルトの名無しさん:2007/09/09(日) 22:57:52
313じゃないが盛れのバカな頭もパンクしそうでつ
デリゲートの項目だけは何度復習しても理解不能なんだが
↑みてたら理解できそ・・・・・うにもないorz
327デフォルトの名無しさん:2007/09/09(日) 22:59:13
インターフェースとデリゲートは全然違うもの
たとえばあるクラスにHogeという名前のイベントがあったら、イメージとしてはそのクラス内に
add_Hoge(EventHandler value)//valueをhogeに追加するメソッド
remove_Hoge(EventHandler value)//valueをhogeから削除するメソッド
EventHandler hoge //登録されたデリゲートを保持する実体(これ自身もデリゲート)
これらが生成されると考えるといいよ。
クラス外部からのデリゲートの実体へのアクセスを登録と削除のみに制限するのが目的。
実際、addとremoveの処理を完全に自分で定義してしまうこともできて
http://msdn2.microsoft.com/ja-jp/library/z4ka55h8(VS.80).aspx
プロパティにそっくりなのがわかると思う
328313:2007/09/09(日) 23:00:11
>>325
使い方1はインターフェースのようなもの。
使い方2は実際の処理を+=などで保持するもの。

ということでいいでしょうか?
329デフォルトの名無しさん:2007/09/09(日) 23:00:12
>>313
たぶん具象を知らずに抽象を知ろうとするからわからなくなるんだろうな。
とりあえず第一次接近としては、デリゲートは関数ポインタみたいなもの
だと考えればいいと思う。

つまり、メソッドのメモリ上の位置(アドレス)に関する情報を格納するための
データ型だと、とりあえずは思えばいいと思う。

デリゲート型の変数にはメソッドの位置情報が入っているわけだから、
当然その位置情報を利用してメソッドを呼び出すことも可能なはずだ。

イベントは、何らかの出来事(たとえばユーザーがボタンをクリックしたとき)に
シバかれるデリゲート型のフィールドみたいなものだと思えばいい。

だから「ユーザーがクリックしたときにシバかれる」デリゲートに対して
予めフォームの中の適当なメソッドの位置情報をぶち込んでおいてやれば、
ユーザーがボタンをクリックした時にそのメソッドが呼ばれるというわけだ。

まああくまで第一次接近だからあんまり真に受けてもダメだけど、
概念的な理解としてはこれでいいと思う。
330313:2007/09/09(日) 23:15:26
>>326
私も何度本を読んでみても理解できないのでここに書き込むことにしました。
お互いがんばりましょう。

>>327
これはイベントのことになるんでしょうか?
EventHandler hoge にはadd_Hoge(EventHandler value)で追加された
ものが入っているということでいいですか?

>>329
デリゲートはポインタのようなもので、そこに実行させたい処理を入れる(+=で
複数登録できるんですよね?)
そして、イベントが実行されたら、デリゲートのさすアドレスの処理(↑で登録したもの)
を実行するって感じでいいでしょうか?
331デフォルトの名無しさん:2007/09/09(日) 23:30:57
ボタン押した時実行させたい処理を入れるとか、

List<int> list = new List<int>();
list.Add(1);list.Add(2);list.Add(3);

List<string> strList = list.ConvertAll<string>(IntToString);

string IntToString(int x){
return x.ToString();
}

コレクション全体に実行させたい処理を入れるとか、
使い道はいろいろだ
332313:2007/09/09(日) 23:42:05
自分が理解できない箇所がわかりました!
イベントを登録するときに

delegate 戻り値の型 イベントハンドラの名前(パラメータリスト);

と宣言しますよね。このdelegateが曲者でした。

私の解釈ですが、
デリゲートは様々な処理をあるアドレスに入れておくもの。
イベントは何かされたとき(クリック等)にデリゲートに定義された
処理を行うこと。

というふうに理解しましたが、あってますか?
なんかちょっと違う気がしてきましたが。
333デフォルトの名無しさん:2007/09/09(日) 23:58:37
>>332
実際のところeventを無視してdelegateだけきっちり理解しておけば当面はそれでいいよ。
自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。

先にdelegateを完璧にしなはれ。
334デフォルトの名無しさん:2007/09/10(月) 00:04:15
デリゲート(のインスタンス)は、単にある特定のメソッドを表している(指している)。
じゃ駄目なのかな?

インスタンスメソッドとスタティックで微妙とかマルチキャストはとかあるけど、
その辺はおいおい理解していけばいいわけで、
まずは、デリゲートとは、なんらかのメソッドを指しているもの。
335デフォルトの名無しさん:2007/09/10(月) 00:21:41
>>332
そうじゃないよ。
だから関数ポインタのようなものだとまずは理解せよ、と言っているじゃないか。

「様々な処理をあるアドレスに入れておく」(これちなみに意味不明だよ)のではなく、
処理のコードが書かれているメモリ上の位置、すなわちアドレス「を」入れておくんだよ。


>>333
>自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
これはおかしいというより、完全に認識違いだよ「w

イベントっていうのはGUIにまったく限らない。
典型的には何らかのデバイスの状態が変化したときとかね。

例えばCDドライブを抽象化したクラスがあるとして、
トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
336デフォルトの名無しさん:2007/09/10(月) 00:25:02
内部のことを言えば、スタティックメソッドを登録した場合はメソッドのポインタ
インスタンスメソッドを登録した場合はメソッドのポインタ+インスタンスのポインタ
をデリゲートは持っている
デリゲートを実行すると、ポインタを辿り、そのインスタンスのそのメソッドを実行する
といった感じ
337デフォルトの名無しさん:2007/09/10(月) 00:38:01
>>332
うん、いやだからdelegateは型だって。もっというと特殊なclass。
ここをまずは押さえよう。とりあえずeventは忘れて。

順番に行こう。まずdelegate型を定義してみる。
internal delegate void Foo();

書き方はクラスとずいぶん違ってみえるけどね。

で、delegateはclassだからclassっぽく使える。

Foo foo = new Foo(HogeMethod);
こんな感じに。Fooクラスの変数fooにFooクラスをnewしてぶちこんでるわけだ。
コンストラクタにメソッドを渡してね。コンストラクタがちょっと特殊なだけだね。

class Hoge {
private Foo foo=null;
}

こうも使える。Foo型のフィールドね。

void Hoge(Foo foo){
//...
}

メソッドのパラメータにも。
338333:2007/09/10(月) 01:39:06
>>335
>これはおかしいというより、完全に認識違いだよ「w

すまん、確かに言うとおりだが、

>トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。

そんなクラスを>>332が作るというのは本当に想像しやすいかw
>>332が「CDドライブを抽象化したクラス」の必要を感じるころには多分イベントで困ることもなかろう。
339デフォルトの名無しさん:2007/09/10(月) 02:03:24
正直どんな場合にせよeventを使おうとは思わないんだよな
delegateだって+=も-=も出来るし、代入して入れ替えることも出来る
+=と-=だけに制限する意味がわからない
タスクトレイが開いた時の動作だって入れ替えたくなる時があると思うんだよな
340デフォルトの名無しさん:2007/09/10(月) 02:12:03
>>339
イベントを通知されるクラスが、他の通知されるクラスを意識しなくていい様にするためじゃね
=で上書きしたら他に通知されるクラスに上書きを通知しなくちゃいけなくなる
341デフォルトの名無しさん:2007/09/10(月) 03:33:56
デリゲートは理解するのに自分も結構苦労たなぁ
>>320が理解できてればなんとなくわかると思う。

>>332補足

internal delegate void Foo();
これでFooと言うデータ型を作った、と考えればいいと思う。
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。
Fooはデータ型なので、変数を定義するときに使用する

ただ、そもそもデータ型という単語の使い方が間違ってないかすごく不安。誰か教えてorz
int型はデータ型だけど、元をたどれば構造体ってことを考えれば、
C#におけるデータ型の意味は、定義されたもの全般・・・と考えてます




342デフォルトの名無しさん:2007/09/10(月) 03:39:42
ごめんミス
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。

戻り値がvoidで引数を取らないメソッド(のアドレス)を代入できる変数、を作るデータ型。
343デフォルトの名無しさん:2007/09/10(月) 03:47:26
まあC#も3.0にもなれば、継承やinterfaceを使ってたところは
大部分がdelegateとラムダ式に置き換わると思うから
ここは理解しといて損は無いというか必須になっていくと思うよ
344313:2007/09/10(月) 07:44:08
みなさん、ありがとうございます。

>>335
ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
処理が実行されるってことでいいですか?


>>337
デリゲートは型。
Foo foo = new Foo(HogeMethod);
でFool型のfooをインスタンス化する。
このときにメソッドを引数ととる。
classは引数にint型やstring型をとるが、デリゲートはメソッドを引数にとることができる。


class Hoge {
private Foo foo=null;
}

int i = nullのようにデリゲートにもnullが代入できるってことですよね?
ゆえにデリゲートはclassやint,stringと同じように型になるってことですね?
345デフォルトの名無しさん:2007/09/10(月) 08:30:08
>>344
まずはデリゲートの機能の物理的イメージを持つのが先決だと思う。

多分ここのほかの人が言ってるような「デリゲートは型でイベントはクラスの
メンバで〜」みたいな抽象的な話を聞いても、余計わからなくなるだけ。

>ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
>あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
>処理が実行されるってことでいいですか?

だから、たぶん変に誤解してるよ。
プログラムというのはメモリ上に置かれる、というのはOK?

だから関数(メソッド)というのも当然メモリ上の位置というものを持つはずだ。
関数ポインタという変数は、その関数のメモリ上の位置を格納するための変数だ。

もちろん「関数ポインタ」という変数自身もメモリ上の特定の位置に存在する
わけだが、それはとりあえずデリゲートを理解するためにはどうでもいい。

関数ポインタは関数がメモリ上のどこの位置に存在するかを「知っている」から、
それを利用すれば関数を呼び出すことができるでしょ?

以上のようなイメージを理解することが先決だと思うよ。
ただ、これはあくまでたとえ話であって正確じゃないことを理解しておくことも
一方で重要。
346デフォルトの名無しさん:2007/09/10(月) 11:11:09
すいません。馬鹿みたいな質問ですが、よろしくお願いします。

double result = Math.Cos(1/4);
とした場合、result には 1.0 が入ってしまいます。
私としては 0.999990 がほしいのですが、勝手に四捨五入されてしまいます。
どうしたらよいのでしょうか。
347デフォルトの名無しさん:2007/09/10(月) 11:16:37
348デフォルトの名無しさん:2007/09/10(月) 11:23:23
>>347
ありがとうございます。
これみても double は、0.99999 を扱えると思うのですが・・・
349デフォルトの名無しさん:2007/09/10(月) 11:29:30
>>348
1/4がいくつか知ってるか。
350デフォルトの名無しさん:2007/09/10(月) 11:33:28
>>349
すいません間違えました。
double result = Math.Cos(1/30);
です。
351デフォルトの名無しさん:2007/09/10(月) 11:34:29
>>350
そうじゃなくて。
1/30 は整数/整数で答えは整数の 0 だろ
1.0/30 とかでやってみそ
352デフォルトの名無しさん:2007/09/10(月) 11:36:30
>>346
0.999990が四捨五入されて1.0になってると思ってるのなら大間違い
353デフォルトの名無しさん:2007/09/10(月) 11:40:20
>>351-352
大間違いしてました!ありがとうございますm(__)m
354デフォルトの名無しさん:2007/09/10(月) 12:37:40
VBだと/使うと演算結果はオペランドの型によらずdoubleになるのが基本だけど、
これはc#のルールの方がシンプルでむしろ初心者向きに感じるな。
355313:2007/09/10(月) 12:40:30
>>345
ありがとうございます。メモリ上に関数ポインタが割り当てられ、その関数ポインタにはメソッドのアドレスが格納している。
この辺りはOKです。(私の表現は下手ですが)

デリゲートは関数ポインタということでいいですよね?

初めて携帯から書くので見にくかったらすみません
356デフォルトの名無しさん:2007/09/10(月) 12:46:03
>>354
CもC++も、C#と同じだと思ったけど
357デフォルトの名無しさん:2007/09/10(月) 13:09:48
VB
/ 商が実数になる割り算
¥商が整数になる割り算
358デフォルトの名無しさん:2007/09/10(月) 13:51:20
delegateって

typedef void* Foo ≒ delegate void Foo

って覚えたらだめなの?
俺の場合C#が先だったから、関数ポインタは

delegate void Foo ≒ typedef void* Foo

って覚えたんだけど…
359デフォルトの名無しさん:2007/09/10(月) 13:57:44
割ったら切り捨てだろ
少数なんて邪道だぜ
360デフォルトの名無しさん:2007/09/10(月) 14:14:29
>>357
なんか間違ってないか?
361360:2007/09/10(月) 14:32:37
ごめん。勘違い。
362ガチャピンの外の人 ◆GaTtuN/dqE :2007/09/10(月) 18:45:14 BE:254472252-2BP(1300)
すごくいいIDの男発見!!!!!!!!

715 :私事ですが名無しです:2007/09/10(月) 14:27:10 ID:TAkaKazu0
ところで俺のIDを見てくれ こいつをどう思う?



716 :私事ですが名無しです:2007/09/10(月) 14:44:34 ID:R76+t3Z/0
すごく・・・いいです


717 :私事ですが名無しです:2007/09/10(月) 14:44:45 ID:H/zeEu5e0
記念かきこw

http://news21.2ch.net/test/read.cgi/news7/1189188763/
363デフォルトの名無しさん:2007/09/10(月) 19:33:29
コピペ君って馬鹿だな、まで読んだ。
364デフォルトの名無しさん:2007/09/10(月) 20:41:09
>>358
スレチなんで適当に答えるが関数ポインタ間違ってるぞ
あとインスタンスメソッドの場合のポインタはもう一息いる

まあdelegateありがたがりやがれという話だ
365デフォルトの名無しさん:2007/09/10(月) 22:38:02
ラムダ式が中心になったら脱落者続出だなあ
366313:2007/09/10(月) 22:43:33
今また調べていたんですけど、どうもデリゲートの使い方というか、
どのタイミングで使うかがいまいちピンときません。

あるデリゲートを個々のクラスで定義して、様々なメソッドから呼び出す
ため?ということでしょうか?
またバカな質問してる気がしますが。
367デフォルトの名無しさん:2007/09/10(月) 22:44:27
>>365
中心ってなんだろうねw
368デフォルトの名無しさん:2007/09/10(月) 22:46:39
>>366
ぴんと来ないなら使う必要なし。
必要になったら使え。
369デフォルトの名無しさん:2007/09/10(月) 22:49:09
>>367
いったいなんだろうねw
370デフォルトの名無しさん:2007/09/10(月) 22:49:26
>>366
とりあえずはイベントハンドラとしてだけ使っとけばいいだろ
371デフォルトの名無しさん:2007/09/10(月) 22:59:18
>>366
@ITの記事は読んだ?
http://www.atmarkit.co.jp/fdotnet/onepoint/onepoint03/onepoint03_01.html

あと、川俣のc#入門は?
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_013/cs2_013_01.html

とりあえずこれ読んでからだな。タダで読めるんだし。
372313:2007/09/10(月) 23:22:10
>>368
仕事で、外部の人が作ったものを私がUpdateすることになったんです。
C#使える人がこの会社にいないんで。。。

>>371
参考URLありがとうございます。
私はいつも下のHPを見ていました。

http://ufcpp.net/study/csharp/sp_delegate.html
http://www.kumei.ne.jp/c_lang/cs/cs_45.htm

教えていただいたHPで勉強して出直します。
ありがとうございました
373デフォルトの名無しさん:2007/09/10(月) 23:36:23
川俣かよ
374デフォルトの名無しさん:2007/09/10(月) 23:37:14
前任者がどこで使ってたかソース見ればなんとなくわかるんじゃないか?
375デフォルトの名無しさん:2007/09/10(月) 23:42:53
>>373
人物はアレだが書いてることは別におかしくないだろw
というか、読んでみると結構わかりやすくていい記事だぞ
376デフォルトの名無しさん:2007/09/11(火) 00:56:19
interfaceのメソッド実装するとき、直入力が面倒なんですが、
インテリセンスを効かせる方法ってありますか?
377デフォルトの名無しさん:2007/09/11(火) 01:01:03
ああ、Eclipseのアレみたいなのか
それ自分も知りたかった
378デフォルトの名無しさん:2007/09/11(火) 01:21:23
>>376
class Hoge : IHage
のIHageにマウスのせるでてくるやつじゃなくて?
379デフォルトの名無しさん:2007/09/11(火) 01:35:12
あー、そこから右クリックでメニューでますね
メソッド名途中入力とかの線しか考えてなかったので目から鱗です。
これでちょっと楽になりそうです。ありがとうございました。
380デフォルトの名無しさん:2007/09/11(火) 01:37:19
なるほど
俺からもありがとう
381デフォルトの名無しさん:2007/09/11(火) 04:30:07
私はJava経験者ですが、今C#を勉強中で分からないことがあるので質問です。

親クラスのメソッドを上書きするとき、Javaでは常にオーバーライドですが、
C#ではnewによって新しいメソッドとして定義する方法と、
overrideによってオーバーライドする方法があるじゃないですか。
この2つのうち、newでやる方法の価値が分からなく、教えてもらいたいです。
ちなみに、実装時のnewとoverrideの違いは把握してます。

今の私の考えでは、全部overrideでいいのでは?と思うし、
むしろnewなど無い方がよいとさえ思っています。
382デフォルトの名無しさん:2007/09/11(火) 05:24:51
ベースクラス実装者が想定していないオーバーライドを許可すべき
ではないかつ継承先のことを考えながらコード書くことのほうが少ない
かつvirtualメソッドのほうが高コストとかもろもろ

newがよく使われているのは経験上staticメソッドが重複する場合、
コンポーネントメンバの属性値の変更、COMインポートなインターフェイス、
内部的にはもうちょいあったかな
383381:2007/09/11(火) 07:50:32
>>382
>ベースクラス実装者が想定していないオーバーライドを許可すべき
>ではないかつ継承先のことを考えながらコード書くことのほうが少ない

でもそれって、virtualにしなければいいというだけの事ですよね。
オーバーライドされたくないなら、そのシグネチャのメソッドは
「子クラスでは実装禁止!」でいいじゃないですか?
何であえて、newとか使って再定義できるようにしてるのかが、
分からないんです。

ちなみに、何でnewを悪者扱いするかというと、例えば
クラスBはクラスAを継承してて、
さらに、AのhogeメソッドをBクラスがnewで書き換えてるとして、
--------------------
A a = new B();
a.hoge();
--------------------
この場合実行されるhoge()はAの実装の方ですよね?
それってつまり、親クラスの型に子クラスのインスタンスを代入するという事が
安全じゃないって事だと思います。メソッドの引数や戻り値に関しても同じで、
作ったインスタンスは、その型のままにしておけという事になります。

そうなると、引数や戻り値に親クラスを指定できなくなり、
汎用性を持たせられなくなってしまいます。
私がnewに否定的な理由はこれですね。

ちなみに、staticメソッドの場合はいいと思うんですよ、
staticはあくまでもその「型」にくっついているわけだし。

と、長く書いてしまいましたが、よろしくお願いします
もし、前提知識がそもそも間違っているとかありましたら、すいません。。
384デフォルトの名無しさん:2007/09/11(火) 08:19:30
>>383
あのね、そんな馬鹿でも分かる例あげる前に俺があげた例調べた?
BCLで標準的に使われているものや経験上必要だったものを挙げたんだが
聞く気がないんなら帰ってくれ

あとJavaやってたらしいから前段はvirtualがデフォじゃない説明だから
わかってるなら読み飛ばして。
385デフォルトの名無しさん:2007/09/11(火) 08:24:58
そんなの調べろっていわれても困るでしょ
そんな能力あったらこんなスレで質問しねえよw
間違ってるか?

>>383
むしろAの型の変数に入っていれば安心してAとして扱えることを
保障するための仕組みじゃないの?
386デフォルトの名無しさん:2007/09/11(火) 08:38:45
>>385
なら〜ってなんですか?って聞けよ

こっちが挙げてみたら分かりきってる講釈たれてそれに反応なし、
同意だけ求めてるのが透けて見えるだけの確証バイアス野郎じゃねーか
387デフォルトの名無しさん:2007/09/11(火) 08:46:18
>>381はただしいよ

終了
388デフォルトの名無しさん:2007/09/11(火) 09:04:39
>>381
>この場合実行されるhoge()はAの実装の方ですよね?
それでいいんじゃん。わざわざAの参照で宣言してるんだから、欲しいのは
Aの規約に則った実装でしょ。なんでAとは無関係の実装であることを
newで明治したメソッドが派生型で定義できると困るの?

ちゅーかnewって、派生型で既に定義されているシグネチャが
あとから基底型で定義されてしまった場合に、派生型を前提とした
コードへの影響を最小限に抑えるための一時しのぎって印象なんだけど。
389デフォルトの名無しさん:2007/09/11(火) 10:14:52
派生クラスとたまたまシグネチャが被るインターフェイスのメソッドを実装したいときとか
インターフェイスの明示的実装というのもあるけど、それだとインターフェイスのメソッドの方が隠れちゃうから
どうしてもインターフェイスのメソッドの方を見せたいとき
そんな場合本当にあるのか知らんけどw
390389:2007/09/11(火) 10:17:06
>>389 訂正
×派生クラス ○基底クラス
391デフォルトの名無しさん:2007/09/11(火) 10:42:53
>>381=387
この人は既に固定観念に捕らわれているし、聞く耳もたない
みたいだから何言っても無駄かと。
392デフォルトの名無しさん:2007/09/11(火) 10:52:23
>>391
お前こそちゃんと読め
393381:2007/09/11(火) 11:22:02
>>384 >>386
まだ、調べていませんが、私が知りたいのは用途ではなく、
存在意義だとか利用価値だとか、少し概念的な事だったんです。
それが伝わっていなかったようなので、>>383で自分の考えを述べて、
これについての意見をもらおうと思ったんです。
このことを>>383でちゃんと書いておくべきでした。
決して無視したつもりではないんですが、結果的にそう取られてしまったようで…

>>385
でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、
使う側はそのメソッドがnewなのかoverrideなのか判断でないし、
使い分けもできません…よね?(できるのかな?)
そう考えると、今hoge()を実行しようとしているけど
果たして「どの型に定義された実装を使うべきなのか?」
という疑問が、使用者に常に付きまとってくるわけで、
そのような不安要素を作り出してるだけのような気がするのです。

>>388
AのサブクラスでB1,B2があるとして
状況によって、B1とB2のどちらかのインスタンスを返すメソッドがあった場合。
戻り値の型はAにすると思います。
そのメソッドとしては、戻り値をB1やB2として使って欲しい。つまりB1やB2のhogeを使って欲しい。
しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。
という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。

親クラスを後から修正した場合の影響を抑えるっていうのは、確かにそうですね。
親は、子がどれだけ存在していて、どんなメソッド定義してるかなんて知らないですもんね。
なるほど。。それはそうですね。
394381:2007/09/11(火) 11:22:51
>>389
でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw

>>391
私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
395381:2007/09/11(火) 11:32:02
なんか、>>394途中で切れたw

>>389
でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw

>>391
私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
でも聞く耳を持ってないわけじゃなく、自分なりに納得のいく解答が得たいと思っているだけです。
おかしなことを言っていたら、そこを指摘してくれると助かりますw
396デフォルトの名無しさん:2007/09/11(火) 11:32:41
>>393
>でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、
>使う側はそのメソッドがnewなのかoverrideなのか判断でないし、
>使い分けもできません…
判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてるわけだし、
似た機能の、インターフェイスの明示的実装もあわせてMSDNに全部明記されてる。
397デフォルトの名無しさん:2007/09/11(火) 12:16:51
読むの疲れるからもっと質問は簡潔にしてくれ…。
俺は初心者で勉強のつもりでこのスレ見てるけど、めっさ疲れるわ。
あと…自演してないだろうな?w
398デフォルトの名無しさん:2007/09/11(火) 12:18:11
>>393
BCLっつー模範的なライブラリで使用されてたりする手法や実際に
使われている手法を先に知らないで存在意義やら糞もあるのかよ。
399385:2007/09/11(火) 12:24:03
>>393
反論になってないと思うなあ。。
短いレスだからもう一度よく読みなおして欲しいよ。

個人的にはメソッドのシャドウの意義を知るには、
Winフォームのコントロールをいろいろカスタマイズしてみるのがいいと思う。

きっと、「そうかこういう場面で必要になるのか」ということが体感できると思う。
400デフォルトの名無しさん:2007/09/11(火) 12:31:04
>>395
>でも、違うメソッドなら違うシグネチャであるべきなのでは?
>逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?

同じ人が同時に開発してるならね。

この辺も読んでみるといいのでは?
ttp://d.hatena.ne.jp/siokoshou/20070901#2
ttp://d.hatena.ne.jp/siokoshou/20070903
401デフォルトの名無しさん:2007/09/11(火) 12:57:25
ところで、>>383の場合でさらにBを継承するクラスCがあったとして
CでAのhogeをオーバーライドすることは不可能なの?
俺は381じゃないよ
402381:2007/09/11(火) 12:59:28
>>396
>判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてる
それは、呼び出される側のコードを見て判断しろということですか?
あと、一応MSDNのその辺の情報は目を押してるつもりです。

>>397
文章力のなさが問題ですね。申し訳ない…色んな事が未熟者の私です。
とりあえず、一番言いたいことは>>393で書いた>>388へのレスかなー
あと、自演などしてないですww

>>398
効果が分かっていて、その効果自体がいまいち納得できないので、
使い方云々の話ではないのと考えてます。
とはいっても、BCLとかは勉強の為に参考にしてみようとは思ってますが。

>>399
>むしろAの型の変数に入っていれば安心してAとして扱えることを保障する
というのに対して、「もしoverrideだったら、実行されるhogeはAの実装の方じゃなくなるから
保障はされてないじゃないですか。」と言ったつもりで、
それが反論になってると思いましたが。。
一応プログラムも、作ったりしてるんですが、今はまだ体感できてないですね。
その時を待つしかないのかな。。。

う〜ん、
メソッドの戻り値や引数を親クラス型で定義出来ないじゃん
っていうのが、本当に言いたいことなんですが。
なんか、伝わってなかったりしてるのかな
403デフォルトの名無しさん:2007/09/11(火) 12:59:52
お前らなんでも継承して楽しようとしてんじゃねぇぞゴルァ
男だったら1からつくれ
404デフォルトの名無しさん:2007/09/11(火) 13:11:33
>>393
>しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。
>という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。
そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?

ちゅーかnewの存在意義は>>388の下半分だけで考えてくれよ。
仮に、新規に派生した時に基底のメソッドと同じシグネチャをnewで宣言しちまうような
馬鹿が出てきたとしても、newを導入しないと回避できない問題なんだから。
405デフォルトの名無しさん:2007/09/11(火) 13:19:37
newは、オーバーライドしないという意図をはっきり示すものだろ
基底クラスのメソッドが呼ばれてもいいと考えてやってるんだから何の問題もない
406デフォルトの名無しさん:2007/09/11(火) 13:58:27
うん、BCLとか使用法とか以前のレベルな気がしてきた。

実際に使ってるものを使い方もしろうともせんでいきなり「いらないですよね!」
ってわけわかめなことのたまうから気にもとめてなかったが
407381:2007/09/11(火) 13:59:11
>>400
リンク先読みました。それと>>388から考えると、
newとoverrideの2つが存在する理由は、親クラスへの変更が後から入った場合でも、
既存のクラスへの影響を小さくする為って事なんでしょうね。

>>404
>そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それは知らないという前提でした。
でも、そこまで意識して作るのがC#のコーディングスタイルってことなんですかね。

>それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?
どのメソッドを使って欲しいとか、そういうのは意識してなくて、
単純にB1とB2を両方扱えるからっていう理由で、Aにしたんです。

>ちゅーかnewの存在意義は
そこは理解できました。親の変更の影響を受けないためですね!

>>405
>基底クラスのメソッドが呼ばれてもいいと考えてやってる
えっ、そういうものですか?
呼んで欲しいから、実装してるんだと思いますが。。
408デフォルトの名無しさん:2007/09/11(火) 14:29:47
先にBのhogeがあって、その存在を関知しない人が後からAにhogeというメソッドを追加したら、
そればBのhogeと名前は同じだけど意味が違うものだろ
BのhogeはBのhogeとして使ってほしいから実装されたものであって、
勝手にAのhogeとして呼び出されるようになっちゃったら困る
409デフォルトの名無しさん:2007/09/11(火) 14:32:39
C#はC++の進化系という建て前なので、
C++に隠蔽があるからサポートしてみましたじゃダメなのかな。
C++でデフォルトvirtualじゃなくて隠蔽なのは主にパフォーマンス上の理由だが、
.NETにそれがあるかどうかはわからん。
overrideに対してvirtualがあるのにnewに対してnewable(?)がないのは、
継承もとのクラスに対してなんら影響がないからだろう。
410デフォルトの名無しさん:2007/09/11(火) 14:43:29
BCLラジオ?
411デフォルトの名無しさん:2007/09/11(火) 14:46:17
newってsealedされてるメソッドやらプロパティを派生先で上書きするための
裏技的キーワードだと思ってたんだけど、違うのか…
412デフォルトの名無しさん:2007/09/11(火) 14:46:31
ICloneableなんか実装してみると便利さも分かる。
まあICloneableを実装することはあまりないが、イメージとして。
413デフォルトの名無しさん:2007/09/11(火) 14:59:09
そういえばなんでsealedメンバを隠すときはnew付けないといけないんだろう
どうせ継承できないんだから無意味なんじゃないの?
414デフォルトの名無しさん:2007/09/11(火) 15:41:13
>>413
親クラスに同名のメソッドがあることを忘れて上書きしちゃうとバグの原因。
415デフォルトの名無しさん:2007/09/11(火) 15:48:32
>>412
トップレベルのクラスがClone()の中でMemberwiseClone()を
使ってくれてなければ隠蔽するしかないものな。
416デフォルトの名無しさん:2007/09/11(火) 15:55:13
newはたとえば戻り値を元の型の子クラスやなんかにしたいときに
便利だぞ
417デフォルトの名無しさん:2007/09/11(火) 16:42:31
>>412はつまり>>416と同じことが言いたかった。
418デフォルトの名無しさん:2007/09/11(火) 19:00:18
>412
返り値の型がね微妙なんだよ。返ってくる型は決まってるのにダウンキャストが必須というのはアホな実装だと思うんだよ。
インターフェースの明示実装と型指定のCloneを両方実装したら
そのクラスを継承した時返り値の型が違うCloneを実装できないわけでやはり微妙なんだよ。
そうなるとGenericsで何とかならんのかと思ったが何ともならなくて残念だったよ。
だからICloneableみたいな微妙なのはない方がいいよ。
419デフォルトの名無しさん:2007/09/11(火) 19:06:40
new(とうかベースクラスのメンバのシャドウ)の意義が、ベースクラスに後から
自由に(派生クラスのことを気にせず)メンバを追加することを可能にすることにある、
って意見は俺はまったく見当違いだと思うなあ。

それはただ、「そういう風にも使える」ってことに過ぎないでしょ。
第一そんな事態はめったにないし、シャドウは問題の完全な解決には全然ならないもん。
困らないのはコンパイラだけじゃんw

メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
420デフォルトの名無しさん:2007/09/11(火) 19:17:03
>>419
>メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。

new使って本気でhookできると思ってるのか、それとも俺様定義のhookなのかどっち?
421デフォルトの名無しさん:2007/09/11(火) 19:26:20
>>420
たぶん君が「フック」の意味を俺様定義とうか、
変に狭義に理解してるだけだと思うけど。。

まあフックという言葉がお気に召さないのなら「フックを入れる」の部分を
「処理を割り込ませる」あるいは「処理をとっかえる」と読んでもらっていいよ。
422デフォルトの名無しさん:2007/09/11(火) 19:57:30
>>421

ごめん。
もしかして世間では下のようなのもhookって言うの?
だったら俺が悪かったってことで許してくれ。

public class Base
{
  public sealed override string ToString()
  {
    return "Base! Base!";
  }
  public sealed override int GetHashCode()
  {
    return 1;
  }
}
public class Deriv : Base
{
  public new string ToString()
  {
    return "とっかえたよ!";
  }
  public new int GetHashCode()
  {
    Console.WriteLine("割り込んだよ!");
    return base.GetHashCode();
  }
}
423デフォルトの名無しさん:2007/09/11(火) 19:57:44
>419
そのような思想の元に
Dispose()をnewで置き換えてあったクラスを見た。
Dispose(bool)もなにやら別の実装があった。
IDisposable.Dispose()も明示実装されていたがそれも実装が違っていた。
それが継承されてまたDispose()がnewで…

変なことやり出すと害があるだけでまともに動かないものになるだけだぞ。
424デフォルトの名無しさん:2007/09/11(火) 20:39:08
>>419
逆でしょ。バージョン管理がnewの主目的であって、「そういう風にも使える」ように
見えてしまうのは任意のメソッド置換の方。
そもそもC++では無言で隠されてしまうところをなんでわざわざコンパイラが警告出して
newで潰す必要があるのか考えてみてよ。

それ以前にC#において「オーバーライドできないメソッドにフックを入れる」の
意味が全然わからん。
425デフォルトの名無しさん:2007/09/11(火) 20:57:14
>>421
それ「も」フックの一種でしょ。
それ「が」フックとは言わないけど。

>>423
思考が倒錯しとるよ。

そもそも「害がある」と予想されるからオーバーライド禁止してるわけ。
それを承知でやるのがシャドウだよ。
426デフォルトの名無しさん:2007/09/11(火) 21:16:11
>422
HashtableのキーにnewでGetHashCodeとEqualsを置き換えたクラスを使ったら
間違いなくobjectのGetHashCodeが呼ばれる。newで置き換えた方は呼ばれることはない。
だけど、そういうクラスを実装した人はnewで置き換えたメソッドが呼ばれることを期待してバグだって騒ぐんだと思うよ。

newでの隠蔽はJavaでは避ける手段がなかった基底クラスがバージョンが上がってメソッド名がかぶったときの変更の影響を
なんとかするための必要悪なものなんで普段は使うべきじゃない。
427デフォルトの名無しさん:2007/09/11(火) 21:23:02
アンマネージリソースを安全に管理するために、
SafeHandleクラスを継承しようと思っているんですが、
ReleaseHandleとIsInvalidをオーバーライドするだけでいいんでしょうか
(実際にはCreateToolhelp32Snapshotでプロセスのスナップショットを得たいので、
CriticalHandleMinusOneIsInvalidから継承したハンドル管理クラスを作る)

具体例的に解説しているサイト等あったら教えてください。

MSDNのサンプルには
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
なんて属性もでてきたりするんですが、意味がわからなくて・・・
428デフォルトの名無しさん:2007/09/11(火) 22:12:13
ふらっとの域を超えてないか?
429デフォルトの名無しさん:2007/09/11(火) 22:32:32
ちなみに私はついてけないぜ。
既に基本的な用語と思われるフックもシャドウもわかってなくて今必死に読んでる始末。
430デフォルトの名無しさん:2007/09/11(火) 22:38:27
相談室ががらんとしてる。
431427:2007/09/11(火) 22:56:24
失礼しました。
相談室で聞いてきます・・・
432429:2007/09/11(火) 23:09:07
と思ったらすぐ出てきた。シャドウってVBでの隠蔽newに対応するキーワードなのね
フックに関しては・・・とりあえずいじくっちゃいけなげなイベント処理を強引に差し替えるもの?
>>420を察するに本来はオーバーライドとか隠蔽とかイベント差し替えとか全部さすっぽいけど

>>427の内容はまだ当分自分には縁がなさそうだ・・・

あと手元の入門書だと隠蔽newの使い道は、
既に完成したプログラムを改造・拡張するときに、
そのプログラムにあったの汎化クラスを継承する際、virtual指定されてないメソッドを上書きしたい時。
と書いてあったけどこれじゃだめなん?
433デフォルトの名無しさん:2007/09/11(火) 23:31:02
シャドウとかシャドーイングってVBと関係ないんじゃない?
文字通り隠蔽の意味だけど。

ローカル変数がフィールドをシャドウする、みたいに普通に言うと思うんだけど。
434デフォルトの名無しさん:2007/09/11(火) 23:47:41
>virtual指定されてないメソッドを上書きしたい時。
どこぞのコンパイル時メタプログラミングじゃあるまいし、それがC#でなんの役に立つのかしら。
それができるようになっちゃうからnewが必要悪と言われる所以だと思うんだけど。
その本のタイトルぷりーず。
435デフォルトの名無しさん:2007/09/11(火) 23:51:00
>432
その入門書に書いてある文章からはしょったかして意味が変わってる気がする。

基底クラスは他者の作成したライブラリ、サブクラスを自分が作成したプログラムで
基底クラスがバージョンアップに伴ってメソッドが増えて
自分の作成したサブクラスに基底クラスと同じ名前のメソッドが発生したときに
メソッド名を変更するのは影響範囲がでかい時に変更の影響を小さくするためにnewで隠蔽を使う
みたいな感じに書いてなかったか?
436デフォルトの名無しさん:2007/09/11(火) 23:55:51
だからそれはそんな風にも使えますよ、ってだけの話だって。
当たり前じゃん。
外人さんが書いた本だとたいていそういうことが書いてあるよね。

でもそういうのは「アカデミックな」話題としては興味深いし面白いとも思うが、
そんな実用性がゼロに近い用途が主目的なはずがないだろう。
437デフォルトの名無しさん:2007/09/12(水) 00:08:53
virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ
ベースクラスとして実行した時と動作が変わったら混乱の元にしかならない
そんなんnewしなくても名前を変えればいいだけの話だろう

戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも
全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし
それ以外でnewを使っていいのはベースクラスが勝手にメンバ追加して名前がかぶっちゃった時だけ
というか継承自体するべきじゃない
438デフォルトの名無しさん:2007/09/12(水) 00:19:45
>>437
言わんとしていることはよく分かるのでちょっと指摘しておくと

>virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ



>戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも
>全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし

の引数版としてあり得るかな。

Genericsが無かった時代は基底クラスが object get/set なメソッドになりがちで
派生クラスのメソッドやインデクサをtypedにするには隠蔽が結構便利だった。

ただ、その用途は Generics の登場によって激減してるので、
最近ではバージョン管理の方に魅力を見いだす人が増えてるとしても
そこまで不思議じゃないのかもしれん。

言わんとしていることはよく分かるのであんまり気にしないでくれ。
439438:2007/09/12(水) 00:27:16
>>437
ごめん。
「virtual指定されてない」ってのの意味がやっとわかった
>>438は忘れてくれ。
440デフォルトの名無しさん:2007/09/12(水) 00:28:16
何言ってるかよくわからん
引数の型が違うならnewできないんじゃねえの
というかoverrideできないものをnewで上書きしたら動作が変わるだろ
441440:2007/09/12(水) 00:29:00
すまん入れ違いになった
442デフォルトの名無しさん:2007/09/12(水) 13:54:33
ファイルの末尾をシークするって、
ファイルの末尾に移動する、見たいな意味でいいんですよね?
443デフォルトの名無しさん:2007/09/12(水) 14:32:53
いやよくない
444デフォルトの名無しさん:2007/09/12(水) 15:31:43
テキストボックスに12桁の数字を打ち込んで、奇数桁だけ取得するにはどうすればいいですか?
445デフォルトの名無しさん:2007/09/12(水) 15:47:06
string s って定義してあれば、s[0],s[1]とかで、一文字ずつアクセスできるから後はがんばって抽出すればよい
446デフォルトの名無しさん:2007/09/12(水) 16:38:58
すいません。P/Invoke の質問です。
P/Invoke で構造体を取得するのですが、この構造体のメンバは int と、さらに構造体が配列で含まれています。
今のところ、この構造体の int は取得できているのですが、配列に格納されている構造体が取得できていません。

P/Invoke で、構造体中に含まれた構造体の配列を取得することは可能なのでしょうか?
447デフォルトの名無しさん:2007/09/12(水) 17:01:08
charみたいだな。string恐るべし
448デフォルトの名無しさん:2007/09/12(水) 17:14:08
StringクラスのインデクサがCharAt()メソッドのエイリアスになっているから。
>>444のケースなら
textBox1.Text[ n * 2 + 1 ]
みたいにすればよかろ。
449デフォルトの名無しさん:2007/09/12(水) 17:59:55
>446
多分無理。
方法があったら教えて欲しい。
byte[]で受け取ってそれをfixedしてサイズ分1個ずつMarshal.PtrToStructureで取得してくとかでできるがあんまりスマートじゃない。
450デフォルトの名無しさん:2007/09/12(水) 18:09:03
>>449
やはりそうですか。
SDK 2.0 のサンプルに構造体を取得したり、構造体の配列を取得したりはあったのですが
さらに複雑なものはありませんでした。
スマートじゃないですが byte[] で受け取っていく方法もありますね。
この方法を試されたかたはいらっしゃいますか?
451デフォルトの名無しさん:2007/09/12(水) 18:23:14
>>446
複雑なP/InvokeはC++/CLIでラップするのも一手。
452デフォルトの名無しさん:2007/09/12(水) 18:33:08
配置を真似した構造体を定義してunsafeで無理矢理
453デフォルトの名無しさん:2007/09/12(水) 18:38:36
IntPtrとかGCHandle 組み合わせてるなあ
454デフォルトの名無しさん:2007/09/12(水) 18:48:38
textBox1のAllowDropをtrueに設定して、
以下のコードを書き、ファイルを2回ドロップすると、
なぜか2回分のMessageBoxが表示されます。
3回だと3回分表示されます。
しかしcountの値は下がっていきます。
なぜなのでしょうか?
何か対処法があればお願いします。

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
 int count = 0;
 if (e.Data.GetDataPresent(DataFormats.FileDrop))
 {
  e.Effect = DragDropEffects.Copy;
 }
 else
 {
  e.Effect = DragDropEffects.None;
 }

 textBox1.DragDrop += delegate
 {
  string s = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
  MessageBox.Show(s, count.ToString());
  count = count+1;
 };
}
455デフォルトの名無しさん:2007/09/12(水) 18:55:57
>>446
今外出先なので検証できんのですが……
構造体配列の各要素の先頭アドレスを計算して、各々に対してMarshal.PtrToStructure()を使えば取得できるかもしれん。
456デフォルトの名無しさん:2007/09/12(水) 18:56:57
>>454
DragEnterの度にイベントハンドラが増えてるからじゃないのか
457デフォルトの名無しさん:2007/09/12(水) 18:59:06
>>454
毎回countを宣言&初期化しなおしてるじゃねえか。
458デフォルトの名無しさん:2007/09/12(水) 18:59:12
>>449-450
どう考えても普通に可能だと思うけど。。
そんな程度のこと何度もやってるぞ。
MSDNライブラリにサンプル書いてあるじゃないか。

まあ、その構造体(および構造体の中の構造体)のシグネチャが判らないと
断言はできないけど。
459454:2007/09/12(水) 19:29:48
>>456-457
すいません。いまいち意味が分かってないです。
DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。

ですが、毎回メッセージボックスが増えていくと言うことはそうじゃないと。
だとすると、それを回避して通常のD&Dの動作をさすのに
何かいい方法はあるのでしょうか?
460デフォルトの名無しさん:2007/09/12(水) 19:35:38
>>459
>DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。 
されません
461デフォルトの名無しさん:2007/09/12(水) 19:36:51
初期化されないのが匿名メソッドの特徴なんだからあたりまえ
変なこと考えずに普通にDragDropにイベントハンドラを追加すればいいだけだろ
コンストラクタかデザイナで
462デフォルトの名無しさん:2007/09/12(水) 19:43:58
>初期化されないのが匿名メソッドの特徴

簡単に記述できるのがいいと思ってたのに
嫌な仕様ですね
463デフォルトの名無しさん:2007/09/12(水) 19:55:18
>>454
君は「スコープ」という言葉の意味をよく理解していないね。


DragDropイベントハンドラが毎回初期化されないのは、スコープとは別の問題。
textBox1はDragDropイベントハンドラの外で宣言されたものであって、イベントハンドラとは無関係に存在している。だから、textBox1に加えた変更はイベントハンドラに入ろうが抜けようが維持される。

countが上がっていかないのはスコープの問題。
countはDragDropイベントハンドラの中で宣言されているから、イベントハンドラを抜けると一旦破棄され、次にイベントハンドラに入った時、改めて確保される。 一回ごとに、中身は別物になる。

464463:2007/09/12(水) 20:00:43
>>462
そりゃ君が匿名メソッドの使い方を間違えてるだけだ。
簡単に記述できることと、それが君の都合どおりに動くことは、別の問題だろ。

偉そうになってすまん。
465デフォルトの名無しさん:2007/09/12(水) 20:53:50
VS2005 C#

コンボボックスのDrawModeをOwnerDrawFixedにし、
(プロパティ?のほうで)コンボボックスにデータバインドで
アイテムを追加し、DrawItemイベントで特定のアイテムだけ
ForeColorを変えようとしているのですが
バインドされたアイテムのテキストがすべてSystem.Data.DataRowViewに
なってしまいます。

バインドを使わずロードイベントでアイテムをAddした場合は
正しくテキストが表示されます。

データバインドを使用してオーナードローでコンボボックスの
アイテムのテキストを正しく表示することは可能でしょうか?
466デフォルトの名無しさん:2007/09/12(水) 21:02:04
言ってることよくわからんが"DrawItemイベント"でアイテムを描画してるのは
君が書いたコードのはずだと思うんだが。。

〜になってしまいます、ってお前さんが自分で書いたコードのバグなだけちゃうんかい?

ちなみに、そんなの普通に簡単に可能なはずだよ。
BackColorをアイテムごとに個別にしようと思うと意外と面倒だったりするけど。
467デフォルトの名無しさん:2007/09/12(水) 21:15:13
GetItemText
468313:2007/09/12(水) 21:51:30
いつも勉強になります。
以前デリゲートについて色々聞いていた者です。
その節は色々教えていただきありがとうございました。

371さんに教えてもらったHPを見てきました。
難しくて、まだ理解がいま一つのところもあるのですが。
ふと思ったんですが、デリゲートの非同期処理を使えば、
マルチスレッドにする必要はなくなる、というイメージは正しいでしょうか?
469デフォルトの名無しさん:2007/09/12(水) 21:55:53
??

デリゲートの非同期処理=マルチスレッド(スレッドプール)
470デフォルトの名無しさん:2007/09/12(水) 22:01:14
>>468
> マルチスレッドにする必要はなくなる
まあ、的を大きく外してはいないと思う。
デリゲートの非同期処理を使ってもマルチスレッドにはなるんだけど、スレッドに関するややこしい処理は隠蔽される、ってこと。
471313:2007/09/12(水) 22:18:16
>>469 >>470
マルチスレッドとデリゲートは=なんですね。
以前、何も分からないまま、HPの通り
Thread thread = new Thread
のようなことをして、マルチスレッドを使ったことがあったので、
違うものだと思ってました。

ありがとうございます。
472デフォルトの名無しさん:2007/09/12(水) 22:20:44
デリゲート自体はマルチスレッドと無関係だぞw
非同期呼び出し機能は単なるオマケ
473デフォルトの名無しさん:2007/09/12(水) 22:23:42
誤解五回
474デフォルトの名無しさん:2007/09/12(水) 22:31:43
>450
今外なんで正確なコードは書けないが
fixedでポインタにしてIntPtrのコンストラクタに渡してMarshal.PtrToStructureを呼ぶ。
後は構造体のサイズ分ずつポインタをずらして配列数分処理するだけ。

>458
構造体のメンバに構造体の配列があるサンプルはないだろ。
あるならurlを挙げてくれ。
475313:2007/09/12(水) 22:31:48
なんか私、すっごくはまってそう。
ご指摘ありがとうございます。
おまけに目を取られてしまって。

教えてください。
デリゲートって何で使うのか?
これがいつまでたっても分かりません。

どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。
その時に使うのがデリゲートです」みたいなことを読みました。

こういうときに使うんですか?
いろいろあると思うんですが、代表的なもの、よく使われる使い方を
教えてください。

お願いします。
476デフォルトの名無しさん:2007/09/12(水) 22:36:25
どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。
その時に使うのがデリゲートです」みたいなことを読みました。


なにこれw
477デフォルトの名無しさん:2007/09/12(水) 22:39:21
458じゃないが
> 構造体のメンバに構造体の配列があるサンプルはないだろ。
意外になかった。

というか、構造体配列が固定長かポインタなのかでもまた別になるんで、それを抜きに話し進めてもな。
構造体内の固定長配列は.NET2.0からのサポートだったっけ、確か。

>>475
List<T>.Sort とか。
Array.Find<T> とか。
Regex.Replace とか。
478デフォルトの名無しさん:2007/09/12(水) 22:40:09
>>475
ゆとり乙

実行するメソッドを変数のように変えられるんだぜ?
479465:2007/09/12(水) 22:44:15
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), font, solidBrush, e.Bounds.X, e.Bounds.Y);
では無理だったけど
e.Graphics.DrawString(comboBox1.GetItemText(comboBox1.Items[e.Index]), font, solidBrush, e.Bounds.X, e.Bounds.Y);
に変更したら正しく取得できました。

テラサンクス!
480313:2007/09/12(水) 22:46:10
>>478
なんか分かりそうで分からない、もう少しで答えがでそうって
感じなんですが・・・

パンクしそうなので、もう少し頭を冷やして考えてみます。
ヒント、ありがとうございます。
(答えなのかも?)
481デフォルトの名無しさん:2007/09/12(水) 22:47:08
>>474
ごめんマンマのサンプルは見当たらないね。
でも構造体配列のフィールドに普通にMarshalAs属性でByValArray指定するだけで
問題ないと思うんだけど。
482デフォルトの名無しさん:2007/09/12(水) 22:49:12
>477
ポインタだったらIntPtrで受け取るから配列だと思ってたよ。
.NET2.0では対応してたんだ。普段1.1しか使ってないから知らなかったよ。
サンプルは1.1の時の名残でないんではと思う。
483デフォルトの名無しさん:2007/09/12(水) 23:16:24
>>480
超大づかみに説明するとだな。
メソッドそのものを代入できる変数がデリゲート。
その機能を利用して、何かが起きた時に呼んでほしいメソッドを代入しておけるのがイベント。
484デフォルトの名無しさん:2007/09/12(水) 23:33:42
>>313
お前もう最初の方で教えてもらったこと忘れてるだろ。
そんなんじゃどこまでいってもループだよ。
一回じっくりと消化してみろ。
485デフォルトの名無しさん:2007/09/13(木) 02:44:33
イメージのわきやすそうなデリゲートの使用例を挙げると・・・

・予め基本クラスのメソッドにprotectedなイベントを仕込んで、メソッド処理を<追加>できるようにする。(差し替えではない)
・後で追加する機能があるかもしれないので、とりあえずイベントを仕込んでおく。
・任意の複数のメソッドを、一度の命令で処理したいとき。

>>483
え、イベント発生とかイベント受け取りとか言うし、デリゲートが実際に使用される時のメッセージのことじゃないの?



486デフォルトの名無しさん:2007/09/13(木) 02:58:25
イベントという語にはそういう使い方もあるね
487デフォルトの名無しさん:2007/09/13(木) 03:23:40
virtualメソッドにしていたところとか
interfaceを実装させたりしていたところなんかを
全部delegateにしたらいい

いまはあまりメリットを享受できないかもしれないけど
C# 3.0になってラムダ式を使えるようになれば
interfaceなんかと比べて五倍ぐらいシンプルで読みやすくなるし、
書きやすさも段違いになる
488デフォルトの名無しさん:2007/09/13(木) 03:30:56
covariance、contravarianceは置いておいて、
delegate=非同期も可能なchainパターン
と認識してるけど間違い?
489デフォルトの名無しさん:2007/09/13(木) 03:35:45
490デフォルトの名無しさん:2007/09/13(木) 04:00:20
delegateは第一に関数オブジェクトだろ
関数を渡したり保持したりするもの
chainも非同期実行も出来るというだけで
491デフォルトの名無しさん:2007/09/13(木) 08:45:35
>delegate=非同期も可能なchainパターン
非同期時にはChainできないぜぇ
492デフォルトの名無しさん:2007/09/13(木) 10:50:59
ASP.NETなんですが、SQLでデータを取得、結果をDataGridなどで表示させるのですが
その際に、1行1行にヘッダーをつけれるようにしたいのですが可能ですか?
493デフォルトの名無しさん:2007/09/13(木) 11:58:00
そういうのはヘッダとは言わない
494デフォルトの名無しさん:2007/09/13(木) 12:34:56
System.ArraySegment<T>構造体の存在を最近知ったんだけど
微妙に便利そうに見えるのに.MSのクラスライブラリ内でもほとんど使われてないみたいだね
インデクサが付いてないのは濫用するなという意味なのかな
495デフォルトの名無しさん:2007/09/13(木) 13:25:25
亀でごめんなんだけど、>>474
>fixedでポインタにして
ってわざわざunsafeで括ってまでfixed使った方がいいの?
GCHandle.AllocしてMarshal.UnsafeAddrOfPinnedArrayElementのが
unsafeで括る必要なくていい様な気がするんだけど
496デフォルトの名無しさん:2007/09/13(木) 15:04:05
>495
GCHandleだと配列の2つ目以降の構造体を取得するときに
サイズ分IntPtrの位置をずらしたりできないからfixedでやったんだけど
実はできたのかな?
497デフォルトの名無しさん:2007/09/13(木) 15:13:50
>>496
多分出来ないわ。
位置ずらすの忘れてた orz
でもなんかunsafeって精神衛生上あんましよろしくない気がする
498デフォルトの名無しさん:2007/09/13(木) 16:00:06
思い切ってクラスの宣言にunsafe付けたらすっきりするよ!
499デフォルトの名無しさん:2007/09/13(木) 17:02:19
すみません。0〜9、A〜Z、a〜z の文字を半角文字に置き換えるメソッドはありますか?
500デフォルトの名無しさん:2007/09/13(木) 17:16:13
Microsoft.VisualBasicを参照設定に追加すれば
Microsoft.VisualBasic.Strings.StrConv("ABCD01234", VbStrConv.Narrow, 0)
でいけるよ。
501デフォルトの名無しさん:2007/09/13(木) 17:28:00
Microsoft.VisualBasic は微妙なので……w

IDictionary<char, char> に全部突っ込んで何とかするべきなのか、
あるいはもっと楽な方法があるのか、そういうのを知りたいです。
502デフォルトの名無しさん:2007/09/13(木) 17:49:45
どの辺が微妙なのか詳しく
503デフォルトの名無しさん:2007/09/13(木) 17:59:20
>>501
どこが笑いどころなのか分からん
504デフォルトの名無しさん:2007/09/13(木) 18:08:49
旧VBはドカタ用のウンコ言語だから笑いの対象でしかない
といったことじゃないか
505デフォルトの名無しさん:2007/09/13(木) 18:37:10
できるものは同じなのに
506デフォルトの名無しさん:2007/09/13(木) 18:50:17
でもなんかそういう見方はあるよな
面接にいったとこのオヤジが
うちはみんな優秀でVisualBasicなんだぜ!って自慢してるのみて
馬鹿じゃねーのって思ったが
507デフォルトの名無しさん:2007/09/13(木) 19:21:46
>>501
そんなあほな方法考えながらなにが微妙なんだか。

まあ、あほといえばあほだけど
別にディクショナリに突っ込んどいてもいいんじゃない?
そんなことするくらいならもうVBの機能使っちゃうけどね。
508デフォルトの名無しさん:2007/09/13(木) 19:53:43
そもそも全角を半角に変換しないでFA
509デフォルトの名無しさん:2007/09/13(木) 20:05:07
それ2.0からライブラリの機能として用意されてる気がしたけど、
何を使うんだったか思い出せない
510デフォルトの名無しさん:2007/09/13(木) 20:16:32
周りが言っているからVBはしょぼいとか安直に思っている
輩なんでしょうな。
511デフォルトの名無しさん:2007/09/13(木) 20:26:08
バカでも使えるツールってすごいと思うのだが
512デフォルトの名無しさん:2007/09/13(木) 20:28:54
うむ、VBを作った側は凄い。
VBを使う側はショボイ。
513デフォルトの名無しさん:2007/09/13(木) 20:28:55
>502
501ではないが予想外な変換を勝手に丁寧にやってくれることがあってVBのメソッドはちょっとと思うことはある。
なんか丁寧にやってくれるパターンがあるおかげかいまいち速度が速くないので呼び出し回数が多い場面では使いたくない。
そんなんで、VBのメソッドを利用して実装してたら最初はあまり呼ばれないつもりが気づいたらいろんなところから呼ばれててパフォーマンスが気になって自前で実装し直そうとしたとき
予想外なよけいなお世話の変換もされててそういうのに依存した処理がそこら中にいたりして苦労するので
最初から必要最小限の変換処理をするのをVB以外ので実装されてるのを探したくなる。
514デフォルトの名無しさん:2007/09/13(木) 20:54:34
全角英数なんてたいした数じゃないし
半角とマッピングするDictionaryを自作するのが一番いいんじゃない
515デフォルトの名無しさん:2007/09/13(木) 21:08:16
そういう問題かw
そこは誰も難しいと思ってないよw

置換というのは置換の前に置換対象を抽出する必要があるわけだが、
それ考えてるか?
516デフォルトの名無しさん:2007/09/13(木) 21:53:19
Dictionary使うのか…
ゆとり世代ってすごいなあw
517デフォルトの名無しさん:2007/09/13(木) 21:53:33
すいません質問です。
構造体とクラスの使い分けはどういったときにすれば有効でしょうか?

データメンバが少なければ
値型なので構造体の方が生成処理・使用処理が早い(時もある)見たいな事はかかれているのですが。
518デフォルトの名無しさん:2007/09/13(木) 21:55:20
>>517
MSDNのどこかに使い分けのガイドラインがあったはずだから、探してみてくれ
519デフォルトの名無しさん:2007/09/13(木) 22:01:48
全部クラスでいいよ
520デフォルトの名無しさん:2007/09/13(木) 22:02:16
>>517
いろいろと面倒だから素直にクラスにしとけ。
小さいのを大量につくるときは構造体。

あとつまらないものも構造体。
521デフォルトの名無しさん:2007/09/13(木) 22:11:29
>>516
趣味か宿題だからいいんじゃね?
522デフォルトの名無しさん:2007/09/13(木) 22:23:27
Dictionary使わないってのはなんだ
配列使うのか
まあこの二択だろ
523デフォルトの名無しさん:2007/09/13(木) 22:27:51
なにそれw
524デフォルトの名無しさん:2007/09/13(木) 22:31:09
>>522
高校生?
525デフォルトの名無しさん:2007/09/13(木) 22:32:58
ありがとうございます。普通にありました。
参考ついでにコピーでも。

・プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。
・インスタンスのサイズが 16 バイト未満である。
・変更できない。
・頻繁にボックス化する必要がない。

この全てに当てはまれば構造体の方がほぼパフォーマンスがいいようです。
ただ、どういうときにボックス化を行ってるかわからないです。
interfaceによる多態性や、List<>の要素に変数を代入・順番に使用、とかはボックス化は行ってるのでしょうか?
526デフォルトの名無しさん:2007/09/13(木) 22:43:59
>>525
インターフェイスへのキャストはボックス化を伴う。
List<int>にintを入れるときにはボックス化は行われない。
527デフォルトの名無しさん:2007/09/13(木) 22:52:03
static void Main(string[] args)
{
int offset;
int zenkaku = (int)'A';
int hankaku = (int)'A';

offset =zenkaku - hankaku;
Console.Out.WriteLine("offset:"+offset);
for (; zenkaku <= (int)'Z'; zenkaku++, hankaku++)
{
if((zenkaku-hankaku)!=offset)
Console.Out.Write("offsetが違う!");
}
Console.In.ReadLine();
}
528デフォルトの名無しさん:2007/09/13(木) 22:54:38
Dictionary<char,char> dict;
...
char hankakuku = dict[zenkaku];
こうか、

char[] array = new char[char.MaxValue];
...
char hankaku = array[(int)zenkaku];
こうだ。これ以外の実装はまずない。

怪しい処理するVBの関数使うより
処理内容が明らかなほうがいいだろ
529デフォルトの名無しさん:2007/09/13(木) 22:55:40
>>526
ありがとうございます、やっぱりそうですか。

多態性に関する記事を漁ってたら、どう考えても参照型でなければ実現できそうにない感じです。
List<>のほうも、インターフェイスが関わってくると動きが少し変わってくるようです。
530デフォルトの名無しさん:2007/09/13(木) 22:58:03
>char[] array = new char[char.MaxValue];

正気ですか?
531デフォルトの名無しさん:2007/09/13(木) 23:00:05
>>530
正気も何も最速の実装じゃん
532デフォルトの名無しさん:2007/09/13(木) 23:02:23
あればあるだけ使う派なんだねw
533デフォルトの名無しさん:2007/09/13(木) 23:04:51
まあ実際問題としてPCでやるという前提とCharが16bitってこと考えたら配列持ちもありではあるなぁ
自由度低いからよほどピーキーな所じゃなきゃやらないけど
534531:2007/09/13(木) 23:05:15
charのmaxvalueがいくつかわかってないのかね
たかが13kbyteのテーブルだぞ
535531:2007/09/13(木) 23:06:50
ちが、130kか
536デフォルトの名無しさん:2007/09/13(木) 23:10:13
数十個しか値がないのにFFFF個(6万)配列取るのはなぜ?
537デフォルトの名無しさん:2007/09/13(木) 23:12:20
最速かどうかはやや怪しいな。
538デフォルトの名無しさん:2007/09/13(木) 23:12:29
知恵が足りないから。
539531:2007/09/13(木) 23:12:32
速度が欲しい時はこれだろ
普通はDictionaryで十分だと思うけど
540デフォルトの名無しさん:2007/09/13(木) 23:12:56
16bitで65535じゃないのか
541531:2007/09/13(木) 23:23:34
charが65536個で約130kだろ
542デフォルトの名無しさん:2007/09/13(木) 23:27:19
static public string ToHankaku(this string source)
{
StringBuilder sb = new StringBuilder(source.Length);
foreach (char c in source)
sb.Append(c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' ? (char)(c - 65248) : c);
return sb.ToString();
}

これで十分だろ。
543531:2007/09/13(木) 23:35:18
65248きめうちでいいのか
案外シンプルだな
544デフォルトの名無しさん:2007/09/13(木) 23:35:58
>>531
m9(^Д^)プギャー
545デフォルトの名無しさん:2007/09/13(木) 23:57:49
>Dictionary<char,char> dict;
>...
>char hankakuku = dict[zenkaku];
>こうか、

>char[] array = new char[char.MaxValue];
>...
>char hankaku = array[(int)zenkaku];
>こうだ。これ以外の実装はまずない。

わらかすな。
546デフォルトの名無しさん:2007/09/13(木) 23:58:51
>Dictionary<char,char> dict;
>...
>char hankakuku = dict[zenkaku];
ありえんわ
547531:2007/09/14(金) 01:22:39
本来ifのいらないアルゴリズムにif書いちゃう気持ち悪さを感じないかね
548デフォルトの名無しさん:2007/09/14(金) 01:50:54
感じないよ
549デフォルトの名無しさん:2007/09/14(金) 02:21:37
夜中に見たら寒気したww同時に吹いたけどww
もっとコードに美を求めようぜ
550デフォルトの名無しさん:2007/09/14(金) 02:44:51
>>547
if文より君に気持ち悪さ感じてる
551デフォルトの名無しさん:2007/09/14(金) 02:53:55
>Dictionary<char,char>
ifどころちゃうわw
552デフォルトの名無しさん:2007/09/14(金) 08:30:58
VBのStrConvが怪しい動きをするという例を教えてくれんか
553デフォルトの名無しさん:2007/09/14(金) 08:41:56
お題だとa−ZA−Z0−9を半角へってことだから全角カナは無視しないといけないのか
554デフォルトの名無しさん:2007/09/14(金) 08:55:34
t
555デフォルトの名無しさん:2007/09/14(金) 09:03:23
構造体中の配列構造体の P/Invoke の質問を書いた者です。
みなさまお返事をいろいろとありがとうございました。結局、構造体をすべてフラットにするラッパを
同僚に作ってもらいました。

ところで SWIG という便利なものがあるらしいのですが、どなたか試した型いらっしゃいますか?
556デフォルトの名無しさん:2007/09/14(金) 12:18:34
だからそんなことわざわざしなくてもByValArray指定するだけだと思うんですが。。
557デフォルトの名無しさん:2007/09/14(金) 12:53:55
>Dictionary<char,char> dict;
>...
>char hankakuku = dict[zenkaku];
これってなんかまずいんですが?
558デフォルトの名無しさん:2007/09/14(金) 13:23:57
>>557
ふむふむ
何がどのようにまずいんですか?
559デフォルトの名無しさん:2007/09/14(金) 13:57:43
>>557
一見シンプルだが、内部処理コスト掛かりすぎだろ
>>542なんか判定6回だぞ
560デフォルトの名無しさん:2007/09/14(金) 14:32:28
わざわざディクショナリ使うのに全値域を埋める前提になってる。
ディクショナリの意味全くなし。
561デフォルトの名無しさん:2007/09/14(金) 14:32:35
あー、なるほど。
>>557は富豪的すぎるってことですね。
納得しました。ありがとうございます。
562531:2007/09/14(金) 18:07:12
よく考えようぜ
事前にテーブル用意すれば判定6回は全部消せるんだ

しかしこれだけ規則がシンプルなら毎回判定しても別に問題はない
だが判定がこの五倍もあったらだいたい誰もが気持ち悪がって
事前にテーブル用意するだろう

じゃあどこからテーブルにして、どこまでなら毎回判定するのか
そこの基準があいまいになる
全部をテーブルでやれば、自分のコードを統一された規則で書くことが出来る
仕様変更があって判定の規則が増えて、テーブルにするはめになっても、
「このぐちゃぐちゃのif文をテーブルに落とさないと、うわー」
ということにならなくて済む

>>560
Dictionaryなのに全部使うわけないだろ
それなら配列使うわ
563デフォルトの名無しさん:2007/09/14(金) 18:10:18
>>562
普通はジェネレータを使います
564531:2007/09/14(金) 18:20:27
>>563
意味がよくわからん
詳しく教えてくれ
565デフォルトの名無しさん:2007/09/14(金) 18:22:56
じゃあインデクサ付けてテーブルっぽくしたクラス作っといて
中で存分に気持ち悪い判定すれば
566531:2007/09/14(金) 18:28:48
>>565
外部からのインターフェースはそれでいいだろうけど
if文をテーブルに直す時の問題は何も解決しとらんぜ
567デフォルトの名無しさん:2007/09/14(金) 19:03:20
>>562
だったらディクショナリにインデクサでアクセスしたらだめだろ。
自分でそういう「コード例」書いといて何言ってやがる。
568デフォルトの名無しさん:2007/09/14(金) 19:10:01
いまはそんだけしか判定がない前提だろう。
後々に備えてという考え方自体は否定しないが、
今回のはちょっとオーバースペックだ。

だいたいテーブル埋める時点で同じような泥臭い処理が入るだろ、
まあ工夫はいくらでもできるけども。
569デフォルトの名無しさん:2007/09/14(金) 19:12:53
ifがごちゃごちゃしてたところでテーブル埋めるのに何の工夫がいるんだ?
570531:2007/09/14(金) 19:15:18
>>567
本来TryGetValueだな申し訳ない
適当に書いてしまった
571デフォルトの名無しさん:2007/09/14(金) 20:03:22
ディクショナリーの処理コストがIF文6回以下で収まるわけ無いじゃん
クラス呼び出しだけでも全レジスタスタックするんだぜ
572デフォルトの名無しさん:2007/09/14(金) 20:45:33
クラス呼び出しってなんぞ
573デフォルトの名無しさん:2007/09/14(金) 20:46:16
Dictionary にすると変換ルールを動的に変更できるから後々便利だってばっちゃが言ってた。
けど結局、無駄に switch を使うことにしました。
574デフォルトの名無しさん:2007/09/14(金) 20:58:44
ディクショナリ内でのハッシュ取得や等値比較は
どうしてもインターフェイス経由になるため、
衝突が一切発生しなくても結構なコストになる。
それにその他諸々の処理を合わせると、
愚直な判定に比べてかなり負荷がかかる。

それでもまあそれほどたいした問題にはならないとは思うが。
575デフォルトの名無しさん:2007/09/14(金) 21:05:04
>>572
IF文とか単純なやつならILにコンパイルしたとき素直に展開されるだけだが
Dictionaryなんかを使えば..net Framework内のプログラムをコールする形になるだろ
そのコールする処理だけでIF文6回を超えるメモリーアクセスが発生するんだよ
もし配列に全部展開する形ならIf文6回以下のコストで実行できる可能性はあるけど
(処理回数と前処理の量次第)Dictionaryを使った時点で駄目だね
576デフォルトの名無しさん:2007/09/14(金) 21:11:35
VB関数呼び出しの負荷はどんなもんなんだろ
577デフォルトの名無しさん:2007/09/14(金) 21:16:59
VB関数はDictionaryのような汎用性を持たせる必要が無いからそれほどでないと思うよ
速度と可読性を考えたら一番バランスがいいと思う
578デフォルトの名無しさん:2007/09/14(金) 21:17:13
誰も測ってない罠
579デフォルトの名無しさん:2007/09/14(金) 21:20:29
>>547
本来 if がいるはず。
それを配列で誤魔化しているだけだろ?
580デフォルトの名無しさん:2007/09/14(金) 21:20:55
マーシャリングとか入らんの?
581デフォルトの名無しさん:2007/09/14(金) 21:23:41
VB関数ってCOMじゃないからマーシャリングは無いだろ
582516:2007/09/14(金) 21:36:26
>>531
本当のところ、高校生だろ?
まさか職業プログra...
583デフォルトの名無しさん:2007/09/14(金) 21:37:44
VBの関数と同等の機能ってだけで、VBのランタイムを呼んでるわけじゃない。
584531:2007/09/14(金) 21:45:19
>>582
別に俺の身分を明かす気はないが、お前こそ
事前にテーブルを用意する発想もなければ
インデックスを変換に使うテクニックも知らない
ifを書き散らすことしかできないVBドカタじゃないのか
585デフォルトの名無しさん:2007/09/14(金) 21:45:58
最終的にはLCMapStringだしな
586デフォルトの名無しさん:2007/09/14(金) 21:46:18
ここは初心者用スレじゃないのか
516もあんまりあおるな
587デフォルトの名無しさん:2007/09/14(金) 22:02:12
>>584
>事前にテーブルを用意する発想もなければ
>インデックスを変換に使うテクニックも知らない

知らないわけないだろ。
こっちはz80から20年以上コードかいてるからな。
588デフォルトの名無しさん:2007/09/14(金) 22:08:55
531も516も偉そうなこと言っている割には全然役に立つことを書かない件
589デフォルトの名無しさん:2007/09/14(金) 22:10:11
>>556
できないつーの
590516:2007/09/14(金) 22:20:58
役に立つことはかかないよw

Dictionary使ったら速度は10分の1程度になるよ!
でもそんなのかんけいね〜
591デフォルトの名無しさん:2007/09/14(金) 22:22:27
まちがえた!

Dictionary使ったら10分の1程度の時間で処理が終わるよ!!
592デフォルトの名無しさん:2007/09/14(金) 22:40:14
arrayだとifとたいして変わらない。
593531:2007/09/14(金) 23:11:23
いや、正直なこといえば
あんな簡単に変換できるなら事前にテーブル用意しようとは思わんけどな
一文字一文字対応させるようなややこしい変換規則になると思ってた
594516:2007/09/14(金) 23:19:23
偽者って…

timeSpan
結果発表
if        >00:00:00.8412096
Dictionary  >00:00:02.0329232
Array     >00:00:01.0014400
595デフォルトの名無しさん:2007/09/14(金) 23:21:19
まだこの話題引きずってんのかw
596516:2007/09/14(金) 23:22:20
>>593
これも偽者か?
597デフォルトの名無しさん:2007/09/14(金) 23:30:11
>>589
できるでしょ。
というかできない理由が思い浮かばない。

それに俺は過去に実際やったことあるよ。
598デフォルトの名無しさん:2007/09/14(金) 23:38:34
c# ByValArray
599デフォルトの名無しさん:2007/09/14(金) 23:48:35
>>594
ちょっとArrayが遅すぎないか?
ああ文字列変換としてやったときの時間?
にしてもArrayのがIfより遅いのは珍しいかも。

状況にもよるが、判定だけならIfより配列の方が5倍程度速い。
まあメモリ、CPUいろんな条件で結構変わるかもしれんが。

文字列変換までまとめたら1割程度の差でであまり変わらんけどな。
600デフォルトの名無しさん:2007/09/14(金) 23:49:16
>状況にもよるが、判定だけならIfより配列の方が5倍程度速い。
ああもちろんこれは俺の環境での話。
601デフォルトの名無しさん:2007/09/14(金) 23:52:12
ちなみにDictionaryだとIfのさらに7倍程度遅い。
つまり俺の環境では、だいたい

配列:If:Dictionary=1:5:35

程度ってことだな。
602デフォルトの名無しさん:2007/09/14(金) 23:54:47
あーひょっとして変換かかる文字ばっかでチェックしたとかかな?
上のは、ほとんどが変換されない文字(ループ変数をchar範囲でAndとってcharにしたもの)
でやったので、そういう意味では特にIfがかなり不利な条件だな。
603デフォルトの名無しさん:2007/09/14(金) 23:57:42
>597
1.1まではできなかった。2.0からできるようになった。
ドキュメント読んでも1.1までとあんまり扱いが変わってるような印象を受けないので
1.1の時やろうとしてさんざん苦労してできないとわかった人はその印象が強いと思うよ。
新しいenumの値が増えてるわけでもなく、1.1で大抵の人がまず指定してみて
もろに失敗したByValArrayというのも駄目だと思うよ。
2.0からできるようになりましたって大きく取り上げられたわけでもないと思うし。
604デフォルトの名無しさん:2007/09/15(土) 01:01:11
ちんこまんこしっこうんこ
605デフォルトの名無しさん:2007/09/15(土) 01:05:32
>601
StrConvも速度の参考程度になるように比較対象に混ぜてあげてください。
606デフォルトの名無しさん:2007/09/15(土) 01:11:38
文字列を変換した場合
※かかった時間のおおよその比率

配列:8
Dictionary:19
If:9
StrConv:50

な感じだたよ?
607デフォルトの名無しさん:2007/09/15(土) 02:07:01
暇だったから適当にやってみた。テキストは全角・半角英数字をランダムに100万文字、
タイムは10回平均。

if        :00:00:00.2571167
Array     :00:00:00.0206023
Dictionary:00:00:00.0713178
StrConv   :00:00:00.1486586

なんかおかしくね?
608デフォルトの名無しさん:2007/09/15(土) 02:10:00
おかしいw
ほんとかそれ?
Ifってどんなの?

ちなみに>>606とかのは
return ('0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') ? (char)(c - 65248) : c;
見たいな判定してる(IfじゃないけどまあIfと変わらん)。
609デフォルトの名無しさん:2007/09/15(土) 02:16:07
>>608
条件式ってか、ifは上にあった>>542をコピペした。


どっか間違えたかな…
610デフォルトの名無しさん:2007/09/15(土) 02:25:42
直った。

if        :00:00:00.0279734
Array     :00:00:00.0181842
Dictionary:00:00:00.0707453
StrConv   :00:00:00.1461418

何を思ったのかコピペした後foreachからforに変えてたのが原因でした。
そら毎度毎度インデクサ使ってたら遅くなる罠 orz
611デフォルトの名無しさん:2007/09/15(土) 02:55:43
クラスの入れ子っていうんですか?

class{
・・・
class{
 ・・・
}
}
これってどういう意味があるんですか
インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
612デフォルトの名無しさん:2007/09/15(土) 03:03:18
>>611
C# でクラスをネストさせても Java のようにはならずに
インスタンスは作られないよ
613デフォルトの名無しさん:2007/09/15(土) 03:13:25
>>611
内クラスは外クラスのメンバに自由にアクセスできる。private でも。
// もちろん非静的なメンバにアクセスする場合は外クラスのインスタンスが必要。
あとはまあ外クラスに強く結びついているクラスとか。
ただし多用は薦められていない(ガイドライン参照)。
IEnumerator の実装クラスとか。

> インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
できない。
614デフォルトの名無しさん:2007/09/15(土) 03:29:23
615611:2007/09/15(土) 08:28:10
なるほどいろいろ利点?があるみたいですね
実験してみよっとありがとうございました
616デフォルトの名無しさん:2007/09/15(土) 11:36:49
>>603
じゃあ >>449 は、1.1 の話?
617デフォルトの名無しさん:2007/09/15(土) 11:39:44
>>603
ByValArray をつけても構造体の配列は取得できなかった。null になってしまった。
他の int のメンバは取得できた。
何が悪いんだろう?
618デフォルトの名無しさん:2007/09/15(土) 11:43:51
アンマネージドの方の定義とC#の定義を見せてもらわん限りなんとも言いようがない
619デフォルトの名無しさん:2007/09/15(土) 12:27:19
プラグイン機能のあるアプリケーションを作りたいんですが、
基本的な話として、各プラグインのアセンブリってやっぱり
それぞれAppDomain作ってそこにロードすべきなんでしょうか?
なんか数が多かったらどんどんAppDomainが増えそうじゃないですか?
これってまずい?

かといって一つのAppDomainにロードしたら
各アセンブリを個別にアンロードできないですよね
620デフォルトの名無しさん:2007/09/15(土) 12:36:26
普通のアプリでアンロードとか考える意味ないよ
621デフォルトの名無しさん:2007/09/15(土) 12:41:01
解像度選択の列挙体で、VGAとかXGAとかの名称使うのは誤用だとわかっていても許せる?

ライブラリ作っててふと思ったので。
622デフォルトの名無しさん:2007/09/15(土) 12:45:25
まあ解像度自体本来誤用なんだから別に良いんじゃない
623デフォルトの名無しさん:2007/09/15(土) 12:47:07
>>621
誤用って?
624デフォルトの名無しさん:2007/09/15(土) 12:48:21
>>619
プラグインに関してはまだ.NETの世界そのものに実績が少ない点に注意。
まずいかどうか、実際やってみての経験ベースの話は実際かなり少ない。

内製ソフトだと、ひとつの画面にひとつのDLLとか変な縛りで作らされてる人が
それなりに挑戦してみるみたいだけど
その手の情報はあんまり表に出てきてないっぽい。

.NET 3.5でプラグイン用のフレームワークが追加されるんだけど
WCF並にfatな仕組みで、個人的にはあんまり好きになれなかった。
あとまだベータ段階のため仕様が時々変わってる。
おかげでいくつかのサンプルはビルドできなくなってる。
ttp://blogs.msdn.com/clraddins/default.aspx
ttp://msdn.microsoft.com/msdnmag/issues/07/03/CLRInsideOut/default.aspx?loc=jp

結論としては、ダメ元で軽くプロトタイプ作ってみて
うまくいきそうなら1年ぐらいそれで様子を見てみるとかどう?
.NET界全体として、まだベストプラクティスが定まってない分野だと思うよ。
625デフォルトの名無しさん:2007/09/15(土) 12:50:09
>>619
どんなプラグインか知らんが、普通に考えて
>それぞれAppDomain作ってそこにロードすべきなんでしょうか?
それはきびしいだろ。

AppDomain管理するコストの方がプラグインのアセンブリロードしとくよりきつそうだ。
動的におきかえなきゃならんのなら仕方がないが、そうでなけりゃ気にする必要ないでしょ。

AppDomainを活用するのはそう簡単じゃないよ。
626624:2007/09/15(土) 13:01:25
>>619
ちょっと追記。
もしプロトタイプ作るなら、個人的にはIronPython使ってみるのをおすすめする。
将来的にはDLRが.NETのアドインシステムの中核を担うと期待している。

>>625
>AppDomainを活用するのはそう簡単じゃないよ。

それに挑戦したのがSystem.AddIn名前空間の奴。
まあ案の定WCFみたいになった。
627621:2007/09/15(土) 13:07:41
>>622
wiki見てて始めて知った。おk、もう正しいとか正しくないとかどうでもいいわ。

>>623
VGAとかは解像度をあらわす単語じゃないはず・・・本来は。
628デフォルトの名無しさん:2007/09/15(土) 13:13:56
>>619じゃないけど、

>>624
Assembly.LoadFile(file).GetTypes()じゃだめなの?
629デフォルトの名無しさん:2007/09/15(土) 13:57:29
>619
アンロードが必須ならAppDomainを作るしかない。
そこまで不要ならAppDomainを分けずにやってしまった方が手っ取り早い。
多少多めのAppDomainでもそれほどきつくはないと思う。
それぞれ通信するプラグインとそれを管理するexeがログ表示などするアプリはやったが
そこそこの数のプラグインがいても特に問題なく動いている。
最大でせいぜい20くらいでいくらでも増えるわけじゃなかったからそれで大丈夫だった。

>628
それ、アンロードできないじゃん。
アンロードをはなから諦めるってのもありだと思うが、プラグインのdllをつかみっぱなしになるのが困らないか?
本体が実行中にプラグインだけ入れ替えたいとか使ってないのにファイルは捕まれてるのはちょっと気持ち悪い。
そういうのがいらないならありだと思う。
630デフォルトの名無しさん:2007/09/15(土) 14:02:32
プラグインのタイプによるけど、
結構ホスト側と密に連携しようとしてることが多いからね〜
独立性の高いプラグイン機構ならまだいいんだけど
631デフォルトの名無しさん:2007/09/15(土) 14:08:59
LoadFileの場合って、パスが異なれば違うアセンブリだと
認識させたりとかできるんだっけか?
もしそれができるならロード前にファイルをコピーしてとかできるかな?
違うアセンブリだと認識させられないんなら無理だが。
もしくはILmeargeで無理やりアセンブリを独立化だw
いやそれならilasmのほがましか?
632デフォルトの名無しさん:2007/09/15(土) 14:11:03
もう全部実行時にコンパイルしちゃえ
633デフォルトの名無しさん:2007/09/15(土) 14:25:21
FileStreamでbyte[]にコピーしてAssembly.Load()とかw
634619:2007/09/15(土) 14:33:28
アドバイスありがとうございました。
とりあえずカレントのAppDomainでロードしてみます。
(問題はプラグイン仕様を後で変えずにロード法を変えられるかですが)

>>633
Load(byte[])のオーバーロードって
ファイルそのもののバイト配列じゃないっしょ?
以前これ見てウホッと喜んで試したけど動かなかった気が。
つかCOFFイメージってなんだこりゃ
635デフォルトの名無しさん:2007/09/15(土) 14:35:06
>>634
何も知らない頃俺これで動かしてたが…
LoadFromだったかな?
さすがに今はやってないがw
636デフォルトの名無しさん:2007/09/15(土) 18:37:01
すいません質問です

あるインターフェイスを実装したクラスを継承したら、
継承クラスももちろんインターフェイスを実装してますよね。
そのとき、インターフェイスから実装されたメソッドはvirtualもoverrideもかかれてませんが、
overrideできちゃうんですかね?
637デフォルトの名無しさん:2007/09/15(土) 18:37:36
ためせ
638デフォルトの名無しさん:2007/09/15(土) 18:43:06
>>634
いやファイルそのもののイメージであってる。
exeなりdllなりをバイト配列でそのまま渡す。
639デフォルトの名無しさん:2007/09/15(土) 18:44:12
試さなくても分かるだろw

それが分からないのは結局継承もインターフェイスも中途半端にしか
理解してないからだよ。
640デフォルトの名無しさん:2007/09/16(日) 01:26:35
値が重複しないコンテナってありますか?

List<string> container = new List<string>();
container.Add("foo");
container.Add("bar");
container.Add("foo"); // 追加されない
641デフォルトの名無しさん:2007/09/16(日) 01:32:41
KeyedByTypeCollection<TItem> あたりかしらん?
642デフォルトの名無しさん:2007/09/16(日) 02:03:12
んなむちゃなw
643デフォルトの名無しさん:2007/09/16(日) 02:29:11
自分でIList<T>積んだクラスを作るか、List<T>を継承してAddいじれば?
644デフォルトの名無しさん:2007/09/16(日) 03:05:18
3.5のHashSetかな。

今ならKeyedCollection派生か
Dictionary<,>のラッパー作るか、かな?
645デフォルトの名無しさん:2007/09/16(日) 03:27:56
Addはoverrideできないだろ

順序を保持しないならDictionaryのラッパー
保持するならListのラッパーを作ればいいんじゃね
646デフォルトの名無しさん:2007/09/16(日) 10:26:17
overrideできない?
647デフォルトの名無しさん:2007/09/16(日) 11:47:36
overrideできないな。

class ListEx<T> : List<T>
{
new public void Add(T item)
{
if (!Contains(item)) base.Add(item);
}
}

これでAddは対応できるな。
648デフォルトの名無しさん:2007/09/16(日) 11:55:39
なんで隠蔽する必要があるの?w
ていうか、それ仮にaddがオーバライド可だとしてもすべきじゃないでしょ。

動作の意味が違うじゃん。
別のメソッドを追加する対応にすべきだ。
649デフォルトの名無しさん:2007/09/16(日) 12:02:54
ていうかList<T>使うのがおかしい。
Collection<T>を派生元にすべき。
650デフォルトの名無しさん:2007/09/16(日) 14:01:35
クラス名に重複なしが明示されてるならAddでもいいと思う
語尾にwを付ける必要はないと思う
651デフォルトの名無しさん:2007/09/16(日) 14:23:45
それにしてもシャドウイングは不味いだろ
652デフォルトの名無しさん:2007/09/16(日) 14:34:36
どうしてもAddにしたいなら継承を使うべきではないね。

まあ確かに、大人数で使うとか売り物にするとかのライブラリでなければ
そこまで拘る必要ないじゃん、と言われればそれも一理あるけどさ。
653デフォルトの名無しさん:2007/09/16(日) 14:37:49
IList<T>を自分で実装するくらいそんなに大したことじゃないし
Collection<T>使えば簡単にできるし
わざわざList<T>を継承する意味がわからん
654デフォルトの名無しさん:2007/09/16(日) 14:42:46
馬鹿だから
655デフォルトの名無しさん:2007/09/16(日) 15:08:45
グラフィックのDrawImageで質問です
bmp0からbmp1へと別のとこへのコピーはできたのですが
bmp0からbmp0へと同一bmp内でのコピーはできませんでした
これはできない仕様なんですか できる方法はありますか?
656デフォルトの名無しさん:2007/09/16(日) 15:11:58
bmp0と同じサイズの新しいBitmapオブジェクトを作ってそれにbmp0をDrawImageして
その上に何か好きに描いたりすればいいだろ
657デフォルトの名無しさん:2007/09/16(日) 15:15:52
やりました ただ
スピードの面で直接1回で描けたらいいなと思って
658デフォルトの名無しさん:2007/09/16(日) 15:21:58
GetPixelとSetPixelでもできるだろうけどかえって遅くなるから
LockBits使って気持ち悪いことやるといいよ
659デフォルトの名無しさん:2007/09/16(日) 15:29:56
やっぱり同一BMP内ではコピーできないんですかね

LockBits 配列を使うやつですね 調べてみます
660デフォルトの名無しさん:2007/09/16(日) 15:41:59
質問してる奴の言ってることもよくわからんが
回答してる奴の言ってることもよくわからん
本当何のこっちゃw
661デフォルトの名無しさん:2007/09/16(日) 18:10:13
エスパー質問者にエスパー回答者

いや両方アホなだけか
662デフォルトの名無しさん:2007/09/16(日) 18:54:23
>>647
IList<T>にキャストしたら
Addの動作が変わって値が重複するだろ
new厨目を覚ませ
663デフォルトの名無しさん:2007/09/16(日) 21:18:47
>>381からの流れがまるで無駄になっててワロタ
664デフォルトの名無しさん:2007/09/16(日) 22:18:59
はあ?
665デフォルトの名無しさん:2007/09/16(日) 22:21:58
あは
666デフォルトの名無しさん:2007/09/17(月) 21:55:05
色々調べてC#でACCESSをオートメーションで動かす事に成功しました。
下記コードです。
Access.ApplicationClass oAccess = new Access.ApplicationClass();
oAccess.Visible = false;

oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);
oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit);

oAccess.CloseCurrentDatabase();
oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess);

oAccess = null;

見よう見まねで書いたので
oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の大に引数trueの意味と
oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit);
の第2、3引数Access.AcView.acViewNormal, Access.AcOpenDataMode.acEditが何を意味しているのか
良く分かりせん。どなたか教えて下さい。
667666:2007/09/17(月) 22:00:36
自己レスです。
oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の第2引数trueの意味だけは
わかりました。trueは排他モード、falseは共有モードということです。
668デフォルトの名無しさん:2007/09/17(月) 22:16:03
OpenQuery にしてもそのままぐぐったら先頭に解説が見つかったんだが
669デフォルトの名無しさん:2007/09/17(月) 22:28:13
 @View(第2引数)に指定する定数

acViewDesign デザインビューで開きます。

acViewNormal 選択クエリーならデータシートビューで開きます。
アクションクエリーならデータの追加、更新、削除を行います。

acViewPivotChart ピボットチャートビューで開きます。(選択クエリーのみ)

acViewPivotTable ピボットテーブルビューで開きます。(選択クエリーのみ)

acViewPreview 印刷プレビューで開きます。(選択クエリーのみ)



 ADataMode(第3引数)に指定する定数(選択クエリー時のみ有効)

acAdd 追加専用モードです。

acEdit 編集・追加・削除モードです。

acReadOnly 読み取り専用モードです。

670デフォルトの名無しさん:2007/09/18(火) 23:30:46
これぐらいだったらリークしないよなあ
これぐらいだったら…
671デフォルトの名無しさん:2007/09/18(火) 23:34:11
リークって言うとどことなくかっこいいから禁止
お漏らしと言え
672デフォルトの名無しさん:2007/09/18(火) 23:59:55
すいません、ジェネリックに関して質問です。

クローズ構築とはなんですか?
説明読む限り型パラメータが固定/ないジェネリックとしか読めないのですが・・・
どのようなときに使うのでしょうか?
673デフォルトの名無しさん:2007/09/19(水) 00:07:50
インスタンスを作れるのがクローズ構築型。List<int> とか。
オープン構築型は型パラメータが未定義なのでインスタンスを作れない。List<T> とか。
674デフォルトの名無しさん:2007/09/19(水) 00:09:34
「要素にHoge型しか受け入れないコレクションを作成するために、
Collection<T>に対するクローズ構築型であるCollection<Hoge>を継承して
HogeCollection(非ジェネリック)を作った」
というような使い方でいいのかなあ
675デフォルトの名無しさん:2007/09/19(水) 00:15:38
ま、どうせリフレクションでしか使わんような言葉だから大して気にする必要もないよ
676デフォルトの名無しさん:2007/09/19(水) 00:39:29
プロパティって配列とかジェネリックを返すものって作れまつか?

int X=10;
public int プロパティA
{
get
{
return X;
}
}

とかで Xを配列にしたりジェネリックにしたりとか

677デフォルトの名無しさん:2007/09/19(水) 00:41:19
やってみれば?
678デフォルトの名無しさん:2007/09/19(水) 00:50:57
確かにこのスレできくより
コンパイラにきいた方がはやいなw
679デフォルトの名無しさん:2007/09/19(水) 01:26:15
private void Button1_Click(...)
{
Class2 c2 = new Class2();
//適当な処理
Form2 f2 = new Form2();
f2.ShowDialog();
//適当な処理
}

としたとき、Form2はDisposeが必要なのに
Class2はDisposeしなくていいのは何故?
680デフォルトの名無しさん:2007/09/19(水) 01:39:59
知るかよ。Class2ってなんだよ
681デフォルトの名無しさん:2007/09/19(水) 01:43:48
Formは内部でリソースを使ってる
もしClass2の内部でリソース使ってるなら解放が必要

IDisposableならusing節推奨
682デフォルトの名無しさん:2007/09/19(水) 01:55:11
>>681
リソースとはコントロールって事でしょうか?
Class2は呼び出し元のForm1で指定したURLを読み込んで
System.Net.WebClientクラスを使った処理をしています。
Form1に書いても良かったのですが、同様の処理が複数あるので
それぞれ別クラスに書きました。

IDisposableについては初めて知ったのでこれから勉強します。
683デフォルトの名無しさん:2007/09/19(水) 01:57:40
>Class2はDisposeしなくていいのは何故?

Class2でDisposeするかしないか決めるのは実装者のあなた
684デフォルトの名無しさん:2007/09/19(水) 02:17:09
Class2がIDisposableなクラスを使ってるならDisposeしなきゃだめだろうな
普通はしなくても平気だけど
685デフォルトの名無しさん:2007/09/19(水) 08:43:06
C#でダブルクォーテーションを文字列変数に格納したいとき

string A = """C:\\Program Files\\Test.exe""” +" /p" + """C:\\Program Files\\Test.arg""”

のように"を2つかさなればよいのでしょうか?
要は "C:\Program Files\Test.exe”  /p "C:\Program Files\Test.arg” でパラメータを指定して
起動していのです。
exeのショートカットではでそのままはリンク先に"C:\Program Files\Test.exe”  /p "C:\Program Files\Test.arg”を
指定してうまくいったのですが
System.Diagnostics.Process.Start(A);とすると起動できないのです。"(ダブルクォーテーションの使い方が悪い?)
686685:2007/09/19(水) 08:44:44
>>685
一部ダブルクオーテーションが全角になってますが実際は半角です。
687デフォルトの名無しさん:2007/09/19(水) 08:49:01
エスケープしろ
688デフォルトの名無しさん:2007/09/19(水) 09:02:58
\"
689デフォルトの名無しさん:2007/09/19(水) 09:20:49
>>685
" 'C:\Program Files\Test.exe' "でできないっけ?
690デフォルトの名無しさん:2007/09/19(水) 10:07:11
@"C:\Program Files\test.exe"
691デフォルトの名無しさん:2007/09/19(水) 10:27:00
質問です。クラス名(名前空間除く)をstringで取得する方法はないのでしょうか?

てっきり規定のメンバで存在すると思っていたのですが、見つかりません。
692デフォルトの名無しさん:2007/09/19(水) 10:30:14
typeof(MyClass).Name
693デフォルトの名無しさん:2007/09/19(水) 10:44:53
Object.GetType().Name;
Object.GetType().FullName;
694デフォルトの名無しさん:2007/09/19(水) 10:55:52
>>685
ProcessStartInfo使え
695デフォルトの名無しさん:2007/09/19(水) 13:54:58
アクセス許可とかアセンブリの項目見てると頭痛くなる(-o-;)
696デフォルトの名無しさん:2007/09/19(水) 13:58:46
つ バファリン
697デフォルトの名無しさん:2007/09/19(水) 13:58:49
SQLの SELECT A AS でb竅翌使おうとするとエラーが出る・・・これらを表示させたい場合にはどうすればいいでしょうか?
698デフォルトの名無しさん:2007/09/19(水) 14:30:15
"で囲む
予約語で具具って美奈代
699デフォルトの名無しさん:2007/09/19(水) 15:05:07
intを返す関数を作ったんですが
retrnで返そうとすると
そんな変数存在しねぇぞ(゚Д゚)ゴルァ!って怒られるんですけどなんで?
宣言を int a =new int()のようにしたら大丈夫ですたが

int function{
 int a
 return a;
}
こんなの
700デフォルトの名無しさん:2007/09/19(水) 15:06:36
ちゃんと動作しなかったソースをコピペで貼ってくれないと。
701デフォルトの名無しさん:2007/09/19(水) 15:12:03
>>699
初期化してないから
int a = 0;(int a =new int()でも一応おk)
702デフォルトの名無しさん:2007/09/19(水) 15:16:28
ええ、たったそんなことだったのか
結構はまる人おおそう
ありがとうございました
703デフォルトの名無しさん:2007/09/19(水) 15:52:08
>>702
残念ながら嵌らない。
第一

int a;
return a;

なんてaを宣言して初期化せずにそれを返すなんてことはしない。
参照型なら例外処理とかで

object a;

catch
{
    a = null;
    return a;
}

とかやる場合もあるが。
704デフォルトの名無しさん:2007/09/19(水) 15:57:33
居ません
705デフォルトの名無しさん:2007/09/19(水) 16:03:58
>>692,693
ありがとうございます。独立したメソッドでしたか・・・
706デフォルトの名無しさん:2007/09/19(水) 16:08:43
いや中でif分で値を入れてたんだが
どれにもあてはまらないパターンがあったようだ
ローカル変数以外は初期化されるんだっけ?やはり基本は大事か
707デフォルトの名無しさん:2007/09/19(水) 16:24:55
= new int();
とやるとInt32が持つInt32型のメンバ変数が自動で規定値に初期化されるから
初期化したことになるというよくわからん理屈
708デフォルトの名無しさん:2007/09/19(水) 16:25:39
>>706
初期化されない。
つか、フィールドはコンストラクタで、ローカルは宣言時に初期化するだろ普通。
709デフォルトの名無しさん:2007/09/19(水) 16:41:16
>>708
メンバ変数は確か 0 に初期化されたんじゃ。
もちろん、初期化してないと Warning は出るけど。
710デフォルトの名無しさん:2007/09/19(水) 18:21:50
フィールドは初期化してなければコンストラクタで型の既定値で初期化されるッてだけ
711デフォルトの名無しさん:2007/09/19(水) 18:30:20
なにがもちろんだ、警告なんかでんわい。
712デフォルトの名無しさん:2007/09/19(水) 18:45:20
値が代入される可能性が無いフィールドがあるときに出る警告と勘違いしてるんだろう
713デフォルトの名無しさん:2007/09/19(水) 18:57:17
ローカル変数以外は0で初期化される
参照型はnull,値型は0になる
714デフォルトの名無しさん:2007/09/19(水) 19:12:08
プリミティブ型のフィールド以外は必要がなければ自動初期化に任せてる
プロパティ用のフィールドにいちいち全部null代入するとか無意味だろ
715デフォルトの名無しさん:2007/09/19(水) 19:56:13
class C1 { public int i; }
class C2 { public int i; public void Set(int i) { this.i = i; } }

C1 c1 = new C1(); // CS0649の既定値を使用しますの警告
C1 c1 = new C1(); c1.i = 9; // フィールドに直接代入すれば警告はない
C2 c2 = new C2();  // Set() を呼ばなくても警告は出ない

716デフォルトの名無しさん:2007/09/19(水) 20:18:02
publicフィールドが規定値であることを知れるからな
ていねいなコンパイラや
717デフォルトの名無しさん:2007/09/20(木) 00:18:56
なにげにコンパイル速いしな。
718デフォルトの名無しさん:2007/09/20(木) 14:40:25
VisualStudio2005を使用し、C#で開発してるんですが
部品のメソッド一覧を作成するときに使えそうなツールってありますか?
メソッド一覧には「メソッド名」「引数」「機能」「例」「使用先」を載せたいです
719デフォルトの名無しさん:2007/09/20(木) 16:14:43
sandcastleとか
最終的な生成に何を使うにしろC#はドキュメントコメントがコンパイラに組み込まれてるから
書き方はそれに従うように
720デフォルトの名無しさん:2007/09/20(木) 16:26:07
VBをC#で書き換え中なのですが・・・

質問です.

VBで PixelsToTwipsX とは,
座標変換をするためのもの
というところまでわかりましたが
C#ではどのように記述すればよいのかわかりません.

現在,サンプルプログラム(VB)を参考に
C#でプログラムを組んでいます.

初心者的な質問ですがご教授願います.
721デフォルトの名無しさん:2007/09/20(木) 16:28:16
722デフォルトの名無しさん:2007/09/20(木) 16:38:59
PixelsToTwipsX
関数のようだが・・・

http://msdn2.microsoft.com/ja-jp/library/9a59w6f5(VS.80).aspx
723デフォルトの名無しさん:2007/09/20(木) 16:43:25
描画時にGraphicsで使える単位に変換して実寸指定すればいいんだろ
724デフォルトの名無しさん:2007/09/20(木) 18:34:47
twipはpointの二十分の一なんだろ

Font font = new Font("MS Gothic", twip / 20F, GraphicsUnit.Point);

こんな感じじゃね?
725デフォルトの名無しさん:2007/09/20(木) 18:48:38
スクリーンの解像度(dpi)みないと駄目っしょ
726デフォルトの名無しさん:2007/09/20(木) 19:36:06
.NETの例外はJavaのように実際に例外を起こした行を取得できないのかな?
.NET EXEから.NET DLLを参照するようにしてるんだけど、
DLL側の情報がStackTraceに見当たらない・・・
727デフォルトの名無しさん:2007/09/20(木) 19:43:09
>726
Application.ThreadExceptionイベント
728デフォルトの名無しさん:2007/09/20(木) 19:52:09
デバッグ情報なしだと不可能だったような
言語や最適化でいくらでも変わる
729デフォルトの名無しさん:2007/09/20(木) 20:02:37
アプリケーションのバージョンをチェックして
指定の場所から最新のアプリを取得してくるアップデータをつくったのはいんだが
アップデータのそのもののアップデートをどうやってやればいいか悩んでまつ
アップデータそのものがアップデートを実行してるのでEXEに上書きできないわけだが
なにかいい案はありませんか賢い人
730デフォルトの名無しさん:2007/09/20(木) 20:23:43
>>729
テンポラリディレクトリに自分自身をコピーして実行すればいいだけだろ
731デフォルトの名無しさん:2007/09/20(木) 20:30:37
アップデータのアセンブリを実行時に生成しちゃうとか
732デフォルトの名無しさん:2007/09/20(木) 21:02:42
うちの会社の場合…
最初に起動するのはチェック用プログラム。
アップデートなしだとターゲット起動
733デフォルトの名無しさん:2007/09/20(木) 21:07:35
ゴメ
チェック用プログラム=アップデータなんだね。

ターゲットがアップデータverチェックだな。
ターゲットが起動したらアップデータ終了だし。
734デフォルトの名無しさん:2007/09/20(木) 21:42:32
わかった。チェック用のプログラムを作ってアップデータを確認すればいいんじゃね
チェックが不具合あったらチェックのチェック用を用意してさらにチェックのチェックノチェ・・・
俺って天才じゃね
735デフォルトの名無しさん:2007/09/20(木) 22:32:00
テンポラリに最新版おいて
アップデータ置き換えバッチ書いてスタートアップに保存
アップデータ起動時にバッチ削除
736デフォルトの名無しさん:2007/09/20(木) 22:41:19
JITコンパイルされたコードを
VirtualProtectでも呼んで動的に書き換えちまえばいいんじゃね

やった事ないけど
737デフォルトの名無しさん:2007/09/20(木) 22:56:32
>729
手抜きでいいんなら元のexeをリネームしてどかして入れ替えで。
リネームした方は新しいexeで起動したときにでも削除で。
738デフォルトの名無しさん:2007/09/20(木) 23:09:34
バージョンチェッカーが自身とメインモジュールの最新版をWorkにダウンロード

チェッカーは自身のプロセスIDを引数にしつつ、アップデータを起動、自身は終了させる。

アップデータはチェッカーの終了を待った後、それぞれの最新版と入れ替える

アップデータはメインモジュールを起動する(更新がなかった場合は、チェッカーが起動させる)

アップデータをWorkに置くようにすれば、たぶん全てのモジュールが更新できる。
739デフォルトの名無しさん:2007/09/20(木) 23:31:24
>>738
俺はそれでアップデータをチェッカーのリソースにつっこんで
アップデートのたびに生成したな。
アップデータが存在したらその回はアップデータを消すだけで
バージョンチェック省けるし。
740729:2007/09/20(木) 23:59:44
ん〜、 つまり、
(アップデートする人)(ソフト本体)のほかに
(チェックをする人?)を作れってことでつか?


ソフト本体がアップデートする人のアップデート情報を
取得できてたら差し替える って方法でいこうとおもってるんでつが
741デフォルトの名無しさん:2007/09/21(金) 00:02:23
素直にClickOnce使おうぜ
742デフォルトの名無しさん:2007/09/21(金) 00:07:53
>>740
ソフト本体が他の媒体の面倒をみる設計で問題なければそれでいいんじゃないか。
743デフォルトの名無しさん:2007/09/21(金) 00:52:05
落として来るものをデータじゃなく実行可能なものにする。
アプリは落として実行してすぐ終了。後は落としてきたものに任せる。柔軟性高し

おすすめはmspかそれを実行するexe。署名で一般ユーザーでも更新可能になる。
が、この利点は会社、組織じゃないと駄目なのが珠にきず
744デフォルトの名無しさん:2007/09/21(金) 01:09:50
>>741
フレムワク1.1だからだめぽ
データ差分も1時間おきにでるので
クリックワンコだけじゃだめぽ
というわけでつ

>>742
トン

>>743
アー、まるでクリックワンコみたいな動作をアップデータにさせるわけでつね
たしかにそれなら柔軟かもしれないです
mspってのはどのmsp・・・?
745デフォルトの名無しさん:2007/09/21(金) 07:48:43
AccessC#からオートメーションで操作させるときのインスタンス生成で

Access.ApplicationClass oAccess = new Access.ApplicationClass();

Access.Application oAccess = new Access.Application();

2種類ありますがこの2つはどう違うのでしょうか?
746デフォルトの名無しさん:2007/09/21(金) 07:55:46
変わらないと考えていい
747デフォルトの名無しさん:2007/09/21(金) 08:32:20
>>744
とりあえずmsp何?なら諦めとけ。WindowsInstallerのパッチ形式だが
知識ないと作るの難しいから

クリックワンスとか以前に、ようはパッチを落として起動するだけの話
748デフォルトの名無しさん:2007/09/21(金) 09:20:33
VS2003、ASP.NETのDataGridで、bニいう列を作りそこにSQLで得た結果DataSetに入れ
その行数を1,2,3・・・・という形に表示させたいのですが、どのようにすればいいでしょうか?
749デフォルトの名無しさん:2007/09/21(金) 09:26:49
SQLをいじる。連番振りの方法はDBMSによりけり
750デフォルトの名無しさん:2007/09/21(金) 12:02:56
PropertyGridでネストされているクラスを展開させたいのですが、どうしたらいいでしょうか?
ネストされていなければ、TypeConverterでExpandableObjectConverterを指定すれば
簡単にできるのですが、展開したクラスの中に、さらに自前のクラスがあると、
それがうまく展開されないです…。
751デフォルトの名無しさん:2007/09/21(金) 14:09:00
BinaryFormatterとかで保存したList<>って
保存時の順番が保持されるかどうかって保証されてないんだっけ?
752デフォルトの名無しさん:2007/09/21(金) 14:34:30
さっきー大暴走!!!!
753デフォルトの名無しさん:2007/09/21(金) 14:36:20
誤爆った。
754デフォルトの名無しさん:2007/09/21(金) 16:50:04
質問です。
Delegate型(delegateキーワードを使って作った型ではない)の変数に
メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので
直接メソッドグループをDelegate型の変数のなかに入れたいのですが、

'メソッド グループ' から 'System.Delegate' に変換できません。

と言われて入れることが出来ません。
どうにかして入れたいのですが、delegateで型を作るしかないですかね?
755デフォルトの名無しさん:2007/09/21(金) 17:09:16
>>754
>いちいちdelegateで型を作っているとものすごい数になるので
この目的だと、
.NET 3.5 から、Action デリゲートと Func デリゲートが標準で用意されてるんで、
それを使えばいいと思う。
756デフォルトの名無しさん:2007/09/21(金) 17:13:24
>>751
されてるはずだけど、何でそう思ったの?

>>754
メソッドグループって何だっけ?
シグネチャさえあってれば1つでいいはずだけど。
757デフォルトの名無しさん:2007/09/21(金) 17:20:07
>>755
.NET 2.0なので無いです… orz

>>756
引数が全部ばらばらなので無理です。

MethodInfoを使えば何とかなりそうだけど、遅いんだよなぁ orz
758デフォルトの名無しさん:2007/09/21(金) 17:27:01
>>757
引数や戻り値を全部objectにするとか。
delegate object FooHandler(object o)
759デフォルトの名無しさん:2007/09/21(金) 17:28:02
>>757
よくわからんけど何が遅いの?
760デフォルトの名無しさん:2007/09/21(金) 17:36:36
>>758
でもそれだと全てのメソッドの引数もobjectにしなければならないので
今からだと厳しいです。

>>759
リフレクションを使うのでMethodInfoを取得するのが重いんですよ
761デフォルトの名無しさん:2007/09/21(金) 17:42:12
>>760
確かにリフレクションは速くはないけど、
MethodInfoの取得がボトルネックになるような場面ってあんまり思いつかないなぁ。
具体的に何やってるの?
762デフォルトの名無しさん:2007/09/21(金) 17:50:31
>>757
Action とか Func に相当するものは、2.0 でも自分で書けるよ。
ちょっと面倒だけど、↓みたいにしとけば、3.5 になったときに修正も不要なはず。

delegate void Action();
delegate void Action<T>(T x);
delegate void Action<T1, T2>(T1 x1, T2, x2); ・・・
delegate R Func<R>();
delegate R Func<R, T>(T x);
delegate R Func<R, T1, T2>(T1 x1, T2, x2); ・・・

ああ、でも、引数が全部ばらばらだとちょっと困るか。
↑のAction とか Func を object[] に格納しといてキャストして使うか、
リフレクション使うか。
てか、そんな引数タイプが異なるものを使おうとすると、
リフレクション使わなくてもリフレクション並みに処理重たそう。
763デフォルトの名無しさん:2007/09/21(金) 18:00:24
>>754
>メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので
>直接メソッドグループをDelegate型の変数のなかに入れたいのですが、

C#の文法はそういう用途をサポートしていないので
自分で簡易コンパイラを作るか、
C#のコードを生成するコードジェネレータでも作ればいいんじゃね?

コンパイル時にまでに必要なメソッドは確定してるんだよね?
764デフォルトの名無しさん:2007/09/21(金) 18:02:18
>>761
やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
Delegateを使おうと思ったのですが、こんなことになるとは orz

>>762
そんなジェネリックだらけの物だったんですねそれ…
それなら何とかなりそうですが、数十個分のを書くとなるとちと面倒ですね
765デフォルトの名無しさん:2007/09/21(金) 18:05:34
>>764
>やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
>Delegateを使おうと思ったのですが、こんなことになるとは orz

そういうのはIronPythonとかIronRuby使った方がさくっと書けるんじゃないかねぇ。
C#+Delegateでやるなとは言わないけど、
少なくとも手段に対して実力が伴っていないような印象は受ける。
766デフォルトの名無しさん:2007/09/21(金) 18:21:42
はじめからそれぞれの操作をオブジェクトとして表現しとけばよかったんじゃね
まだC#にはそういう方法の方が合ってる気がする
767デフォルトの名無しさん:2007/09/21(金) 18:29:18
System.DelegateにキャストしてしまったらDynamicInvoke()を使うことになるから、
MethodInfoでリフレクションでやるのと変わらない気がする。
768デフォルトの名無しさん:2007/09/21(金) 18:33:15
それに引数・戻り値がばらばらなら、
実行時にどのシグネチャをもつdelegateかの判別が必要なんじゃ?
そこでどうせ分岐するんじゃね?
769デフォルトの名無しさん:2007/09/21(金) 18:37:45
引数には、それを通していろんなものを引っ張ってこれる「なんでもオブジェクト」的なものを渡すようにして
シグネチャを統一してしまった方がいいんじゃね
770デフォルトの名無しさん:2007/09/21(金) 18:52:06
>>766
それはどのようにするのでしょうか?
enumとかで条件分けするってことでしょうか?

>>767
そうなんですよね。しかし、MethodInfoで試そうと
Type.GetMethod()をしてもパブリックメソッドしか引っかからないのでどうしようかなと。

>>768
DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。

>>769
それがまさしくobjectだと思うのですが、毎度毎度キャストするのも重たいし…
771デフォルトの名無しさん:2007/09/21(金) 19:07:00
>DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。

などと平気で言いながら、
キャストが重いとか言う…
772769:2007/09/21(金) 19:08:43
objectで渡すなら呼び出し先の判別が必要だろ
実際の型として何を要求してるかはメソッドによって違うんだから。
MouseEventArgsなんかはそれを一つ渡すだけだけど中にいろんなオブジェクトが入ってるだろ?
そのおかげでマウス関連のイベントハンドラはMouseEventArgsに統一できる。
「なんでもオブジェクト」はそういう意味で言った
773デフォルトの名無しさん:2007/09/21(金) 19:09:22
C#からExcelのファイルを生成したいんだが
ここ見ると評判悪いみたいだね
VSTOを買うわけにもいかないし
何かいい方法はないだろうか
774726:2007/09/21(金) 19:09:58
throw ex; が原因だった。ごめんね。
てか throw; って・・・
775デフォルトの名無しさん:2007/09/21(金) 19:22:09
>>773
そこだけVB.NETを使う。
776デフォルトの名無しさん:2007/09/21(金) 19:28:23
>>773
生成にExcelは使っていいの?
777デフォルトの名無しさん:2007/09/21(金) 20:24:45
初歩的な質問ですいません。
特定の数値やbool値を保存したり読み込んだりするには、どうすればいいのでしょうか?
778デフォルトの名無しさん:2007/09/21(金) 20:25:51
>>777
初歩的な指摘ですみません。
どこに保存するつもりですか?
779777:2007/09/21(金) 20:49:24
すいません

実行ファイルに組み込んで保存できるならそこで、出来ないなら適当に所謂datファイルとしてです。
アプリケーションのオプション設定などを保存しておきたいのです。
780デフォルトの名無しさん:2007/09/21(金) 20:55:29
レジストリを使うか2.0以上なら設定ファイルってやつがある
1.1の時にはデータセットのreadXMLとWriteXMLを使って保存したこともあったな
781デフォルトの名無しさん:2007/09/21(金) 20:57:59
設定用のクラス作ってXmlSerializerでXMLファイルに/BinaryFormatterでバイナリファイルにシリアライズするか
レジストリに書き込むか

C# 設定 保存
でぐぐればいくらでもでてくるっしょ
782777:2007/09/21(金) 21:14:07
やはり入門書に載ってないと混乱する癖は何とかしなくては・・・
確かに検索したら一発でした。

・・・というか・・・すごく楽ですね!!びっくりしました。
783デフォルトの名無しさん:2007/09/21(金) 21:35:24
abstract
これなんて読めばいいんですか?
784デフォルトの名無しさん:2007/09/21(金) 21:37:26
抽象
785デフォルトの名無しさん:2007/09/21(金) 21:39:40
いや・・・意味じゃなくて、読み方です;
784さんは、なんて読んでいますか?
786デフォルトの名無しさん:2007/09/21(金) 21:40:15
chusho
787デフォルトの名無しさん:2007/09/21(金) 21:41:13
786さん・・・笑
これは諦めたほうがいいんですかね。。。
788デフォルトの名無しさん:2007/09/21(金) 21:41:28
>>785
辞書引けばいいじゃん。中学生?
789デフォルトの名無しさん:2007/09/21(金) 21:41:41
マジレスするとアブストラクトなんだけど、辞書で調べろよ
790デフォルトの名無しさん:2007/09/21(金) 21:42:40
中学時代はずっと、ぼーとしてたんで。。。すいません;
791デフォルトの名無しさん:2007/09/21(金) 21:44:52
興味ないことは覚えない学ばない!
社会人の特権だよな
792デフォルトの名無しさん:2007/09/21(金) 21:59:00
Funcは
Func<T1,T2,TResult>だぜ
793デフォルトの名無しさん:2007/09/21(金) 22:08:38
それって誘拐っていみじゃないですか!?
794デフォルトの名無しさん:2007/09/21(金) 22:17:34
>>770
Redoしたいのが
SomeMethod(Arg1 arg1, Arg2 arg2)
といったアクションだったら

class SomeMethodObj : IActionObj
{
Action<Arg1,Arg2> action;
Arg1 arg1; Arg2 arg2;

public SomeMethodObj(Action<Arg1, Arg2> action, Arg1 arg1, Arg2 arg2){
this.action = action; this.arg1 = arg1; this.arg2 = arg2;
}

public void Invoke(){
action(arg1, arg2);
}
}

引数までオブジェクトに囲い込めばいいんじゃないの
匿名メソッド使えばオブジェクト作る必要すらなくなる
795デフォルトの名無しさん:2007/09/21(金) 22:35:05
http://www.atmarkit.co.jp/fdotnet/vsexpress/vsexpress_02/vsexpress_02_03.html
に書かれているコードについて質問します。

> // フィールド
> string _tenki; // 例:曇時々雨
> string _title; // 例:東京都 東京 - 今日の天気
> string _link; // 例:http://weather.livedoor.com/area/13/63.html?v=1
> bool _available; // データが正しく取得できればtrue
> DateTime _publicTime; // 予報の発表日時
> Icon _icon; // タスクトレイ用のアイコン
>
> // プロパティ
> public string Tenki { get { return _tenki; } }
> public string Title { get { return _title; } }
> public string Link { get { return _link; } }
> public bool Available { get { return _available; } }
> public DateTime PublicTime { get { return _publicTime; } }
> public Icon Icon { get { return _icon; } }
>
> string lwwsUrl; // お天気WebサービスのURL
> (略)

lwwsUrlはフィールドではないのでしょうか。
それと、 なぜフィールド (とフィールドかもしれないlwwsUrl) を宣言するときにアクセス修飾子が使われていないのでしょうか。
796デフォルトの名無しさん:2007/09/21(金) 22:36:18
1) フィールドです
2) 既定のアクセスレベルが定められているからです
797デフォルトの名無しさん:2007/09/21(金) 22:37:38
メンバのアクセスレベルを省略したらprivateになる
lwwsUrlは重要だから目立つように最後に書いてるんじゃね
798デフォルトの名無しさん:2007/09/21(金) 22:38:05
一行空けてんだから汲んでやれよ
799デフォルトの名無しさん:2007/09/21(金) 22:43:00
ああ、プロパティ用のフィールドじゃないから別扱いにしてあるのか。
800デフォルトの名無しさん:2007/09/21(金) 22:56:05
>>793
アブダクションだっけ?
UFOのやつね。
801デフォルトの名無しさん:2007/09/21(金) 23:21:19
>>796-799
ありがとうございました。

・ lwwsUrlもフィールドであるけれども、 特にプロパティ用のフィールドを 「フィールド」 としてまとめている。
・ アクセス修飾子は省略でき、 省略するとprivateになる。

というわけですね。

もう1つ質問します。
>>795のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
そのような書き方は一般的なのでしょうか。
802デフォルトの名無しさん:2007/09/21(金) 23:28:41
>>795のような書き方だと、
「プロパティ用のフィールドは直接触るな。クラス内部でもプロパティを通せ」
という意思表示のようにも見えるけどそうはなってないね
803デフォルトの名無しさん:2007/09/21(金) 23:33:07
> ・ アクセス修飾子は(snip)省略するとprivateになる。
必ずしも真ではない。詳しくはMSDN
言語によっても異なるしな。

> >>795のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
> そのような書き方は一般的なのでしょうか。
それなりに見かける。インテリセンスで前の方に集まって見やすいという主張もある。
でもおいらはアンダースコアつけない。
外部に見せないものは趣味の範囲だし。
もちろん複数人でコードを共有する場合はきちんと規約を作るべきだが。
804デフォルトの名無しさん:2007/09/21(金) 23:36:15
アンダーバー頭につけるのは視覚的に見難い気がするよ。
昔ながらの小文字のm一文字がやっぱり一番しっくりくる。
なぜかあまりやってる人見ないけど。
805デフォルトの名無しさん:2007/09/21(金) 23:36:26
>>803
> 言語によっても異なるしな。

少なくともここはC#のスレだと思うんだが
806デフォルトの名無しさん:2007/09/21(金) 23:38:57
クラスのことじゃね
>>797はメンバと言ってるけどな
807デフォルトの名無しさん:2007/09/21(金) 23:41:11
privrateなフィールドにアンダーバーを付けるのはIronRubyのソースでも見た。
thisは省略。
そっちの方が分かりやすいかなぁ。
808デフォルトの名無しさん:2007/09/21(金) 23:46:25
俺はなんもつけないぞ
それが一番多数派じゃね
809デフォルトの名無しさん:2007/09/21(金) 23:48:58
>>805
でもVB.NETのソースとか結構読むことあるし
810デフォルトの名無しさん:2007/09/21(金) 23:49:23
foreach( Hage hage in Hoge.Hages){}みたいな感じで使う
HageCollectionクラスを作る必要ができました。

上の方で「なんでList<T>から継承するの? 馬鹿?」みたいな話がありましたが
ICollection<T>とかIList<T>とかから継承して、全部自分で実装するべきなんですか?

List<T>を継承して動作変えたいところだけnewで隠蔽するんじゃ駄目ですか?
(sealedなクラスで他の用途は無いんですが)
811デフォルトの名無しさん:2007/09/21(金) 23:51:59
アンダースコアを付けるのは、 皆がやっているわけではないのですね。

「C#におけるメンバは」 宣言時にアクセス修飾子を省略するとprivateになる、 という理解でよいのでしょうか。
812デフォルトの名無しさん:2007/09/21(金) 23:52:33
Collection<T>使えよ
813デフォルトの名無しさん:2007/09/21(金) 23:55:38
List<T>(たぶん派生したものも同じ)オブジェクトって
publicメンバとして公開してはいけないことになってたような
List<T>はパフォーマンスが目的であってカスタマイズできないからCollection<T>を使えと
MSDNのどっかに書いてあった覚えがある
814デフォルトの名無しさん:2007/09/22(土) 00:00:06
SortとかForEachとかFindとかがList<T>にしかないのが気に食わんけどな
3.5は遠い
815デフォルトの名無しさん:2007/09/22(土) 00:00:43
全部自分で実装するったってList<Hoge>をメンバに持って
そのメソッドを呼び出すだけ
動作変えたいなら変えればいいし
なんでわざわざ制限が多くてわかりにくい継承を使いたがるのかわからん
816デフォルトの名無しさん:2007/09/22(土) 00:01:03
>>810
お作法的にはダメだろうね。

でも所詮一人で書いてるコードで自分で自分の罠に落ちない自信が持てるなら
別にかまわんでしょ。
817デフォルトの名無しさん:2007/09/22(土) 00:01:07
>>811
残念ながら間違い
818デフォルトの名無しさん:2007/09/22(土) 00:18:27
>>817
C#の言語仕様はもっと複雑なのですね。

皆さんありがとうございました。
819デフォルトの名無しさん:2007/09/22(土) 00:28:42
インラインアセンブラが使え無い言語は
基本的に劣っていると考えたい・・・
820デフォルトの名無しさん:2007/09/22(土) 00:29:17
ILGeneratorがあるじゃないか
821デフォルトの名無しさん:2007/09/22(土) 00:31:50
メンバはprivateになるさ
822デフォルトの名無しさん:2007/09/22(土) 00:39:51
VB6からC#へ移行時の質門です。
VB6である行範囲をコピーして別の行範囲にコピーしたいのです。
***VB6のコード:***
Dim oExcel As Excel.Application
Set oExcel = CreateObject("Excel.Application")

oExcel.Workbooks.Open FileName:="C:\TEST\TEST.xls"
oExcel.Application.Sheets("TEST").Select
oExcel.Application.Rows("1:42").Copy oExcel.Application.Rows("43:84")

をC#で置き換えしようと思い以下のように書きましたが
シートの選択の記述が分からなかったのでとりあえずActiveSheetにして
みました。
Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
Excel._Workbook oWB;
oWB = (Excel._Workbook)(oExcel.Workbooks.Open(@"C:\TEST\TEST.xls",
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value));
oSheet = (Excel._Worksheet)oWB.ActiveSheet; シート選択わからなかったのでとりあえず
  oExcel.Application.Rows.Copy["1:42"] oExcel.Application.Rows["43:84"]???ここがよく分からない
しかし上記コードでは行範囲コピーでエラーが発生してうまくいきません。
Excel8.0 Object Libraryを参照設定しています。どなたか教えて下さい。
823デフォルトの名無しさん:2007/09/22(土) 00:45:16
>>810
勘違いしてそうだけど継承するのは全然構わないよ、MSのサンプルコードでもやってるし。
ただ、動作を変えるのならnewで隠さず名前も変えろってだけの話。
824デフォルトの名無しさん:2007/09/22(土) 00:49:00
>>811
いい
825デフォルトの名無しさん:2007/09/22(土) 02:00:21
>>819
インラインアセンブラは、言語じゃなくコンパイラの仕様だろ
826デフォルトの名無しさん:2007/09/22(土) 02:52:57
Dは言語仕様にx86アセンブリを含んでるけどな
827デフォルトの名無しさん:2007/09/22(土) 05:39:55
>>800
お前のせいでUFOに誘拐されたアメリカ人の証言が頭の中で舞ってしまったじゃないか
828デフォルトの名無しさん:2007/09/22(土) 11:18:08
Imageクラス(というかGDI+)についての質問です。
あるファイルなりメモリ上のデータなりを、Imageクラスでデコードできるかどうか、を知る方法はないでしょうか。
現在はtryブロック内でImage.From*を使い、例外が発生するかどうかで判断しているのですが、いちいちImageクラスのインスタンスが生成されたり例外が発生したりするので無駄が多いように思いまして……
829デフォルトの名無しさん:2007/09/22(土) 14:12:16
それしかない
830デフォルトの名無しさん:2007/09/22(土) 14:18:19
自力でヘッダ解析するしかないんじゃないかな
831デフォルトの名無しさん:2007/09/22(土) 15:42:53
>>822
((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]).Copy(oExcel.Application.Rows["43:84", Missing.Value]);
コンパイルエラーと実行時エラーくらいはっきり区別しようよ
832デフォルトの名無しさん:2007/09/22(土) 16:31:50
エクセル操作する部分だけvb.netでライブラリ化した方がいいんじゃない?
>>831に書いてあるような調子のコードってメンテ不能じゃないか?
833デフォルトの名無しさん:2007/09/22(土) 17:46:09
質問です。
Windowsのアドレス帳ファイル(.wab)のバイナリデータを読み込みたいと思っています。
バイナリデータの仕様はどこかで公開されているのでしょうか?
特定のライブラリやAPIがあるようでしたらばそれでもOKです。
834デフォルトの名無しさん:2007/09/22(土) 17:54:56
この辺?

FILE: Windows Address Book (WAB) Documentation
ttp://support.microsoft.com/kb/266347

MSDN Online Web & Internet Samples - WAB Property Inspector Tool
ttp://msdn.microsoft.com/archive/en-us/samples/internet/messaging/wabtool/default.asp?frame=true
835833:2007/09/22(土) 18:11:32
>>834
ありがとうございます。
軽く目を通したんですが、MS系の開発は初めてで解読できませんでした。
諦めてCSVでエクスポートする方法を提案したいかと思います。
836デフォルトの名無しさん:2007/09/22(土) 19:49:14
どんだけあきらめいいんだよw
837833:2007/09/22(土) 19:53:17
自分、専門はJavaなんでMSDNを読んでいると眩暈がw
そもそも簡単ならやってくれる?程度の優先度低い話なんですよ
838デフォルトの名無しさん:2007/09/22(土) 22:00:38
>>831
ありがとうございます。
もっと勉強します。

>>832
VBの方がやはりいいのでしょうか?
C#からExcelを扱うのは一般ではあまりやらないのでしょうか?
839デフォルトの名無しさん:2007/09/22(土) 22:12:23
VB.NETでもやっぱり面倒だよ
たくさんExcelを操作するコードを書くならVBAのマクロを生成して
それを呼び出すという手もある
840デフォルトの名無しさん:2007/09/22(土) 22:13:52
>>838
エクセルの操縦に限れば遥かに楽だね。
エクセルの設計のいい加減さと、VB.NETの旧VBを引きずってるいい加減さが
親和的なんだよね。
841デフォルトの名無しさん:2007/09/22(土) 22:35:52
List とかジェネリッククラスを継承した場合って、Add とかのメソッドの override が
出来ないのね。知らんかった。
どうしてできないの?
842デフォルトの名無しさん:2007/09/22(土) 22:40:21
委譲するべきだから
ほぼありとあらゆる場合に継承はするべきじゃない
843デフォルトの名無しさん:2007/09/22(土) 22:50:09
.NETではオーバーライドを許可するメソッドは
テンプレートパターンのためのもののみに限定する方針みたいだね
むしろオーバーライドできないのが普通
Collection<T>にはカスタマイズ目的でオーバーライドさせるためのメソッドがあるよ
844デフォルトの名無しさん:2007/09/22(土) 22:50:44
virtualにするとパフォーマンスが落ちるしな
845デフォルトの名無しさん :2007/09/22(土) 22:50:53
C#のフリーコンパイラでお勧めのものを教えてくださいおっ
[条件]
・.NET FRAMEWORK 1.1でコンパイルできるもの
・デバッガ付
・VSに似ているもの
846デフォルトの名無しさん:2007/09/22(土) 22:52:45
なにいってんだこいつ
847デフォルトの名無しさん:2007/09/22(土) 22:54:16
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
848デフォルトの名無しさん:2007/09/22(土) 22:55:55
>>845
Visual C# 2005 Express Edition
SharpDevelop
849デフォルトの名無しさん :2007/09/22(土) 22:57:04
>>848

ありがとうございます。
早速さがしてみます。
850デフォルトの名無しさん:2007/09/22(土) 23:49:17
>>840
vb.net使っても開放忘れるとかなりシステムが不安定になったりする。

VBAかVB6のほうがよい。
851デフォルトの名無しさん:2007/09/22(土) 23:56:06
null代入じゃなくてcom開放ね。
上のコードだと、oExcel,oWB,oSheetもちゃんと開放しないといけない。


おまけ。
oExcel.Application.Sheets["TEST"].Select
852デフォルトの名無しさん:2007/09/23(日) 00:00:46
なんかちゃんとラップしないと使い物にならなさそうだな
853デフォルトの名無しさん:2007/09/23(日) 00:02:27
うん。だからあまり使われてない。
854デフォルトの名無しさん:2007/09/23(日) 00:10:12
誰かがラッパー作ってそうだけど見つからないな
中途半端にできるからダメなのか
855デフォルトの名無しさん:2007/09/23(日) 00:17:22
>>850
それ逆だよw
VB6からのエクセルのオートメーション操作は問題多すぎだった。

っていうか、VBAって何を言ってるんだw
856デフォルトの名無しさん:2007/09/23(日) 00:25:46
>>850
そうなのか俺はラッキーだったのか.

VBAでできるものはVBAで。
857デフォルトの名無しさん:2007/09/23(日) 00:25:46
だいぶ飛び飛びだが.NETからExcel/Wordを使う場合の話題はこの辺でされていた。
VB.NET質問スレ http://pc11.2ch.net/test/read.cgi/tech/1189038267/10-38
858デフォルトの名無しさん:2007/09/23(日) 00:29:59
じゃあWSHで
859デフォルトの名無しさん:2007/09/23(日) 00:31:03
C#はoperator overloadができるようですが、
「同じオブジェクトを指しているかどうか調べる」には obj1 == obj2 ではダメな場合があるって事ですか?
あと、オブジェクトを特定のブロック内で「確実に」破棄させる(C++のスタックに置いたオブジェクトのように)には、
usingを使えば問題ないのでしょうか。それともtry...finallyでDisposeさせるのでしょうか。
860デフォルトの名無しさん:2007/09/23(日) 00:33:03
はい
条件付はい
861デフォルトの名無しさん:2007/09/23(日) 00:34:50
>>859
==がoverrideされた典型的な例がStringクラス。
imutableクラス以外で==のoverrideはあまり見たことがない。
862デフォルトの名無しさん:2007/09/23(日) 00:35:35
後者はいいえだな
863デフォルトの名無しさん:2007/09/23(日) 00:44:20
オブジェクトの破棄と呼んでいるものは2つの意味を持ってて、
オブジェクトの終了コードの実行とオブジェクトが占有している領域の開放。
C#では領域の開放はあくまでもGCが行う。
864デフォルトの名無しさん:2007/09/23(日) 00:48:05
usingで問題ない
なんだったらコンストラクタを潰して
匿名メソッドでコードブロックを引数にとらないと使えない形にして、
コードブロック終了後Disposeとかすればもっと確実かな
865デフォルトの名無しさん:2007/09/23(日) 10:37:56
基本的に放置するしかないよ
Disposeはあくまでメンバに持ってるアンマネージリソースを開放するためのチャンス
866デフォルトの名無しさん:2007/09/23(日) 11:10:02
StringDictionaryってKeyで指定してValue取り出せないの?
foreach使って取り出す以外使えない?
867デフォルトの名無しさん:2007/09/23(日) 11:14:37
インデクサ使え
868デフォルトの名無しさん:2007/09/23(日) 12:09:20
>StringDictionaryってKeyで指定してValue取り出せないの?
>foreach使って取り出す以外使えない?

どうしてその疑問に行き当たったのか不思議だw
869デフォルトの名無しさん:2007/09/23(日) 12:40:20
>>866
まずはMSDNライブラリくらい見てみたら?
http://msdn2.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx
870デフォルトの名無しさん:2007/09/23(日) 14:28:46
インデクサはItemプロパティで説明されてるから見つけにくいのかもしれんね。
演算子のoverloadもop_Equality のような名前になっている。
871デフォルトの名無しさん:2007/09/23(日) 15:40:12
C#に限った説明じゃないからな
872デフォルトの名無しさん:2007/09/23(日) 16:18:31
ただ、それってDictionaryとかでも一緒じゃん。
なにも考えずに使ったら使えたってなりそうじゃん。
873デフォルトの名無しさん:2007/09/23(日) 16:28:38
なんでインデクサがわからないような人がStringDictionaryのようなマイナーなものを使うに至ったのか気になる
Tips系のサイトで見つけたならそこに使い方も書いてあるはず
もし.NET 2.0ならDictionary<String>が使えるから存在価値は無いね
874デフォルトの名無しさん:2007/09/23(日) 21:35:22
略語に関する質問です。

・CIL⊃MSIL? CIL≒MSIL?
・CLS⊃CLI?

(CLT+CLS+MSIL+JIT)→CLI→CLR≒.net Framework→.NET言語⊃C#?

うち、CLT、MSILおよびCLIから先はMicrosoftが作った用語で合ってますか?
875デフォルトの名無しさん:2007/09/23(日) 21:39:37
CLRはMSによるCLIの実装だったかな
876デフォルトの名無しさん:2007/09/23(日) 22:01:08
>>874
MSILはCILに若干の拡張を加えたもの
877デフォルトの名無しさん:2007/09/24(月) 02:06:43
StringDictionaryよりDictionary<string,string>の方が1.5倍強処理早いね
878デフォルトの名無しさん:2007/09/24(月) 03:00:46
やっぱそうなんか。
StringCollectionよりList<string>の方が速いのは知ってたが
879デフォルトの名無しさん:2007/09/24(月) 03:05:48
StringDictionaryは大小文字を区別しないとかカルチャ意識するとかそういう比較をしてたと思う。
880デフォルトの名無しさん:2007/09/24(月) 03:06:51
C#はパクり元のDelphiみたいに、動的配列や集合型はないの?
881デフォルトの名無しさん:2007/09/24(月) 03:09:58
>>880
そういう質問をするときはまずDelphiの動的配列や集合型の説明をするのが礼儀だよ。
882デフォルトの名無しさん:2007/09/24(月) 03:10:00
パクり元・・・
883デフォルトの名無しさん:2007/09/24(月) 03:11:03
パクリもなにも同じヘジたんだしな。
884デフォルトの名無しさん:2007/09/24(月) 08:56:21
PictureBox ってフォーカスが移動しないのでしょうか?
ボタンなどはフォーカスが移動すると、ボタンの表面に点線が引かれ
フォーカスがある状態になります。
PictureBox にもフォーカスを移動させるにはどうしたらよいでしょうか?
885デフォルトの名無しさん:2007/09/24(月) 09:08:36
フォーカスってのはキーボード入力受付を意味するもんで、絵が入力受け取ってもねぇ?
886デフォルトの名無しさん:2007/09/24(月) 10:21:39
>>885
複数の絵を表示したいので、PictureBox で→を押したら次の絵に進みたいのです。
887デフォルトの名無しさん:2007/09/24(月) 11:14:02
>>886
不可視のコントロール置いて代わりにすれば?
888デフォルトの名無しさん:2007/09/24(月) 11:25:59
>>887
なるほど。
不可視のコントロールをおいて、そこの KeyDown イベントで PictureBox を制御すると。
ところで不可視のコントロールって何を使えばよいのでしょうか?
TextBox.Visible = false;
てな感じかな?
889デフォルトの名無しさん:2007/09/24(月) 11:27:57
form.KeyPreview = true
にして親フォームでキー見たら?
890デフォルトの名無しさん:2007/09/24(月) 11:30:32
カスタムコントロールでSetStyle(ControlStyles.Selectable, true)として
OnPaintを自分で実装したら?
たかが画像一枚描画するだけでしょ
891デフォルトの名無しさん:2007/09/24(月) 11:53:20
どもです。
不可視のほうも、form.KeyPreview = true の方もうまくいきました!
もうちょっと実装を進めて、良いほうを最終的に使いたいと思います。
892デフォルトの名無しさん:2007/09/24(月) 13:10:16
どこからも使われてないprivateメソッドが存在しても、コンパイラは警告も何も言わないんですが、
C#ではprivateメソッドにクラス外からアクセスすることができるって事ですか?
それとも、ただコンパイラが頭悪いだけですか?
C#作った人が前の会社で作った、Pascal風の言語のコンパイラでは、ちゃんと教えてくれるんですが。
893デフォルトの名無しさん:2007/09/24(月) 13:12:59
>>892
リフレクションを使えば、privateメンバにもアクセスできる。
894デフォルトの名無しさん:2007/09/24(月) 13:18:41
クラス外からリフレクションで触られるのはさすがに考慮しなくていいだろうけど
クラス内からリフレクションで触ってるってこともありうる
895デフォルトの名無しさん:2007/09/24(月) 15:13:45
FxCopを使う。いろいろ出すぎてわけわからなくなるけど。
896デフォルトの名無しさん:2007/09/24(月) 16:09:11
ShouldSerializePropertyはprivateが多かったべかな

まあなんにしろFxCopの役割やわなあそれ
897896:2007/09/24(月) 16:13:30
これじゃ分かりにくいべさ。
privateで外部から触られる→ShouldSerializeProperty
898デフォルトの名無しさん:2007/09/24(月) 16:30:00
FormにTextBoxを配置しているのですが、Formの空いた部分をクリックすると
TextBoxの方にフォーカスが行ってしまいます。
普通にFormにもフォーカスを当てたいのですがどのようにすればよいのでしょうか。
MouseDownイベントでFocus()メソッドを呼んでも結果は同じでした。
899デフォルトの名無しさん:2007/09/24(月) 17:15:05
>>898の考える、フォームにフォーカスが当たっている状態、ってどんな状態だ?
900898:2007/09/24(月) 17:52:30
>>899
とりあえずキー入力がFormの方に行く状態と考えてます。
901デフォルトの名無しさん:2007/09/24(月) 20:29:11
>>839
サンプルコードがあるHPとかありまつか?
902デフォルトの名無しさん:2007/09/24(月) 20:37:14
>>どこからも使われてないprivateメソッドが存在してもコンパイラは警告も何も言わないんですが、

そんなことでいちいち報告されたらたまらん。
903デフォルトの名無しさん:2007/09/24(月) 20:42:04
>>892
蛇足な機能はちゃんと削除したという報告ですか
ごくろうさん
904デフォルトの名無しさん:2007/09/24(月) 20:42:30
>>902
それはあんたの発想の方が変だw
もしくは余程物を知らないか
905デフォルトの名無しさん:2007/09/24(月) 20:46:39
どうでもいいと思う俺は技術者に向いてないんだろうか
906デフォルトの名無しさん:2007/09/24(月) 20:59:17
>>904
いつどのようなときにひつようなの?
ひらがなでしつれいします。
907デフォルトの名無しさん:2007/09/24(月) 21:10:26
かいとうがないようだ。
論破!
908デフォルトの名無しさん:2007/09/24(月) 21:11:42
>>892
それがコンパイラの仕事かどうかはしらんがReSharperで警告してくれるよ。
VisualStudioのアドインね。
909デフォルトの名無しさん:2007/09/25(火) 11:25:40
どう考えても意図的に外してるだろ
中の人が何考えて外したのかは知らんが
910デフォルトの名無しさん:2007/09/25(火) 21:16:15
oExcel = new Excel.Application();
// 指定したファイルをオープン
oWorkbook = (Excel.Workbook)(oExcel.Workbooks.Open(@"C:\AAA\AAA.xls,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value));
oSheet = (Excel.Worksheet)oWorkbook.ActiveSheet;
oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]);
oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]);
oRange1 = (Excel.Range)oSheet.Cells[8, 1];
oRange1.Value ="aaa";
oExcel.DisplayAlerts = false;
oExcel.ActiveWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange,
Missing.Value, Missing.Value, Missing.Value, Missing.Value);
oExcel.DisplayAlerts = true; //元に戻す
System.Runtime.InteropServices.Marshal.IsComObject(oRange); //oRangeの解放
System.Runtime.InteropServices.Marshal.IsComObject(oRange1); //oRange1の解放
System.Runtime.InteropServices.Marshal.IsComObject(oSheet); //oSheetの解放
System.Runtime.InteropServices.Marshal.IsComObject(oWorkbook); //oWorkbookの解放
oExcel.ActiveWorkbook.Saved = true;
oExcel.Quit(); //Excelを終了する
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
GC.Collect();
上記コードでExcelのプロセスが残ってしまいます。EXE終了するとプロセスは消えます。
COMは解放していると思うのですが・・・どなたか教えて下さい。
911デフォルトの名無しさん:2007/09/25(火) 21:20:05
nullに代入してないぞ!!!
どこかの馬鹿がnull代入必要ないとか逝ってたけど嘘だぞ。
912デフォルトの名無しさん:2007/09/25(火) 21:22:32
nullに → nullを
913910:2007/09/25(火) 21:23:25
>>911
回答ありがとうございます。
最後のところ
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
oExcel = null;
GC.Collect();
としたのですがやはり同じ現象でした。
914デフォルトの名無しさん:2007/09/25(火) 21:24:42
IsComObjectって何だよw
いや「どこかの馬鹿」が言ったのはReleaseComObjectなんてイラネ、でしょ。

しかし、ほとんど嫌がらせに近いコードだな
915デフォルトの名無しさん:2007/09/25(火) 21:24:46
oRange
oRange1
oWorkbook
916デフォルトの名無しさん:2007/09/25(火) 21:26:17
null代入は関係ないだろ常識的に考えて……

>oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]);
とか
>oExcel.ActiveWorkbook.SaveAs(...
あたりに問題ありそう。変数にうけないとまずくない? Excel使ったことないけど。

917デフォルトの名無しさん:2007/09/25(火) 21:28:45
IsComObject?
918デフォルトの名無しさん:2007/09/25(火) 21:28:50
>>916

>GC.Collect();
は無視か?

俺の言ってる馬鹿ってのは…
919デフォルトの名無しさん:2007/09/25(火) 21:32:30
>>911&>>918のことだろ。知ってるよ!
920デフォルトの名無しさん:2007/09/25(火) 21:34:27
921デフォルトの名無しさん:2007/09/25(火) 21:37:32
だからReleaseComObjectなんて要らないってw
922デフォルトの名無しさん:2007/09/25(火) 21:38:24
/// <summary>
/// COM オブジェクトへの参照を解放するプロシージャ(既存のファイルを開く場合も共用)
/// </summary>
/// <param name="objCom"></param>
private void MRComObject(ref object objCom)
{
//COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
try
{
//提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメント
if (objCom != null && System.Runtime.InteropServices.Marshal.IsComObject(objCom))
{
int i;
do
{
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom);
}
while (i > 0);
}
}
finally
{
objCom = null;
}
}
上記のメソッドをhttp://hanatyan.sakura.ne.jp/dotnet/index.html(VB版)を見てC#に置き換えたのですが
MRComObject(ref oSheet);とするとオブジェクトの変換ができない旨のエラーが発生します。
VBと違ってC#のobject型は何でも受けることができないのでしょうか?
923デフォルトの名無しさん:2007/09/25(火) 21:42:28
>>914
すみません。
System.Runtime.InteropServices.Marshal.ReleaseComObjectの間違いでした。
でも上記に修正しても駄目でした。
924デフォルトの名無しさん:2007/09/25(火) 21:43:08
ref のせい。いらん。
あと2.0以降ならわざわざループせんでもFinalReleaseComObjectがある。
925デフォルトの名無しさん:2007/09/25(火) 21:44:15
>>921
試してないだろ?
926デフォルトの名無しさん:2007/09/25(火) 21:47:09
927デフォルトの名無しさん:2007/09/25(火) 21:47:11
EXEを終了させればEXCELのプロセスが消えるのなら大筋は間違ってないと思う。
ファイナライザがあるオブジェクトの場合、
参照が消えてもGC.Collect()1回で回収されるわけではなく大体2〜3回後くらいになる。
目安として、1回目でファイナライザの実行予定としてリストされ、
2回目でファイナライザ実行、3回目でメモリ回収。
928デフォルトの名無しさん:2007/09/25(火) 22:05:17
>>923
FinalReleaseComObjectにしたらいけたよ。
929デフォルトの名無しさん:2007/09/25(火) 22:07:45
>>924
VBの場合Private Sub MRComObject(ByRef objCom As Object)なんですが
参照渡しじゃなくてもいいのでしょうか?
930デフォルトの名無しさん:2007/09/25(火) 22:08:28
でもFinalReleaseComObjectは使っていいのかな?

他のアプリから使っていても大丈夫か?
931デフォルトの名無しさん:2007/09/25(火) 22:12:03
>>928
FinalReleaseComObjectですか!ありがとうございます!
932デフォルトの名無しさん:2007/09/25(火) 22:17:26
>>930
問題ない。
RCWからの参照をきるだけだから。
COMオブジェクトの管理する参照カウンタとは別。
933デフォルトの名無しさん:2007/09/25(火) 22:21:35
>>930
RCWの参照カウンタはCOMの参照カウンタとはべつものなのでその心配はない。
このソースだとoExcel.Application.ほにゃららを無駄に何度も呼んでるから、
ApplicationオブジェクトのRCWのカウンタが1より大きく増えてる可能性があるな。

つかReleaseComObjectを使うなら中間で取得したCOMオブジェクトは全部変数に入れとけ。
こういう書き方をすると捕捉出来ないオブジェクトが無駄に増えてるぞ。
>oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]); 


934デフォルトの名無しさん:2007/09/25(火) 22:26:59
oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
あとでReleaseComObjectする必要があるのはわかるか?
935デフォルトの名無しさん:2007/09/25(火) 22:35:10
しかしまあしみじみ.NETでOfficeオートメーションなんかするもんじゃないと思うな

プロセス分けてそっちでやらすか
936デフォルトの名無しさん:2007/09/25(火) 22:35:51
だからReleaseComObjectなんていらんて。
実際やってみりゃ分かると思うが。
937デフォルトの名無しさん:2007/09/25(火) 22:39:49
>>934
すみません。どうしてオブジェクトを返す事が分かったのでしょうか?
私はどんなオブジェクトが返る事が分かりませんでしたし、どんな
オブジェクトかも分かりません(;;)
938デフォルトの名無しさん:2007/09/25(火) 22:46:11
↓null代入とかReleaseComObject要/不要の議論禁止
939デフォルトの名無しさん:2007/09/25(火) 22:48:40
>>937
ならExcelのオブジェクトモデルが分かってないってことで、
それじゃお話にならんのじゃないかい?
940デフォルトの名無しさん:2007/09/25(火) 22:55:55
正直この話はまたかという感じで飽きたな。
VB.NETにCOM専用の参照カウンタGCを搭載すれば問題の大半は解決すると思うのだが。
941デフォルトの名無しさん:2007/09/25(火) 23:11:19
>>939
すみません。VB6のときはあまり気にせずともできてしまったので・・・
オブジェクトはRangeが返ってくるのでしょうか?
942デフォルトの名無しさん:2007/09/25(火) 23:19:22
943デフォルトの名無しさん:2007/09/25(火) 23:20:06
944デフォルトの名無しさん:2007/09/25(火) 23:30:41
>>936またおまえか
945デフォルトの名無しさん:2007/09/25(火) 23:32:59
>>926
もうちょっときれいに書けないか?
946デフォルトの名無しさん:2007/09/26(水) 01:01:37
>>910
Excel11 のタイプリブを使ったので若干OpenとSaveAsの引数が増えてる。
ファイル名や範囲もいじってるので注意されたし。
string strFileName = @"D:\AAA\AAA2.xls";
Excel.Application oExcel = new Excel.Application();
//oExcel.Visible = true;
Excel.Workbooks oWorkbooks = oExcel.Workbooks;
Excel.Workbook oWorkbook = oWorkbooks.Open(@"D:\AAA\AAA.xls", 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value);
Excel.Sheets oSheets = oWorkbook.Worksheets;
Excel.Worksheet oSheet = (Excel.Worksheet) oSheets[1];
Excel.Range oRange0 = oSheet.Rows;
Excel.Range oRange = (Excel.Range) oRange0["1:1", Missing.Value];
Excel.Range oRange2 = (Excel.Range) oRange0["5:5", Missing.Value];
oRange.Copy(oRange2);
Excel.Range oRange3 = oSheet.Cells;
Excel.Range oRange1 = (Excel.Range) oRange3[8, 1];
oRange1.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "aaa"); 
続く
947946:2007/09/26(水) 01:02:46
続き
oExcel.DisplayAlerts = false; 
oWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, 
    Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, 
    Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
oExcel.DisplayAlerts = true; //元に戻す 
oWorkbook.Saved = true;
//oWorkbook.Close(false, Missing.Value, Missing.Value);
//oWorkbooks.Close();
oExcel.Quit(); //Excelを終了する 
Marshal.ReleaseComObject(oRange0);
Marshal.ReleaseComObject(oRange); //oRangeの解放 
Marshal.ReleaseComObject(oRange1); //oRange1の解放 
Marshal.ReleaseComObject(oRange2);
Marshal.ReleaseComObject(oRange3);
Marshal.ReleaseComObject(oSheet); //oSheetの解放 
Marshal.ReleaseComObject(oSheets);
Marshal.ReleaseComObject(oWorkbook); //oWorkbookの解放 
Marshal.ReleaseComObject(oWorkbooks);
Marshal.ReleaseComObject(oExcel); //oExcel を解放 
948946:2007/09/26(水) 01:13:16
oRange.Copy(oRange2) はobjectで実体はboolを
戻してるようなのでReleaseComObjectは不要だった。
もれなくReleaseComObjectするのはたいていのことではない。
あきらめてGCに任せるのもひとつの方法だと考えよう。
VB6ではなぜ出来る限り早くEXCELを開放してしまわないといけなかったか、
.NETではそれが必ずしも重要ではなくなったかの理由は以下を参照されたし。
http://pc11.2ch.net/test/read.cgi/tech/1189038267/37-38
949デフォルトの名無しさん:2007/09/26(水) 08:17:10
前々からこれも疑問でしょうがないんだが、
>oExcel.Quit(); //Excelを終了する

これって、まあもちろんエクセルの使われ方にもよるんだけど
ほとんどの場合、ユーザーの使い勝手の観点から言えば不要じゃないだろうか。

というか、こんなことするから「プロセスが残る」なんて問題が起こるんじゃん。

俺はこの手のコード見るたびに、世の中手を動かしてコピペするだけで
頭を使わない馬鹿が多いんだな、と思っちゃうよ。
950デフォルトの名無しさん:2007/09/26(水) 11:07:33
>>934
> oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
> あとでReleaseComObjectする必要があるのはわかるか?

試しに
ojject oTest;

oTest = oRange.Copy(..) としてみましたが
voidが返ってくる旨のエラーメッセージが出るのですが・・・
951デフォルトの名無しさん:2007/09/26(水) 11:12:24
>>946
ご教授ありがとうございます。サンプル例まで提示して頂いて感謝します。

952デフォルトの名無しさん:2007/09/26(水) 11:32:16
>>950
Excelのversionの違いかもしれんね。
boxingされたSystem.Bool、処理に成功するとTrueが戻ってるよ。
msdnでもobjectが戻ってくることになっている。ただし内容の説明がない。
http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.copy(VS.80).aspx
953デフォルトの名無しさん:2007/09/26(水) 11:42:03
>>952
回答ありがとうございます。色々難しいですね。
954デフォルトの名無しさん:2007/09/26(水) 12:08:22
>>949
使ったことがないのがみえみえじゃん(笑

Officeのオートメーションは操作自動化のためのインターフェイスで、
手で操作するのと同じことがCOM経由で出来るというもの。
マクロのようにApplication#Visible = trueの表示状態で使うのが本来の使い方なのだと思う。
つまり立ち上げたExcelは別途ユーザーに閉じさせる前提で起動したままにしておくということ。
ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
非表示のまま使用することがほとんどであり、
ユーザーのニーズにOfficeのオートメーションの仕組みがあっていないといえる。
955デフォルトの名無しさん:2007/09/26(水) 12:09:04
お触り禁止
956デフォルトの名無しさん:2007/09/26(水) 12:21:02
>>954
>ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
>非表示のまま使用することがほとんどであり、

なるほど確かにそういう使い方なら意味はある。というか必須だね。
ただそういう使い方が「ほとんど」かどうかは疑問だけど。
957デフォルトの名無しさん:2007/09/26(水) 12:24:23
コメントに文句言ってるのかと思った。
ソースと同内容のコメントは余計だよなあ
958デフォルトの名無しさん:2007/09/26(水) 12:53:25
>>954
本来はという話ならVBAマクロやVSTOのように、
EXCELやWORDの機能を拡張するためのオートメーションなんだろう。
アプリケーションからEXCELを呼び出すのは方向が逆。
959デフォルトの名無しさん:2007/09/26(水) 13:59:47
>>956てか最初からそういう前提の話しかしてないだろ
960デフォルトの名無しさん:2007/09/26(水) 22:46:47
非表示だと動かない機能があって…
961デフォルトの名無しさん:2007/09/26(水) 22:52:03
どんな昨日だよwExcelにそんなの無いだろ
962デフォルトの名無しさん:2007/09/26(水) 23:08:02
あるよ
963デフォルトの名無しさん:2007/09/26(水) 23:11:40
どの機能?
964デフォルトの名無しさん:2007/09/26(水) 23:17:23
プレビュー?
965デフォルトの名無しさん:2007/09/27(木) 22:28:06
非表示でもフォーカス当てたり、アクティブに出来るの?
sendkeys使える?
966デフォルトの名無しさん:2007/09/27(木) 22:50:04
>>965
フォーカス、アクティブ、sendkeysってどういうときに使うの?
967デフォルトの名無しさん:2007/09/27(木) 23:22:38
もうやめとけってw

昔VB6とかからエクセル操作する場合には、操作する対象のオブジェクトは
かならず表示状態にして、かつアクティブにすべし、みたいなことが
「おまじない」的に推奨されてたから、それをいまだに信じている人がいるんだよたぶん。

某花ちゃんなんたらってサイトとか見てみるといいよ。
968デフォルトの名無しさん:2007/09/27(木) 23:37:36
>>967
ド素人にVB6でExcel操作させると、画面のリフレッシュとかプログレスバーの表示なんて処理を考えずに作るから
固まってるかどうか判別しにくくなるだろうから表示状態にするのは正解かもね
.netでも非表示にさせると偉い目にあいそう
969デフォルトの名無しさん:2007/09/28(金) 00:28:17
office2007ってファイル出力にXMLが選択できるそうだが
中身解析すれば手軽に直接ファイル生成ができると思っておk?
970デフォルトの名無しさん:2007/09/28(金) 00:54:57
仕様が公開されてるでそ
971デフォルトの名無しさん:2007/09/28(金) 01:11:52
おkじゃない
972デフォルトの名無しさん:2007/09/28(金) 01:16:45
XPSのこと?あれは複雑っぽいな。
973デフォルトの名無しさん:2007/09/28(金) 03:11:54
xml+圧縮かかってたような
974デフォルトの名無しさん:2007/09/28(金) 11:34:10
Office Open XMLだろ
ほんとにただのXML
975デフォルトの名無しさん:2007/09/28(金) 12:12:01
ただじゃないxmlてどんなん?
976デフォルトの名無しさん:2007/09/28(金) 13:40:48
docxやxlsx
977デフォルトの名無しさん:2007/09/28(金) 14:17:55
Panelコントロールについての質問なんですが、
AutoScrollをtrueにしたPanelをDock.FillでFormに置き、
Panel.ClientSizeChangedでサイズを変更するようにした幅がPanelClientSize.Widthな
コントロールをPanelの中に置いたのですが、Formを最大化後に元に戻すと
ちゃんとClientSizeChangedが発生し、コントロールのサイズも変わってるにもかかわらず
横スクロールバーが表示されてしまいます。
コントロールのLeftは0で、横にスクロールしてもWidthがPanelのサイズをオーバーしてる
とは思えません。
WndProc()でWM_RESTOREを拾ってリサイズしても変わりませんでした。

このPanelの横スクロールバーを消すにはどうしたらいいでしょうか?
978デフォルトの名無しさん:2007/09/28(金) 19:50:42
class MyClass : IMyInterface
とするとき、

object obj = new MyClass();
MyClass my = (MyClass)obj;



IMyInterface interface = new MyClass();
MyClass my = (MyClass)interface;

って速度変わらないですかね?
979デフォルトの名無しさん:2007/09/28(金) 19:50:46
で、結局どうなんよ
直接ファイル生成できそう?
それとも無理?
2007使ってる香具師回答きぼんぬ
980デフォルトの名無しさん:2007/09/28(金) 19:58:55
速度気にするんなら通常のキャストじゃなくて as キャストだろ
981デフォルトの名無しさん:2007/09/28(金) 20:03:10
>>980
asって値型だと型が合致しなかった場合はdefault(struct)になるんですかね?
982デフォルトの名無しさん:2007/09/28(金) 20:33:06
ならない。
Nullableな値型ならnullが返される。非Nullableな値型ならコンパイルエラー。
983デフォルトの名無しさん:2007/09/28(金) 20:45:28
>>979
Office System 互換機能パックで 2003でもいけた。 hoge.xmlで保存してちょ。
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <Worksheet ss:Name="XmlSheet">
  <Table>
   <Row>
    <Cell><Data ss:Type="Number">1</Data></Cell>
    <Cell><Data ss:Type="Number">2</Data></Cell>
   </Row>
   <Row ss:Index="3">
    <Cell><Data ss:Type="String">aaa</Data></Cell>
    <Cell><Data ss:Type="String">bbb</Data></Cell>
   </Row>
  </Table>
 </Worksheet>
</Workbook>
984983:2007/09/28(金) 20:47:53
あらかじめExcelで雛形作っておいて部分的に書き換えるのがよさそう。
テンプレートエンジンがあれば使えそうだ。
985デフォルトの名無しさん:2007/09/28(金) 22:33:34
つかただのxmlスプレッドシートで事足りんじゃねーの?
986デフォルトの名無しさん:2007/09/28(金) 22:35:01
っていうよりただのxmlスプレッドシート?
互換パックすらいらないんじゃ…
987デフォルトの名無しさん:2007/09/28(金) 22:35:42
988デフォルトの名無しさん:2007/09/28(金) 23:11:50
>>980
as キャストの方が早いの?
989デフォルトの名無しさん:2007/09/29(土) 00:43:12
次スレ余路。
990デフォルトの名無しさん:2007/09/29(土) 02:08:18
>988
asの方が早いし型が違う場合に例外が飛ばずにnullが返る。
キャストで型が違って例外が飛ぶと結構重いし。
でも、ダウンキャストしなくても済むようにインターフェースを作る方がいいんじゃない?
991デフォルトの名無しさん:2007/09/29(土) 02:51:50
>>980があほなんだろ。
992デフォルトの名無しさん:2007/09/29(土) 02:54:15
>asの方が早いし型が違う場合に例外が飛ばずにnullが返る。
asのが早いってそんな違いがあるの?
例外とぶって飛ばなきゃ使う側でNullReference〜になるかチェックが必要になるわけで
正しい型が入っているはず、という状況なら普通のキャストの方がまだ望ましい動きじゃないかい?
993デフォルトの名無しさん:2007/09/29(土) 03:28:45
>992
正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。
違う型のものが入ってるかもしれない場面でダウンキャストするってのは何か作りがおかしいので考慮する必要ってあんまりないと思うよ。
994デフォルトの名無しさん:2007/09/29(土) 03:41:11
msdnをみるとis演算子の分asの方が命令数が多いように見える。
>as 演算子はキャストと似ていますが、変換エラーの時に、
>例外を発生せずに null を返す点が異なります。次に式の形式を示します。
>expression as type
>これは、次と同じ意味になります。
>expression is type ? (type)expression : (type)null
995994:2007/09/29(土) 03:59:31
IL上は1命令違うだけで差はなかった。
IL_0002:  isinst     A
IL_0002:  castclass  A
996デフォルトの名無しさん:2007/09/29(土) 04:09:22
結局asは早くも遅くもないのか
997デフォルトの名無しさん:2007/09/29(土) 04:15:58
じゃあ、Delphiのasはキャストより速いの?遅いの?
998デフォルトの名無しさん:2007/09/29(土) 06:59:24
>違う型のものが入ってるかもしれない場面でダウンキャストするってのは
>何か作りがおかしいので考慮する必要ってあんまりないと思うよ。

だからこそキャストで例外になるようにするんじゃねーかよ。
まあNull参照例外でも似たようなもんではあるけど、
キャスト例外のがまし。
999デフォルトの名無しさん:2007/09/29(土) 07:00:16
>正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。

asの方が早いってのは思い込みじゃねーのか?といってる。
1000デフォルトの名無しさん:2007/09/29(土) 07:08:03
is演算子が面白い。
o is CLASS1 が o as CLASS1 != null と同じコードを吐いている。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。