C#, C♯, C#相談室 Part96

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 7633-kUv4)
垢版 |
2021/12/20(月) 11:03:25.88ID:sdn/+VfW0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part94
https://mevius.5ch.net/test/read.cgi/tech/1553075856/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/02/13(日) 17:47:23.01ID:DvSkIP620
別にインターフェイスを使いたいってわけじゃないだろ

var dic = new Dictionary<string, Delegate>();

Func<int, int> f1 = (i => i + 1);
Func<string, string> f2 = (s => s + "さん");
dic.Add("1", f1);
dic.Add("2", f2);

Console.WriteLine(dic["1"].DynamicInvoke(2));
Console.WriteLine(dic["2"].DynamicInvoke("名無し"));

これでいいんじゃないか
2022/02/13(日) 19:33:32.60ID:gSu1aBn10
>>98
なんかすげーなまじで
仕事で使ってるだけのわいには到底思いつかんわ

しかしこれなんか業務で使える場面あるん?
2022/02/13(日) 19:55:15.91ID:DvSkIP620
>>99
本当は何がやりたいかは知らんわ

>Dictionary<string, Func<T, TRESULT>>
>みたいな事をやりたいのですが
って話だからな
2022/02/13(日) 20:48:10.88ID:7zxfmdEw0
本当にやりたいことを突き詰めるとそんな面倒なことをしなくてもよい解決方法があったりするのはよくある事よな
今回の件でも当てはまるかどうかは知らんけど
2022/02/15(火) 12:56:44.30ID:XMXX+kQj0
例えばFFMPEGをC#で起動させてるときに
エンコード処理みたいな定期的に値が返ってくるやつって
別スレッドでFFMPEGを走らせて
本スレッドではテキストボックスあたりに出力するようにしたいんだけど
これってFFMPEGの処理が終わるまでメインスレッドはwaitしないとダメってことですよね?

単独スレッドで終了した結果は表示できるんですけど
2022/02/15(火) 13:01:30.90ID:XQ5fPZCEa
そんなことはない
別スレッドで読みだした値をメインスレッドに送って、メインスレッドでその値を表示すればいい
別スレッドからUIに表示しようとしたらエラーになる
2022/02/15(火) 17:00:40.59ID:/St4XHrW0
>>102
本スレッドのTextBox.TextにInvoke使って書き込むんだよ
2022/02/15(火) 19:16:59.08ID:jLK4fSzed
たぶんGUIアプリ作ってるんだろうけど
GUIのデータはメインスレッドしか書き換えちゃダメなルールがある

TextBox.Invokeでメインスレッドに自分のデータ変えてくれってお願いするか、
WPFのBindingならメインスレッドがデータ持ってないからデータ取りに来いってできたりする
2022/02/15(火) 19:24:23.63ID:IqKJXua+0
今のc#はスレッドを安易に使えるがスレッドには深い闇がある。
107名無し募集中。。。 (ワッチョイ ffad-aF3f)
垢版 |
2022/02/20(日) 04:59:16.93ID:gLgXgTw20
c#ってvisual studio でテストする時って
アプリの前回値みたいの記憶できないの?
〇〇フォルダのパスとか記憶したいんだけど
108デフォルトの名無しさん (JP 0H1f-JnE0)
垢版 |
2022/02/20(日) 05:45:33.44ID:9eA/EulNH
Windows上だと何日動かしてもメモリ使用量40MBくらいで安定してるプログラムが
(VS2002の診断ツールで確認)

ラズパイのMono上だと徐々にメモリ使用量が増え続けて
1日くらいで4GB到達して落ちるんだけど何故だろう
109デフォルトの名無しさん (アウアウウー Sae7-iDSx)
垢版 |
2022/02/20(日) 08:10:15.15ID:k8LvFvhxa
タイマーかなんか仕掛けて手動で↓を呼ぶ
GC.Collect(2, GCCollectionMode.Forced, false, true);

それで減らないならMonoのランタイムがそもそもUNCOと思われ。

Unity Profilerで表示されるMonoで使用メモリ量が膨大になってしまう
https://teratail.com/questions/238133
2022/02/20(日) 08:11:50.49ID:/uCWXFvO0
VS2002?
2022/02/20(日) 15:59:54.94ID:gLgXgTw20
dataGridView の中のリストの大きさってどうやって変えるの?
枠の大きさは変えられるんだけど
中のリストだけ小さいままでこまってる
2022/02/20(日) 23:16:48.82ID:ppLUrwgj0
中のリストという意味がちょっと判らない、列や行の幅の事?
名前にWidthとかHeightが含まれるプロパティ片っ端から弄ってみたら
113デフォルトの名無しさん (アウアウウー Sae7-7p3p)
垢版 |
2022/02/21(月) 19:22:27.56ID:4hCK79/5a
var form = new Form(){
 Text = "たいとる"
 FormBorderStyle = FormBorderStyle.FixedDialog
};

みたいに書けるやつ
一見VBのwith文っぽいけどプロパティの代入行為しかできなくて中途半端
2022/02/22(火) 10:14:36.95ID:Q9cfD2FD0
そら、初期化のために用意されているものなんだからそういうもんだろ
2022/02/22(火) 13:36:13.33ID:j1m5S7Tk0
オブジェクト初期化子って名前を知らないとwith的なもんかと思ってしまうのかも知れないね
2022/02/22(火) 15:45:45.85ID:vNlU0s1vM
VBのWith文読み難いから出来んでいい
2022/02/22(火) 15:53:33.83ID:PEuqNSu60
vb.netのオブジェクト初期化子はWithなんだよね。
冗長だ。
2022/02/22(火) 16:15:23.63ID:gr38xJ4ba
c#のは同じような書き方でも意味が変わって一貫性のようなものがない(ように一見思える)
var form = new Form()
{Text = Text};
form.click += delegate
{Text=Text;};

vbのは普通の命令としてもwithがあり、そこに囲まれてる変数の頭にピリオドを付けるという書き方の一貫性のようなものがあるからな
どっちが初心者に優しいかと言えば今でもvbと感じる(vbがいいとは言ってない)
119デフォルトの名無しさん (ワッチョイ 6fe9-EcOz)
垢版 |
2022/02/23(水) 12:07:24.23ID:n7YEN9KD0
フレームワークの話でしょうが、フォームアプリでモーダルフォームの外を
クリックした時に、モーダルフォームを閉じる事って出来るでしょうか?
スマホのUIによくある挙動ですが、同等の動きを実現出来ないかなと。
120119 (ワッチョイ 6fe9-EcOz)
垢版 |
2022/02/23(水) 12:10:24.55ID:n7YEN9KD0
初心者板の内容でした。
失礼しました。
2022/02/23(水) 12:26:47.20ID:n4QLtIZ70
薄毛や抜け毛にお悩みなら、発毛専門の*****へ。
一人ひとりの薄毛・脱毛原因を正確に突き止め、その原因を解消する独自の発毛システムを提供しています。
2022/02/23(水) 19:02:33.81ID:wKfqGXJ00
たぶん画面全体に、透明のレイヤーでも貼るのだろう

それで、そのレイヤーがクリックイベントを受け取れる
123デフォルトの名無しさん (ワッチョイ cf10-hSEA)
垢版 |
2022/02/23(水) 20:18:19.67ID:Mz9SDh4V0
すいません 教えてください
文字列変数の中に 変数をしてしておいて 実行時に指定する方法ありますか?

例:
目覚まし時計プログラムで
9:00の時
9:00になりました。 おはようございます。
12時の時
お昼です 12:00になりました。
って 入れ替えたいのだけど
$Time になりました。おはようございます。

12時の時の文字列は
お昼になりました$Timeになりました。

って指定しておき $Timeをあとから指定したいみたいな方法です。
2022/02/23(水) 20:28:47.29ID:RBoSgh/A0
Replace("$Time", "12:00")
2022/02/23(水) 20:56:09.29ID:77XR+UNq0
>>123
お望みなのは、文字列補間?

string a="かきくけこ";
Console.WrightLine($"あいうえお { a } さしすせそ");
2022/02/23(水) 21:57:54.53ID:6Rc20OyP0
埋め込む文章も変えたいみたいだから
DateTimeによって適したフォーマット用文字列を返すようにして、その後string.Format()するとか
2022/02/24(木) 06:20:18.96ID:1wBDmGBO0
>>122
Webじゃないから難しいかな
2022/02/24(木) 10:51:32.90ID:N/yjILul0
>>119
フックしちゃうのは?
https://www.artistics.co.jp/blog/2019/07/1485/
2022/02/24(木) 21:50:55.08ID:G5PhgONP0
>>119
Deactivateイベントで拾えないか?
130デフォルトの名無しさん (ワッチョイ cf10-iDSx)
垢版 |
2022/02/24(木) 22:02:34.13ID:eVS3l/k90
>>126 ありがとうございます。
一つ進化しました。
求めているのは、 126みたいな感じです。
2022/02/25(金) 14:06:14.20ID:Eg3DloqN0
Ruby on Rails では、ERB(Embedded Ruby)で、何の文書にも、Rubyのコード片を埋め込める

例えば、a.rb 内で、ary = [ "a", "b" ]
と定義して、ERB のresult( binding )で、
この文脈を他のファイルへ、バインドできる

b.html.erb 内で、<% 〜 %>, <%= 〜 %> を使って、Rubyのコード片を埋め込む

<% ary.each do | elem | %>
<p><%=h elem %></p>
<% end %>

出力ファイル、b.html
<p>a</p>
<p>b</p>

他にも、カスタムフォーマットを自作して、その形式を日本語辞書に登録して、呼び出せる

ja:
time:
formats:
medium: "%Y年%m月%d日 (%a) %H:%M"

と定義したら、b.html.erb 内で、
<%=l( Time.current, format: :medium ) %>
と書くと、

出力ファイル、b.html
2022年02月25日 (金) 13:55

まあ、コミュニティーが配布している日本語辞書に、
最初から、幾つかの形式が登録されているから、自作する事は少ない
2022/02/25(金) 15:06:52.58ID:8px/N21n0
Rubyって使ったことなかったけど、
それAsp.netにそっくりやね
2022/03/01(火) 13:52:40.14ID:4BvRS+UW0
Console.writeline()はスレッドセーフでないというのは本当でしょうか?
今までシングルスレッドで動いていたプログラムを一部の処理だけマルチスレッドで動作するように変更中です
Console.writeline()の呼び出し箇所を全て変更する必要がありますか?
2022/03/01(火) 13:56:54.75ID:VTZdDdWR0
スレッドセーフです
2022/03/01(火) 20:21:42.35ID:OUtPpYxS0
https://docs.microsoft.com/ja-jp/dotnet/api/system.console?view=net-6.0#thread-safety
2022/03/01(火) 23:40:13.90ID:wsOShTVj0
この方は スレッガー ロウ です
2022/03/15(火) 17:49:18.74ID:uT8cdwkS0
相談させてください。

IntPtr を ref int に変換するために以下のようなコードを書くと、期待通り False と表示されます。

IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // False と表示される
Marshal.FreeCoTaskMem(ptr);

しかし、以下のように意味のない for 文を追加すると、コードの最適化が有効な場合のみ True と表示されます。

for (int i = 0; i < 0; i++) { } // 意味のない for 文
IntPtr ptr = Marshal.AllocCoTaskMem(4);
ref int x = ref Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr);
Console.WriteLine(Unsafe.IsNullRef(ref x)); // 最適化が有効な場合のみ True と表示される
Marshal.FreeCoTaskMem(ptr);

ただし、意味のない for 文があっても
Unsafe.AddByteOffset(ref Unsafe.NullRef<int>(), ptr)
→ Unsafe.SubtractByteOffset(ref Unsafe.NullRef<int>(), -(nint)ptr)
のように書き換えると常に False と表示されるようになります。

なぜこのようなことが起こるのかさっぱり見当がつかないので、お知恵を拝借できないでしょうか。
私の環境を分かる範囲で書くと以下のとおりですが、他に何か必要な情報があればお教えください。

Windows 10 Pro (21H2)
Microsoft Visual Studio Community 2022 (64 ビット) Version 17.1.1
コンソール アプリケーション、.NET 6.0

どうぞよろしくお願いいたします。
2022/03/15(火) 18:02:33.05ID:LD6RLXEha
一行目しか見てないけど、これはいいのか?(8)かもよ
IntPtr ptr = Marshal.AllocCoTaskMem(4);
2022/03/15(火) 18:57:03.19ID:BlmPXv890
そもそも現在のポインタ値がヌル参照からのオフセットだって保証されてるのか?
2022/03/15(火) 18:59:03.73ID:1RknuKaK0
for文に意味があるからじゃないかな
2022/03/15(火) 20:05:41.25ID:NI5jmOXt0
最適化でなんか情報が消し飛んでるんだと思うけど、判らんな
[MethodImpl(MethodImplOptions.NoInlining)]
public static ref T AddByteOffset<T>(ref T reference, IntPtr offset)
=> ref Unsafe.AddByteOffset(ref reference, offset);
とかやってインライン展開抑制してみたら
2022/03/15(火) 21:00:09.00ID:ZTE9InWz0
>>137
JIT最適化を抑制せずF11でデバッグして逆アセンブルすると
先にConsole.WriteLine(Boolean)がTrue固定で呼び出されて
その後にMarshal.IsNullOrWin32Atom(IntPtr)となってるね

未定義動作はタイムトラベルを…彷彿とさせるがC#なんだよなぁ
MSIL的にも&とnative intの結果型は&に定められている筈だし
とはいえ、管理下ポインタはnullになりえないとか有った気もするし
null参照への演算が未定義なら道理なのかもしれない、あるいはバグか
2022/03/15(火) 21:23:35.68ID:uT8cdwkS0
皆様、返信どうもありがとうございます。
いただいたアドバイスを元に色々と確認をしていて反応が遅くなってしまいました。
申し訳ありません。

>>138
確認してみた所、C# では int は 32 ビットと決められているようです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/integral-numeric-types
ただ、可読性を考えると 4 ではなく sizeof(int) と書くべきでした。
ご指摘どうもありがとうございました。

>>139
Unsafe.NullRef<T>() と Marshal.ReadInt32(int) の実装を確認してみたところ、
おそらくその点は問題ないかと思います。
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/System/Runtime/InteropServices/Marshal.cs
しかし、問題の原因は大抵こういう思い込みに隠れているものだと思うので、
可能性を一つ潰すことができてとても助かりました。

>>140
そうなんですよね。
for (int i = 0; i < 0; i++) {} は i++ に到達しないのは明らかだから
最適化でまるっと消えてしまうかと思っていたので、この結果には驚きました。

>>141
書いていただいたコードを試してみたところ、確かに最適化が有効でも期待通りの動作になりました。
それからもう一つ、書いていただいたコードを使わない場合、
プラットフォームが x86 と x64 の両方とも最適化有効時には期待通りの動作をしないことが分かりました。
(x86 の場合は常に期待通りに動作するならば問題の原因について一つ仮説が立てられるかと思ったのですが、
 実際は違っていたので未だに原因はさっぱり見当がついていません…)
2022/03/15(火) 21:24:27.40ID:uT8cdwkS0
>>142
null参照への演算が未定義というのは、AddByteOffset メソッド内の話でしょうか。
下記のページの AddByteOffset<T>(ref T, IntPtr) のところをみると

ldarg.0
ldarg.1
add
ret

とコメントされていて、少なくとも IL 的には一つ目の引数が null でも特に問題はないように思えてしまいます。
IL 的に問題がないかどうかは私は自信がないのですが、
もし IL に問題がないのに JIT 最適化で問題が起きてしまうとすれば、
バグと考えてもよいのでしょうか。

参考
https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/Internal/Runtime/CompilerServices/Unsafe.cs
2022/03/15(火) 21:29:32.78ID:NI5jmOXt0
issue検索して無かったら、一応報告しといたほうがいいかもしらんね
2022/03/15(火) 21:33:53.42ID:NI5jmOXt0
[Intrinsic]
がついてるメソッドは、Release時に特殊な最適化が走ってる筈なんだけど
それが誤動作するケースがあるのかもしらん(あくまで想像)
2022/03/15(火) 21:41:55.33ID:ZTE9InWz0
あー同じような判定コードを読み間違えた
タイムトラベルは起きてないけど、代入もヌル判定もなくなってる感じかな

>>144
そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
xが常にぬるぽ扱いになってしまっている様ではある

