ふらっと C#,C♯,C#(初心者用) Part147
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為) 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください >>980 を踏んだ人は新スレを建てて下さい。>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっと C#,C♯,C#(初心者用) Part146 https://mevius.5ch.net/test/read.cgi/tech/1576069931/ ■関連スレ C#, C♯, C#相談室 Part95 https://mevius.5ch.net/test/read.cgi/tech/1508168482/ ■コードを貼る場合は↓を使いましょう。 http://ideone.com/ https://dotnetfiddle.net/ ■情報源 https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://docs.microsoft.com/en-us/dotnet/standard/class-libraries http://referencesource.microsoft.com/ ・Insider.NET > .NET TIPS - @IT https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html ・DOBON.NET .NET Tips https://dobon.net/vb/dotnet/index.html VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured Not演算子が見辛いから関数に置き換える ぐらいでいい気はする >>285 1つ目は短絡評価の場合の動作が異なるから等価な式になってないし、2つ目の式は元の式より見辛くなって無意味だろう てかそんな条件がパット見でわからんくなるなら、根本的にそこにいたる道筋がおかしいと思うよ SSH.net使った事ある人います? フォワードポイント設定後、Startしてプログラムは通ってるんですけど、なぜかポートが開かないので困ってます RloginというフリーのSShソフト使うと同じポートが開くので、SSH.net側かVS側が原因と考えてます ネットの先人たちの知恵を拝見して同じようにしてるんですけど、なぜか上手くいきません 開発環境 VS2017 Nugetより最新のSSH.netを入れてます netstatコマンドでポートの確認したら、192.168.〜の所が開かず、[::]の所が開いてるようです これはなんなんでしょう? >>292 ポートじゃなくてIPどうなってんの? 見た感じv6が開いてそうな感じだけど。 ポートフォアード開始してる?ステップインで状態とエラーメッセージ追えば理由なんとなくわかるんじゃね? >>293 >>294 返信ありがとうございます! >>293 さんのおっしゃる通りv6が開いてました フリーソフトは両方開けてくれてたので、そこで勘違いしてました こんな簡単な事でスレ汚してすいませんでした ありがとうございました 拡張メソッドがあるのに、拡張プロパティなどが無いのは何故でしょう? 多くの日本語解説サイトで DirectoryInfoではなくDirectoryを、EnumerateFilesでなくGetFilesを使ってるのは何故でしょう? (対応していないバージョンのC#を利用する人も、その方が高速・妥当なコードも稀だと思うのですが…) >>296 > 拡張メソッドがあるのに、拡張プロパティなどが無いのは何故でしょう? Why No Extension Properties? https://blogs.msdn.microsoft.com/ericlippert/2009/10/05/why-no-extension-properties/ > 多くの日本語解説サイトで 解説を書いてるヤツらに聞け >>298 最悪の提案だな 言語にこういう横断的関心事を入れられるようになるとだいたい無茶苦茶になるから、絶対にやめてほしい >>297 ,298 なるほど 確かにC#3.0に並んでるものと比べたら、優先度低くても全然不思議じゃないですね 将来的な実装を心待ちにしておきます ありがとう! 開発チームの内情というか現実的な部分の説明が面白かったw >>299 言われてみれば、強力な反面 把握し辛い奇想天外なクソコードも書きやすくなりそうですね >>298 リフレクション使うとどんな挙動になるんだろ >>301 今の拡張メソッドと特に変わらんのじゃない? >>299 ちなみに言語にこういうのを入れて滅茶苦茶になった言語ってどんなのがある? どんな感じに滅茶苦茶になったのかな >>302 そういう失敗例ならScalaでも見てみたら Taskとasync/awaitの使い方について質問です await Task.Delay(100); と task.Wait(); を組み合わせるとデッドロックすると色々なページで書かれていますが 試したらデッドロックしませんでした https://ideone.com/d6BWCC ConfigureAwaitもよく分かっていません(コンテキストとかマーシャリングとかも・・・) https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.configureawait?view=netframework-4.8 なぜデッドロックしなかったのか教えてください WPFで適当なボタン作ってクリックイベント内で同じようなことをしたらフリーズしました GUIじゃなければ起きない、とかでしょうか CUIだとフリーズせず実行できてしまいます ・UIスレッドは1つしかない ・GUIアプリの場合、await後は生成元のスレッドに戻ろうとする ・ところがUIスレッドはawaitしている ・お互い待ち合うことでデッドロック発生 CUIの場合はawait後に元のスレッドに戻らないのでデッドロックしない。 GUIでもAsync1、Async2のメソッド内で await Task.Delay(100).ConfigureAwait(false); とすればデッドロックしないが、Async1やAsync2でDelay後にUI部品触ると(ボタンのキャプション変えるとか)落ちる なんとなくわかった気がしました SynchronizationContext.Currentで取得できる同期コンテキストでawaitの動作が変わってるみたいで CUIはもともとnull、WPFは await Task.Delay(100).ConfigureAwait(false); のあとはnullになるようです 一度nullにしてしまえば await Task.Delay(100); Async().Wait(); とやってもフリーズしませんでした というかCUIと同じようにawait毎にスレッドがコロコロ変わるようになります 逆にCUIでも同期コンテキストを設定してしまえばデッドロックも起こせるみたいです SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); とやったらCUIでもフリーズしました 普通のnew SynchronizationContext()ではフリーズしないので、知らない仕掛けがありそうですが 同期コンテキストの作られ方によってawaitの動作が変わるから デッドロックが起きたり起きなかったりする、という感じがしました WinformsやWPFは各々フレームワークのコンポーネントの初回呼び出しで それぞれ専用の同期コンテキストを自動で現在のスレッドに設定して await 式から自動生成されたコードで現在の同期コンテキストのSendやPostを呼び出してるって割と単純な話だわよ 質問失礼致します。 ttps://xr-hub.com/archives/20326 の2番目のサンプルコード「Person.cs」に public Person(string name, Job job) という行があるのですが、これは関数ですか? publicの後の型やvoidを省略した時、どういう扱いになっているのでしょうか? (暗黙的にvoidなど) 初歩的すぎる質問ですが知恵をお借し頂ければと思います。 よろしくお願い致します。 >>311 ,312 コンストラクタと言うキーワード自体を知らなかったので大変助かりました! 迅速なお答えありがとうございます。 >>313 コンストラクタ知らないとか煽り抜きで基礎からやり直せ。この先すぐに行き止まりやぞ コンストラクタは言語によってちょこちょこ違いがあるからなあ それによって作法も、チームとかのなかでの使い方も違うんだよな 初心者で妥当な用語もよく分からないのですが、 Sytem.IO.File全体を Sytem.IO.FileInfoで上書きしたり Sytem.IO.File全体を FileUtilsにリネームして利用ってできるでしょうか 多分歴史的経緯とかなんでしょうが、名前も機能も違和感ある・・・あるよね? >>319 名前空間の上書きは出来るよ using に= を付ける。 マニュアル読むべし 進歩しろってことだろ >>322 には一生無理っぽいが… >>321 ありがとう! alias directiveで上書きになるのか aliasって単語から、上書き用に使うという発想が出てこなかった・・・ >>319 すでにFileInfoは存在してるしUtilsみたいな抽象的な名称はあんま好きじゃない あくまでもnamespaceなんだから個人的に違和感は無い >>319 あなたの違和感をなくすために他人に違和感を与えるコードを書いてはダメでしょうw そういう尾崎豊的な「世の中間違ってる!」は義務教育で卒業しておけよw インフラはみんなが慣れ親しんで知識を共有していることに意味があるんだよw 変なエイリアスを使うことはあなたの「俺流」を理解する手間を読む人に押し付けることになる。 それは1年後の自分自身かもしれないよw 自分だけのコードなら好きにすればとしか チームで共有するならレビューしろとしか まさにそういう話で、(大多数が慣れ親しんだ知識である)自然言語で full path of a file だから (FileInfo) hoge.FullName より (File) file.FullPath の方が読みやすく、知識なく利用しやすくない? と思ったんだ 自分が知らないだけでFileInfoやFullNameの方が妥当な理由あるのかな 質問です。 visual studio2013 のWEBフォーム(.aspx)を使用しています。 以下のようなフォームを作りたいです。 どうやってつくったらよいでしょうか? ▼コンビニ ←選択すると▼マークになり、折り畳みのチェックボックスリストが出る ■セブンイレブン ←選択するとレ点でなく、□を塗りつぶす □ローソン ■ファミリーマート △ショッピングモール ←選択しないときは△マークでリストは折りたたまれている △スーパー よろしくお願いいたします。 チーム内でそれを浸透させる実力があるならいいんじゃね 俺はデフォルト推奨派なので、それだけの理由なら無意味な改変に見えるので 、それは賛成しないがな 「俺が見易い」は「皆が見易い」ではない CreateFontがMFCではCreateFontIndirect でオーヴァーライドされている事を 知った時の驚き。😵 世の中広いからそういう常識の所も あるのでしょう❤ windowsならpathってだけで他システムでもpathかどうか? 組み込み系OSだったらディレクトリ構造持ってないようなやつあったりしないかね?全然しらんけど つうかその程度なら332と同じく公式に準拠する IDEがヘルプ付きで候補出してくれるんだし、リファレンスもあるんだから困るほどのことじゃない あくまでもプログラムであって自然言語じゃない PowerShell では、FullName $files = ls -File echo $files[ 0 ].FullName 共有フォルダに置いてる実行ファイルで、一人が起動している時に別の人が起動したら処理中ですとお断りメッセージ出したいのですが、どういう方法で実現できるでしょうか? DBでフラグ監理しようかとも思っているのですが、世間様はどうしているのかなと思い 共有フォルダ内に、ファイルを置いて、それに記録すれば? ロックファイル的なものを起動時に作成・チェックさせるとかかねぇ? 異常終了したりしてロックファイルが残った時が面倒だけど そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど それな ファイルおいたとこで実行ユーザはローカルとか、なにそれって感じ なんでサーバにしないのとかね Unix環境とかならファイルオープン時に共有モード指定できないから、ロックファイルを「作成」できるかで排他制御するけど、 Windows環境なら共有モード指定できるから、「排他モードでオープン」できるかで排他制御できないの? そうすれば、ロックの解放は単にファイルハンドルを閉じるだけでロックファイルを削除する必要はない。 で、異常終了してプロセスが終了した場合はOSがプロセスによって開かれてたファイルハンドルをクローズしてくれるので、 自動的にロックも解放されるってことにはならないの?? 途中共有モードを無視するような輩がいたらあれだけど、とりあえず全部Windowsで揃えてSMBで共有すればそれでいけそうな気がする 理論通りに動けば良いなぁ なおopenfiles ってコマンドで強制解除出来る そうすれば、アプリ起動時にnew FileStream(特定のファイル、FileShare.None) アプリ終了時にStream.Closeの2行で実装終了 Windows最強 >>345 それって共有フォルダ側が安いNAS(≒samba)でも使えるの? >>346 それは知らない。 すべては要件次第。あくまで全部Windowsで揃えられる場合の一番簡単な実装を示しただけ。 安いNASでダメだったら、君のいうロックファイルのやり方でやればいい。ただし、君の方法もひょっとしたら安いNASで「ファイルの存在確認とファイルなければ作成」をアトミックにやってくれないSMBの実装があって使えない可能性もあるので。 >>339 > そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど バージョンアップの手間を省きたいとかでしょ Web化しろとかの話もあるだろうけどそこまで工数かけられないとか普通にあると思う >>337 微妙に要件と違うけど、昔のアドビのアプリは同一ネットワーク内のPCでは 同じプロダクトキーでアクティベートされたソフトは同時に起動できなかった あれと同じ仕組みを使うことは可能じゃないか 具体的にどういう仕組みか知らんけどw DBにログインIDと開始時刻を記録して処理が成功したら記録削除、失敗してたら20分経過で無効情報で良いかと思ってます 処理が20分超えたらアウトというイケてない部分をどうしようかとも思ってます だったらファイル管理でも良いかなと思ってますが DBに処理対象を一意な文字列にして、ユーザIDとIPアドレスをもってロックを確保しに行ってるな。 弾かれた側に「誰々がどこでロックしてるから諦めるか直談判しにいけ」ってメッセージにしてる。 ロックが外れる時間は2分にしてるけど、ロック掛けてる側が、30秒ごとに延長するように更新してる。 トランザクションは増えるけど、強制終了してロックが残ったのを外す方が手間。 20分待ってくれる方が少ないと思うぞ。 1000人ぐらいが同時に使ってるが、それほど負荷は無い。ジャーナルの残し方だけ気にした方がいいぐらいか。 >>351 タイムアウトを含めて失敗したら即リソースを解放すればいいだけでは? あと排他制御が必要なリソースの状態を管理するテーブルと そのリソースを誰が使ってるかみたいな情報を管理するテーブルは別にしたほうがいいよ >>353 処理失敗とかイベント取れる所なら良いのですがパソコンがネットワークからいきなり外れた時とかどうしようかなと >>354 共有フォルダに実行ファイルを置くやり方だから クライアント側でしかタイムアウト検知できないって話なのか そうすると>>352 が書いてるような方式になるけど サーバー側で実行するやり方なら必要のない複雑性を抱える事になるから テストや運用時の手間を考えるとアーキテクチャ見直したほうが早い気がする chartのX軸のスクロールバーを動かしたときのイベントハンドラ的なものってありますか? 具体的には、縦軸(Y軸)の範囲を表示されている範囲内の最大値と最小値に逐次変更したいです。 >>331 この問題どなたか教えていただけないでしょうか? とくにレ点じゃないチェックボックスを作成したいです FormにWebboewserコントロールを張り付けて ↓のコードコピペしたのですがThis がFrom1を参照しているのでエラーになります。 正しく使うのはうすればいいのでしょうか? https://todosoft.net/blog/?p=380 今時WebBrowserコントロールは古いんですね とりあえず、これは勉強の為のなので、WebBrowserで大丈夫です。 上記コードの this を webBrowser1 に置換すれば問題なく動きますが、thisのまま使う場合はどのようなコードになるのでしょうか? >>362 リンク先のソースのメソッドは、おそらくはFormではなくWebBrowserを継承したコントロールに書くメソッド WinForms標準のコントロール自体に機能追加することで、あちこちのFormでWebBrowserを使うつどそういうソースを書かなくて済むようにしてる 初学者でカスタムコントロールの作りかたとか未学習なら「this を webBrowser1に置き換え」で回避してよいと思う >>362 なるほど、このコードはカスタムコントロールを目的としているのですね。 納得しました。ありがとうございました。 Form1に以下のような構造体を作ったんです。 // ----------通知方法の構造体-------------------- public struct Nortification { public bool OpenBrowser; public bool MessageboxShow; public bool ToolchipBaloonShow; } 次にメンバ変数として以下を定義しました static Nortification _nort = new Nortification(); //構造体のインスタンス で、プロパティを作ったんです public static Nortification nort { get { return _nort; } set { _nort = value; } } ところが、このプロパティをForm2で書き込もうとすると Form1.nort.OpenBrowser = true; 「変数ではないため Form1.nort の戻り値を変更出来ません」とエラーになります。 >>366 の続き しかし、以下のようにするとエラーは消えました。 Nortification nt = new Nortification(); nt = Form1.nort; nt.OpenBrowser = true; Form1.nort = nt; いったん別のインスタンスを作ってそこに構造体ごとコピーし、 コピーのメンバなら値を設定出来ました。 最後に元のインスタンスへコピーし直します。 なぜ元の構造体のメンバに直接値を書き込めないのでしょうか? そもそも構造体の使い方が間違っていますか? >>367 C#入門者が必ず嵌るポイント c# 値型と参照型 とかでググれば腐るほど出てくる 構造体は特性をよく理解した上でパフォーマンス上のメリットがある場合のみ使うもの 今は忘れてクラスだけ使ってればいい このメモリ大容量時代に構造体プログラミングなんてすなや おっしゃるとおりクラスに変更したところエラーは出なくなりました。 ググると以下のページのような記述がありました https://smdn.jp/programming/netfx/valuetype_referencetype/#value_type_property 値型では代入時にコピーが作成されますが、値型のプロパティやインデクサから値を 取得しようとする場合も同様にコピーが作成されます。 値型のプロパティ・インデクサはインスタンスそのものではなくインスタンスのコピーを 返すことから、直接インスタンスを変更することができません。 そのため、次の例のように値型のプロパティを直接変更しようとするとコンパイルエラーとなります。 参照型では変更しようとするインスタンスを参照によって取得することができるため、 コンパイルエラーとはなりません。 >値型のプロパティはインスタンスそのものではなくインスタンスのコピーを返す ということなのでやはり構造体の型をプロパティにするのは使い勝手が悪そうですね いっそインスタンス作成時にpublicにしたほうがいいかもと思いました >>373 コードを書く側の立場で考えると >構造体の型をプロパティにするのは使い勝手が悪そう これはむしろ逆の場合が多いと思うよ。 考えてもみてよ。 プロパティーの値が変更された時の処理をプログラマは普通プロパティーのセッターに書く。 ゲッター経由でプロパティーが実質的に変更されてしまう可能性があるとしたら? 値型で高速化の話が出てきたついでに教えて欲しいんだけどさあ 下のそれぞれの変数って、スタックとヒープどっちにメモリが確保されてるの?これであってる??? 静的なint型の変数・・・・スタック 静的な構造体・・・・スタック mainメソッド内に宣言されたint型の変数・・・・ヒープ mainメソッド内に宣言された構造体・・・・ヒープ インスタンス内で宣言されたint型変数・・・・ヒープ インスタンス内で宣言された構造体・・・・ヒープ VisualStudioプロフェッショナル版以下使用時、 プログラムの概観を素早く把握したい時ってどうするのがベストなんでしょう? ctrl + m → o ? 逆に把握してもらいたい時はDocFXとかに頼る形になるのかな 概要をさくっと把握する、にコード見ろになるの? 概要こそドキュメント、もしくはファイル先頭に概要コメントで詳細は各メソッドのコメントなりコード見ろじゃない? docをコメントから自動生成するなら書いてある内容の粒度はコメントだろうがドキュメントだろうが変わらん プログラマが見るならIDEで見れたほうがいい場合もあるしそうじゃないなたhtmlドキュメントみたいなのが良い場合もある >>376 ローカル変数以外は全部ヒープ なおローカル変数もクロージャ等によりヒープになる場合がある >>376 ついでにいうとそもそもint自体も構造体だよ >>379 get,setしないとフィールドにアクセスできないじゃん ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる