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
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なら都合がいいのでそういう事にします
2022/04/22(金) 19:17:02.27ID:X/HcvjX50
親のオブジェクトも取得できれば便利なのにな。
200デフォルトの名無しさん (スッップ Sdbf-RPPK)
垢版 |
2022/04/22(金) 20:30:49.13ID:XRzGPZH0d
派生クラスとInnerクラスをごっちゃにするなよ?

外側のクラスのインスタンスさえ得られればprivateにアクセスし放題だったり
2022/04/22(金) 21:18:57.90ID:gmnEH6VvM
>>199
循環参照になるから…
2022/04/25(月) 12:56:21.20ID:zhSuRXyD0
xxxx.exeで
var args = Environment.GetCommandLineArgs()
のargs[0]が xxxx.dll だった・・・
2022/04/29(金) 23:05:58.93ID:ZxkWaM0v0
関数のエラーを表現するのってどういうのが一番C#のスタイルに合うんでしょうか
例えば公式のtryparseなんてbool返しますよね。でも例外投げるって手もありますよね。なんか職場の古いおっさんははるか昔のCのやり方そのまま0とか-1とか返してるし
2022/04/29(金) 23:18:22.51ID:Hw91ocej0
メソッド次第、エラー次第 これ一つでオールオッケーなんて物はない
って当たり前の答えにしかならないよ
2022/04/29(金) 23:19:40.25ID:oqakQFJca
普通はboolでいいよ
処理中断したいよってな想定外の失敗は例外
2022/04/29(金) 23:54:03.84ID:ojB4mgIH0
例外は重いからね
2022/04/30(土) 00:24:41.78ID:QtDBeglS0
>>203
> なんか職場の古いおっさんははるか昔のCのやり方そのまま0とか-1とか返してるし
Cでも定数か列挙体定義しろよってレベルだけどな
2022/04/30(土) 06:39:16.16ID:OR8SZm5l0
>>203
> 例えば公式のtryparseなんてbool返しますよね。でも例外投げるって手もありますよね。
だからTryParseとParseの両方あるでしょ
汎用性を求めるなら両方用意すればいいし特定の場合だけなら使いやすい方を用意すればいいと思うよ
2022/04/30(土) 07:00:58.78ID:OalUk2/jM
「エラー」を表すなら例外一択
そうするとtryブロック内に書かれている処理は正常系だけ、catchブロック内が異常系だけになって
ソースコードが明瞭になるし異常系ロジックをcatchの1か所に集約できる
こういう書き方に慣れるといちいち1処理行うごとに戻り値if分岐してるような書き方のダサさが分かる

例外が重いってのもたしかにその通りなんだけどまあ1回こっきり投げるだけなら許容範囲かな
2022/04/30(土) 07:37:56.60ID:3TsZhUq60
>>203
C流儀のintは成功が0だからboolと混在させると厄介なんだよな。
2022/04/30(土) 08:06:49.00ID:OR8SZm5l0
>>210
それshellのリターンコードと勘違いしてないか?
正常/異常を返すケースで正常が0って滅多にないと思うけど
2022/04/30(土) 08:13:30.52ID:3TsZhUq60
ほら、成功か失敗かを返すだけなら成功=0が一般的だったんだよ。
https://www.jpcert.or.jp/sc-rules/c-err33-c.html
2022/04/30(土) 08:14:04.30ID:VP7AAWWpa
やっぱboolってintみたいな構造体より重いんか?
2022/04/30(土) 08:15:37.08ID:Ce086BTG0
どちらもスカラーやろ
2022/04/30(土) 08:17:51.61ID:Hl+yZMpS0
>>203
普通は例外一択です。
2022/04/30(土) 09:29:44.98ID:/k/F8o6k0
おじいちゃんも多いので意見が分かれやすいですね
2022/04/30(土) 10:04:25.38ID:QtDBeglS0
エラーの内容を精査する必要があるなら、エラーコードなりを持たせた例外スローするけど
単純な失敗成功だけ見たいならbool返すかな
2022/04/30(土) 10:32:08.49ID:Ce086BTG0
例外のコストが高いからね
2022/04/30(土) 11:13:28.89ID:UYlijuGg0
>>211
C/CPPのライブラリは0が成功って割と多い
多分210が言いたいのはCにはbool型なんて無くてintをBOOLとして扱ってるからC的には0x100000はTRUE、C#的にはbyte化されて0となりfalseになるから注意ってことを言いたいんだと思うが
2022/04/30(土) 11:14:35.66ID:UYlijuGg0
>>213
別に重くない
例えば関数の戻り値でtrue表現するためのアセンブラは
intだとmov eax, 1
boolだとmov al, 1
アセンブリコードの使用バイト数的には同じか後者の方が小さかったはず
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。