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

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

■ このスレッドは過去ログ倉庫に格納されています
0001ななしぃ#2007/11/18(日) 15:53:41
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

前スレ: ふらっとC♯, C#(初心者用) Part20
http://pc11.2ch.net/test/read.cgi/tech/1191036844/
0286デフォルトの名無しさん2007/12/03(月) 08:00:19
最近thisを記述しなくなったのですが
つけなければアクセスに時間がかかるとか何か不都合がありますか?
0287デフォルトの名無しさん2007/12/03(月) 08:12:19
無いけど付けた方が良い。
0288デフォルトの名無しさん2007/12/03(月) 08:42:46
>>287
ありがとう!早速直します!
0289デフォルトの名無しさん2007/12/03(月) 10:46:56
>>287
その理由を簡単にでも教えてください
0290デフォルトの名無しさん2007/12/03(月) 11:05:13
無いからつけなくてもいい
0291デフォルトの名無しさん2007/12/03(月) 11:05:44
気分
0292デフォルトの名無しさん2007/12/03(月) 11:07:22
どっちがいいなんて正解はない。
状況も聞かずに無条件につけるべきなんていう奴は知らない。
0293デフォルトの名無しさん2007/12/03(月) 11:10:19
拡張メソッドはthisつけないと呼び出せない
拡張メソッドと分けて見やすくする目的だとthisはつけないほうがいい
0294デフォルトの名無しさん2007/12/03(月) 12:11:12
this.を付けないならインスタンスメンバにはプレフィックスを付けることにしたほうがいいと思う
0295デフォルトの名無しさん2007/12/03(月) 12:47:46
m_とか? きめえ
プレフィックスはインテリセンスの利きを悪くするし可読性も落ちるだろ
0296デフォルトの名無しさん2007/12/03(月) 13:07:19
_だろ。
IronPythonのコードがそうなってる。
0297デフォルトの名無しさん2007/12/03(月) 13:21:21
MSの中でも_が多いみたいだよ
C++な人が多いからとか、VB.NETではつけないとプロパティ名と被りやすいから
それに合わせてるとかきっとそういうことだろうけど
0298デフォルトの名無しさん2007/12/03(月) 13:24:16
C#の話をしようぜ
どっちにしろインテリセンスの利きは悪くなる
可読性は_ならたいして落ちないだろうけど
C#の標準命名規則にはそんなんないのだ
0299デフォルトの名無しさん2007/12/03(月) 13:33:06
MS公式のガイドラインがあるのはアセンブリ外から見える名前についてだけだよ
0300デフォルトの名無しさん2007/12/03(月) 13:37:07
とりあえずprivateフィールドは小文字で始めますって書いてなかったか
0301デフォルトの名無しさん2007/12/03(月) 13:45:43
インテリセンスの危機が悪いってのはどういうこと?
0302デフォルトの名無しさん2007/12/03(月) 13:48:32
プレフィックスがあると一文字入力しても全然絞れない
0303デフォルトの名無しさん2007/12/03(月) 13:48:45
>>300
公式には無いよ
「C#コーディング標準」ではプリフィックス付けてもいいとされてるし、
大文字小文字を区別した名前を付けるなとあるから、それを守るんであれば
何か付けないとプロパティと被る
0304デフォルトの名無しさん2007/12/03(月) 14:05:51
あるwebサイトのデータを数秒間隔で取得してフォームに表示したいのですが
sleepで数秒寝かせて無限ループで取得という方法でいいんでしょうか?
0305デフォルトの名無しさん2007/12/03(月) 14:10:19
一定だと怪しまれるからランダムを入れた方がいいかもね
0306デフォルトの名無しさん2007/12/03(月) 14:11:52
>>305
でもその方法だとなぜか重すぎてキャンセルとか受け付けてくれないんですよ
0307デフォルトの名無しさん2007/12/03(月) 14:21:14
>>306
どうせ0秒から3秒くらいのランダムとかして平均1.5秒でアクセスしてるんだろう。
0308デフォルトの名無しさん2007/12/03(月) 14:39:13
つーかメインのスレッドでスリープしてるんだろうw
0309デフォルトの名無しさん2007/12/03(月) 14:47:29
>>308
mainのなかでwhile使って無限ループさせてるんでそうだと思います
guiのプログラミングって何が何だかわからない
0310デフォルトの名無しさん2007/12/03(月) 14:48:47
guiはメインが全部終了しないと動き出さない
0311デフォルトの名無しさん2007/12/03(月) 15:12:18
ジェネレートってどうゆう意味ですか?

教えてくださいお願いします。
0312デフォルトの名無しさん2007/12/03(月) 15:39:33
イタリア風のアイスだよ
0313デフォルトの名無しさん2007/12/03(月) 15:51:42
>>312

それはジェラート。
0314デフォルトの名無しさん2007/12/03(月) 16:19:29
string data = "M-SEARCH * HTTP/1.1\r\nMX: 3\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nST: urn:schemas-upnp-org:service:WANIPConnection:1\r\n\r\n"

もたいな文字列が在る場合。↓みたいな感じで表示するにはどうすれば良いですか?

M-SEARCH * HTTP/1.1\r\n
MX: 3\r\n
HOST: 239.255.255.250:1900\r\n
MAN: "ssdp:discover"\r\n
ST: urn:schemas-upnp-org:service:WANIPConnection:1\r\n
\r\n
0315デフォルトの名無しさん2007/12/03(月) 16:25:33
\r\n→\\r\\n\r\n
0316デフォルトの名無しさん2007/12/03(月) 19:24:06
>>309
夢幻ループ化。

処理をWindowsに返さないといけないんです。
Windowsから仕事しロッテ言われてから動けばいいんです。
自分から動きたい場合は、そのタイミングで呼び出してもらえるように約束を取り付けておけばいいんです。
0317デフォルトの名無しさん2007/12/03(月) 21:27:09
>>309
GUI関係ないだろ・・・
Timer使え
0318デフォルトの名無しさん2007/12/03(月) 21:49:01
すいません質問です。
名前空間は、団体名. 技術名. 分野と記述するのが推奨だと始めて知ったのですが、
普通はこの形式で名前空間定義をしているのでしょうか?
0319デフォルトの名無しさん2007/12/03(月) 21:53:09
そうです。
0320デフォルトの名無しさん2007/12/03(月) 21:59:43
そうでもないよ。
0321デフォルトの名無しさん2007/12/03(月) 22:10:15
楽しいか?
しかし、どこのスレも下らん馴れ合いで嬉しくなっちゃう単細胞な馬鹿が多いな。
0322デフォルトの名無しさん2007/12/03(月) 22:19:57
アンマネージdllはdllimportで呼べるそうですが、これを使えばいちおう理論的には全てのdllを呼べる、というわけでもないんでしょうか?
ググるといろんなサイトや掲示板で、Cなどで作ったdllのimportに苦労してる人がけっこう見つかります。
でも、アドバイスしてる人も“難しい”とは言いますが“不可能”と言ってる人は見かけません。

理論的に不可能ではないが、非常に難しい場合もある、ということでしょうか?
0323デフォルトの名無しさん2007/12/03(月) 22:36:55
>>322
Cのdllなら基本的に難しいことはないと思うが・・・。
C++のクラスライブラリをインポートするのは不可能。
03243222007/12/04(火) 01:13:57
>>323
引数が構造体だったりすると大変にならないですか?
実は以前、他所様のCで書かれたdllを使おうと試みたんですが、
引数の構造体の中身が分からなくて断念したことがあります・・・
私の能力が至らないだけで、本当はできるんでしょうか?

>C++のクラスライブラリをインポートするのは不可能。
え、そうなんですか?すいません、どうして不可能なのか簡単に教えて頂けないでしょうか?
0325デフォルトの名無しさん2007/12/04(火) 01:24:16
C#のここで質問していいか迷うけど
C#でプログラミングしてるからここに。

TcpClient使ってネットワークストリームから出力すると
レスポンスヘッダと内容自体がいっしょくたになるけど
これをレスポンスヘッダと内容を効率よく分解する方法ってない?
TcpClient以外を使うっていうのは無しで。
0326デフォルトの名無しさん2007/12/04(火) 01:29:44
>>324
C++のABIは標準化されてないから
0327デフォルトの名無しさん2007/12/04(火) 02:19:00
>>324
構造体なんて定義すればいいだけだよ
C同士だって構造体の中身がわからなければ何もできないでしょ
03283222007/12/04(火) 02:51:26
>>326
アンマネージなC++クラスライブラリだと駄目ってことでしょうか?
やるとしたら、マネージなのに作り直すか、クラスを使わないようにする、という認識で合ってますか
0329デフォルトの名無しさん2007/12/04(火) 02:55:37
あってる
もちろんクラスをマネージコードとやりとりしなければいいのであって、DLL内だけで使用する分には問題ないよ。
0330デフォルトの名無しさん2007/12/04(火) 03:14:46
C++/CLIでラップすればいいんじゃねえの
0331デフォルトの名無しさん2007/12/04(火) 04:49:49
C++クラスのDLLをC#から直接呼び出すのは、
DllImportのCallingConvention.ThisCallを使えばできるが、
ファクトリや開放用のメソッドが必要になったりで
正直おすすめしない。
03323222007/12/04(火) 06:09:38
>>327
いや、中身が分からないんです。非公開というか勝手に使ってるだけなので。
で、もう一度トライしてみたらできました!朝までかかってしまいましたが・・・
dll内の関数の引数や返り血が構造体のポインタなのですが、C#のほうで適当に
 struct hoge{};
と空っぽの構造体を作ってしまいました。とりあえず正常に動きました!(´∀`)ヤッター
でも、何故これで動くのかあんまりよく分かってないのですが、このまま使って大丈夫でしょうか??
unsafeでやってるので少し不安です・・・

>>329
探したら↓などを見つけました。
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20010&forum=7
COMを使えばクラスライブラリも呼べるようですが、茨の道みたいですね

>>330
無理してコードを変えるより、そのままC++/CLIでラップするほうが楽だし安全、ということでしょうか。
・・・というか、これ使えば何でもできるんじゃ?もしかして相当すごい機能?

>>331
すいません、まだそういうことできるレベルじゃないです。。


もう寝ます。皆様お付きあい頂いて、ありがとうございました。
0333デフォルトの名無しさん2007/12/04(火) 10:47:07
フォーム上のボタンを押したらMonthCalendarコントロールが表示するようにしたいのですが、
このMonthCalendarコントロールを表示した際にフォーム内からはみ出た部分が表示され
ないのですが、回避するにはどうしたらよいのでしょうか?
0334デフォルトの名無しさん2007/12/04(火) 11:39:04
別のフォームに作れば
0335デフォルトの名無しさん2007/12/04(火) 12:18:46
フォームにラベルを複数置いたのですが
これらを配列として扱うには下記の方法でよろしいでしょうか?
label1〜label4がフォームに置いたラベルです

Label[] lblArr = new Label[4];
lblArr[0] = label1;
lblArr[1] = label2;
lblArr[2] = label3;
lblArr[3] = label4;

考え方がよくなかったりしたら教えてください
0336デフォルトの名無しさん2007/12/04(火) 12:33:27
>>333
あらかじめ貼っておくか、追加するときに場所と大きさ計算してフォームのサイズを調整したら

>>335
いいよ
Label[] lblArr = new Label[]{ label1, label2, label3, label4 };
でもいい


03373352007/12/04(火) 13:15:21
>>336
数が少ないなら宣言時に入れたほうがすっきりするんですね
そうするようにします。

ありがとうございました。
0338デフォルトの名無しさん2007/12/04(火) 13:34:32
for(int i=0;i<4;i++){lblArr[i]=(Label)this.Controls["label"+i];}
一応こういうのもある
>>335-336の方が好ましいのでできればやめた方がいいけど
0339デフォルトの名無しさん2007/12/04(火) 15:05:32
コンソールアプリなのですが、キーボードステータスを読み取るにはどうすればよいのでしょうか。
03403392007/12/04(火) 15:10:04
(続き)
タイマーイベントのハンドラの中で、現在押下されているキーをすべて取得するといった内容で考えております。
0341デフォルトの名無しさん2007/12/04(火) 15:13:29
いつもお世話になっております。ご相談させてください。

UDPポートをbindして、クライアントから一方的にudpデータが
送られてくる状況で、パケットの取りこぼしが発生してしまいます。

クライアントから送られてくるデータの、先頭2バイトをインクリメントデータの
シーケンス番号としておりまして、これを連続して取り出したところ
最大で10パケットほどごっそり抜けるといった現象が発生しています。

以下がプログラムの流れです。

1.ソケット作成
2.Socket.BeginReceiveFrom〜で非同期受信開始
3.コールバックメソッドで、先頭2バイトを読み出してシーケンス番号を確認。
4. 3.のシーケンス番号を保存して、再びSocket.BeginReceiveFrom〜を呼び出し。
5.再度のコールバックメソッドで、4.で保存したシーケンス番号と
 新しいシーケンス番号に2以上の差があるときがある。(おおよそ2〜10程度)

UDP自体は信頼性のないネットワークなのは十分承知しているのですが、
クライアントからのデータはCore2DuoのPCでデータを受信しているので、
CPUパワーからして本当に取りこぼすのか疑問に思っております。

Wiresharkでパケットをキャプチャするとネットワークライン上には
正しくデータは流れているので、Windowsは取りこぼしていないが、
アプリケーションの段階で取りこぼしているのかなと想像はしているのですが……。

どなたか同じような症状の方おりませんでしょうか。
またわかる方がいればご教示願えませんでしょうか。

orz

0342デフォルトの名無しさん2007/12/04(火) 15:19:06
>>341
1パケットに複数まとまってるんでない?
0343デフォルトの名無しさん2007/12/04(火) 15:20:32
初歩的な質問ですみません。
C#の文法規則の意味について教えてください。

C++は理解しており、メンバーに対するアクセス指定は理解できるのですが
クラスに対するアクセス指定の意味がわかりません。

名前空間内でクラス宣言を行うときにクラス自体にpublicかinternalの
アクセス指定ができますが、これらは何を意味するのでしょうか?

理解していること
・名前空間内で指定可能なアクセス指定子はpublicかinternalのみ
・省略するとinternalとなる

0344デフォルトの名無しさん2007/12/04(火) 15:26:07
>>340
GetAsyncKeyState()等のAPI 使うとかでどうか
0345デフォルトの名無しさん2007/12/04(火) 15:29:00
>>343
http://msdn2.microsoft.com/ja-jp/library/ba0a1yw2(VS.80).aspx
03463392007/12/04(火) 16:02:59
>>344
ビンゴでした。THANKS!
http://www.cam.hi-ho.ne.jp/oishi/tips.html#keystate
を参考に、GetKeyStateで出来ました。

[DllImport("user32.dll")]
private extern static Int16 GetKeyState(VirtualKeyStates nVirtKey);

private enum VirtualKeyStates : int
{
VK_LBUTTON = 0x01,
VK_RBUTTON = 0x02,
}

public void OnTimedEvent(Object sender, ElapsedEventArgs e)
{
bool fLeftPressed = (GetKeyState(VirtualKeyStates.VK_LEFT) & 0x8000) != 0;
bool fRightPressed = (GetKeyState(VirtualKeyStates.VK_RIGHT) & 0x8000) != 0;
}

03473392007/12/04(火) 16:16:20
おっと失礼
private enum VirtualKeyStates : int
{
VK_LEFT = 0x25,
VK_RIGHT = 0x27,
}
必要な定義はこちらでした。
0348デフォルトの名無しさん2007/12/04(火) 16:51:16
>>345
ありがとうございます。

『public と宣言された型には、他のすべての型がアクセスできます。
internal と宣言された型には、同じアセンブリに所属する型だけが
アクセスできます。』

とあるのですが、ここでいうアセンブリとはソースファイルという理解
で正しいでしょうか?
03493482007/12/04(火) 16:55:18
アセンブリとはDLLやEXEのことでした。

ということは、internal指定のクラスの場合は同一DLL, EXE
からしか参照できなくて、public指定のクラスの場合は
別のDLLやEXEから参照できるということですね。
0350デフォルトの名無しさん2007/12/04(火) 16:57:51
おおかた合ってる。
0351デフォルトの名無しさん2007/12/04(火) 16:59:18
>>346
Keysつかえよ。
0352デフォルトの名無しさん2007/12/04(火) 22:38:31
P/Invokeでは[DllImport("kernel32.dll")]などと指定しますが、
kernel32.dllやuser32.dllなどといったものは64ビットWindowsにも存在するのでしょうか?
またこれらに64ビットポインタを渡しても問題ないのでしょうか?

手元に64ビット環境がないので、よろしくお願いします。
0353デフォルトの名無しさん2007/12/04(火) 22:46:18
存在する
64bitのAPIも同名DLL
WoW64で動くかどうかでどっちを使うか自動判断
明示したけりゃ/platform
0354デフォルトの名無しさん2007/12/04(火) 23:03:46
>>353
どうもありがとうございます。
特別な理由がなければ何も考えずに書けばいいんですね。

もう一つ質問があるのですが、32用と64ビット用の二つのdllがある場合、
P/Invokeで実行環境に適したdllを読み込むことはできますか?
0355デフォルトの名無しさん2007/12/04(火) 23:22:37
>>354
>>353のレスちゃんと読んでやれよ・・・
03563522007/12/04(火) 23:38:07
>>355
どういうことです?
WOW64上で動作させて32ビット用を読み込めということですか?

ちなみにこの場合のdllはシステムにあるものではなく、自作のdllという意味です。
0357デフォルトの名無しさん2007/12/04(火) 23:40:21
IntPtr.Sizeみて分岐
0358デフォルトの名無しさん2007/12/04(火) 23:46:04
自動判断って書いてあるように見えるけど?
0359デフォルトの名無しさん2007/12/04(火) 23:49:07
system32/syswow64に入らないのなら自動呼び分けはないんじゃないかな
シングルトンで実装させれば使う側は気にしなくてすむようになるけど
DLL検索パスを利用してうまいことやればdll名だけ違うDllImportとか書かなくてもなんとかなるかな
0360デフォルトの名無しさん2007/12/04(火) 23:53:10
ま、正しいのはやはり/platformでターゲットを明示すること
03613522007/12/04(火) 23:56:03
>>357
最悪そうせざるをえないですね。

>>359
実行時に検索パスを設定するorアーキテクチャによって変更するってできるんですかね?
できたらかなりすっきり書けそうですが。

>>360
そうしたら実行環境が限られてしまうんじゃないですか?
0362デフォルトの名無しさん2007/12/05(水) 00:01:51
ラッパかぶせてその中で分岐しとけばごちゃごちゃしたりはしないだろう
0363デフォルトの名無しさん2007/12/05(水) 00:02:26
IntPtr.Size
PATH

> そうしたら実行環境が限られてしまうんじゃないですか?
限られるんじゃなくて限らせるの。
x86とx64両方つくりゃいいだけ。
0364デフォルトの名無しさん2007/12/05(水) 00:08:05
>>363
それはちょっと保守の手間が増えるので避けたいです。

>>362
そうですね。とりあえずその方法でいきたいと思います。
どうもありがとうございました。
03653522007/12/05(水) 00:08:48
名前忘れました。>364=>352
0366デフォルトの名無しさん2007/12/05(水) 00:30:28
色々なクラスで使うメソッドを、ユーティリティクラスを作ってstaticメソッドで呼び出すのと
継承を使って派生させて使うのとどっちがいいのでしょうか?

今までベースクラスに汎用メソッドを書いていたのですが、
Xmlの操作とか、クラスの本質に関係のない部分はユーティリティクラスのほうがいいのかな
と最近思うようになってきました。

HttpUtility.UrlEncodeみたいに、.NETでもユーティリティクラスの存在そのもの
を禁止されているわけではないですよね・・・
0367デフォルトの名無しさん2007/12/05(水) 00:31:10
ユーティリティクラスあるだろ
Mathとか
0368デフォルトの名無しさん2007/12/05(水) 00:41:31
どっちがいいといってもことそれぞれとしか
0369デフォルトの名無しさん2007/12/05(水) 00:45:57
まあユーティリティクラス作る方が標準的じゃないか
0370デフォルトの名無しさん2007/12/05(水) 01:11:47
GoogleMapsAPIを利用してて自分もこういうWebAPIというものを
作ってみたいと思いました。
WebAPIを作るにあたり必要なスキルは何でしょうか?
またWebAPIの開発の参考書などがあればご紹介ください。
WebAPIを利用するための参考書じゃなくて自分でWebAPIを開発する参考書です。
0371デフォルトの名無しさん2007/12/05(水) 01:27:34
>>367-369
レスありがとうございます。

staticメソッドを計算の代用とか気軽な目的で自体は
問題なさそうですね・・・。
0372デフォルトの名無しさん2007/12/05(水) 01:48:25
>>370
Google Maps API 質問箱
http://pc11.2ch.net/test/read.cgi/tech/1131627583/
0373デフォルトの名無しさん2007/12/05(水) 09:13:16
継承でやる方が邪道だよ大抵は。
まあユーティリティと言ってるものの内容にもよるけど。
0374デフォルトの名無しさん2007/12/05(水) 12:14:48
Sin()やSqrt()がSystem.Doubleのインスタンスメンバだったりしたら煩わしいことこの上ないよな。
03752852007/12/05(水) 12:48:53
>>285わかる方いませんか?
0376デフォルトの名無しさん2007/12/05(水) 12:59:05
ユーティリティクラスはクラス名短くしないと読むのが困難になりがち
0377デフォルトの名無しさん2007/12/05(水) 14:53:40
C#で始めてプログラミング始めたんですけどお勧めの書籍とかサイトってありますか?
0378デフォルトの名無しさん2007/12/05(水) 16:05:40
ふらっとじゃない方のC#スレの>>4
0379デフォルトの名無しさん2007/12/05(水) 17:04:15
@ITのC#入門はガチですとも
0380デフォルトの名無しさん2007/12/05(水) 17:07:52
他の言語の経験があるなら、ホントに@ITのC#入門読むだけですむよな。
0381デフォルトの名無しさん2007/12/05(水) 17:13:42
オラはオライリーのプログラミングC#で覚えた。
ガイジン特有の変な例えのせいでデリゲートが全然理解できなかったが。
0382デフォルトの名無しさん2007/12/05(水) 17:27:25
うちは標準C#入門っていう、いかにもな本だった。
なかなか読みやすかったのを覚えてる。
0383デフォルトの名無しさん2007/12/05(水) 17:31:37
LINQのおかげでdelegateの意味は全然変わっちゃったしな
03843352007/12/05(水) 18:07:26
正直デリゲートはわかってないけど
やばいかな
03853352007/12/05(水) 18:08:05
@IT逝ってきます
■ このスレッドは過去ログ倉庫に格納されています