ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらない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 >>17 私は { は単独にしない派ですね。 理由は、少しでも多く画面内にソースを表示して見通しやすくするためと、昔からの Basicの名残で、ifなら thenに相当する { は行末。endifの } は単独という位置づけですね。 今はideの進化で { } のペアの書き忘れがほとんどないというのもあるかな。 >>37 試してないけど、対応OSで実行してないとか? >>44 その言語の流儀に素直に従った方がいいんじゃないかと int c = 5; for(c = 1; c < 61; c++) { //処理 } Console.WriteLine(c.ToString()); これで一番最後でCが62になるのですが C<61の判定後でも++のインクリメントは行われているってことでいいのですか? >>48 新規でコンソールアプリ用のプロジェクト作ってそれをコピペして実行してみたら? 処理の中身に問題が無ければ62になるはずがない つーか、この程度の検証もせずに他人に質問を投げる神経が分からんマジで >>47 パブリックなAPIかそうでないかによって違う >>45 OSのバージョンは問題なさそうなんですよね。 >>52 え、何が? {の位置にそんなこと関係ある? 構造化制御文はインデントされた行を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) { で始めて、( の前のスペースの有無と { の前の改行の有無のどちらでも前者と後者で 違いをつけた方が、すんなりと見分けられて良い。 >>55 if (cond) { } と書くのだったら、関数の場合も int func(int arg) { } とするのが統一がとれていいんじゃない?なぜ関数と if 文とで書き分けるのか、その理由がわからない あ、>>57 は>>55 宛てね 宗教論争は他所でやって頂きたい メソッドとif文に差付けなくてもインデント違う時点で判別付くんじゃないのか と思ったが、ローカル関数出てきたんだっけか if (cond) statement; if (cond) call(); if (notcond) return; statement; statement; statement; {}がなくても見やすいね >>56 それぞれの制御文 (if, for, whileなど) 同士は機能が似通っているが、 関数は全く違うから、見た目も書き分けた方が良い。 Pascalだと関数は function func(arg: integer): integer; begin で、制御文は if cond then begin で始まり、前者は begin の前に ; が入り、関数頭部を書いて一旦区切ってから 関数本体を書く格好になるので、頭部の行の独立性が比較的高い。これに倣い、 C系でも関数は頭部だけで改行した方がすんなり読める。 >>58 じゃあ、スレ立ててよ。 >>60 1行if文は否定しないし、自分自身も割とよく使うよ。 >>61 pascal に習う必要はないと思いますが…なぜ pascal を持ち出してきたのでしょうか? 私は関数と if/for/while を別にする必要性はないと思っています { } とかスペースの無駄にみえてしまいます 構造がクリーンなコードを心がければ自然と{}を使わないコードになる まあ俺から言わせてもらうと{}は綺麗なコードが浮かばない時に仕方なく使う苦肉の策ってところだね >>63 Pascalの悪い所、例えば条件を ( ) で囲まないので条件が目立たないのは真似する 必要はないが、良い所は参考にすべきだろう。C#は開発主導者がTurbo Pascalの 作者だったこともあり、Pascalからもいくらかの影響を受けていて、赤の他人ではない。 関数と制御文は機能が違うし、関数の方がより大きなブロックだから、書き分けた方が すんなり読める。自然言語で小さな区切りには , を、大きな区切りには ; を使って 書き分けるのに似ている。あるいは章や節の見出しのスタイルに視覚的な差を つけるようなもの。 >>65 >>61 昔のpascalのif 文は if cond begin ..;. end; が主流だった気がします if cond begin end; はむしろCの影響を受けているのでは? >>54 うん。C#のコーディング規約はあくまでもパブリックなライブラリに関するものだから。 プライベートなものについてはお好きにどうぞって感じ。 改行コードが構文に影響を与えない言語仕様なんだから、好きにすればいいんだよ。 pascal流はマジキモイな func() { } if () { } else { } が一番利に適ってる これ以上続けても宗教の違いみたいな話で なにも建設的なハナシにはならないからここらで終わりにしておけば? いくら議論したところで、お仕事なら我が社のコーディング規約で終わっちゃう話だしな この手の嗜好がただの慣れと思い込みにすぎないっていい歳こいて気付かない人は プログラマとしてかなり筋が悪いと思うw たぶん知能もあんまり高くないw 2週間も違う書式で作業してたらすっかりそっちが「普通」になるw 人間なんてそんなもの。 これフォントにも言えるね >>70 泥仕合にならないかぎり、意義があると思っています、これから泥仕合になるのかもしれませんが… エディタとコーディングスタイルの話はしないのが紳士のたしなみ >>73 フォントは目に優しいのを使った方がいい カッコの位置などというくだらない問題とは違う VisualStudio2017 でコンソールアプリケーションを作っています。 System.Windows.Forms.Clipboardクラスを使いたいのですが ビルドの設定をReleaseにしているとエラーはでないのに Debugにすると FormsがSystem.Windowsに存在しないといわれてしまいます。 (アセンブリ参照はしています) どなたか原因分かる方いないでしょうか。 https://i.imgur.com/sgkx4HK.png https://i.imgur.com/Tr2VkYB.png >>80 新しいソリューションを作成してコードをコピペしたら問題が発生しなかったので とりあえず解決したということにします。 ありがとうございます フォームアプリで画面の真ん中に線を引きたいと思って単純に (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)/2 のところに線を挽けばいいと思ったんですが、モニタのピクセルの半分のところに線を引くと フォームの上の -□× のあるバーの下から0ピクセルになるから20ピクセルほどが下にずれてしまいます。 フォームの中央に線を引く方法ってないでしょうか? フォームの中央なのかディスプレイの中央なのかどっちだよ 自分でもどっちでいいかわからなくなったw 最初単純にフォーム最大化してるんだから、モニタの真ん中が真ん中だろと思ったら、 windowsって下にタスクバーあるわ、モニタの下に非表示領域20ピクセルほど隠れてるわ、フォームにフォームバーあるわで、 モニタの真ん中が真ん中に見えない。 たぶん無意識化でフォームの真ん中が人は真ん中と認識しているので気持ち悪い。 ということでフォームの真ん中にしました。 >>86 タスクバーの位置なんて自由に変えられるんだけど >モニタの下に非表示領域20ピクセルほど隠れてるわ そんなものはないと思うけど... 今時CRT使っててオーバースキャン表示でもやってるなら別かもしれんけどw フォームバーってタイトルバーのことかな 非クライアント領域もあるぞ どうにかイベントを発生させることができました。ここから5バイトの受信データを分解して処理を分岐したいんですが、どのような手法、便利な関数がありますでしょうか。 オペコード1バイト+データ4バイトという形式です。データは4バイトで表現する数値だったり、1ビットごとのフラグだったりします。 昔ながらのswich~caseで分岐って使うんでしょうか オペコードが増えたり、データの予約ビットが変わると変更が大変そうです switchでいいよ たかがイベント一個作るのに何日もかかるようなレベルで今どんな凝った設計しようが、結局後で全部やり直しになる 今は余計な手間をかけないこと、シンプルに保つこと、それだけ考えてりゃいい デバイスドライバーみたいに処理をチェーンさせるってのもあり スクリプト言語のインタプリタなんかでも巨大switchが普通だぞ 断言するが、先を見通せない状況でヘタにコマンドパターンとか入れても、後で横断的な変更が多発して すべてのコマンドクラスに手を入れて回るアホみたいな作業に追われることになるだけ >>90 どっちにしろ「便利な関数なんかないでしょうw ちっとも汎用的じゃない処理をエレガントに書く方法なんか用意されてるはずがないw 泥臭い物は泥臭く書くしかないかと オペコードがそれ以上分解できない前提で (1) オペコードをenumにキャストしてswith、でも (2) ジャンプテーブル(デリゲートの配列)を使う、でもお好みで もし仮に受信するデータが常にこちらから要求したデータである、 つまり、どういうデータが送信されてくることをこちら側が期待しているか事前に分かっている場合は 別の方法論もあると思う その場合はこちらがリクエストを出す段階で、期待する種類のデータだけを読解できるオブジェクトを 生成してタイムアウト付きで待機させればいい >>93 横断的な変更を最小限の労力でやるために最初にほんのすこしだけ投資する これがシステム開発のコツな それより、データの先頭を識別できるフォーマットにしたか? 固定長なら先頭コード種類分のデリゲートを割り付けるってのもあるが、こればっかしは好みだな。 ありがとうございます。 ベタベタに書いてみます。 1バイトが1ビットごとのフラグになっている場合はビットマスクで一つずつ抽出するのが一般的でしょうか? SQLについて質問ですが INSERT INTO T_USER ( ID, PASSWORD ) VALUES ( @ID, @PASSWORD ); のINSERT分を INSERT INTO T_USER ( ID = @ID, PASSWORD = @PASSWORD ); のように書く場合はどのようにしたらよいでしょうか。 そういうメソッド作ったらいいじゃん setInsert(new dictionary略); みたいなの クラスの構造体(ただint型のデータが複数個しかない)をXMLに変換したいのだが XMLSerializer以外に何かないかな? XMLSerializerは以前にバグを起こしたことがあって使いたくないんだ 最終的に配列を書きだしたいのですが それまでに色んなクラスのインスタンスからその配列の読み書きがされるのですが どういうふうにクラスを作ればいいですか? その配列はグローバルでstaticで宣言するか、インスタンス作るごとに参照を引き渡すのですか? >>107 グローバルなpublic staticでいい 良い悪いを問題にするのであれば、あちこちから共通の配列をいじくるという前提の時点で設計に問題があるので、正解なし、が答えになる アクセス関数を作ってインスタンス取得用に一つスタティック関数を用意するだけ。 アクセス関数介さないと、排他処理とかいちいち入れるの面倒だぞ。 初歩的な質問なんだけど プロパティ?(get;set;)ついてるやつと、ついていないやつの差がわからないから教えてほしい プロパティつけててもprivateはアクセスできないみたいだから 結局、両方ともpublicになって何が違うん?ってなってる クラスのプロパティに「型」を変数みたいにおけますか? 外部から「型」をセットして、クラスの中でその型を使って new して実体を作って利用したいのです。 気持ちをコードで表すと public class Test { public <T> PersonClass; public void Unko() { var p = new PersonClass(); p.unko(); } } ってな感じです。 ※PersonClass にメソッド unko() がある前提 >>115 unkoを定義するインターフェイス作って、 Tをwhereでそのインターフェイスとnew()で絞った上で、default(T)でインスタンス作って、呼べばよいのでは? >>114 賭けてもいい 初心者がこの手の処理が必要だと思う時、それは100%勘違いw >>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 ) ) { >>119 そんな見てて痒くなる書き方しなくても今のC#は2進数リテラル使えるぞ 1 2 4 8 16 32 64 128 でいいよ。 >>119 みたいなのならHexで書くのが一番だろうねw 少なくとも俺ならそうする 10進よりマシだが一番ではない 2進があるならどう考えても2進が一番 書いてみりゃ分かるよw 単に一つのビットだけ立っている値を列挙するなら2進リテラルは冗長過ぎる。 そもそも何のためにHexなんかあると思ってるの 2進リテラルっていうのは、例えば組み込みで7セグのパターンのテーブルを定義する時とか、 bit5-bit7みたいにニブル単位じゃないビット範囲のビットマスクを定義する時とかに使う 君にとってはCが頭に染み付いてるからそうかもしれないけど、 現に>>119 にとっては分かりにくいからわざわざこんな書き方をしてるんだろう 今時のプログラマはC経験ない人も多いんだから実情に合わせることも必要 そういう連中を見下すのもいいけど老害呼ばわりされないように気をつけてね >>125 しょうもな 偉そうにするな!と偉そうに言うバカw どこが偉そうにしてるのか。 そもそも俺は>>119 を必ずしも否定してない。 少なくとも10進表記や2進数リテラルよりマシだ どーでもいいけど、こういう自分を客観視できない単細胞な奴がネトウヨとかなるんだろうね ネトウヨってつまりどういう定義なんですか マンコ吸わせてくださいs 5分かけて最後に煽っていくというだけで 自分が嫌ってるゴミと大差なくなっているというね >>119 ありがとうございます bitarrayってのがあるらしいんですけど、これって共用体とかに一括で代入できないんですかね 3バイトデータの内の下位1バイトは1bitごとのフラグなのでbitarrayで分解できそうなんですが そういえばちょっと疑問なんだけど、enum定義する時に>>119 みたいにbyteとか指定するのは何か意味があるの? 指定したところでbyte型の変数に代入しようとしたらキャストしなきゃいけないし、やる意味がわからないんだけど ああ、enumで作った型なんだからenum型になってるだろ。 受ける変数も同じ型じゃないとダメなのは当たり前。 >>133 シリアライズとかネイティブとの相互運用目的 動的にenumで作った型のsizeof求めりゃいいんだが、静的に解決しなきゃならない時は指定するしか無いって話だよな? >>116-117 コンパイル時点で型が定まらない(実行時に型が決まる)ものを new する手段という風ですよね? 使えそうです。ありがとうございました。 あとは、外部から「型」を受け取って new するまでの間、保管しておきたいのですが 型を変数(プロパティ)に格納するにはどうしたらいいんでしょ >>139 117はジェネリクスなのでコンパイル時には一応定まってるハズ。 型を変数に入れたいならインスタンス.GetType()か、typeof(型)で、Type型の値が取れるけど… 本当にやりたい事と、実装の方法(型を受け取ってインスタンスを作ってそのメソッドを呼ぶ)がズレてないか心配。 >>140 ありがとうございます。 「型」を格納する変数の型は System.Type なんですね!! やりたいことが出来ました!! System.Type t = typeof(××フォーム); ← ここのところを公開して外部からセット var f = (System.Windows.Forms.Form)System.Activator.CreateInstance(t); f.ShowDialog(); ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる