X



ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 369a-msj4)
垢版 |
2018/06/05(火) 19:32:42.28ID:70UTtyrn0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

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

■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part137
https://mevius.5ch.net/test/read.cgi/tech/1523004019/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0044デフォルトの名無しさん (オイコラミネオ MMb5-GLBR)
垢版 |
2018/06/08(金) 13:08:29.19ID:CYBBWkiVM
>>17
私は { は単独にしない派ですね。
理由は、少しでも多く画面内にソースを表示して見通しやすくするためと、昔からの Basicの名残で、ifなら thenに相当する { は行末。endifの } は単独という位置づけですね。

今はideの進化で { } のペアの書き忘れがほとんどないというのもあるかな。
0045デフォルトの名無しさん (ワッチョイ 137f-6+Fv)
垢版 |
2018/06/08(金) 14:44:00.50ID:6WR6CtyO0
>>37
試してないけど、対応OSで実行してないとか?
0048デフォルトの名無しさん (ワッチョイ d360-X4KX)
垢版 |
2018/06/08(金) 17:50:11.32ID:wbtEeseM0
int c = 5;
for(c = 1; c < 61; c++)
{
        //処理
}
Console.WriteLine(c.ToString());

これで一番最後でCが62になるのですが
C<61の判定後でも++のインクリメントは行われているってことでいいのですか?
0055デフォルトの名無しさん (ワッチョイ 13b3-3s1o)
垢版 |
2018/06/09(土) 11:11:10.00ID:3S5Pjg6F0
構造化制御文はインデントされた行を1行と1行、例えば if (a == b) { と } で挟むのが、
パッと見たとき一体に見えて分かりやすい。{ を単独行にすると、{ と } で挟まれた
無名ブロックがあって、その上に構造的に無関係な1行のif文があるように見えてしまう。
もう少しじっくり見れば、行末の ; の有無で下のブロックとの関係を判別できるが、
その一瞬の認知の遅れに違和感を覚え、もっとはっきり言えばキモいコードだと思う。

同じ理由で、条件が真のときの文が1つの場合の
 if (a == b)
   c = d;
 e = f;
のようなスタイルもキモいし、Pythonの
 if a = b:
  c = d
  e = f
 g = h
はもっとキモくて、まさに蛇蝎のように嫌いだ。

関数・メソッド定義と制御文の見分けという観点からも、前者は
 int func(int arg)
 {
後者は
 if (cond) {
で始めて、( の前のスペースの有無と { の前の改行の有無のどちらでも前者と後者で
違いをつけた方が、すんなりと見分けられて良い。
0056 ◆QZaw55cn4c (ワッチョイ d360-EqDK)
垢版 |
2018/06/09(土) 11:28:17.50ID:BV3WmSRm0
>>55
if (cond) {
}
と書くのだったら、関数の場合も
int func(int arg) {
}
とするのが統一がとれていいんじゃない?なぜ関数と if 文とで書き分けるのか、その理由がわからない
0061デフォルトの名無しさん (ワッチョイ 13b3-3s1o)
垢版 |
2018/06/09(土) 12:03:48.88ID:3S5Pjg6F0
>>56
それぞれの制御文 (if, for, whileなど) 同士は機能が似通っているが、
関数は全く違うから、見た目も書き分けた方が良い。

Pascalだと関数は
 function func(arg: integer): integer;
 begin
で、制御文は
 if cond then begin
で始まり、前者は begin の前に ; が入り、関数頭部を書いて一旦区切ってから
関数本体を書く格好になるので、頭部の行の独立性が比較的高い。これに倣い、
C系でも関数は頭部だけで改行した方がすんなり読める。

>>58
じゃあ、スレ立ててよ。
0062デフォルトの名無しさん (ワッチョイ 13b3-3s1o)
垢版 |
2018/06/09(土) 12:05:40.33ID:3S5Pjg6F0
>>60
1行if文は否定しないし、自分自身も割とよく使うよ。
0063 ◆QZaw55cn4c (ワッチョイ d360-EqDK)
垢版 |
2018/06/09(土) 12:18:17.45ID:BV3WmSRm0
>>61
pascal に習う必要はないと思いますが…なぜ pascal を持ち出してきたのでしょうか?
私は関数と if/for/while を別にする必要性はないと思っています
{
}
とかスペースの無駄にみえてしまいます
0064デフォルトの名無しさん (ワントンキン MM53-7qxP)
垢版 |
2018/06/09(土) 12:23:56.94ID:54mp5fzVM
構造がクリーンなコードを心がければ自然と{}を使わないコードになる
まあ俺から言わせてもらうと{}は綺麗なコードが浮かばない時に仕方なく使う苦肉の策ってところだね
0065デフォルトの名無しさん (ワッチョイ 13b3-3s1o)
垢版 |
2018/06/09(土) 12:43:14.79ID:3S5Pjg6F0
>>63
Pascalの悪い所、例えば条件を ( ) で囲まないので条件が目立たないのは真似する
必要はないが、良い所は参考にすべきだろう。C#は開発主導者がTurbo Pascalの
作者だったこともあり、Pascalからもいくらかの影響を受けていて、赤の他人ではない。

関数と制御文は機能が違うし、関数の方がより大きなブロックだから、書き分けた方が
すんなり読める。自然言語で小さな区切りには , を、大きな区切りには ; を使って
書き分けるのに似ている。あるいは章や節の見出しのスタイルに視覚的な差を
つけるようなもの。
0073デフォルトの名無しさん (アウアウエー Sa23-SCrG)
垢版 |
2018/06/09(土) 14:27:26.20ID:DBY1R4Jva
この手の嗜好がただの慣れと思い込みにすぎないっていい歳こいて気付かない人は
プログラマとしてかなり筋が悪いと思うw
たぶん知能もあんまり高くないw

2週間も違う書式で作業してたらすっかりそっちが「普通」になるw
人間なんてそんなもの。
これフォントにも言えるね
0079デフォルトの名無しさん (ワッチョイ 1981-DGJA)
垢版 |
2018/06/11(月) 12:25:35.64ID:6xD/x26k0
VisualStudio2017 でコンソールアプリケーションを作っています。
System.Windows.Forms.Clipboardクラスを使いたいのですが
ビルドの設定をReleaseにしているとエラーはでないのに
Debugにすると FormsがSystem.Windowsに存在しないといわれてしまいます。
(アセンブリ参照はしています)
どなたか原因分かる方いないでしょうか。

https://i.imgur.com/sgkx4HK.png
https://i.imgur.com/Tr2VkYB.png
008179 (ワッチョイ 1981-DGJA)
垢版 |
2018/06/11(月) 13:13:19.40ID:6xD/x26k0
>>80
新しいソリューションを作成してコードをコピペしたら問題が発生しなかったので
とりあえず解決したということにします。

ありがとうございます
0082デフォルトの名無しさん (ワッチョイ eb96-LHz9)
垢版 |
2018/06/11(月) 21:03:57.62ID:TLX2q1MD0
フォームアプリで画面の真ん中に線を引きたいと思って単純に

(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)/2

のところに線を挽けばいいと思ったんですが、モニタのピクセルの半分のところに線を引くと
フォームの上の -□× のあるバーの下から0ピクセルになるから20ピクセルほどが下にずれてしまいます。
フォームの中央に線を引く方法ってないでしょうか?
0086デフォルトの名無しさん (ワッチョイ eb96-LHz9)
垢版 |
2018/06/11(月) 21:44:14.69ID:TLX2q1MD0
自分でもどっちでいいかわからなくなったw
最初単純にフォーム最大化してるんだから、モニタの真ん中が真ん中だろと思ったら、
windowsって下にタスクバーあるわ、モニタの下に非表示領域20ピクセルほど隠れてるわ、フォームにフォームバーあるわで、
モニタの真ん中が真ん中に見えない。
たぶん無意識化でフォームの真ん中が人は真ん中と認識しているので気持ち悪い。
ということでフォームの真ん中にしました。
0090前スレ976 (ブーイモ MMeb-tDoJ)
垢版 |
2018/06/12(火) 07:25:05.60ID:qsxFIdydM
どうにかイベントを発生させることができました。ここから5バイトの受信データを分解して処理を分岐したいんですが、どのような手法、便利な関数がありますでしょうか。
オペコード1バイト+データ4バイトという形式です。データは4バイトで表現する数値だったり、1ビットごとのフラグだったりします。
昔ながらのswich~caseで分岐って使うんでしょうか
オペコードが増えたり、データの予約ビットが変わると変更が大変そうです
0091デフォルトの名無しさん (アウアウウー Sad5-BJSQ)
垢版 |
2018/06/12(火) 08:46:58.51ID:awfOgDQGa
switchでいいよ
たかがイベント一個作るのに何日もかかるようなレベルで今どんな凝った設計しようが、結局後で全部やり直しになる
今は余計な手間をかけないこと、シンプルに保つこと、それだけ考えてりゃいい
0093デフォルトの名無しさん (ブーイモ MM05-BJSQ)
垢版 |
2018/06/12(火) 09:12:16.14ID:HMj9ZmCFM
スクリプト言語のインタプリタなんかでも巨大switchが普通だぞ
断言するが、先を見通せない状況でヘタにコマンドパターンとか入れても、後で横断的な変更が多発して
すべてのコマンドクラスに手を入れて回るアホみたいな作業に追われることになるだけ
0095デフォルトの名無しさん (アウアウエー Sa23-SCrG)
垢版 |
2018/06/12(火) 11:04:17.10ID:O2DKnY7ra
>>90
どっちにしろ「便利な関数なんかないでしょうw
ちっとも汎用的じゃない処理をエレガントに書く方法なんか用意されてるはずがないw
泥臭い物は泥臭く書くしかないかと

オペコードがそれ以上分解できない前提で

(1) オペコードをenumにキャストしてswith、でも
(2) ジャンプテーブル(デリゲートの配列)を使う、でもお好みで

もし仮に受信するデータが常にこちらから要求したデータである、
つまり、どういうデータが送信されてくることをこちら側が期待しているか事前に分かっている場合は
別の方法論もあると思う

その場合はこちらがリクエストを出す段階で、期待する種類のデータだけを読解できるオブジェクトを
生成してタイムアウト付きで待機させればいい
0099前スレ976 (ブーイモ MMeb-tDoJ)
垢版 |
2018/06/12(火) 20:18:08.93ID:qsxFIdydM
ありがとうございます。
ベタベタに書いてみます。

1バイトが1ビットごとのフラグになっている場合はビットマスクで一つずつ抽出するのが一般的でしょうか?
0100デフォルトの名無しさん (ワッチョイ 9361-6Jh4)
垢版 |
2018/06/13(水) 22:29:58.82ID:T96Fk9Se0
SQLについて質問ですが

INSERT INTO T_USER (
ID, PASSWORD
) VALUES (
@ID, @PASSWORD
);

のINSERT分を

INSERT INTO T_USER (
ID = @ID,
PASSWORD = @PASSWORD
);

のように書く場合はどのようにしたらよいでしょうか。
0103デフォルトの名無しさん (ワッチョイ c68a-3+MO)
垢版 |
2018/06/14(木) 08:40:57.01ID:tUkyOm+Z0
クラスの構造体(ただint型のデータが複数個しかない)をXMLに変換したいのだが
XMLSerializer以外に何かないかな?
XMLSerializerは以前にバグを起こしたことがあって使いたくないんだ
0106デフォルトの名無しさん (ワッチョイ 42a4-/RsH)
垢版 |
2018/06/14(木) 11:31:35.89ID:/+f4Bre90
>>103
全手動
0107デフォルトの名無しさん (ワッチョイ 2260-BQKd)
垢版 |
2018/06/14(木) 12:02:09.33ID:cv0ACSdK0
最終的に配列を書きだしたいのですが
それまでに色んなクラスのインスタンスからその配列の読み書きがされるのですが
どういうふうにクラスを作ればいいですか?
その配列はグローバルでstaticで宣言するか、インスタンス作るごとに参照を引き渡すのですか?
0108デフォルトの名無しさん (ブーイモ MMb6-OAOp)
垢版 |
2018/06/14(木) 13:20:39.46ID:NMzxKZ+IM
>>107
日本語でおk
0111デフォルトの名無しさん (スプッッ Sd61-3+MO)
垢版 |
2018/06/14(木) 17:22:37.66ID:Omv9hEYDd
初歩的な質問なんだけど
プロパティ?(get;set;)ついてるやつと、ついていないやつの差がわからないから教えてほしい

プロパティつけててもprivateはアクセスできないみたいだから
結局、両方ともpublicになって何が違うん?ってなってる
0113デフォルトの名無しさん (アウアウウー Saa5-m0US)
垢版 |
2018/06/14(木) 17:41:27.02ID:im2Z0uooa
クラスのメンバーでプロパティじゃない変数はフィールドと言う

フィールド (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/fields

プロパティ (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/properties

フィールドは代入も参照も同じ制限になる
プロパティは別々に設定できる
しかもgetだけ setだけというのも可能

フィールド (メンバ変数) とプロパティはここが違う
https://code.msdn.microsoft.com/windowsdesktop/5-5f828cde
0114デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
垢版 |
2018/06/14(木) 18:59:14.79ID:UejGuppF0
クラスのプロパティに「型」を変数みたいにおけますか?

外部から「型」をセットして、クラスの中でその型を使って new して実体を作って利用したいのです。
0115デフォルトの名無しさん (ワッチョイ d2eb-hrcC)
垢版 |
2018/06/14(木) 19:03:10.93ID:UejGuppF0
気持ちをコードで表すと

  public class Test
  {
    public <T> PersonClass;

    public void Unko()
    {
      var p = new PersonClass();
      p.unko();
    }
  }

ってな感じです。
※PersonClass にメソッド unko() がある前提
0119デフォルトの名無しさん (ワッチョイ 41da-4dYe)
垢版 |
2018/06/14(木) 19:26:49.09ID:dsNhKni40
>>99
enumにFlagsAttributeを付ける

[Flags]
enum Hoge : byte
{
Bit0 = 1 << 0,
Bit1 = 1 << 1,
Bit2 = 1 << 2,
Bit3 = 1 << 3,
Bit4 = 1 << 4,
Bit5 = 1 << 5,
Bit6 = 1 << 6,
Bit7 = 1 << 7,
}

var hoge = Hoge.Bit1 | Hoge.Bit4;
if ( hoge.HasFlag( Hoge.Bit3 ) )
{
0124デフォルトの名無しさん (アウアウエー Sa4a-jhA2)
垢版 |
2018/06/15(金) 01:34:20.89ID:UuMD2cf2a
書いてみりゃ分かるよw
単に一つのビットだけ立っている値を列挙するなら2進リテラルは冗長過ぎる。
そもそも何のためにHexなんかあると思ってるの

2進リテラルっていうのは、例えば組み込みで7セグのパターンのテーブルを定義する時とか、
bit5-bit7みたいにニブル単位じゃないビット範囲のビットマスクを定義する時とかに使う
0125デフォルトの名無しさん (ブーイモ MM62-l11B)
垢版 |
2018/06/15(金) 02:40:57.81ID:3RK99arqM
君にとってはCが頭に染み付いてるからそうかもしれないけど、
現に>>119にとっては分かりにくいからわざわざこんな書き方をしてるんだろう
今時のプログラマはC経験ない人も多いんだから実情に合わせることも必要
そういう連中を見下すのもいいけど老害呼ばわりされないように気をつけてね
0132前スレ976 (ブーイモ MM62-C226)
垢版 |
2018/06/15(金) 07:27:20.01ID:A2l2tHW6M
>>119
ありがとうございます


bitarrayってのがあるらしいんですけど、これって共用体とかに一括で代入できないんですかね
3バイトデータの内の下位1バイトは1bitごとのフラグなのでbitarrayで分解できそうなんですが
0133デフォルトの名無しさん (ワッチョイ c211-jgxh)
垢版 |
2018/06/15(金) 09:16:33.32ID:rymWY0Tx0
そういえばちょっと疑問なんだけど、enum定義する時に>>119みたいにbyteとか指定するのは何か意味があるの?
指定したところでbyte型の変数に代入しようとしたらキャストしなきゃいけないし、やる意味がわからないんだけど
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況