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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/11/28(木) 11:27:54.20
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問。
質問者自身なんだか意味がよく分からない質問。
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて、他スレ・他板へ行くことを勧められることがあります、ご了承下さい。

なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

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

■前スレ
ふらっとVisual C#,C♯,C#(初心者用) Part108
http://toro.2ch.net/test/read.cgi/tech/1383867970/

■関連スレ
C#, C♯, C#相談室 Part81
http://toro.2ch.net/test/read.cgi/tech/1381134494/

■コード貼るなら↓使ってください
http://ideone.com/
0052デフォルトの名無しさん2013/11/30(土) 11:25:55.11
System.IO.BinaryReader br = new System.IO.BinaryReader(st);

brから一気にバイト列を読み込みたいんです。
ReadBytes()だとサイズ指定がありますが
元のストリームがHTMLの為上手くサイズが取得出来ないんですがどのようなやり方があるでしょうか?

・ReadBytes()の代わりに一気に読み込めるメソッドはあるか?
・ReadBytes()に指定するHTMLサイズを取得する為の方法は何か?

どちらかが分かれば解決するのですが。
0053デフォルトの名無しさん2013/11/30(土) 11:29:24.79
HTTPのヘッダには普通Content-Lengthがあるだろ
無ければMemoryStreamにでもCopyToしてToArrayじゃないの
0054デフォルトの名無しさん2013/11/30(土) 11:32:19.80
>>53
それが場合によってはContent-Lengthを返さないサーバがあるらしいので
この方法だと不安なんです…

後者の方法はどうやるのか少しご教授願えませんか?
0055デフォルトの名無しさん2013/11/30(土) 11:35:29.60
using(var ms = new MemoryStream())
{
st.CopyTo(ms);
return ms.ToArray();
}
0056デフォルトの名無しさん2013/11/30(土) 11:39:29.76
C#とVB.netの違いってなに?
C#もポインタは、実際は使えるようで使えないみたいだし。
0057デフォルトの名無しさん2013/11/30(土) 11:42:30.41
>>55
バッチリできました!ありがとうございます!
0058デフォルトの名無しさん2013/11/30(土) 11:42:47.17
VB.NETの演算の言語仕様はILとの整合性が低いので
コンパイル時にクソみたいなヘルパー関数呼び出しが大量に生成されます
あとTry-Catchもゴミまみれになる
0059デフォルトの名無しさん2013/11/30(土) 11:45:05.84
根拠は?それほど違わないよ
0060デフォルトの名無しさん2013/11/30(土) 11:46:33.99
chunkedだとContent-Lengthを返してはいけない
chunkedだと全部読み取るまでコンテンツサイズは判明しない
HTTP1.1の仕様のせい

chunkedがないとgzip等を返す場合一度tmpに出力しないといけなかったので
サーバー側は効率的ではあるのだが
0061デフォルトの名無しさん2013/11/30(土) 11:48:43.83
いやヘルパー関数呼び出し大量発生は確かにその通りだよ
根拠はildasm
C#も2.0からはILとどんどん乖離していってるけど、VBランタイム相当のC#ランタイムが必要になるのはdynamicだけだね
0062デフォルトの名無しさん2013/11/30(土) 11:54:22.71
>>60
そんな問題があったのですね。勉強になりました!
0063デフォルトの名無しさん2013/11/30(土) 13:30:23.90
そういえばBooleanとString型の動作が少し違うな
0064デフォルトの名無しさん2013/11/30(土) 19:16:18.54
XMLから要素名のわからない要素を取り出したいのですがどうすればよいでしょうか?
例えば、以下の様にOptionalAttributeという要素があり、
その場合は子要素を読み込み、要素名を取得したいと考えています。
どのようなメソッドを使えば良いでしょうか?

<AA Name="A1"
Category=""
Index="1">
<OptionalAttribute>
<BType>
<Value>A</Value>
<BType>
</OptionalAttribute>

なにとぞご教授ください。
0065デフォルトの名無しさん2013/11/30(土) 19:24:39.87
XMLパーサーは何のクラス使ってるんだよ
0066デフォルトの名無しさん2013/11/30(土) 19:56:19.49
要素名の分からない要素とかXMLの設計が悪いんじゃ・・・何のための属性だよ
0067デフォルトの名無しさん2013/11/30(土) 20:01:07.71
XAMLの悪口は止めろ
まあOptionalかどうかは要素の有無で判断するのが普通だと思うけど
0068デフォルトの名無しさん2013/11/30(土) 20:03:43.33
下のようなプログラムのとき
string s;
の宣言のときにnullをつっこんでるのはなぜ?
どーせ、すぐにsr.ReadLine()によって設定されるのに。

string s = null;
while((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
0069デフォルトの名無しさん2013/11/30(土) 20:07:00.42
俺は無くてもいいものは書かない派
0070デフォルトの名無しさん2013/11/30(土) 20:10:39.70
俺も書かないので分かりません
0071682013/11/30(土) 20:12:17.64
でも、教科書等々のサンプルソースなんかでは、よくこういうソースが出てくるん
なんで?
0072デフォルトの名無しさん2013/11/30(土) 20:16:51.01
それは著者の気持ちを答えなさいってことか?
0073デフォルトの名無しさん2013/11/30(土) 20:18:12.13
うん。
CやC++のmalloc()、free()名残?
0074デフォルトの名無しさん2013/11/30(土) 20:19:55.14
代入をしないと変数定義できない言語の使い手なのではないか
世の中にはそういう難儀な言語もある
0075デフォルトの名無しさん2013/11/30(土) 20:20:46.73
警告、エラー避けじゃね?
string s;
Console.WriteLine(s);
だとエラーだし

まあ、コンパイラに警告されない限り代入の必要はないと思うけど
0076デフォルトの名無しさん2013/11/30(土) 20:21:26.14
Pythonの悪口は止めろ
0077デフォルトの名無しさん2013/11/30(土) 20:23:08.82
Cなんかは変数宣言の段階じゃ初期値不定だからその名残でやってるんだろうな
別に悪い習慣ではないと思うがC#じゃいらんな
0078デフォルトの名無しさん2013/11/30(土) 20:27:10.41
whileならいいけど、forとかusingとかの中で設定したあとブロック抜けた先で使いたい場合とかあるじゃん?
0079デフォルトの名無しさん2013/11/30(土) 20:30:17.67
未定義になるコードパスがあったのを
いろいろいじっているうちにそのままになってた
ということもよくある話
0080デフォルトの名無しさん2013/11/30(土) 20:30:19.24
>>78
これだろうな
0081デフォルトの名無しさん2013/11/30(土) 20:31:34.92
stringだったら初期化にはString.Empty使うけどな
0082デフォルトの名無しさん2013/11/30(土) 20:35:25.16
String.Emptyに初期化する必要性ない限りnullでいいよ
わずかだけど、null初期化の方がコストも少ないし
0083デフォルトの名無しさん2013/11/30(土) 20:35:53.52
ローカル変数をstring.Emptyで初期化したほうが都合がいい場面って思いつかない
0084デフォルトの名無しさん2013/11/30(土) 20:57:53.97
Datatableって、なんで任意の列だけを対象にして検索して、見つかった行の番号を返すって、良く使うコードが実装されてないの?
0085デフォルトの名無しさん2013/11/30(土) 20:58:09.94
想像力の貧弱さの告白乙
0086デフォルトの名無しさん2013/11/30(土) 20:59:56.17
じゃ、おしえて
0087デフォルトの名無しさん2013/11/30(土) 21:17:15.48
var i = dataTable.AsEnumerable().ToList().FindIndex(r => r["column"].Equals(value));
とか書くと初心者にはすごく見えるし初心者以外には馬鹿にされるからおススメ
0088デフォルトの名無しさん2013/11/30(土) 21:21:37.65
>>85
煽るな障害者
0089デフォルトの名無しさん2013/11/30(土) 21:37:57.15
>>85
わかんないんじゃんw
0090デフォルトの名無しさん2013/11/30(土) 21:42:05.82
主キーじゃなきゃ重複するだろ常識的に考えて
っていう理由じゃないかな
0091デフォルトの名無しさん2013/11/30(土) 21:52:57.75
そもそもRDBのテーブルという概念は行の集合なので行番号は持たないのですよ
0092デフォルトの名無しさん2013/11/30(土) 21:55:18.86
こんな10行で書ける処理に文句を垂れる奴は専用メソッドがあったところで
「DataColumnって何ですか」とか言い出すに決まってる
0093デフォルトの名無しさん2013/11/30(土) 21:56:05.37
>>65
XDocumentとXElement使ってます
0094デフォルトの名無しさん2013/11/30(土) 22:00:27.38
DescendentsとかでOptionAttributeさがしてそのElements().First()のNameとかそんなん
0095デフォルトの名無しさん2013/11/30(土) 22:01:59.03
>>94
ありがとうござます!
試してみます!
0096デフォルトの名無しさん2013/11/30(土) 22:03:26.23
.Elements("OptionalAttribute").Elements()の方がいい気がする
0097デフォルトの名無しさん2013/11/30(土) 22:06:13.01
>>96
OptionalAttributeがないとクラッシュするじゃん
0098デフォルトの名無しさん2013/11/30(土) 22:07:32.60
>>92
10行もかからねーだろw
0099デフォルトの名無しさん2013/11/30(土) 22:20:52.53
intとDataRow型の宣言をしてforとifをブロックで書くとジャスト10行だけど煽ってコード書かせようってクチ?
0100デフォルトの名無しさん2013/11/30(土) 22:22:17.13
※ここの住人は「まず煽る」ことから始めるのでスルー能力を磨いてから書き込みましょう
0101デフォルトの名無しさん2013/11/30(土) 22:24:28.37
じゃあ俺はElementとElementsの違いに気づかない>>97を煽る
0102デフォルトの名無しさん2013/11/30(土) 22:24:54.52
いや87ででてるじゃん? まだ冗長だけど
0103デフォルトの名無しさん2013/11/30(土) 22:27:09.40
>>96
こういうコードたまに見るけど、もうなんというか
最も酷い
0104デフォルトの名無しさん2013/11/30(土) 22:30:24.43
ユーザーコントロールを継承したクラスAを更に継承したクラスBを
Formに動的に追加してクリックイベントを発生させたいのだけど
クラスBでクリックイベントが発生しません

大部分の機能は同じだけどクリックされたときの挙動を幾つか用意したいので
クラスB1、B2のように作っていこうと思っているんだけどどうすればいいですか?
0105デフォルトの名無しさん2013/11/30(土) 22:30:37.05
>>87はわざとお話にならないように書いたコードだぞ
0106デフォルトの名無しさん2013/11/30(土) 22:32:34.62
>>105
それ以外の書き方を知らない人間はそうやって道化を演じるしかないからな
0107デフォルトの名無しさん2013/11/30(土) 22:42:05.55
>>104
OnClick呼んでないとかイベントハンドラー登録してないとかそんな感じだろ
0108デフォルトの名無しさん2013/12/01(日) 00:42:00.21
>>84
DataRow[] rows = datatable.Select("xxx = ...");

じゃだめなの?
こういう意味じゃ無い?
0109デフォルトの名無しさん2013/12/01(日) 00:42:19.02
もしかして子コントロールのイベントはユーザーコントロールを継承したクラスAでしか取得できない?
クラスBで取得するにはコードでイベントハンドラを登録させるしかないのかな?
0110デフォルトの名無しさん2013/12/01(日) 01:33:02.14
なぜかコンストラクタが削除されてて
InitializeComponentメソッドが読まれてなかっただけだった
慣れない継承したからてっきり継承のせいだと思ってた
0111デフォルトの名無しさん2013/12/01(日) 01:55:04.14
あ、ちがった、やっぱり継承先では継承元の子コントロールのイベントは取得できないみたい
0112デフォルトの名無しさん2013/12/01(日) 02:14:29.08
コントロールAをこうすればいいでしょ
protected virtual void button1_Click(object sender, EventArgs e)
{
}
0113デフォルトの名無しさん2013/12/01(日) 02:56:37.81
それでいけました
あと、コントロールのmodifiersをProtectedにしてもできた
でも他のクラスから直接コントロールを操作できるようにするは作法としてよろしくないのかな
やっぱり>>112のように触ってもいいところだけ仮想メソッドなりで公開するのがいいのかな
0114デフォルトの名無しさん2013/12/01(日) 06:03:19.27
private void button1_Click(object sender, EventArgs e)
{
 this.OnButton1Click();
}

protected virtual void OnButton1Click()
{
}

こんな感じ
0115デフォルトの名無しさん2013/12/01(日) 09:39:09.03
>>99
どうやったら10行も必要なの?
int i = datatable.Rows.IndexOf(datatable.Select(".............")[0]);
0116デフォルトの名無しさん2013/12/01(日) 09:48:33.34
公式に10行で云々ってページがあるからさw
0117デフォルトの名無しさん2013/12/01(日) 09:55:46.23
>>115
それ全件検索→配列作成→順次検索だからforで回すのの平均1.5倍かかるぞ
構文解析のコストとか無視しても
0118デフォルトの名無しさん2013/12/01(日) 09:58:23.31
ついでに言うと短くしたいのならパフォーマンスがいいのは.Select().FirstOrDefault()とか
0119デフォルトの名無しさん2013/12/01(日) 10:03:28.82
3倍だったわ
0120デフォルトの名無しさん2013/12/01(日) 13:00:31.86
C#er が速度なんて考えてるとはおもわなんだ!!!
0121デフォルトの名無しさん2013/12/01(日) 13:23:39.21
その程度の速度差が気になるならデータセットは使えないでしょうが
0122デフォルトの名無しさん2013/12/01(日) 13:28:58.22
速度無視しても>>115はありえない
全レコード該当した場合n要素の配列が2個必要だぞ
0123デフォルトの名無しさん2013/12/01(日) 13:29:00.90
前提条件が提示されていない中で
各々のポリシーに従って不毛な言いあいを続けるようなら
また両方にまぎれて煽りますよ
12時間くらい
0124デフォルトの名無しさん2013/12/01(日) 13:29:32.23
普通にforで回すのが最速だと思う
0125デフォルトの名無しさん2013/12/01(日) 13:31:40.19
今回はポリシー云々じゃなく万人が認めるべきアホなコードだから不毛じゃない
0126デフォルトの名無しさん2013/12/01(日) 13:44:14.64
ほう。
こんな表現もあったか。
データ件数が100件程度以内なら
int i = datatable.Rows.IndexOf(datatable.Select(".............")[0]);
でいいなぁ。上にコメントでもつけてくれれば。
0127デフォルトの名無しさん2013/12/01(日) 13:50:52.86
自演
0128デフォルトの名無しさん2013/12/01(日) 13:53:20.67
filterExpressionが原因のバグが頻発しそう
0129デフォルトの名無しさん2013/12/01(日) 14:02:42.61
頻繁するかは分からないけどリスクはあるよね
0130デフォルトの名無しさん2013/12/01(日) 14:39:36.83
VBのほうが利用者多いんでしょ。
C#とVBに差がないんならC#を何で選ぶの?
C一族なの?
0131デフォルトの名無しさん2013/12/01(日) 14:47:44.76
VB6から抜け出せない人用だし、選ぶ積極的理由が無いよ
0132デフォルトの名無しさん2013/12/01(日) 14:54:36.05
利用者が多いってのは何の統計なんだね
0133デフォルトの名無しさん2013/12/01(日) 14:58:13.95
当方C一族でして
0134デフォルトの名無しさん2013/12/01(日) 15:04:00.18
リーナス・トーバルズ曰く

*YOU* are full of bullshit.
C++ is a horrible language. It's made more horrible by the fact that a lot
of substandard programmers use it, to the point where it's much much
easier to generate total and utter crap with it. Quite frankly, even if
the choice of C were to do *nothing* but keep the C++ programmers out,
that in itself would be a huge reason to use C.

だいたいこれと同じ理由
0135デフォルトの名無しさん2013/12/01(日) 16:40:56.88
VBコードなんて見づらくて最初からやる気しなかったな
0136デフォルトの名無しさん2013/12/01(日) 17:52:29.22
スクリプトで遊び始めた頃にvbscriptを見るとなぜか吐き気を催したので
javascriptを選択してしまった流れで
0137デフォルトの名無しさん2013/12/01(日) 18:14:32.16
>>130
低レベルなコードも書きたいならC#
COMと相互運用したいならVB.NET
常識だろ
0138デフォルトの名無しさん2013/12/01(日) 18:14:34.87
C一族の者に御座る
0139デフォルトの名無しさん2013/12/01(日) 18:16:20.04
Dim Unko As String
string unko;
どっちが見やすいかな?
0140デフォルトの名無しさん2013/12/01(日) 19:56:01.66
vbはこれができるんだぜ
Dim number = 1, text = "hoge"
0141デフォルトの名無しさん2013/12/01(日) 19:59:18.75
だからどうしたというレベル
0142デフォルトの名無しさん2013/12/01(日) 20:02:11.62
ムムム
If 5 == 5 Then
Console.WriteLine();
End If

if (5 == 5)
Console.WriteLine();

どっちが見やすいんだよ?
0143デフォルトの名無しさん2013/12/01(日) 20:10:15.18
C#スレで聞いてどうする
0144デフォルトの名無しさん2013/12/01(日) 20:33:46.18
If 5 == 5 Then Console.WriteLine();
0145デフォルトの名無しさん2013/12/01(日) 20:34:19.66
まだ間違ってるぞ
If 5 = 5 Then Console.WriteLine()
0146デフォルトの名無しさん2013/12/01(日) 20:44:30.76
    l'''-、    .t―--、   .!¬、          > 、              r‐ ,          >-、     >、___
 .lヽ,,| il,,..、   ,ゝ--′   | | 、        / ./ t-、            ,,,  | レ''')      ! . ゝ、,. t,   >   `!
  ゙ヽ、 __,ノ   , -''',゙ ̄''、 <゙゙´ レ'',゙ ̄\ .l゙‐''"゛.,i、`'i lヽ   _,_._,,、 ヘ ̄ .,,..-',゙ _ ト‐'" .,i  l, l.ヽ / .厂 ̄゛
 / !/ ,l_r-,.´>、 ヽ,,./   | .l `フ  / ̄│ .l `-7 ./ .l .! .l l l'‐'゙/'''''''、.ヽ  / /ィニ二_,,,ノ ゝ7 ./ .l ! ゙l l .! !_.. - 、.
 ヽ、   ./゙l .l      l  ! /  !    } ! / ./ l /!││゙''"    .} | l゙ / ,,.'"゛    / ./  l l | |.l  ン"゙゙''、 ヽ
  .! l ̄ .,ノ |    ノ  ノ∠   !   ノ ノ / .iト,,ノ /  .゙''゙      / . l ,/ / ./.!  ._....、./ .,l ト,,/ /  .゙''゙ L./    /  }
  .ヽ `゙゛ . /  ._,,/_,/   .! l ∠‐"  |__/ ヽ ./       ._.. ‐,゙..-゙ ! / .l、.´   ,!| ./ l ./      . __,, / ,.ノ
    .`゙゙゙゙゙゛   `⌒       `゛         `´       .  ̄´   `"   `"'''''"゛    `゛      `゙'''''゙゙´
0147デフォルトの名無しさん2013/12/02(月) 01:46:32.63
VBって未だにサブルーチン呼び出しは括弧付けたら駄目っつー変態バカ仕様でやってんの?
0148デフォルトの名無しさん2013/12/02(月) 02:10:49.67
ListViewでListViewItem一個一個に
ユーザーデータを追加させたいのですが
(MFCのCListCtrlのSetItemData/GetItemDataみたいなやつ)
どのようにすればいいでしょうか?
0149デフォルトの名無しさん2013/12/02(月) 06:47:01.04
Tag
0150デフォルトの名無しさん2013/12/02(月) 08:13:07.79
ListViewを継承してお好きなプロパティでもなんでも持たす
0151デフォルトの名無しさん2013/12/02(月) 08:13:48.83
×ListViewを継承してお好きなプロパティでもなんでも持たす
○ListViewItemを継承してお好きなプロパティでもなんでも持たす
0152デフォルトの名無しさん2013/12/02(月) 08:49:50.39
コントロールは多くのプロパティをオーバライドできないのだけど
どういう設計思想なのこれは?
■ このスレッドは過去ログ倉庫に格納されています