C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
2022/03/15(火) 22:00:29.13ID:RZxqxi620
winforms
dbの値は、dataset . datatable以外で、どうやって取得するの? list?
2022/03/15(火) 22:07:11.34ID:uT8cdwkS0
>>145
そうですね。アドバイスありがとうございます。

私はこれまでこの手の問題は「まずは自分を疑え」と教わってきて
実際それで大抵の問題は解決してきたのですが、
皆様のお話をうかがうに、今回は自分の勘違いではなく
よそに原因があると考えたほうがいいのかもしれません。

これまで報告等は経験がないのですが、
それも視野に入れて調べてみたいと思います。

>>146
勉強になります。
その特殊な最適化で結果が変わることがバグなのか
私の力では判断が難しそうなのが歯がゆいところです。

>>147
> そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
> Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
私の理解不足で、
「片方が0なら実質意味はない」 ← 0 + p の計算は必要ない?そりゃそうだ!
「固定アドレス0をデリファレンスする」 ← 0 + p = 0 ということ?p ではなくて?
という感想を持ってしまいました。
申し訳ないのですが、もしよろしければもう少し詳しく説明していただけないでしょうか。

> C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
> Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
ご意見どうもありがとうございます。とても共感させていただきました。
未定義であればこそデバッグ時に教えてほしいものですが、
実際にはデバッグ時には期待通りに動作してしまうのが厄介なところです。
2022/03/15(火) 22:26:59.94ID:NI5jmOXt0
>>148
DataReaderで読むとか、EntityFrameworkやDapperみたいなフレームワーク使うとか
2022/03/15(火) 22:47:23.94ID:BlmPXv890
そもそも値型にたいするヌル参照が未定義な気がするが
最適化で数値ゼロとヌル参照が同一視されてるとか?
2022/03/15(火) 23:25:37.07ID:ZTE9InWz0
>>149
件の部分はJITコンパイルされたマシンコードの話で、ref intを参照する際に
xからでなくても「mov ecx, dword ptr [ptr]」的であっても整合性は取れるが
逆アセが「mov ecx, dword ptr [0]」になるので、xはnullにされてるという話

それならばIsNullRefが消えるのは順当としても、xがnullになる代入の欠落が
NullRef<int>が宜しくないのか、それをAddByteOffsetに与えるのがダメなのか
単なるバグか…、Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね
2022/03/16(水) 00:04:15.38ID:pAqxvPky0
>>151
なるほど…。
ただ、Unsafe.IsNullRef(ref Unsafe.NullRef<int>()) と書けてこれが true を返すので、
値型に対するヌル参照が定められていない場合は Unsafe.NullRef<T> の T に int が
指定できること自体がバグということになってしまうような気もします。
一応未定義ではないけど、CLR 外部との相互利用等で必要に迫られない限り
使ってくれるなという感じなのでしょうか。

>>152
ご親切に説明していただきどうもありがとうございます。
逆アセンブルの結果に “なぜだか理由は分からないが” 0 になっている部分があって、
そこから x が null にされているというという事実が読み取れる、ということですね。
(まだ間違っていたら大変申し訳ありません)

> NullRef<int>が宜しくないのか、それをAddByteOffsetに与えるのがダメなのか
NullRef<T> と AddByteOffset<T> のソースコードのコメントにはそれぞれ

ldc.i4.0
conv.u
ret

ldarg.0
ldarg.1
add
ret

とあって、これを見る限り、NullRef<int>() を AddByteOffset<int> に与えることの問題は
私には読み取れませんでした。
(そもそもこの問題で IL を持ち出すこと自体が見当外れなのでしょうか)
もちろん、実際には特殊な JIT 最適化が行われているのでしょうが、
その結果 IL から期待される動作と変わってしまうようなら、
やはりバグとして報告したほうがよいのかなというのが今のところの考えです。
2022/03/16(水) 00:10:04.98ID:pAqxvPky0
>>152
> Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね

そうなんです!というか、本来私がしたいことからいうと
MemoryMarshal.CreateSpan<int> メソッドに IntPtr 型を渡せると一番よいのですが、
それができないのでこのメソッドが受け付けてくれる ref int を作るという方向で考えています。
2022/03/16(水) 01:45:02.44ID:lykY2TTP0
>>153-154
仰る通りです

ECMA-335の文言"Managed pointers cannot be null"で検索してみたら案の定ツッコミありましたが
https://github.com/dotnet/runtime/issues/41418#issuecomment-681177889
これを受けてか、トップのNullRef<T>()に関する注釈にも
(10) Per ECMA-335, Sec. II.14.4.2, it is not strictly legal for a gcref to point to null.
However, all .NET runtimes allow this and treat it in a type-safe fashion,
including guarding accesses to null gcrefs by throwing NullReferenceException as appropriate.
と書かれていて問題なさそうな見解です
仕様に準拠していないというのは…JITコンパイラ的にどうなのか
言及を忘れていましたが、アセンブリにコード欠落は見受けられないのでC#コンパイラの問題ではないし

AddByteOffset<T>(ref T, IntPtr)にしても関連する注釈は
(1) Arithmetic operations on gcrefs (such as via Unsafe.Add) are not checked for correctness by the runtime.
The resulting gcref may point to invalid memory or to a different object. See ECMA-335, Sec. III.1.5.
のみですし、また前項と合わせてECMA-335が示されていますから、ILと無関係でもないでしょう
System.Runtime.CompilerServices.Unsafe.dllをデコンパイルしてみてもコメントと同じコードが示されます

Framework時代ならSafeBuffer継承とかやってましたが(SafeMemoryMappedViewHandleはコンストラクタがinternalなので)
これもこれで今見たら「SafeBuffer may be unavailable in future releases.」で笑えぬ
2022/03/16(水) 02:59:05.97ID:b5JRB2Cp0
最近の標準ライブラリの実装を見るに、.NET開発チームはIntPtrを使わせたくないように感じる
ポインタ弄るなら、あぶねー事やってんだから明確にunsafe宣言しろって事なんだろうな
2022/03/16(水) 15:09:58.97ID:lykY2TTP0
>>137>>153
よくよく調べてみたらズバリそのものが有りました
https://github.com/dotnet/runtime/issues/61510
>>156で言われている様な主旨のコメントもありますね

元コードの添え書きを見るに意図されたものと見受けられますが
ぬるぽを多少オフセットした所でデリファンレスしたら一緒という事でしょうか

昨年の時点で修正が入っていますが、マイルストーンは7.0.0とされ6.0.3でも取りこまれていません
https://github.com/dotnet/runtime/blob/v6.0.3/src/coreclr/jit/morph.cpp#L12906-L12918
.NET 7.0 Previewにはマージされており、その後さらに周辺コードはリファクタリングされ移動しています
https://github.com/dotnet/runtime/commit/132cc2f2d00e00b7f0dfd43498077da65cc27d29#diff-5b83397bbbdd17bb9457998b520fdaaa474d165390985b66f32371561b6d0bacR13505

まぁやはり本来は相対オフセットが期待されるところですから
絶対オフセットではなく大人しくAsRefを使うべきなのかもしれません
2022/03/16(水) 16:49:39.25ID:TbbZbi5h0
すみません。規制にあってしまったのか、パソコンから書き込めなくなってしまいました。
この文章も書き込めるかどうか分かりませんが、
ひとまず、親切にしてくださった皆様に心からお礼申し上げます。
2022/03/16(水) 18:13:49.44ID:b5JRB2Cp0
>>157 のリンク先の、
> Sergio0694 commented on 13 Nov 2021
> Having fake "safe" code using APIs like this instead of properly using built-in unsafe syntax is objectively worse and should be avoided. It makes it harder to see when code is actually doing unsafe things. It effectively makes your code more unsafe. It's an ongoing problem that has been here forever, certainly not helped by the existence of some APIs (looking at you Marshal...).

このコメントに激しく同意するわ。
ポインタ操作やってるのに、Unsafeクラスで無理矢理unsafeブロック書くの回避したところで、
それは危険なコードである事に変わりはない。
2022/03/16(水) 19:44:50.55ID:Eqgki5Lk0
vs2022 c# winforms .net6
画面作って、vs再起動すると
フォームが読込エラーが発生する

おまえら、発生しないの?
2022/03/16(水) 19:53:52.54ID:KaTnXwmea
発生するぞw
2022/03/16(水) 20:33:39.98ID:paMiN66w0
>>160
タブオーダーの変更も無効化されててマジゴミ
2022/03/16(水) 20:40:08.63ID:DWqldl790
.NET framework 4.8は永遠に不滅です( ー`дー´)キリッ
2022/03/16(水) 21:36:45.42ID:b5JRB2Cp0
WindowsFormでやるなら、実際.NET framework安定だと思う
.NET5とか6でやるなら、他のUI選択した方がいい
2022/03/26(土) 10:57:27.94ID:klc4wM2MF
初心者ですまんが、async/awaitでtaskの実行とtask自体の生成の責務が分離されてない気がするんだが
asyncの中にはawaitがあるもの(ないと警告)という連鎖はどこで切ればいいの?
最終的にインフラまで行ったとしてそこのasyncメソッドはawaitするものがなくなってしまうよな?
末端は警告を無視するか、Task.Runとかを作ってTaskを返すかなりしろってこと?
2022/03/26(土) 11:26:01.00ID:opZhrmyVa
await hogesync();

_= hogesync();
これで警告連鎖から逃げれる
2022/03/26(土) 11:38:25.92ID:klc4wM2MF
>>166
いやそっちじゃなくCS1998の方
↓みたいなの

async Task hogeA {await hogeB();}

// 警告 CS1998
async Task hogeB{Console.WriteLine("hogeB");}
2022/03/26(土) 12:14:52.53ID:opZhrmyVa
asyncにする必要がないのはしなければいいだけ
async Task hogeB{Console.WriteLine("hogeB");}

void hogeB(){}
asincじゃないけど、hogeB();って呼び出せばawait hogeB();と意味は変わらない
2022/03/26(土) 12:22:02.66ID:sDWgty5NM
>>165
TaskCompletionSouece
2022/03/26(土) 12:30:11.96ID:sDWgty5NM
あと、インターフェースの都合でasyncだけど実装は非同期である必要がない場合には、Task.FromResultやValueTaskやCompletedTaskを使うとよい
2022/03/26(土) 12:40:15.39ID:pvkpV0Laa
>>168-170
サンクス
中身が同期やけど呼び出し元はそいつを非同期で待機したけりゃTask.Runとか使うしかないって事だよな
asyncの中身を同期だけにすると混乱を招きかねないけどawait可能なTaskを自動で作ってくれてスレッド復帰なんかも勝手にやってくれる分利点もありそうな気がするんだが
どうなんだろ
asyncじゃないTaskを返すメソッドを作る法がええんかも知れんけどめんどいよね
2022/03/26(土) 16:33:46.27ID:7Z9PIxRJr
違うんじゃね?
ある関数の内部処理で
状況によって同期の場合と非同期の場合に
スィッチする事は良くある
173デフォルトの名無しさん (ワッチョイ 0d32-S2l7)
垢版 |
2022/04/06(水) 10:28:00.42ID:OCQcEzvM0
ご存知の方いらっしゃいましたら教えてください

StreamReader urlReader = new StreamReader(urlStream, Encoding.UTF8);
string urlReadString = urlReader.ReadLine();

上記の関数使ってcharset=UTF-8が設定されてるURLを読み込んだときに
普通にテキストとして読み込めるときと、UTF-8の読み込みに失敗してEF BF BDが出力されるときがあるけど、
失敗するときって何か初期設定が足りてない?
それともReadLine()じゃなくて別の関数を使う?
2022/04/06(水) 10:40:24.67ID:/2SYAuGyM
エンコーディング関係は、まず生バイトコードを確認しなさい
2022/04/06(水) 11:06:48.61ID:BAnc7YwEd
バイトコードでなくバイナリデータな

バイナリモードでファイル開いて読み込んで16進出力するか、
BZとかのバイナリエディタでファイルのバイナリを見るのがいい
2022/04/06(水) 12:14:51.33ID:XIBRKt28M
URL言うとるやん

UTF8EncodingクラスでBOMの有無指定出来るけど、結局バイトコード確認しないと判定出来ん
2022/04/06(水) 18:52:21.62ID:IJ3XlCfB0
ばいなり()
2022/04/06(水) 19:11:31.46ID:oIHs85Eca
バイナリであってるだろ。むしろバイトコードって使いかた初めて聞いたぞ
urlならその内容をファイルに落として開いて確認するのが楽
それが面倒な場合はコードからstreamをファイルに落として確認
2022/04/06(水) 19:15:36.12ID:aGcf2Kai0
ファイル落とさんでもVSで配列取得すればデバッグで確認できるやろ
2022/04/06(水) 19:26:15.02ID:oIHs85Eca
streamはデバッガで直接中身見れない(よな?)のと
(俺が使ってる外部バイナリエディタは)エンコーディング自動判別してくれるから俺にとってはファイルの方が楽
ほかの人にとってはわからないな
2022/04/06(水) 19:26:20.34ID:8tuXZutt0
EF BB BFってUTF-8のBOMだよね
detectEncodingFromByteOrderMarksの指定がある
詳しくはEncoding.GetPreambleで調べる
2022/04/06(水) 19:27:06.07ID:aGcf2Kai0
文字コードを判別する
https://dobon.net/vb/dotnet/string/detectcode.html
ReadJEnc C#(.NET)用ファイル文字コード種類自動判別ライブラリ
https://github.com/hnx8/ReadJEnc
このへんでいけるんじゃないかね
2022/04/06(水) 19:32:51.40ID:aGcf2Kai0
>>181
指定だけで自動判定出来るなら、そっちの方が楽そうね
2022/04/11(月) 20:16:43.58ID:2IiYezuY0
ソースジェネレーターってnetstandard2.0だからWinFormsは参照不可能?
ソースジェネレーター側で参照できずともまあ良いんだけど、出来ればWinFormsのいくつかのクラスからコンパイル時リフレクションで色々取り出したいのだが
2022/04/11(月) 20:33:51.13ID:M/snaKK00
ソースジェネレータで何を生成したいん?
2022/04/13(水) 17:04:49.00ID:5l1VnwO30
C#からPowserShellを実行して
登録済みのVPN一覧を取得しようとしています。

コマンド発行までは出来たのですが戻り値
Name ServerAddress の取得が出来ません。
どの様なコードを書けばよいでしょうか?

using (var invoker = new RunspaceInvoke())
{
var result = invoker.Invoke(source);
}

resultに値が入るハズなのですが・・・分かりません。
PowerShell上で実行するとVPN一覧が表示されています。
2022/04/13(水) 18:50:59.56ID:e0uLmTvD0
マルチ死ね
2022/04/13(水) 18:59:25.77ID:zw+GE19b0
>>186
グロ
2022/04/13(水) 19:26:25.04ID:nybfnzFR0
>>186
resultの中身をデバッガーで見てみなよ
2022/04/13(水) 19:52:25.67ID:5l1VnwO30
>>189
動的ビューというところに値がありました。

new Microsoft.CSharp.RuntimeBinder.DynamicMetaObjectProviderDebugView(result[0]).Items[24]


result[0]
BaseObject
ImmediateBaseObject
Members
Methods
Properties
TypeNames
本来であれば、この中のどこかに入ると思うのですが見つかりません。
2022/04/13(水) 20:53:24.06ID:zw+GE19b0
>>190
もう一方の方でも返信きてるぞ
2022/04/13(水) 23:57:25.49ID:5l1VnwO30
>>191
ありがとうございます。
2022/04/18(月) 12:25:35.83ID:UzqEtN9Q0
これはマルチのお手本
2022/04/22(金) 17:18:18.78ID:11YPP3hWa
内部クラスから外のprivateなenumの型を直接参照できるのはどうしてでしょうか?

public class A {
private enum ZZZ {a, b, c}
class B {
Console.Writeline("number = " + (int)ZZZ.a); // なぜenumだけこれが許されるのか
}}
2022/04/22(金) 17:20:58.21ID:QpAASndCM
enumだけが許されるわけではない
2022/04/22(金) 17:32:06.89ID:11YPP3hWa
よろしければそのルールについて学べるようなヒントとかキーワードを教えて頂けると助かります。
2022/04/22(金) 17:56:13.35ID:cNb4vicFa
privateはそこに含まれるのに対してアクセスおkって定義だからアクセスできる
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/basic-concepts#752-declared-accessibility
2022/04/22(金) 19:10:42.44ID:11YPP3hWa
ありがとうございます。enumが暗黙的にstaticなら都合がいいのでそういう事にします
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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