!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
探検
C#, C♯, C#相談室 Part96
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 7633-kUv4)
2021/12/20(月) 11:03:25.88ID:sdn/+VfW079デフォルトの名無しさん (アウアウウー Sac3-B80Q)
2022/02/12(土) 21:15:10.31ID:wWgyF7+Aa 窓を閉じたときに
MethodInvokerの中の処理がまだ実行中で例外出すんだけど
停止させるか完了するまでフォームの廃棄を待つ方法は無いの?
MethodInvokerの中の処理がまだ実行中で例外出すんだけど
停止させるか完了するまでフォームの廃棄を待つ方法は無いの?
80デフォルトの名無しさん (ワッチョイ 122c-ShCo)
2022/02/12(土) 21:27:27.68ID:C+pjCsCl0 一旦FormClosingでキャンセルしたあと完了してから改めてCloseする
81デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 12:57:34.90ID:5Mv4IyiB082デフォルトの名無しさん (ワッチョイ b7d2-fdHv)
2022/02/13(日) 14:18:56.36ID:3OIdnfKh0 >>81
嘘教えんな
ジェネリクス定義側はFunc<T, TResult>みたいにコンパイルに型決まってないだろうが
Func<object, object> とかいうクソみたいな型を使わせようとするな
嘘教えんな
ジェネリクス定義側はFunc<T, TResult>みたいにコンパイルに型決まってないだろうが
Func<object, object> とかいうクソみたいな型を使わせようとするな
83デフォルトの名無しさん (ワッチョイ 122c-ShCo)
2022/02/13(日) 14:35:33.11ID:TxpWrVyK0 dic.Add("a", (int a) => a * 2);
dic.Add("b", (string b) => b + b);
をやりたいって質問であるという想定なんでしょ?
dic.Add("b", (string b) => b + b);
をやりたいって質問であるという想定なんでしょ?
84デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 14:40:02.85ID:5Mv4IyiB0 >>82
なら出来るやり方言ってみろよ
なら出来るやり方言ってみろよ
85デフォルトの名無しさん (ワッチョイ b7d2-fdHv)
2022/02/13(日) 14:40:38.46ID:3OIdnfKh0 いろんな型のFuncを受け付けるようにするならそれ用のclassを作ってしまった方が手っ取り早い
public class MyDictinary<T, TResult> : Dictinary<string, Func<T, TResult>{...}
Funcをなんでも受け付けるようにするなら
public class MyDictinary<TDelegate> : Dictinary<string, Func<T, TResult> where TDelegate: Delegate {...}
どうしてもinterfaceにしなくちゃいけないなら
public interface IMyDictinary<T, TResult> : IDictinary<string, Func<T, TResult>{...}
ごちゃ混ぜのFuncを受け付けるようにするとFunc呼び出し時に大変な思いをするだけだからやらん方がいい
public class MyDictinary<T, TResult> : Dictinary<string, Func<T, TResult>{...}
Funcをなんでも受け付けるようにするなら
public class MyDictinary<TDelegate> : Dictinary<string, Func<T, TResult> where TDelegate: Delegate {...}
どうしてもinterfaceにしなくちゃいけないなら
public interface IMyDictinary<T, TResult> : IDictinary<string, Func<T, TResult>{...}
ごちゃ混ぜのFuncを受け付けるようにするとFunc呼び出し時に大変な思いをするだけだからやらん方がいい
86デフォルトの名無しさん (テテンテンテン MMde-gtE8)
2022/02/13(日) 14:46:43.73ID:ifSJDHUhM ?
>>69はDictionaryいっこにいろんな引数型/戻り値のFuncを入れたいと言ってるみたいだから>>81しかないと思うんだけど・・・
引数型/戻り値型毎に別々のDictionaryにするだけなら、たとえば
var dic1 = new Dictionary<string,Func<int, string>>();
var dic2 = new Dictionary<string,Func<int, int>>();
var dic3 = new Dictionary<string,Func<string, string>>();
みたいにT/TResultの組み合わせに応じて別変数にするだけで解決するような・・?
なんでわざわざ>>85みたいなclassなりinterfaceなりを作る必要があるのかわからない
>>69はDictionaryいっこにいろんな引数型/戻り値のFuncを入れたいと言ってるみたいだから>>81しかないと思うんだけど・・・
引数型/戻り値型毎に別々のDictionaryにするだけなら、たとえば
var dic1 = new Dictionary<string,Func<int, string>>();
var dic2 = new Dictionary<string,Func<int, int>>();
var dic3 = new Dictionary<string,Func<string, string>>();
みたいにT/TResultの組み合わせに応じて別変数にするだけで解決するような・・?
なんでわざわざ>>85みたいなclassなりinterfaceなりを作る必要があるのかわからない
87デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 14:48:17.51ID:5Mv4IyiB088デフォルトの名無しさん (ワッチョイ b7d2-fdHv)
2022/02/13(日) 14:54:01.04ID:3OIdnfKh0 マジで1つのインスタンスに別の型のdelegateが入ればなんでもいい前提なん?
取り出して呼び出すときに引数/返り値型調べないといけないが
取り出して呼び出すときに引数/返り値型調べないといけないが
89デフォルトの名無しさん (スップ Sd32-WC3G)
2022/02/13(日) 14:56:56.20ID:+oV/29aBd DynamicInvoke使えばいい
90デフォルトの名無しさん (テテンテンテン MMde-gtE8)
2022/02/13(日) 15:19:09.62ID:ifSJDHUhM ていうか>>85ってコンパイル通る?
「>」ひとつ付け忘れとかDictionaryのミススペルはともかくとして、
2つめの書き方でT/TResultの型はどこから決まるんだろう?
それとも
public class MyDictinary<TDelegate> : Dictionary<string, TDelegate> where TDelegate: Delegate { }
を意図してるのだろうか
Func<object, object>をクソと言ってるからには引数1つの制約すらつかなくなるこんなクソ以下の書き方を意図してるとも思えないけど・・・
「>」ひとつ付け忘れとかDictionaryのミススペルはともかくとして、
2つめの書き方でT/TResultの型はどこから決まるんだろう?
それとも
public class MyDictinary<TDelegate> : Dictionary<string, TDelegate> where TDelegate: Delegate { }
を意図してるのだろうか
Func<object, object>をクソと言ってるからには引数1つの制約すらつかなくなるこんなクソ以下の書き方を意図してるとも思えないけど・・・
91デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 15:28:36.94ID:5Mv4IyiB0 そもそも、そのDictionary使って何したいかまでは知らんから
それを言えば、もう少しマシな案なりが出てくるとは思うが
それを言えば、もう少しマシな案なりが出てくるとは思うが
92デフォルトの名無しさん (ワッチョイ b7d2-fdHv)
2022/02/13(日) 15:30:03.46ID:3OIdnfKh0 >>90
携帯からやったから酷いミスしてるのは悪かった
T/TResultの型を決めないならって意図で書いてる
当然Func<object, object>と同じで使うときに酷い目に遭うが
Func<object, object> だと引数型がobjectを受け付けないといけない縛りができるから
「いろんな関数を受け付ける」という要件を満たせない
Delegateだとその縛りはなくなる
ラムダを受け付けられなくなるが
携帯からやったから酷いミスしてるのは悪かった
T/TResultの型を決めないならって意図で書いてる
当然Func<object, object>と同じで使うときに酷い目に遭うが
Func<object, object> だと引数型がobjectを受け付けないといけない縛りができるから
「いろんな関数を受け付ける」という要件を満たせない
Delegateだとその縛りはなくなる
ラムダを受け付けられなくなるが
93デフォルトの名無しさん (ワッチョイ d201-b83C)
2022/02/13(日) 15:34:09.27ID:Igq9caCG0 質問者は
1つのDictionaryの中に異なる型を混在させたいという話をしてるのか
1つのDictionaryの中は同じ型のみ入るが、型が異なる複数のDictionaryをジェネリックで統一して扱いたいという話をしてるのか
前者ならジェネリックを使うケースではなさそう
1つのDictionaryの中に異なる型を混在させたいという話をしてるのか
1つのDictionaryの中は同じ型のみ入るが、型が異なる複数のDictionaryをジェネリックで統一して扱いたいという話をしてるのか
前者ならジェネリックを使うケースではなさそう
94デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 16:07:38.09ID:5Mv4IyiB0 単純なインターフェース使う例だとこんなもんかな
受け取る結果の型が決まってるなら、dynamic使わんで済むけど
public interface IJob
{
dynamic Run();
}
public class SomeJob<T1, T2> : IJob
{
public T1 Param1 {get;}
public T2 Param2 {get;}
public SomeJob(T1 param1, T2 param2)
{
Param1 = param1;
Param2 = param2;
}
public dynamic Run() => (dynamic)Param1 + (dynamic)Param2;
}
public static void Main()
{
var dic = new Dictionary<string, IJob>()
{
{"a", new SomeJob<int, double>(2, 3.3) },
{"b", new SomeJob<float, double>(5.5f, 16.612340) },
};
Console.WriteLine(dic["a"].Run());
Console.WriteLine(dic["b"].Run());
}
受け取る結果の型が決まってるなら、dynamic使わんで済むけど
public interface IJob
{
dynamic Run();
}
public class SomeJob<T1, T2> : IJob
{
public T1 Param1 {get;}
public T2 Param2 {get;}
public SomeJob(T1 param1, T2 param2)
{
Param1 = param1;
Param2 = param2;
}
public dynamic Run() => (dynamic)Param1 + (dynamic)Param2;
}
public static void Main()
{
var dic = new Dictionary<string, IJob>()
{
{"a", new SomeJob<int, double>(2, 3.3) },
{"b", new SomeJob<float, double>(5.5f, 16.612340) },
};
Console.WriteLine(dic["a"].Run());
Console.WriteLine(dic["b"].Run());
}
95デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 16:11:15.84ID:5Mv4IyiB0 SomeJobをジェネリックにしたけど、別にIJobを実装したクラス個別に作っても構わない
96デフォルトの名無しさん (ブーイモ MM63-WC3G)
2022/02/13(日) 17:02:55.32ID:7+Po28QvM わざわざinterfaceを定義する意味がわからん
たぶん>>94はdynamic型にキャストしたデリゲートを直接呼び出せることを知らないんだろう
たぶん>>94はdynamic型にキャストしたデリゲートを直接呼び出せることを知らないんだろう
97デフォルトの名無しさん (ワッチョイ 3302-rCQD)
2022/02/13(日) 17:24:19.17ID:5Mv4IyiB0 さすがにそれは判るわw
>>69でinterfaceが判らんって書いてるからサンプルで出しただけ
>>69でinterfaceが判らんって書いてるからサンプルで出しただけ
98デフォルトの名無しさん (ワッチョイ 632f-TxqZ)
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("名無し"));
これでいいんじゃないか
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("名無し"));
これでいいんじゃないか
99デフォルトの名無しさん (ワッチョイ 96bb-neei)
2022/02/13(日) 19:33:32.60ID:gSu1aBn10100デフォルトの名無しさん (ワッチョイ 632f-TxqZ)
2022/02/13(日) 19:55:15.91ID:DvSkIP620101デフォルトの名無しさん (ワッチョイ 126a-iSvi)
2022/02/13(日) 20:48:10.88ID:7zxfmdEw0 本当にやりたいことを突き詰めるとそんな面倒なことをしなくてもよい解決方法があったりするのはよくある事よな
今回の件でも当てはまるかどうかは知らんけど
今回の件でも当てはまるかどうかは知らんけど
102デフォルトの名無しさん (ワッチョイ 92ad-Z1WE)
2022/02/15(火) 12:56:44.30ID:XMXX+kQj0 例えばFFMPEGをC#で起動させてるときに
エンコード処理みたいな定期的に値が返ってくるやつって
別スレッドでFFMPEGを走らせて
本スレッドではテキストボックスあたりに出力するようにしたいんだけど
これってFFMPEGの処理が終わるまでメインスレッドはwaitしないとダメってことですよね?
単独スレッドで終了した結果は表示できるんですけど
エンコード処理みたいな定期的に値が返ってくるやつって
別スレッドでFFMPEGを走らせて
本スレッドではテキストボックスあたりに出力するようにしたいんだけど
これってFFMPEGの処理が終わるまでメインスレッドはwaitしないとダメってことですよね?
単独スレッドで終了した結果は表示できるんですけど
103デフォルトの名無しさん (アウアウウー Sac3-9hE7)
2022/02/15(火) 13:01:30.90ID:XQ5fPZCEa そんなことはない
別スレッドで読みだした値をメインスレッドに送って、メインスレッドでその値を表示すればいい
別スレッドからUIに表示しようとしたらエラーになる
別スレッドで読みだした値をメインスレッドに送って、メインスレッドでその値を表示すればいい
別スレッドからUIに表示しようとしたらエラーになる
104デフォルトの名無しさん (ワッチョイ 12e4-EYbL)
2022/02/15(火) 17:00:40.59ID:/St4XHrW0 >>102
本スレッドのTextBox.TextにInvoke使って書き込むんだよ
本スレッドのTextBox.TextにInvoke使って書き込むんだよ
105デフォルトの名無しさん (スプッッ Sd52-fdHv)
2022/02/15(火) 19:16:59.08ID:jLK4fSzed たぶんGUIアプリ作ってるんだろうけど
GUIのデータはメインスレッドしか書き換えちゃダメなルールがある
TextBox.Invokeでメインスレッドに自分のデータ変えてくれってお願いするか、
WPFのBindingならメインスレッドがデータ持ってないからデータ取りに来いってできたりする
GUIのデータはメインスレッドしか書き換えちゃダメなルールがある
TextBox.Invokeでメインスレッドに自分のデータ変えてくれってお願いするか、
WPFのBindingならメインスレッドがデータ持ってないからデータ取りに来いってできたりする
106デフォルトの名無しさん (ワッチョイ 5289-CJof)
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到達して落ちるんだけど何故だろう
(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
GC.Collect(2, GCCollectionMode.Forced, false, true);
それで減らないならMonoのランタイムがそもそもUNCOと思われ。
Unity Profilerで表示されるMonoで使用メモリ量が膨大になってしまう
https://teratail.com/questions/238133
110デフォルトの名無しさん (ワッチョイ ff89-xC0C)
2022/02/20(日) 08:11:50.49ID:/uCWXFvO0 VS2002?
111デフォルトの名無しさん (ワッチョイ ffad-u5El)
2022/02/20(日) 15:59:54.94ID:gLgXgTw20 dataGridView の中のリストの大きさってどうやって変えるの?
枠の大きさは変えられるんだけど
中のリストだけ小さいままでこまってる
枠の大きさは変えられるんだけど
中のリストだけ小さいままでこまってる
112デフォルトの名無しさん (ワッチョイ b302-mA98)
2022/02/20(日) 23:16:48.82ID:ppLUrwgj0 中のリストという意味がちょっと判らない、列や行の幅の事?
名前にWidthとかHeightが含まれるプロパティ片っ端から弄ってみたら
名前にWidthとかHeightが含まれるプロパティ片っ端から弄ってみたら
113デフォルトの名無しさん (アウアウウー Sae7-7p3p)
2022/02/21(月) 19:22:27.56ID:4hCK79/5a var form = new Form(){
Text = "たいとる"
FormBorderStyle = FormBorderStyle.FixedDialog
};
みたいに書けるやつ
一見VBのwith文っぽいけどプロパティの代入行為しかできなくて中途半端
Text = "たいとる"
FormBorderStyle = FormBorderStyle.FixedDialog
};
みたいに書けるやつ
一見VBのwith文っぽいけどプロパティの代入行為しかできなくて中途半端
114デフォルトの名無しさん (ワッチョイ ff6a-nAeH)
2022/02/22(火) 10:14:36.95ID:Q9cfD2FD0 そら、初期化のために用意されているものなんだからそういうもんだろ
115デフォルトの名無しさん (ワッチョイ cf63-3QhW)
2022/02/22(火) 13:36:13.33ID:j1m5S7Tk0 オブジェクト初期化子って名前を知らないとwith的なもんかと思ってしまうのかも知れないね
116デフォルトの名無しさん (テテンテンテン MM7f-lT30)
2022/02/22(火) 15:45:45.85ID:vNlU0s1vM VBのWith文読み難いから出来んでいい
117デフォルトの名無しさん (ワッチョイ ff89-xC0C)
2022/02/22(火) 15:53:33.83ID:PEuqNSu60 vb.netのオブジェクト初期化子はWithなんだよね。
冗長だ。
冗長だ。
118デフォルトの名無しさん (アウアウウー Sae7-8E80)
2022/02/22(火) 16:15:23.63ID:gr38xJ4ba c#のは同じような書き方でも意味が変わって一貫性のようなものがない(ように一見思える)
var form = new Form()
{Text = Text};
form.click += delegate
{Text=Text;};
vbのは普通の命令としてもwithがあり、そこに囲まれてる変数の頭にピリオドを付けるという書き方の一貫性のようなものがあるからな
どっちが初心者に優しいかと言えば今でもvbと感じる(vbがいいとは言ってない)
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によくある挙動ですが、同等の動きを実現出来ないかなと。
クリックした時に、モーダルフォームを閉じる事って出来るでしょうか?
スマホのUIによくある挙動ですが、同等の動きを実現出来ないかなと。
120119 (ワッチョイ 6fe9-EcOz)
2022/02/23(水) 12:10:24.55ID:n7YEN9KD0 初心者板の内容でした。
失礼しました。
失礼しました。
121デフォルトの名無しさん (ワッチョイ ff02-9L8B)
2022/02/23(水) 12:26:47.20ID:n4QLtIZ70 薄毛や抜け毛にお悩みなら、発毛専門の*****へ。
一人ひとりの薄毛・脱毛原因を正確に突き止め、その原因を解消する独自の発毛システムを提供しています。
一人ひとりの薄毛・脱毛原因を正確に突き止め、その原因を解消する独自の発毛システムを提供しています。
122デフォルトの名無しさん (ワッチョイ cf2c-hSEA)
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をあとから指定したいみたいな方法です。
文字列変数の中に 変数をしてしておいて 実行時に指定する方法ありますか?
例:
目覚まし時計プログラムで
9:00の時
9:00になりました。 おはようございます。
12時の時
お昼です 12:00になりました。
って 入れ替えたいのだけど
$Time になりました。おはようございます。
12時の時の文字列は
お昼になりました$Timeになりました。
って指定しておき $Timeをあとから指定したいみたいな方法です。
124デフォルトの名無しさん (ワッチョイ b378-9yE7)
2022/02/23(水) 20:28:47.29ID:RBoSgh/A0 Replace("$Time", "12:00")
125デフォルトの名無しさん (ワッチョイ ff6a-nAeH)
2022/02/23(水) 20:56:09.29ID:77XR+UNq0126デフォルトの名無しさん (ワッチョイ b35f-nZx7)
2022/02/23(水) 21:57:54.53ID:6Rc20OyP0 埋め込む文章も変えたいみたいだから
DateTimeによって適したフォーマット用文字列を返すようにして、その後string.Format()するとか
DateTimeによって適したフォーマット用文字列を返すようにして、その後string.Format()するとか
127デフォルトの名無しさん (ワッチョイ ff89-xC0C)
2022/02/24(木) 06:20:18.96ID:1wBDmGBO0 >>122
Webじゃないから難しいかな
Webじゃないから難しいかな
128デフォルトの名無しさん (ワッチョイ cfbb-iK/E)
2022/02/24(木) 10:51:32.90ID:N/yjILul0129デフォルトの名無しさん (ワッチョイ f32f-hSEA)
2022/02/24(木) 21:50:55.08ID:G5PhgONP0 >>119
Deactivateイベントで拾えないか?
Deactivateイベントで拾えないか?
130デフォルトの名無しさん (ワッチョイ cf10-iDSx)
2022/02/24(木) 22:02:34.13ID:eVS3l/k90131デフォルトの名無しさん (ワッチョイ cf2c-hSEA)
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
まあ、コミュニティーが配布している日本語辞書に、
最初から、幾つかの形式が登録されているから、自作する事は少ない
例えば、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
まあ、コミュニティーが配布している日本語辞書に、
最初から、幾つかの形式が登録されているから、自作する事は少ない
132デフォルトの名無しさん (ワッチョイ cfbb-s8XF)
2022/02/25(金) 15:06:52.58ID:8px/N21n0 Rubyって使ったことなかったけど、
それAsp.netにそっくりやね
それAsp.netにそっくりやね
133デフォルトの名無しさん (ワッチョイ 5ae4-sFH0)
2022/03/01(火) 13:52:40.14ID:4BvRS+UW0 Console.writeline()はスレッドセーフでないというのは本当でしょうか?
今までシングルスレッドで動いていたプログラムを一部の処理だけマルチスレッドで動作するように変更中です
Console.writeline()の呼び出し箇所を全て変更する必要がありますか?
今までシングルスレッドで動いていたプログラムを一部の処理だけマルチスレッドで動作するように変更中です
Console.writeline()の呼び出し箇所を全て変更する必要がありますか?
134デフォルトの名無しさん (ワッチョイ 0a89-d1gR)
2022/03/01(火) 13:56:54.75ID:VTZdDdWR0 スレッドセーフです
135デフォルトの名無しさん (ワッチョイ de63-v7rK)
2022/03/01(火) 20:21:42.35ID:OUtPpYxS0136デフォルトの名無しさん (ワッチョイ ca02-Y5l0)
2022/03/01(火) 23:40:13.90ID:wsOShTVj0 この方は スレッガー ロウ です
137デフォルトの名無しさん (ワッチョイ a236-8qwV)
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
どうぞよろしくお願いいたします。
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
どうぞよろしくお願いいたします。
138デフォルトの名無しさん (アウアウウー Sac5-I38D)
2022/03/15(火) 18:02:33.05ID:LD6RLXEha 一行目しか見てないけど、これはいいのか?(8)かもよ
IntPtr ptr = Marshal.AllocCoTaskMem(4);
IntPtr ptr = Marshal.AllocCoTaskMem(4);
139デフォルトの名無しさん (ワッチョイ ed2f-lWiN)
2022/03/15(火) 18:57:03.19ID:BlmPXv890 そもそも現在のポインタ値がヌル参照からのオフセットだって保証されてるのか?
140デフォルトの名無しさん (ワッチョイ e5ad-Yoff)
2022/03/15(火) 18:59:03.73ID:1RknuKaK0 for文に意味があるからじゃないかな
141デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
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);
とかやってインライン展開抑制してみたら
[MethodImpl(MethodImplOptions.NoInlining)]
public static ref T AddByteOffset<T>(ref T reference, IntPtr offset)
=> ref Unsafe.AddByteOffset(ref reference, offset);
とかやってインライン展開抑制してみたら
142デフォルトの名無しさん (ワッチョイ 1232-IMun)
2022/03/15(火) 21:00:09.00ID:ZTE9InWz0 >>137
JIT最適化を抑制せずF11でデバッグして逆アセンブルすると
先にConsole.WriteLine(Boolean)がTrue固定で呼び出されて
その後にMarshal.IsNullOrWin32Atom(IntPtr)となってるね
未定義動作はタイムトラベルを…彷彿とさせるがC#なんだよなぁ
MSIL的にも&とnative intの結果型は&に定められている筈だし
とはいえ、管理下ポインタはnullになりえないとか有った気もするし
null参照への演算が未定義なら道理なのかもしれない、あるいはバグか
JIT最適化を抑制せずF11でデバッグして逆アセンブルすると
先にConsole.WriteLine(Boolean)がTrue固定で呼び出されて
その後にMarshal.IsNullOrWin32Atom(IntPtr)となってるね
未定義動作はタイムトラベルを…彷彿とさせるがC#なんだよなぁ
MSIL的にも&とnative intの結果型は&に定められている筈だし
とはいえ、管理下ポインタはnullになりえないとか有った気もするし
null参照への演算が未定義なら道理なのかもしれない、あるいはバグか
143デフォルトの名無しさん (ワッチョイ a236-8qwV)
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 の場合は常に期待通りに動作するならば問題の原因について一つ仮説が立てられるかと思ったのですが、
実際は違っていたので未だに原因はさっぱり見当がついていません…)
いただいたアドバイスを元に色々と確認をしていて反応が遅くなってしまいました。
申し訳ありません。
>>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 の場合は常に期待通りに動作するならば問題の原因について一つ仮説が立てられるかと思ったのですが、
実際は違っていたので未だに原因はさっぱり見当がついていません…)
144デフォルトの名無しさん (ワッチョイ a236-8qwV)
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
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
145デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
2022/03/15(火) 21:29:32.78ID:NI5jmOXt0 issue検索して無かったら、一応報告しといたほうがいいかもしらんね
146デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
2022/03/15(火) 21:33:53.42ID:NI5jmOXt0 [Intrinsic]
がついてるメソッドは、Release時に特殊な最適化が走ってる筈なんだけど
それが誤動作するケースがあるのかもしらん(あくまで想像)
がついてるメソッドは、Release時に特殊な最適化が走ってる筈なんだけど
それが誤動作するケースがあるのかもしらん(あくまで想像)
147142 (ワッチョイ 1232-IMun)
2022/03/15(火) 21:41:55.33ID:ZTE9InWz0 あー同じような判定コードを読み間違えた
タイムトラベルは起きてないけど、代入もヌル判定もなくなってる感じかな
>>144
そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
xが常にぬるぽ扱いになってしまっている様ではある
C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
タイムトラベルは起きてないけど、代入もヌル判定もなくなってる感じかな
>>144
そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
xが常にぬるぽ扱いになってしまっている様ではある
C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
148デフォルトの名無しさん (ワッチョイ 8dc1-EzgM)
2022/03/15(火) 22:00:29.13ID:RZxqxi620 winforms
dbの値は、dataset . datatable以外で、どうやって取得するの? list?
dbの値は、dataset . datatable以外で、どうやって取得するの? list?
149デフォルトの名無しさん (ワッチョイ a236-8qwV)
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でチェックされないのか判断に困る。さもなければ最適化のバグだと思う
ご意見どうもありがとうございます。とても共感させていただきました。
未定義であればこそデバッグ時に教えてほしいものですが、
実際にはデバッグ時には期待通りに動作してしまうのが厄介なところです。
そうですね。アドバイスありがとうございます。
私はこれまでこの手の問題は「まずは自分を疑え」と教わってきて
実際それで大抵の問題は解決してきたのですが、
皆様のお話をうかがうに、今回は自分の勘違いではなく
よそに原因があると考えたほうがいいのかもしれません。
これまで報告等は経験がないのですが、
それも視野に入れて調べてみたいと思います。
>>146
勉強になります。
その特殊な最適化で結果が変わることがバグなのか
私の力では判断が難しそうなのが歯がゆいところです。
>>147
> そう、片方が0なら実質意味はないから加算命令が現れなくても不思議ではないけど
> Console.WriteLine(x);としてみても固定アドレス0をデリファレンスするので
私の理解不足で、
「片方が0なら実質意味はない」 ← 0 + p の計算は必要ない?そりゃそうだ!
「固定アドレス0をデリファレンスする」 ← 0 + p = 0 ということ?p ではなくて?
という感想を持ってしまいました。
申し訳ないのですが、もしよろしければもう少し詳しく説明していただけないでしょうか。
> C#的には未定義なら未定義でビルド時か実行時にエラーを出しそうだけど
> Unsafeでチェックされないのか判断に困る。さもなければ最適化のバグだと思う
ご意見どうもありがとうございます。とても共感させていただきました。
未定義であればこそデバッグ時に教えてほしいものですが、
実際にはデバッグ時には期待通りに動作してしまうのが厄介なところです。
150デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
2022/03/15(火) 22:26:59.94ID:NI5jmOXt0 >>148
DataReaderで読むとか、EntityFrameworkやDapperみたいなフレームワーク使うとか
DataReaderで読むとか、EntityFrameworkやDapperみたいなフレームワーク使うとか
151デフォルトの名無しさん (ワッチョイ ed2f-lWiN)
2022/03/15(火) 22:47:23.94ID:BlmPXv890 そもそも値型にたいするヌル参照が未定義な気がするが
最適化で数値ゼロとヌル参照が同一視されてるとか?
最適化で数値ゼロとヌル参照が同一視されてるとか?
152デフォルトの名無しさん (ワッチョイ 1232-IMun)
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とせず済むのにね
件の部分は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とせず済むのにね
153デフォルトの名無しさん (ワッチョイ a236-8qwV)
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 から期待される動作と変わってしまうようなら、
やはりバグとして報告したほうがよいのかなというのが今のところの考えです。
なるほど…。
ただ、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 から期待される動作と変わってしまうようなら、
やはりバグとして報告したほうがよいのかなというのが今のところの考えです。
154デフォルトの名無しさん (ワッチョイ a236-8qwV)
2022/03/16(水) 00:10:04.98ID:pAqxvPky0 >>152
> Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね
そうなんです!というか、本来私がしたいことからいうと
MemoryMarshal.CreateSpan<int> メソッドに IntPtr 型を渡せると一番よいのですが、
それができないのでこのメソッドが受け付けてくれる ref int を作るという方向で考えています。
> Unsafe.AsRefに直接IntPtr渡せれば/unsafeとせず済むのにね
そうなんです!というか、本来私がしたいことからいうと
MemoryMarshal.CreateSpan<int> メソッドに IntPtr 型を渡せると一番よいのですが、
それができないのでこのメソッドが受け付けてくれる ref int を作るという方向で考えています。
155デフォルトの名無しさん (ワッチョイ 1232-IMun)
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.」で笑えぬ
仰る通りです
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.」で笑えぬ
156デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
2022/03/16(水) 02:59:05.97ID:b5JRB2Cp0 最近の標準ライブラリの実装を見るに、.NET開発チームはIntPtrを使わせたくないように感じる
ポインタ弄るなら、あぶねー事やってんだから明確にunsafe宣言しろって事なんだろうな
ポインタ弄るなら、あぶねー事やってんだから明確にunsafe宣言しろって事なんだろうな
157デフォルトの名無しさん (ワッチョイ 1232-IMun)
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を使うべきなのかもしれません
よくよく調べてみたらズバリそのものが有りました
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を使うべきなのかもしれません
158137 (ワッチョイ 6136-KDK6)
2022/03/16(水) 16:49:39.25ID:TbbZbi5h0 すみません。規制にあってしまったのか、パソコンから書き込めなくなってしまいました。
この文章も書き込めるかどうか分かりませんが、
ひとまず、親切にしてくださった皆様に心からお礼申し上げます。
この文章も書き込めるかどうか分かりませんが、
ひとまず、親切にしてくださった皆様に心からお礼申し上げます。
159デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
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ブロック書くの回避したところで、
それは危険なコードである事に変わりはない。
> 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ブロック書くの回避したところで、
それは危険なコードである事に変わりはない。
160デフォルトの名無しさん (ワッチョイ 8dc1-EzgM)
2022/03/16(水) 19:44:50.55ID:Eqgki5Lk0 vs2022 c# winforms .net6
画面作って、vs再起動すると
フォームが読込エラーが発生する
おまえら、発生しないの?
画面作って、vs再起動すると
フォームが読込エラーが発生する
おまえら、発生しないの?
161デフォルトの名無しさん (アウアウウー Sac5-I38D)
2022/03/16(水) 19:53:52.54ID:KaTnXwmea 発生するぞw
162デフォルトの名無しさん (ワッチョイ 3d78-9pEf)
2022/03/16(水) 20:33:39.98ID:paMiN66w0 >>160
タブオーダーの変更も無効化されててマジゴミ
タブオーダーの変更も無効化されててマジゴミ
163デフォルトの名無しさん (ワッチョイ 4289-r+i/)
2022/03/16(水) 20:40:08.63ID:DWqldl790 .NET framework 4.8は永遠に不滅です( ー`дー´)キリッ
164デフォルトの名無しさん (ワッチョイ 7d02-WCXV)
2022/03/16(水) 21:36:45.42ID:b5JRB2Cp0 WindowsFormでやるなら、実際.NET framework安定だと思う
.NET5とか6でやるなら、他のUI選択した方がいい
.NET5とか6でやるなら、他のUI選択した方がいい
165デフォルトの名無しさん (アウウィフ FFcd-XTxC)
2022/03/26(土) 10:57:27.94ID:klc4wM2MF 初心者ですまんが、async/awaitでtaskの実行とtask自体の生成の責務が分離されてない気がするんだが
asyncの中にはawaitがあるもの(ないと警告)という連鎖はどこで切ればいいの?
最終的にインフラまで行ったとしてそこのasyncメソッドはawaitするものがなくなってしまうよな?
末端は警告を無視するか、Task.Runとかを作ってTaskを返すかなりしろってこと?
asyncの中にはawaitがあるもの(ないと警告)という連鎖はどこで切ればいいの?
最終的にインフラまで行ったとしてそこのasyncメソッドはawaitするものがなくなってしまうよな?
末端は警告を無視するか、Task.Runとかを作ってTaskを返すかなりしろってこと?
166デフォルトの名無しさん (アウアウウー Sacd-JpNp)
2022/03/26(土) 11:26:01.00ID:opZhrmyVa await hogesync();
↓
_= hogesync();
これで警告連鎖から逃げれる
↓
_= hogesync();
これで警告連鎖から逃げれる
167デフォルトの名無しさん (アウウィフ FFcd-XTxC)
2022/03/26(土) 11:38:25.92ID:klc4wM2MF >>166
いやそっちじゃなくCS1998の方
↓みたいなの
async Task hogeA {await hogeB();}
// 警告 CS1998
async Task hogeB{Console.WriteLine("hogeB");}
いやそっちじゃなくCS1998の方
↓みたいなの
async Task hogeA {await hogeB();}
// 警告 CS1998
async Task hogeB{Console.WriteLine("hogeB");}
168デフォルトの名無しさん (アウアウウー Sacd-JpNp)
2022/03/26(土) 12:14:52.53ID:opZhrmyVa asyncにする必要がないのはしなければいいだけ
async Task hogeB{Console.WriteLine("hogeB");}
↓
void hogeB(){}
asincじゃないけど、hogeB();って呼び出せばawait hogeB();と意味は変わらない
async Task hogeB{Console.WriteLine("hogeB");}
↓
void hogeB(){}
asincじゃないけど、hogeB();って呼び出せばawait hogeB();と意味は変わらない
169デフォルトの名無しさん (ブーイモ MM96-nQMq)
2022/03/26(土) 12:22:02.66ID:sDWgty5NM >>165
TaskCompletionSouece
TaskCompletionSouece
170デフォルトの名無しさん (ブーイモ MM96-nQMq)
2022/03/26(土) 12:30:11.96ID:sDWgty5NM あと、インターフェースの都合でasyncだけど実装は非同期である必要がない場合には、Task.FromResultやValueTaskやCompletedTaskを使うとよい
171デフォルトの名無しさん (アウアウウー Sacd-XTxC)
2022/03/26(土) 12:40:15.39ID:pvkpV0Laa >>168-170
サンクス
中身が同期やけど呼び出し元はそいつを非同期で待機したけりゃTask.Runとか使うしかないって事だよな
asyncの中身を同期だけにすると混乱を招きかねないけどawait可能なTaskを自動で作ってくれてスレッド復帰なんかも勝手にやってくれる分利点もありそうな気がするんだが
どうなんだろ
asyncじゃないTaskを返すメソッドを作る法がええんかも知れんけどめんどいよね
サンクス
中身が同期やけど呼び出し元はそいつを非同期で待機したけりゃTask.Runとか使うしかないって事だよな
asyncの中身を同期だけにすると混乱を招きかねないけどawait可能なTaskを自動で作ってくれてスレッド復帰なんかも勝手にやってくれる分利点もありそうな気がするんだが
どうなんだろ
asyncじゃないTaskを返すメソッドを作る法がええんかも知れんけどめんどいよね
172デフォルトの名無しさん (オッペケ Sr79-jbHl)
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()じゃなくて別の関数を使う?
StreamReader urlReader = new StreamReader(urlStream, Encoding.UTF8);
string urlReadString = urlReader.ReadLine();
上記の関数使ってcharset=UTF-8が設定されてるURLを読み込んだときに
普通にテキストとして読み込めるときと、UTF-8の読み込みに失敗してEF BF BDが出力されるときがあるけど、
失敗するときって何か初期設定が足りてない?
それともReadLine()じゃなくて別の関数を使う?
174デフォルトの名無しさん (テテンテンテン MM4b-g8k9)
2022/04/06(水) 10:40:24.67ID:/2SYAuGyM エンコーディング関係は、まず生バイトコードを確認しなさい
175デフォルトの名無しさん (スプッッ Sde1-z1p6)
2022/04/06(水) 11:06:48.61ID:BAnc7YwEd バイトコードでなくバイナリデータな
バイナリモードでファイル開いて読み込んで16進出力するか、
BZとかのバイナリエディタでファイルのバイナリを見るのがいい
バイナリモードでファイル開いて読み込んで16進出力するか、
BZとかのバイナリエディタでファイルのバイナリを見るのがいい
176デフォルトの名無しさん (テテンテンテン MM4b-g8k9)
2022/04/06(水) 12:14:51.33ID:XIBRKt28M URL言うとるやん
UTF8EncodingクラスでBOMの有無指定出来るけど、結局バイトコード確認しないと判定出来ん
UTF8EncodingクラスでBOMの有無指定出来るけど、結局バイトコード確認しないと判定出来ん
177デフォルトの名無しさん (ワッチョイ 45ac-ceAq)
2022/04/06(水) 18:52:21.62ID:IJ3XlCfB0 ばいなり()
178デフォルトの名無しさん (アウアウウー Sae9-xcJo)
2022/04/06(水) 19:11:31.46ID:oIHs85Eca バイナリであってるだろ。むしろバイトコードって使いかた初めて聞いたぞ
urlならその内容をファイルに落として開いて確認するのが楽
それが面倒な場合はコードからstreamをファイルに落として確認
urlならその内容をファイルに落として開いて確認するのが楽
それが面倒な場合はコードからstreamをファイルに落として確認
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【令和の高校生】ハタチ過ぎても「タバコ吸わない」9割超! 圧倒的多数を占めた “5つの理由” とは [七波羅探題★]
- 【大学】全国の女子大7校がトランスジェンダー女性の入学認める 16校が検討 [七波羅探題★]
- 【日産】九州転籍で給与5年分支給 補償金、追浜工場の生産終了で [蚤の市★]
- 【名古屋主婦殺害】容疑者、被害者夫に「子育ての苦労分からせたくて」 [蚤の市★]
- 【フジテレビ】『サン!シャイン』3月で終了 放送わずか1年… 谷原章介MC起用も 視聴率低迷、3%台の壁を越えれず 後継番組はなし [冬月記者★]
- 令和ロマン・高比良くるま 不倫訴訟起こされていた 「不倫関係ない」と否定も元夫から「婚姻期間中に…」 [征夷大将軍★]
- アンパンマンになりたい
- 【悲報】山上徹也(おてつ)、借金300万を踏み倒していたことが発覚wwwwwwwwwwwwwww [455031798]
- 【悲報】婚活女子「なんで婚活弱者男性って『デブ』が多いの?肥満は努力不足、自己責任なのに…そんなんだから嫌われるんだよ?30万 [483447288]
- 米メディア「早苗は中国との対立をむしろ楽しんでいるのかもしれない」「日中対立が高市の政治的利益」に [399259198]
- おこめ券←これ大反対。ボッタクリ米でぼろ儲けしてきて連中を何で税金で救済するんだ?
- ていうか日本人てふつーに中国のこと嫌いなんやな [455031798]
