C#, C♯, C#相談室 Part95
■ このスレッドは過去ログ倉庫に格納されています
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら http://www.visualstudio.com/downloads/ ■コードを貼る場合はこちら http://ideone.com/ ■前スレ C#, C♯, C#相談室 Part94 http://mevius.2ch.net/test/read.cgi/tech/1492843013/ ■次スレは>>970 が建てる事 建てられない場合は他を指定する事。 >>122 >>107 はソースの話やで? オブジェクトはまとめたらいいだけだし >>123 var list = new dynamic[] { a, b, c }; foreach (var x in list) func(x); 引数もインスタンスも無いならreflection >>125 なるほど。 dnamic使うしか無いんですね? >>127 reflectionと言うのでやる方法を教えて下さい >>119 APIはあっても、実際は例外投げるんじゃないかとか。 StreamやISerializableなど今まで散々レガシー扱いされてたのに、 すんなり実装されたのだったら、今までは何だったのかと思ってしまって。 >>124 「配置できるファイルに〜」のところもソースファイルの話だったか、失礼した >>126 リフレクション そもそも用途がわからんけど >>130 最初のリンクがそもそも.NETStandardの話なんだけど、.NETStandardとは何か知ってれば(最低限ググれば)前者は迷う余地がない 後者は経緯知らないけどレガシーが実装されたらだめという理由がない …と考える人が大多数だと思う C#でちょっとした文字列の連結を行う場合、+がいいのかFormatがいいのかReplaceがいいのかStringBuilderを使うのがいいのか悩んでます どれが一番いいのでしょうか? 1. string value = A + "-" + B; 2. string value = string.Format({0}-{1}, A, B); 3. string value = "{A}-{B}".Replace("{A}", A).Replace("{B}, B); 4. StringBuilder sb = new StringBuilder(); sb.Append(A); sb.Append("-"); sb.Append(B); こんな細かいことで悩んでいたら禿げるわ それぞれにどれだけの差が出てくるか考えろよ とりあえず、環境が許すなら141、駄目なら139の1 連結ならいつもは分かりやすさ優先で+ 実際に扱うデータで使ってみて遅いと感じたらStringBuilderに変えてるわ 置き換えは置き換えの時だし、フォーマット形式が必要と感じたらそれ使うし 悩むのかこれ…コーディング終わらんやろ… 最初はくだらない事に悩むからしょうがない。直に、開き直るからそれまでとことん悩め。 >>145 こういうので悩みだすのはスキルが伸びず閉塞感に陥って逃げ道探しているときだw StringBuilder必要なのはループで回す時くらいやろ 固定回数なら最適化されるんちゃうか しらんけど 改行したい時はsb.AppendLine使う var s = $@"hello {A} world"; 別にこれでもいいけど、インデントが気持ち悪い 数個程度の定数個の結合にStringBuilderは無いね @""で改行入れたときの改行コードってソースコードの改行コードに依存するんかな StringBuilder使うのは基本、ループ内で文字列結合するときだけだな と書くと、問題あるな。あるメソッド内でループしてないから普通に文字列結合してても、 そのメソッドを使う方でループしてメソッド呼び出されたら・・ ということでなんでもない。 パフォーマンスは大差ないので可読性で選ぶ となると 定数個なら+ 動的ならlinqとJoin public override と override public とでは、どっちが普通ですか? >>156 じゃあstatic使う場合は どこに入れるべきですか? EF Core + MariaDBで行ロックをするにはどうしたらいいですか? >>159 EFに明示的なロックは要らん 保存するときに他の変更があれば保存は失敗する EFは基本、楽観ロックだからね。 自分が更新するデータは誰も変更しないだろうということで楽観的に考えて行ロックを取得しない。 で、実際の更新時に、保存しておいたタイムスタンプ列や全列を比較して更新するUpdate文を 発行して誰も変更してなきゃ成功する。 対して、悲観的ロックは誰か変更するんじゃないかと悲観的に考え前もって行ロックする。 行ロック取得したければ、トランザクションの分離レベル変更して、間接的に取得すればいいんじゃねぇかな。 例えば、トランザクションをロックを使って実装してるデータベース使ってるなら、 トランザクションの分離レベルをREPEATABLE READにして読めば、読み込んレコードには 行ロックがかかる。 Consoleアプリの関数Aから別のスレッドで関数Bをを実行。 Bが終わるまで数分かかるので、その間はAの処理を引き続きやる。 Bが終わったら何らかの通知をA(あるいはアプリ)で受けとる。 そんな処理をしたいのですが、どんな手法がお勧めですか? >>166 普通にTaskとasync-await >>167 情報ありがとうございました。調べてみます。 >>168 それは何ですか? >>169 関数Aの中で関数Bの終了をawaitするとそこでAの処理が停止しますよね? それでは困るんです。 通知を受け取って何をするの? Aが実行中に通知を受け取った場合は? Aが終わったあとに通知を受け取った場合は? >>171 終わったってフラグでも作っておけばいい 何のためにそんなこと聞くの? >>172 実際にコードに起こすこと考えたら>>171 の疑問出てこない? ポーリングの有無とかB終了の通知はA以外で受けたほうがいいのかみたいな void A() { ... Task.Run(() => B()); ... ... } void B() { ... ... SetSomeFlag(); } こういうこと? 何をしたいのかハッキリしないな >>170 関数BをTaskで実行しておいて、たまにTask.Wait(0)がtrueを返すか確認する >>173 何で目の前の問題置いて次の実装考えるの やり方が一つ決まったらそれでやり通す必要もないし 質問者の要件わからないのにそんなこと聞きだす必要はない 多分処理AはUIスレッドなんだろ 処理B実行中にUIは止めたくない そして処理B完了でUIを更新したい そんな要件だと想像した >>177 それだとInvokeやDispatcherの話にも広がりそうだね >>177 consoleアプリって書いてあるやん 元の話が設計で根本的におかしいか思い付きで質問しているかどっちか 後半に100ペリカ コンソールアプリなら EventWaitHandle使うのが楽そう WaitHandleは完了を待つ側のスレッドをブロックするから、 それでいいんだったら普通にasync-awaitでいい Aで何したいかだけどコールバックでいいんじゃないの だったらTask.ContinueWithでいいだろ つかそもそも別スレッドで実行する必要があるのか 別プロセスで良いんじゃねえのか >>187 プロセス間のデータ受渡はsoket通信する感じ? >>188 勝手に要件作る気なのかw しかも中身まで要エスパーとか 皆さんレスありがとうございました。 >Aが実行中に通知を受け取った場合は? 関数Cを別スレッドで実行したいです。例えばこんなふうに。 void C(){ Console.WriteLine("Bが終わった"); } >Aが終わったあとに通知を受け取った場合は? Aは終わらないと言う前提でお願いします。 >>190 >>186 に出ているだろ というかTaskメソッドをMSDNで調べろよ フラット案件どころかこれだけレスとキーワード出ていて自分で解決できないのならプログラムやめるべき 何でもいいけどすぐ動く完動品が出てくるまでこの調子だと思うぜ どうせソースないんだろ、出てきたものを見ていじって作ろうとしてるんだろ >>190 BとCについてはよく分かった Aが現状どういう処理をしているかによって 解決の仕方が違ってくると思うな コンソールアプリで関連性のない2つの動作を同居させるシチュエーションがわからん マルチスレッドにしたら効率が良くなるってだけの頭の悪い発想じゃね >>187 が当てはまらないのならぜひ教えてほしいくらい >>188 コンソールアプリ同士なんだから、まず標準入出力でダメか考えるべきじゃね ソケット通信が必要ならまあやればいいけど、それだとそもそもコンソールアプリなのが正しいのか疑問だ >>199 ASP.NET Coreなんてもろコンソールアプリだけどな >>199 GUIが必要ないからCUIってプログラムは幾らでもあるが。 >>201 それはGUIが基本なのかCUIが基本なのかの違いであって コンソールアプリである必要性とは関係ないよね 別にGUIを基本にしろって主張じゃないよ ただCUI=コンソールアプリってわけでもないだろうと Task<string>型からstream型に変換するにはどうしたらいいでしょうか? 調べてもよく分からず詰まっています よく分からんけどstringを取り出してからTextReaderかなんかに渡す >>205 https://ideone.com/CfSqOZ こんな感じでurlを投げて返ってきたものをstreamに入れたい // HTTPアクセス var req = WebRequest.Create(url); var res = req.GetResponse(); // レスポンスをオブジェクトに変換 Stream s = res.GetResponseStream(); StreamReader sr = new StreamReader(s); string str = sr.ReadToEnd(); もともとConsoleAppでこう書いて動いてたんだがGUIベースのにしようとしたらGetResponseが使えなかった 代わりにGetResponseAsyncにしたらエラーが出てもっとわからなくなった ナウなヤングはHttpClient.GetStreamAsync 低水準言語からC#に戻ってくるとlinqが有能すぎて困る困らない ienumなんとかいうヤツにforeachないのはなんでなの?魔女のバァさんの呪いか? List<T>.ForEach(Action<T> action) みたいなやつのことかな? はい副作用ドーン!はLINQとしてどうなのってことで入らなかった console では処理を止めても良いから、同期処理でも良い でも、GUI では処理を止めると、アプリが動かなくなるから、 50ms 以上掛かるものは、非同期処理が推奨 Int32へのIntPtrを渡さなければいけないのですが、unsafeコードしか方法はないのでしょうか? 現状、 Int32 int32; IntPtr intPtr; unsafe { intPtr = new IntPtr(&int32) } someObject.someMethod(intPtr); みたいな感じです。 System.Runtime.InteropServices.ComTypesで用意されてるインターフェース使うと、 IntPtrで宣言されてるんですよね・・ まぁ、自前でrefで宣言しなおしてもいいんですけど。 うーん。どうしよう。 まぁ、out,ref使わずにIntPtrで宣言すると、null渡せるっての1つの利点ですかね・・ COMインターフェースでオプショナルな引数もあって、そん時はnull渡してくれみたいのもあるんで。 >>213 みたくunsafeしなければいけなならデメリットの方が大きそうですけど。 Marshal.AllocCoTaskMemするとか new int[1]してGCHandle.AllocでPinnedしてAddrOfPinnedObjectするとか 直接アンマネージにポインタだけ渡すってどうなんだろ Marshal.AllocHGlobalとかしなくていいのか? いまだにどこまで.Pinnedしなきゃならないのかわからないw 趣味グラマだからわからないままでも問題はないんだけども C#始めたころはいちいち書いていたが最近はずっと省いているな 変数がスタックにあるなら要らん それ以外は必須 GCHandle.Allocは解放漏れでメモリリーク起こす可能性があるしパフォーマンスも悪いからなるべくfixed使った方がいい >>220 サンクス だけどアンマネージ側に渡すのにいちいちunsafeにはしたくないな IntPtrってvoid*相当で型安全もクソもないし AllocHGlobalもmallocを生で使うのと変わらん unsafeよりよっぽどunsafe ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる