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

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

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

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

前スレ

ふらっとC#,C♯,C#(初心者用) Part40
http://pc12.2ch.net/test/read.cgi/tech/1239599317/
0153デフォルトの名無しさん2009/06/07(日) 21:53:32
>>150
どんだけ劣等感持ってんだよw
0154デフォルトの名無しさん2009/06/07(日) 21:55:43
>>152
分からん
死ぬ前に教えてくれ
0155デフォルトの名無しさん2009/06/07(日) 21:56:03
C++も極めればそれなりに使える、自演C++厨房は巣に帰ってガンバレ
0156デフォルトの名無しさん2009/06/07(日) 21:57:34
C++に過剰反応する奴はもう寝ろ。疲れてるだろ。
0157デフォルトの名無しさん2009/06/07(日) 21:57:35
コンパイル結果はJIT次第だ、ローレベルの話がしたくて仕方がないC++坊は無視
0158デフォルトの名無しさん2009/06/07(日) 21:58:37
>>156
あのさぁ、過剰反応つーか、埋め尽くすなよって話だろ
ここなんのスレだよ?言ってみろ
0159デフォルトの名無しさん2009/06/07(日) 21:58:52
>>157 ← JITがどういう処理をしてるか分かってない奴。
0160デフォルトの名無しさん2009/06/07(日) 22:00:47
>>158
反応しないでスルーできないのか?  スルーしたら埋め尽くされないの。2ch初心者?
おまえみたいのがいるから荒れるんだよ。
0161デフォルトの名無しさん2009/06/07(日) 22:02:12
>>158
スルーしろっつってんだよ。馬鹿か?
0162デフォルトの名無しさん2009/06/07(日) 22:02:15
ほっとていも、ほっとかないでも酷有様、つか埋め尽くし犯人お前だろ >> 160
0163デフォルトの名無しさん2009/06/07(日) 22:02:41
だまんねえと改行で埋めるぞ

だまれ
0164デフォルトの名無しさん2009/06/07(日) 22:03:02
>>158
【魔力】書き込むと願いが必ず叶うスレ【強力】409
だろが
0165デフォルトの名無しさん2009/06/07(日) 22:04:11
C++の人アタマおかし過ぎ
0166デフォルトの名無しさん2009/06/07(日) 22:04:58
それにしても >>142 一人で必死すぎだろw
0167デフォルトの名無しさん2009/06/07(日) 22:05:08
>>164
VB スレに誤爆すんなよw
0168デフォルトの名無しさん2009/06/07(日) 22:05:31
"1"が他に置き換わるような設計してる時点でミスですよ僕に言わせれば
0169デフォルトの名無しさん2009/06/07(日) 22:06:03
心療内科へいって治療してもらえ
0170デフォルトの名無しさん2009/06/07(日) 22:06:22
クラック対策だろjk
0171デフォルトの名無しさん2009/06/07(日) 22:08:37
メソッド内部で書かれたsは定数として処理されて出てこないよ
上でも下でも出力は一緒ね、メンテの問題だけね、変なやついるから相手すんなよ
0172デフォルトの名無しさん2009/06/07(日) 22:10:14
出力が違うと思ってた奴は一人もいないのに偉そうに説明すんな。
0173デフォルトの名無しさん2009/06/07(日) 22:11:01
>>171
分かってないな。そんな話じゃないだろ。
0174デフォルトの名無しさん2009/06/07(日) 22:11:39
つまらん話で発狂するなよ
0175デフォルトの名無しさん2009/06/07(日) 22:12:31
よほどコンプレックスがあるのだろう。
0176デフォルトの名無しさん2009/06/07(日) 22:12:43
もりあがってまいりました
0177デフォルトの名無しさん2009/06/07(日) 22:14:07
向上心なければどの言語でも無駄って事を知れ C++ の人
0178デフォルトの名無しさん2009/06/07(日) 22:16:17
おい黙れって言ってるだろ
0179デフォルトの名無しさん2009/06/07(日) 22:21:59
黙ったぞ
0180デフォルトの名無しさん2009/06/07(日) 22:23:52
>>178-179
お前変過ぎる、精神病院へいけ、今すぐ
0181デフォルトの名無しさん2009/06/07(日) 22:28:46
>>157
ふつうに考えてC#のコンパイル結果ってILの話だと思うぞ。
0182デフォルトの名無しさん2009/06/07(日) 22:30:27
>>157 >>171
スレが荒れているので聞き流されるかもしれないが、C#のコンパイラはあまり最適化などかけず、
かなり素直なコードを吐き出すんだが、それを知っているんだろうか。
public void SampleMethod1()
{
this.textBox1.Text = "1";
this.textBox2.Text = "1あ";
}
public void SampleMethod2()
{
string s = "1";
this.textBox1.Text = s;
this.textBox2.Text = s + "あ";
}
最初の質問の例を一旦コンパイルした後、ディスアセンブルするとこんな感じになる。
ほとんど最適化されてない。
0183デフォルトの名無しさん2009/06/07(日) 22:35:40
ディスアセンブル? バイナリをアセンブラにすることなんだが。
0184デフォルトの名無しさん2009/06/07(日) 22:39:25
メソッドのインライン展開が行われたりするのは実行時なんだが、それを知っているんだろうか。
0185デフォルトの名無しさん2009/06/07(日) 22:42:36
>>182
ILやメタデータって string s のローカル変数名を保持してんの?
もしそうなら恥ずかしい名前つけれないんだが。
0186デフォルトの名無しさん2009/06/07(日) 22:45:18
>>184
そんなことは当たり前のことだから省略した。長かったからな。
>>185
そう。だから.NET用の難読化ツールとかが出回ってたりする。
前のスレでも話題になった。
0187デフォルトの名無しさん2009/06/07(日) 22:46:22
>>185
保持はしていないね、直接定数をロードしている。
ちなみに const string s = 1; としてしまえばどちらも一緒。
0188デフォルトの名無しさん2009/06/07(日) 22:49:09
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsFormsApplication2.Form1::textBox1
IL_0006: ldstr "1"
IL_000b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
IL_0010: ldarg.0
IL_0011: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsFormsApplication2.Form1::textBox1
IL_0016: ldstr "1a"
IL_001b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
IL_0020: ret
ちなみにこんな感じだね、しかしこんなのチクチク詰めていっても関係無くないw
あほくさあほくさ
0189デフォルトの名無しさん2009/06/07(日) 22:50:03
フィールドと違って最適化で消えることはあるけど基本的には保持される
0190デフォルトの名無しさん2009/06/07(日) 22:50:38
じゃあディスコンパイルしたらどうやって >>182 の sって名前を特定したんだ?
>>182 はガセ?
0191デフォルトの名無しさん2009/06/07(日) 22:51:29
いちいちツッコミどころかC++厨房うぜぇーって感じだな
0192デフォルトの名無しさん2009/06/07(日) 22:52:50
ガセではない。IL表記ならこうだ。
.method public hidebysig instance void SampleMethod2() cil managed
{
.maxstack 3
.locals init (
[0] string s2)
L_0000: ldstr "1"
L_0005: stloc.0
L_0006: ldarg.0
L_0007: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox ImageComposer.Form1::textBox1
L_000c: ldloc.0
L_000d: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
L_0012: ldarg.0
L_0013: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox ImageComposer.Form1::textBox2
L_0018: ldloc.0
L_0019: ldstr "\u3042"
L_001e: call string [mscorlib]System.String::Concat(string, string)
L_0023: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
L_0028: ret
}
0193デフォルトの名無しさん2009/06/07(日) 22:52:51
reflectorでぐぐれ
0194デフォルトの名無しさん2009/06/07(日) 22:53:51
ああ、s2になっているのは、ローカル変数がたまたまsという
名前になっているのではないかと疑ったので変えてみた。
0195デフォルトの名無しさん2009/06/07(日) 22:56:46
>>192
おや、おれのと結果違うね
.method private hidebysig instance void Test2() cil managed
{
// コード サイズ 41 (0x29)
.maxstack 3
.locals init (string V_0)
IL_0000: ldstr "1"
IL_0005: stloc.0
IL_0006: ldarg.0
IL_0007: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsFormsApplication2.Form1::textBox1
IL_000c: ldloc.0
IL_000d: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
IL_0012: ldarg.0
IL_0013: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsFormsApplication2.Form1::textBox1
IL_0018: ldloc.0
IL_0019: ldstr "a"
IL_001e: call string [mscorlib]System.String::Concat(string,
string)
IL_0023: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_Text(string)
IL_0028: ret
} // end of method Form1::Test2
まっ、こんなのはコンパイラのバージョン次第で何でてるくかなどコンパイラの作り手の勝手なわけですが。
0196デフォルトの名無しさん2009/06/07(日) 22:59:04
/oの有無の違いに決まってるだろjk
0197デフォルトの名無しさん2009/06/07(日) 23:01:27
pdbファイルが同じディレクトリにあったらildasmが読んでるみたいだ
アセンブリ自体には含まれない
0198デフォルトの名無しさん2009/06/07(日) 23:04:17
しかしなんで string s 使うか直書きするかの違いがILDの話になるんだと……
おかしくね?
0199デフォルトの名無しさん2009/06/07(日) 23:04:40
試したらアセンブリ自体には含まれないな。冷や汗かいたぜ。
0200デフォルトの名無しさん2009/06/07(日) 23:05:45
アホのC++坊よけには丁度いいかもしれんけど
0201デフォルトの名無しさん2009/06/07(日) 23:08:33
結論:string s 推奨。
0202デフォルトの名無しさん2009/06/07(日) 23:18:48
あんだけ荒れてたのにスレ止まった・・
0203デフォルトの名無しさん2009/06/07(日) 23:22:07
C#の話題、C++であってもC#と関連する話ならいくらでもレス付けますがな
C++サイコーっていいたいなら巣に帰れって事
0204デフォルトの名無しさん2009/06/07(日) 23:25:41
C++サイコーなんて主旨の書き込みはどこにもないわけだが。
一人必死でC++叩いてる奴が荒らしてただけだよ。
0205デフォルトの名無しさん2009/06/07(日) 23:30:09
まったくこれだけ書き込みまくっていけしゃぁしゃぁと、死んでしまえw
0206デフォルトの名無しさん2009/06/07(日) 23:34:10
一人汚いレスばかりする人がいますな。
0207デフォルトの名無しさん2009/06/07(日) 23:37:31
C++の人さ、努力って大事だよ、ちゃんと勉強してC++使えるようになろうな
そしたら、こんなスレッドで嫌がらせなどしなくても自信もって生活できるようになる。
0208デフォルトの名無しさん2009/06/07(日) 23:48:10
>>141はC++が初心者装った嫌味に見え
>>142が反応した
という流れじゃなかろうか
0209デフォルトの名無しさん2009/06/07(日) 23:50:46
ちょっと話変わるけど、Visual studio 2010でC#のインテリセンス変わったよな。
インクリメンタルサーチ式になったけど、あれはもう旧式に戻らないのか?オプションに設定項目はなかったが
進化だとしても旧式も用意して欲しいもんだ
0210デフォルトの名無しさん2009/06/08(月) 00:03:54
え?
0211デフォルトの名無しさん2009/06/08(月) 00:15:42
>>207
そうやって煽ってるのはおまえ一人だけなんだが。さっさと消えろカス。
0212デフォルトの名無しさん2009/06/08(月) 04:04:23
C#勉強中です。

Google LABSのソースコード検索をマニュアルの補助に使っているのですが、
ちょっと疑問に思うコードがあったので教えてください。

リソースの解放を確実に行うため、usingを使ってスコープを定義すると
いう方法があると思うのですが、そのコードではこう書かれていました。

SQLiteDataReader reader;
using (reader = command.ExecuteReader())
{
 何かの処理
}

この様にusingの外にDataReaderを定義して、usingの終わりで確実に
Dispose()されるのでしょうか?
0213デフォルトの名無しさん2009/06/08(月) 04:12:07
>>212
SQLiteDataReader reader;
try
{
}
finally


のように宣言することが推奨されている。

http://msdn.microsoft.com/ja-jp/library/yh598w02.aspx
0214デフォルトの名無しさん2009/06/08(月) 04:14:03
すまん変なところで送信してしまった。

SQLiteDataReader reader;
{
try
{
 // 何かの処理
}
finally
{
 if (reader != null) ((IDisposable)reader).Dispose();
}
}
と同等だけど
using (SQLiteDataReader reader = command.ExecuteReader())
{
 // 何かの処理
}
のように宣言することが推奨されている。
0215デフォルトの名無しさん2009/06/08(月) 04:14:22
>>212
using が実は現状確実にDispose してくれないという話的には Dispose され
ないと答えるけど、その話を除けば普通に
using(SQLLiteDataReader reader...)
とした場合と同等レベルには Dispose される。

これとそれの違いはスコープぐらいかな、意図がそれだけだと正直わか
らんが。
02162122009/06/08(月) 04:38:37
>>213-215
ありがとうございました。

GCがいつ実行されるか分からないというのは一応承知してます。
安心してusing内に書くようにします。
0217デフォルトの名無しさん2009/06/08(月) 05:08:35
>>216
あー。GC とかは関係ない。
説明すると、現状の using には Abort されたときの耐性がない
という話。
インスタンスが生成された直後とローカル変数に代入されるまでの
間にスレッドが Abort されれば Dispose は呼ばれない。それも
含めて Finalizer が必要な理由にもなっている。
と思って今確認したら try の外でやってるし…なら try に入るまで
かな。

めったに問題になることじゃないので記憶の片隅においておくだけで
いい知識だが。
02182122009/06/08(月) 05:59:16
>>217
ありがとうございます。

今の自分の知識ではお話の半分ほどしか分かりませんが、
滅多に問題になることはないということも含めてメモっておきます。
0219デフォルトの名無しさん2009/06/08(月) 11:26:26
あるフォームに対して、サイズ変更枠が付いたままタイトルバー有り無しの
切り替えをしたいと思い、フォームのコンテキストメニューから「切り替え」を
選択した際に、タイトルバーをなくす場合はフォームのTextを空にして
ControlBoxをfalseにしています。しかしControlBox=falseかつText=""
という操作をすると、それ以降Application.Exitで終了したときに
FormClosingイベントが呼ばれなくなってしまいます。
フォームの終了時に設定を保存したいのですが、終了処理はどこで
行えばいいでしょうか。よろしくお願いします。
0220デフォルトの名無しさん2009/06/08(月) 13:03:06
>>219
操作中に例外が発生してるんじゃないかな。
そうすると何も起こらず終了しているように見えることがある。
コントロールの存在・状態チェックはしっかりやろう。
02212192009/06/08(月) 13:39:01
>>220
ありがとうございます。存在していないコントロールに触っているのかと思い、
原因を調べるために怪しい所を省いた以下のソースを実行してみたんですが
やはりフォームのTextを空にしてControlBox=falseとすると、FormClosing
のところにブレークポイントを設定してもヒットしなくなりました
ttp://sakuratan.ddo.jp/uploader/source/date112420.txt

こういう場合にはFormClosingイベント等は使えないのでしょうか。。。
0222デフォルトの名無しさん2009/06/08(月) 13:41:22
>>221
というか、Application.Exit()じゃなくてメインのフォームをクローズするのが普通じゃないの?
0223デフォルトの名無しさん2009/06/08(月) 13:48:16
>>>222
そうですね、よく考えたらサブのフォームからでも
MainForm.Close()ってすればいいんですよね
Application.Exitの事は忘れます。ありがとうございました
0224デフォルトの名無しさん2009/06/08(月) 14:31:59
二つの配列を一つにまとめるにはどうしたらいいでしょうか?

int[] a = {1,2,3};
int[] b = {4,5,6};
↓
int[] c = {1,2,3,4,5,6};
0225デフォルトの名無しさん2009/06/08(月) 14:47:35
c = a.Concat(b).ToArray();
0226デフォルトの名無しさん2009/06/08(月) 14:59:34
225> 出来ました。ありがとうございます(_ _)
0227デフォルトの名無しさん2009/06/08(月) 19:56:13
Window Formの初期化のタイミングとして、
1.コントラクタのInitializeComponent();の後、
2.Loadイベントハンドラ内、
3.フォーム表示直後のShownイベントハンドラ内
の3つがあると思います。

1,2と3はフォームが表示される前か後ろかという違いがありますが、
1と2ではどういう違いがあるのでしょうか?
0228デフォルトの名無しさん2009/06/08(月) 20:07:05
newしたときに呼び出されるか表示とかしようとしたときに呼び出されるか
0229デフォルトの名無しさん2009/06/08(月) 20:08:23
C#ってASP開発できるんですか?
0230デフォルトの名無しさん2009/06/08(月) 20:14:18
ASP.netなら出来る
0231デフォルトの名無しさん2009/06/08(月) 20:20:21
>>228
なるほど、ということは、

コンストラクタ→New後、フォーム表示前に一度だけ実行

Loadイベントハンドラ→フォーム表示前に実行。リロードしたら再度実行される。

Shownイベントハンドラ→フォーム表示後一度だけ実行(リロードしても実行しない)

くらいに考えとけば良いですか。
0232デフォルトの名無しさん2009/06/08(月) 20:30:49
普通、Windows Forms にリロードという概念はない。
0233デフォルトの名無しさん2009/06/08(月) 20:35:35
〜Changedっていうイベントはオブザーバーパターンなんですか?
0234デフォルトの名無しさん2009/06/08(月) 20:47:44
>>232
・・・もう一度マニュアル読んできます。
ありがとうございました。
0235デフォルトの名無しさん2009/06/08(月) 20:50:26
イベントはイベントだろ
0236デフォルトの名無しさん2009/06/08(月) 20:51:31
今日なんかあるの?
0237sage2009/06/08(月) 21:28:25
VisualC#2008で、再表示がうまくできずに困っています。
fileSystemWatcher
でファイルを監視し、ファイルを読みこんで表示しようとしています。

string file = @"C:\tmp.txt";
public Form1()
{
InitializeComponent();
}

private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
{
string[] lines = System.IO.File.ReadAllLines(file, Encoding.GetEncoding("Shift_JIS"));
//MessageBox.Show(lines[1]);
label1.Text = lines[1];
label2.Text = lines[2];
label3.Text = lines[3];
label4.Text = lines[4];
label5.Text = lines[5];
}
監視はできているようなのですが、2度めの表示が行われません。
どこがまずいんでしょうか。
0238デフォルトの名無しさん2009/06/08(月) 21:38:16
public static List<T> a = new List<T>();
↑静的なListって可能なんですか?
どうやってメモリを確保しているんですか。
0239デフォルトの名無しさん2009/06/08(月) 21:39:22
>>237
そのコードだけで判断しろってのも難しいが、ひょっとして
C# の Array(string[] とか) のインデックスは 0 から始まるぞ。
それはさすがにOK?
0240デフォルトの名無しさん2009/06/08(月) 21:40:04
>>238
可能
起動時に自動で1度だけ呼ばれる
0241デフォルトの名無しさん2009/06/08(月) 21:49:47
>>240
正確には、そのクラスが初めて使われるときね。
0242デフォルトの名無しさん2009/06/08(月) 21:50:42
>>237
一応の確認だけど、そのFileSystemWatcherはVSでツールボックスからD&Dしたものだよね?
02432382009/06/08(月) 22:00:57
>>240-241
へー。
静的なのか動的なのか、分かったような分からないような…。
ありがとうございます。
0244デフォルトの名無しさん2009/06/08(月) 22:01:22
初めに表示するメインフォームがアクティブにならずに起動することがある
ビルドして何もクリックしてないのにキャプションバーが灰色になってる
ウィンドウズのバグ?
0245デフォルトの名無しさん2009/06/08(月) 22:11:04
すぐ Windows のバグ? とか聞く奴は、死んだ方がいいと思うよ。
0246デフォルトの名無しさん2009/06/08(月) 22:13:14
2DMAPエディタを作ってみたいと思います。配列は必要というのはわかりました
どなたか知恵を貸してください。設計とか初めてなので><
0247デフォルトの名無しさん2009/06/08(月) 22:17:57
アイコンエディタでも描いてろ
0248デフォルトの名無しさん2009/06/08(月) 22:22:43
>>246
二次元配列使うとやりやすいと思う
int[,] ってやつ
後は
画像を分割して描画する(g.DrawImage)
バイナリ(orテキスト)でそのデータを保存する
保存したデータを読み込む
クリックした場所を取得する
等々

最低限上の機能は必要
そのほかマップの大きさだとかも必要だろうし
スクロールも必要
0249デフォルトの名無しさん2009/06/08(月) 22:30:06
StreamReader(じゃ無くてもいいのですが)を利用して
単純にファイルを開くだけの処理を記述した場合、
1Kと100Mのファイルでは、オープンにかかる時間は違うものでしょうか?

挙動を見ると、単にファイルを開くだけ(Readしない)だと、
どちらも大して時間がかからないのですが、
大きなファイルは開くだけでも時間がかかるといわれまして。

試したところでは、大差ないので、読み込まずに開くだけであれば差は無いのかと
思ったのですが、違いがわかるかた教えていただけますか?
0250デフォルトの名無しさん2009/06/08(月) 22:32:48
言われたんだろ?言った奴に根拠を聞けよ
0251デフォルトの名無しさん2009/06/08(月) 22:34:39
>>243
static と言いつつ、静的(コンパイル時決定)じゃない。
あれにstaticって名前が付いてるのはC++を意識しすぎた結果。
実際にはクラス変数とでも呼ぶべきもの。
0252デフォルトの名無しさん2009/06/08(月) 22:35:07
>>249
違わない
その人は何か既成のアプリと勘違いしてるんじゃない?
■ このスレッドは過去ログ倉庫に格納されています