3:デフォルトの名無しさん (ブーイモ MM7f-bhaQ)
22/06/17 09:44:05 6P0695t/M.net
前スレに引続き、VBに関して雑談しましょう
4:デフォルトの名無しさん
22/06/17 10:01:22.33 Ech7goP3d.net
VB.NET VS C#.NET
スレリンク(tech板)
ここでやれ>>2
5:デフォルトの名無しさん
22/06/17 10:05:30.78 0flDhQ0N0.net
VBはもうええは
6:デフォルトの名無しさん
22/06/17 12:49:36.63 SEHo94h90.net
質問です。
VBとC#は同じって本当ですか?
7:デフォルトの名無しさん
22/06/17 13:28:19.51 A6HKqZSjM.net
>>5
「同じ」の定義次第なので
まず何をもって同じとみなすかを定義してから質問して下さい。
終わり。
8:デフォルトの名無しさん
22/06/17 16:21:06.76 G79h5Zera.net
ここまでCLRなし
9:デフォルトの名無しさん
22/06/18 17:42:22.61 5N4YYnEs0.net
立て乙
非同期なのにawait/asyncどころかtaskやaction/funcも全く使っていないC#2.0時代みたいな書き方してる今の現場から逃げたい……
10:デフォルトの名無しさん
22/06/18 18:06:31.65 FHXg/LAj0.net
お前が現場を変えんだよ
11:デフォルトの名無しさん
22/06/18 19:19:21.37 uW38nGwr0.net
時間管理のできてない安易な非同期はほぼ100%バグってるのでやらなくていい
12:デフォルトの名無しさん (オイコラミネオ MM63-2kmA)
22/06/18 21:39:25 DZ8znIamM.net
レガシーな非同期はラップしてTaskかObservableにすると気分が晴れやかになる
13:デフォルトの名無しさん
22/06/18 22:03:02.01 V1FXcKIO0.net
Taskは遅いとかいう記事のせいで未だにCallbackが主流の俺社の悪口はやめて
14:デフォルトの名無しさん
22/06/18 22:21:46.90 5N4YYnEs0.net
それそれ
そもそもcallbackの書き方なんて最近の本に全く載ってないから今の現場に入ってIAsyncResult?なんじゃそりゃってなった
10年は前に作られただろうサイトを読んで長い時間かけてようやく何やってるか理解したみたいな
15:デフォルトの名無しさん
22/06/19 18:15:11.59 JN11Elx30.net
>>8
書き換えればええやん
16:デフォルトの名無しさん
22/06/21 10:13:10.23 Anf2PF0ZM.net
予算は?
17:デフォルトの名無しさん
22/06/21 11:32:11.12 xt+HQD+A0.net
いま少し時間と予算をいただければ…
18:デフォルトの名無しさん
22/06/22 06:57:18.35 10PSZ3s70.net
>>15
稟議通せば?
19:デフォルトの名無しさん
22/06/22 07:24:29.42 aadzgmkj0.net
この表の部分Excelと同じ操作にしてくれる?
20:デフォルトの名無しさん
22/06/22 08:29:37.02 ITHh+IXJ0.net
ピコーン OLE2で埋め込めば良いじゃん
21:デフォルトの名無しさん
22/06/22 09:11:42.38 pCRUTkSs0.net
ArrayListを使ってる.NET1.0時代な職場よりマシなのでは
22:デフォルトの名無しさん
22/06/22 10:02:21.11 KXMvDxejp.net
ようやく文法の教科書終わったくらいの素人なんですがinterfaceの具体的な使い方はどうやって覚えたらいいですかね
interfaceを使った疎結合というのがいまいちイメージできなくて取っ掛かりが分からん
23:デフォルトの名無しさん
22/06/22 10:24:15.19 4lQZ5KlU0.net
DIコンテナで実装クラスの差し替えでもしてみたらどうでしょうか
URLリンク(qiita.com)
24:デフォルトの名無しさん
22/06/22 10:30:38.32 PAt9l0gwr.net
例えば動物クラスで、哺乳類とか鳥類とかに派生していくけど、
飛ぶ能力は鳥類だけの特徴ではないから interface で実装するとか。
25:デフォルトの名無しさん
22/06/22 10:42:48.00 IP7+Sy+B0.net
どんなclassのオブジェクトでも引数で受け取れるメソッド作ってみろよ
但し受け取るオブジェクト内でHage()メソッドの実装は必須な
26:デフォルトの名無しさん
22/06/22 11:22:39.46 A/muOnk30.net
文法だけみても、実際に使い方みないと必要性とか実感なんてわかないだろ
まあ用途なんていろんなライブラリ使ってみればそのうちわかるさ
27:デフォルトの名無しさん
22/06/22 11:32:21.14 cmFMiTtgp.net
>>24
すごい。設問で理解できた気がする。
つまり現存するのが少数の自前クラスだけならまだ全てのクラスを引数にするメソッドを作成できるが、将来に渡って作られるであろうあらゆるクラスを引数にした関数は普通は作れない
そこでinterfaceを使って引数を抽象化する事で、あらゆるクラスを引数に取る事を可能にする。しかもHoge()は確定実装なので相手が何であれHoge()を叩けるのは保証される。よって相手を限定しない疎結合になる。
ってことか?この認識であってます?
28:デフォルトの名無しさん
22/06/22 11:37:00.61 SASaungr0.net
抽象化レイヤーの有用性を理解するにはテストコードを書くのが一番
まずはDIやるほどでもない小規模なプログラムで、HTTP通信とかファイルアクセスとかDBアクセスとかやってるところにinterface挟んで、
ユニットテストでは実際のアクセスを発生させずにテストできるようにしてみるといい
URLリンク(docs.microsoft.com)
29:デフォルトの名無しさん
22/06/22 11:46:24.28 cmFMiTtgp.net
>>27
ありがとうございます、やってみます
他にレスくれた方もありがとうございます
30:デフォルトの名無しさん
22/06/22 11:56:22.30 /fjoIry/0.net
>>26
外野だけど大体そんな感じ
ただ、「そのインターフェースを実装しているクラスに限る」けどね
だからといって闇雲に継承したりインターフェースを実装したりするのではなく、is-aの関係であるべき
「車」や「飛行機」は抽象化すると「乗り物
」となるけど、「家」は抽象化しても「乗り物」とはならないね(抽象化すると「建物」とかになるはず)
車、飛行機、家はそれぞれ通常クラスとして、
乗り物、建物はインターフェースとして定義する
そうすればどの乗り物だろうと同じ「前進」とかで動かせる
この抽象化して、どれでインスタンス化したか関係なく動かすためにinterfaceがある
31:デフォルトの名無しさん
22/06/22 12:05:02.40 PETcyPz40.net
インターフェイスは、デザインパターンやユニットテストを多少でも知っていないと意味不明だろう
32:デフォルトの名無しさん
22/06/22 12:38:55.59 +v1vNSu7r.net
まあ書いてみたときに便利さを実感するわな
33:デフォルトの名無しさん
22/06/22 12:56:59.75 PETcyPz40.net
どうだろね
数時間で完成する規模のものしか書かないのであれば、記述が増えて不便になったと思うかもしれないし・・・・
34:デフォルトの名無しさん
22/06/22 13:00:52.20 1cdxoy9qd.net
実際にはほとんどテストが目的だから、>>29みたいな説明で納得した気になってるとかなりギャップを感じるよね
一方で拡張ポイントを作るためにinterface使う場合は非常に恣意的な設計になるので、これまた>>29のようなメンタルモデルとはだいぶ違う感じになる
35:デフォルトの名無しさん (アウアウウー Sa47-vQ73)
22/06/22 13:58:54 bIOoQPo7a.net
JavaとJavaBeansのことか
36:デフォルトの名無しさん
22/06/22 15:18:26.16 IP7+Sy+B0.net
>>26
合ってる。
小難しく考えず、要は「俺のこと呼び出すならこれとこれのメソッド実装しとけ」ってこと。
だんだん使いこなせてきて、もうちょっと凝ったことやろうと思うと型制約とかが出てくる
37:デフォルトの名無しさん
22/06/22 15:19:46.32 pCRUTkSs0.net
普段意識しないだけで、インターフェースはいたるところにある
判りやすい例がforeachステートメント
あれはListではなくIEnumerableに対してループしている
38:デフォルトの名無しさん
22/06/22 15:42:58.01 81K3MuoLd.net
車が家の場合は?
39:デフォルトの名無しさん
22/06/22 17:28:55.97 A/muOnk30.net
>>33
インターフェイスの目的がテストってのは違うんじゃね
もともとは多重継承させないための仕組みだろ
もっとも使われてるシーンがテストだってならまあそうかもしれんが
>>36
初心者むけの例であんまり例外的な条件あげつらうののもうどうかとは思うが
じつはforeachはIEnumerable実装してなくても可能なんだがな
40:デフォルトの名無しさん
22/06/22 17:54:44.92 FYBnfkKla.net
>>20
石器時代の産物だなw
41:デフォルトの名無しさん
22/06/22 18:10:20.15 5Bb+Exnq0.net
初心者向けなら最初はテストのためって言ってしまっても問題ないと思う
初心者のときに俺が一番ピンときたのは、
ファイル作成や書き込みをテストしたくなったときに使った System.IO.Abstractions だな
ファイルシステム自体を抽象化(IFileSystem)することで
テストの度に実際のファイルをセットアップしなくてもいいことが分かった時は結構感動した
42:デフォルトの名無しさん (ワッチョイ 0b01-bS77)
22/06/22 19:03:12 +B9FnbDA0.net
private Random _random = new Random();
void MethodA(){
var val = _random.Next(1, 100);
}
void MethodB(){
var random = new Random();
var val = random.Next(1, 100);
}
MethodAとMethodBをそれぞれループで何度も実行したとき、Bの方が圧倒的に速いのはなぜですか?
Randomオブジェクトを都度生成しているので遅そうに思えるのですが。
43:デフォルトの名無しさん
22/06/22 19:22:48.61 EFlIvheoM.net
>>41
計測に使ったコード見せて
44:デフォルトの名無しさん
22/06/22 19:58:57.85 pCRUTkSs0.net
RandomNumberGenerator.GetInt32の方がおすすめよ
ゲームみたいにシード値を固定にしたい場合はその限りではないけど
速度が欲しい場合はXorshiftもあるんでついでに比較するといい
45:デフォルトの名無しさん
22/06/22 20:07:52.96 6/q1nl240.net
C++だと、メンバ変数をループでアクセスしたりすると遅くなるよ
C#も多分変わらんのでは
46:デフォルトの名無しさん
22/06/22 20:16:40.07 1cdxoy9qd.net
>>44
そんなもん誤差
Randomクラスが中でどれだけフィールドにアクセスしてると思ってるんだ
47:デフォルトの名無しさん
22/06/22 20:19:45.04 ITHh+IXJ0.net
Rレジスタを読むだけじゃないのか
48:デフォルトの名無しさん
22/06/22 21:10:25.85 MLZMXa4p0.net
ローカル変数に保持するとかなりの確率でレジスタに入るがstaticフィールドに紐づいてるインスタンスだと逆に絶対にその都度メモリにアクセスすることになる
それもその都度多重ポインタを辿っていく事になるので何度もreadする変数は出来ればローカル変数に一度入れた方が良い
レジスタ利用されずともヒープへのアクセスとスタックへのアクセスじゃ局所性の問題からスタックの方が早いし手間以外にはメリットしかない
49:デフォルトの名無しさん
22/06/22 21:42:35.06 XpS14TAH0.net
>>41
計測してみたけどBのほうが圧倒的に遅かった
50:デフォルトの名無しさん
22/06/22 21:49:22.91 XpS14TAH0.net
環境で最適化内容に差があったりするのかな?
コード貼っておくので計測してみて
URLリンク(dotnetfiddle.net)
51:デフォルトの名無しさん
22/06/22 22:27:47.54 OsaOMnRZ0.net
出した乱数を未使用で後者はローカルで完結してるから最適化でコードが全省略されたってオチだろう
52:41
22/06/22 22:57:40.86 LVeGoA3E0.net
みなさんありがとうございます。書いたコードはこんな感じです。
.NET Framework4.8 の Form アプリで、画面にlabelを1つ置いています。
私の環境だとDebug, Releaseビルドに関わらず100倍くらいBが早いです。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private Random _random = new Random();
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random.Next(1, 100);
}
private int MethodB() {
var random = new Random();
return random.Next(1, 100);
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
53:デフォルトの名無しさん
22/06/22 23:12:43.31 BDP06NEh0.net
AとBの実行順は変えてみた?
54:デフォルトの名無しさん
22/06/22 23:17:07.34 MLZMXa4p0.net
>>51
Test(MethodB);
Test(MethodA);
こうやって逆にして見ると今度はAの方が100倍速くなるかもね
Stopwatchクラスはこんな風に糸も簡単に結果が変わるからパフォーマンス測定にはあんまり向かない
あとRandomと比べてlabe1.Text = がかなりのボトルネックになってる可能性あるから、そうだとしたらRandomのパフォーマンス差なんて誤差の範囲内ってことになってしまう
よって強いてTest()でやるとしたら自分ならこうやって最後だけアウトプットするようにする
int num = 0;
for (int i = 0; i < 10000; i++) num += func();
label1.Text = num.ToString();
55:デフォルトの名無しさん
22/06/22 23:19:35.02 MLZMXa4p0.net
てかループ枚にToString()を挟んでる時点で後発の方が100倍早くなるのはヒープアロケーション関係だろうね
とりあえずそのコードじゃRandom自体のパフォーマンス差なんてほぼ計れてないと思うよ
56:デフォルトの名無しさん
22/06/22 23:50:09.49 XpS14TAH0.net
>>51
Application.DoEvents()はずしても100倍の差が出る結果は同じなの?
57:41
22/06/23 00:05:42.18 L4XgT5Hv0.net
>>52-55
A,Bの順序を入れ替えても同じ結果でした。(A:6000msec, B:60msec)
Application.DoEvents()を外すと、差が小さくなりますがそれでもBが40倍くらい速いです。(A:2000msec, B:50msec)
Randomの使い方が正しくないとかは、いったん置いておいて、
なぜこれほど差が出るのかが知りたいです。
気づかずに遅い実装をしない為には、何に気を付ければ良いのかが知りたいです。
58:デフォルトの名無しさん
22/06/23 00:40:24.63 VlRKcYRwd.net
Textプロパティは>>53も指摘している通りクソ遅いから>>53の言うとおりに直しなさい
59:デフォルトの名無しさん
22/06/23 00:47:12.21 VlRKcYRwd.net
あと、Bの方は頻繁に同じ値が返ってないか?
Randomの引数なしコンストラクタは現在のミリ秒単位の時刻をシードに設定するから、1ms以内に生成されたRandomオブジェクトは全て同じ結果を返すはず
前述の通りTextプロパティの変更は非常に重いので、値が変わらない場合は実際の変更を省略する実装になっている可能性がある
60:デフォルトの名無しさん
22/06/23 00:50:17.77 wY0+W7Gq0.net
GUIへのsetterもそうだが、何かを計測したいなら不確定要素になりうるものはできるだけ排除しなよ
sw.Start()からsw.Stop()までの間はFunc呼び出しのループだけにしたい
あとループと関数呼び出しのオーバーヘッド分の計測も必要
空の関数 int Empty(){return 0;} も用意すること
61:デフォルトの名無しさん
22/06/23 02:12:34.18 3EmxumxM0.net
>>56
かかってる時間を見るとBが最適化されて速いというわけじゃなくAが異常に遅いんだね
コードからはなんでそんな遅くなるのか全然わからないから絞り込んでいって切り分けるかプロファイリングするかかな
それ以外で簡単にできるものだと
A、B、A、B、A、Bと3回ずつ回して差をみる
FormじゃなくCLIでやってみる
BenchmarkDotNetで計測してみる
とか
62:デフォルトの名無しさん
22/06/23 09:47:54.73 d0910tAHM.net
Randomより遅い処理色々混ざってるから計測になってない
計測したい処理を完全に独立したメソッドにしてBenchmarkDotNetで測れ
63:デフォルトの名無しさん
22/06/23 10:02:19.23 VlRKcYRwd.net
>>61
公の場でのベンチマークにそういう変なライブラリを使うのは悪手
使う側にもその結果を検証する側にも不要な疑念が生じて、ソースを見ることになり結局時間の無駄
64:デフォルトの名無しさん
22/06/23 10:04:16.16 uYSGjbtO0.net
公の場?
65:デフォルトの名無しさん
22/06/23 10:59:37.96 uYSGjbtO0.net
いわゆる.NETだと(だっけ)プロパティへのアクセスが遅くなるっていうハナシじゃないん?
どうしてもならリフレクションとかでどうにかこうにかするとか、そういう話だった気はする
66:デフォルトの名無しさん
22/06/23 11:05:10.95 szzSpCywM.net
いわゆらない.NETの話はこのスレで出てくるのか?
67:デフォルトの名無しさん (ドコグロ MM92-cRYK)
22/06/23 11:22:03 /qnvtXmgM.net
>>58
これだろうな
68:デフォルトの名無しさん
22/06/23 11:43:08.08 6zHFEOYgM.net
>>64
そういうレベルの話じゃなくて、Control.Textは内部でWinAPIを呼んでいてビチグソ遅い
69:デフォルトの名無しさん
22/06/23 12:07:07.81 3EmxumxM0.net
>>58, 66
なるほど納得
俺環で再現しなかったのはFrameworkのバージョン違いが原因だった
.NET Core以降は1ms以内でもシードが変わるようになってる
70:64
22/06/23 12:13:05.94 uYSGjbtO0.net
コンソールアプリでも似たような結果になったんだが気のせいかな?(4.8)
ちなみにrandom使わずにやってみても同じ(intの和)
プロパティへのアクセスだなあとワイは思うけどどやろね
71:デフォルトの名無しさん
22/06/23 12:14:45.20 /osWwN6CM.net
>>62
公ってなんだよw
.NETの速度を売りにしてるライブラリは大体これ使ってる
72:デフォルトの名無しさん
22/06/23 12:17:22.87 jvSS+4eW0.net
基本的に出力は重い
Console.WriteLineですらただの数値計算と比べると圧倒的に重い
Controlの操作は>>67が言うように内部でSendMessageが走るので更にめちゃくちゃ重い
73:64
22/06/23 14:13:54.26 uYSGjbtO0.net
コンソールアプリ、BenchmarkDotNetでやってみたら大して変わらんかったわ
Randomじゃなくてintの和でも同じ傾向
速度の違いはデバッグ時の状況の影響かもね
ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
比較の話で共通部分のコード直せって意味わからんわな
74:64
22/06/23 14:15:31.83 uYSGjbtO0.net
ちなコードの一部
private void Test(Func<int> func)
{
for (var i = 0; i < 10000; i++)
{
Console.CursorLeft = 0;
Console.Write($"{i}{func()} random");
}
}
//private int MethodA()
//{
// v = 5 + 5;
// return v;
//}
//private int MethodB()
//{
// int v = 5 + 5;
// return v;
//}
private int MethodA() => _random.Next(1, 100);
private int MethodB() => (new Random()).Next(1, 100);
[Benchmark]
public void executeA() => Test(MethodA);
[Benchmark]
public void executeB() => Test(MethodB);
75:デフォルトの名無しさん
22/06/23 14:44:45.09 pqpGOzkV0.net
>>69
何を根拠にプロパティは遅いって判断したんだ
ただのメソッド呼び出しだぞ
特定のプロパティが遅いのはプロパティの中の実装のせいなので別の話
リフレクションは普通遅くなるはずだが
76:デフォルトの名無しさん
22/06/23 14:53:28.22 uYSGjbtO0.net
>>74
ワイの勘違いだったわ
77:デフォルトの名無しさん
22/06/23 15:31:00.54 te570uEsM.net
>>73
このintの和のケースではBは最適化が効いて return 5; になっていると思われる
Randomでは同様の最適化はできないはずだから状況が違う
78:76
22/06/23 15:31:31.06 te570uEsM.net
訂正
return 10;
79:64
22/06/23 15:56:54.89 uYSGjbtO0.net
>>76
ちなみにintのほう、5+i にしてても"ほぼ"一緒やったよ。差異も似たようなもん
言いたいのは、>>51(=41)が言う「AとBにこんなに差が出るがなぜか」について、
4.8のコンソールアプリでは51が言うほどの有意な差は出なかったということ。
ちなみにワイの環境でMeanの差異は50ms程度でBが早いってなったけど、
まあこれは51が言ってるほどじゃないけど環境依存もあるからなんとも
(Randomのほうもコメントで切替えつつ検証した、差異も同じ)
原因についてのワイの推測は間違ってたってことはこれで自分で明らかにしちゃったけど、
Randomの1ms~も多分違うんじゃないかなとはこれで思う
80:デフォルトの名無しさん
22/06/23 16:15:51.40 te570uEsM.net
>>78
切り分けの仕方が不適切なんだよ
>>51のコードではボトルネックは明らかにTextやToStringやRandomの実装にあり、フィールドアクセスの有無やプロパティ自体のオーバーヘッドなんか誤差
>>73のような超マイクロベンチマークとは測ってるものが全然違うわけ
その処理時間の大小が定性的に同じだったとしても、それは恐らく偶然
定量的に評価しないと意味がない
81:64
22/06/23 16:30:56.77 6J8EAy2kr.net
いやそれはなんのために言ってるわけ?
メソッドの実装の仕方の違いからくる性能差の疑問を解決したいだろう51に対して、
何を言いたいん?
「これじゃ分かんねえよ」とでも言いたいの?なら引っ込んでれば?
こっちは自分の予想を自分で検証してその植えでその誤りも認めたんやから
何もせず考えもせずわかんねえって言ってるだけやん
予想があるなら検証してコードもだしてくれよん?
82:デフォルトの名無しさん
22/06/23 17:45:34.11 jvSS+4eW0.net
>>72
全く違う
他で大きく時間使われるところがあると大数の法則的な感じで軽い部分が圧倒的母数によって覆い隠されてしまう
特にGCやシステムコールは常に一定速度とは限らないから、そういう処理を挟めば挟むほど誤差が大きくなってすぐに終わる軽微な処理差が覆い隠されてしまう
83:デフォルトの名無しさん
22/06/23 18:02:24.84 a115LlJm0.net
>>51
>>58の情報を信じて書いたけど
これで大体同じような数字が出たら>>58の通りベンチの取り方の問題のせいで出た差だと思うよ
MethodA,MethodB自体は>>72も検証してくれた通り変わらないはず
というか今MethodBのほうをどこかで使ってるんだとしたら、性能なんかより1ms以内連続して同じ値が出るような乱数でも問題無い使い方なのかを気にするべき
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private int _random = 0;
private void Test(Func<int> func) {
var sw = Stopwatch.StartNew();
var count = 10000;
for (var i = 0; i < count ; i++) {
label1.Text = func().ToString();
Application.DoEvents();
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} msec");
}
private int MethodA() {
return _random++;
}
private int MethodB() {
return (int)DateTimeOffset.Now.FromUnixTimeMilliseconds;
}
private void button1_Click(object sender, EventArgs e) {
Test(MethodA);
Test(MethodB);
}
}
84:デフォルトの名無しさん
22/06/23 18:09:26.02 ey2ezatM0.net
とりあえず64がアホだという事は判る
85:デフォルトの名無しさん
22/06/23 18:14:56.67 3EmxumxM0.net
label1.Text = func().ToString();を
label1.Text = $”{i}: {func().ToString()}”;にでもすれば
>>58が書いてる内容が原因かどうかはっきりわかるでしょ
86:64
22/06/23 18:19:33.38 4fvcgSgI0.net
>>81
何が全く違うんやねん
一般論はいいけど、それが51の言ってるAとBの差の理由になるのは何なのよっていうことじゃん?
まあそもそも51のコードにそこまでの差が出るのかどうかも今のワイは知らん立場やが
51はBのほうが速くなってるから疑問なんやろ、まあ他のコードのとこに依存ありそうで気になるな
87:64
22/06/23 18:21:37.32 4fvcgSgI0.net
>>82
まあ正直今どきRandom使うなとはワイも思ったw
88:デフォルトの名無しさん
22/06/23 18:41:00.93 jvSS+4eW0.net
>>85
ん?5chって一般論話す場だろ
そりゃ自分でベンチ計れば結論出せるけどそんなことする義理はない一方で一般論レスするのは5秒で終わるし
89:64
22/06/23 19:08:45.37 4fvcgSgI0.net
>>87
しょうもな、わからないんやろ、引っ込んでて
90:デフォルトの名無しさん
22/06/23 19:40:58.09 1Th4d0L20.net
>5chって一般論話す場だろ
初めて聞いたわ。
ここ技術系の板だぜ。個別問題に一般論しか返せないなら邪魔だから黙ってろ
91:デフォルトの名無しさん
22/06/23 19:45:10.46 ey2ezatM0.net
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
[MemoryDiagnoser(false)]
public class RandomBenchmark
{
[Params(10000)] public int A;
private readonly Random _random = new Random();
public int MethodA() => _random.Next(1, 100);
public int MethodB() => new Random().Next(1, 100);
[Benchmark]
public int BenchA()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodA();
return result;
}
[Benchmark]
public int BenchB()
{
int result = 0;
for (int i = 0; i < A; i++) result += MethodB();
return result;
}
public static void Main() => BenchmarkRunner.Run<RandomBenchmark>();
}
| Method | A | Mean | Error | StdDev | Allocated |
|------- |------ |------------:|---------:|---------:|----------:|
| BenchA | 10000 | 80.88 us | 0.489 us | 0.434 us | - |
| BenchB | 10000 | 1,490.26 us | 9.404 us | 8.797 us | 720,001 B |
92:デフォルトの名無しさん
22/06/23 20:56:11.83 pqpGOzkV0.net
>>51
皆が指摘してるように余計な処理を省いたら、たぶん、結果が逆転すると思う
(自分の所では逆転してMethodAの方が60倍位速かった)
private void Test2( Func<int> func )
{
var sw = Stopwatch.StartNew();
var count = 10000; // ※速すぎて結果が0msecになると思うから1桁増やした方が良い
for ( var i = 0; i < count; i++ )
{
func();
}
sw.Stop();
Console.WriteLine( $"{sw.ElapsedMilliseconds} msec" );
}
private async void button2_Click( object sender, EventArgs e )
{
await Task.Run( () => Test2( MethodA ) );
await Task.Run( () => Test2( MethodB ) );
}
93:デフォルトの名無しさん
22/06/23 20:58:51.74 ey2ezatM0.net
少なくとも >>51 のコードでは、Label.Text の更新とApplication.DoEventの時間測ってるのと変わらん
94:デフォルトの名無しさん
22/06/23 20:59:14.76 pqpGOzkV0.net
>>91ほど変えなくても
>>51の
label1.Text = func().ToString();
を
func();
に置き換えるだけで結果が逆転するな
95:64
22/06/23 21:03:40.24 4fvcgSgI0.net
>>90
やっぱ差異あってもその程度だよなあ
これだけで 2000ms とか差が出るのは考えにくいよなあ
96:デフォルトの名無しさん
22/06/23 21:07:01.92 pqpGOzkV0.net
ついでにfunc().ToString(); でも逆転するな
97:デフォルトの名無しさん
22/06/23 21:21:12.73 pqpGOzkV0.net
.NetFramework4.8 Debugビルドにて
■label1.Text = func().ToString();
MethodA: 5480[msec]
MethodB: 48[msec]
■func().ToString()
MethodA: 8[msec]
MethodB: 20[msec]
■func():
MethodA: 7[msec]
MethodB: 18[msec]
■>>91
MethodA: 0[msec]
MethodB: 12[msec]
98:デフォルトの名無しさん (ワッチョイ ca2d-MKW/)
22/06/23 22:05:36 pqpGOzkV0.net
.NET Core 6.0 Debugビルドにすると
A,Bどちらも4500~4600msec位で若干ばらつくがほぼ同じ
結局のところ、>>58が正解で、.NET Framework4.8のRandomの挙動の違いで
Textプロパティの内部で処理がスキップされるか否かってことだろうね
Randomの値の検証はもう面倒臭いからやらないけど
99:デフォルトの名無しさん
22/06/23 22:19:46.46 ey2ezatM0.net
まとめるとこうだな
・Label.Textの更新速度がクソ遅いのでRandomの処理時間は誤差
・new
100:Randomで同じ値が返ってきた場合、Label.Textが更新されないから速くなってるだけ https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/control.cs,4048
101:デフォルトの名無しさん
22/06/24 02:50:44.64 gZdHgxGE0.net
>>98
ギャハハハw
難しいなw
102:デフォルトの名無しさん
22/06/24 07:20:28.71 fuiDR9PnM.net
仕様から推測した原因で間違いないか最終的に動作でも確認しといたほうがいいのでは?
パラメータ有りのnew Random(i)したり>>84みたいにカウンタもLabel.Textに反映して
MethodBがMethodAと同様に遅くなれば一件落着
103:デフォルトの名無しさん
22/06/24 09:06:25.48 nZzm6L7c0.net
>>89
結果的に俺が一番最初に指摘した一般論の通りだったな
104:64
22/06/24 09:10:29.92 ec4i6GcX0.net
>>101
お前何もしてないじゃん
105:デフォルトの名無しさん
22/06/24 09:14:09.95 nZzm6L7c0.net
>>102
>>98が言ってる上記の結論をこのスレで一番最初に指摘したけど
106:64
22/06/24 09:17:32.89 ec4i6GcX0.net
検証してくれたのは違う人じゃん
なに自分の手柄にしてんの
107:デフォルトの名無しさん
22/06/24 09:27:01.49 nZzm6L7c0.net
>>104
単なる数値計算と比べて出力が激重なんてことは検証しなくても分かる程度に明らかな事だからな
実際俺以外にもちらほら指摘しとる奴おるし
せっかくただのint結果に小分けされてるものを毎回出力に紐づけるとか発想がスタティックおっさんと同レベルだからオブジェクト指向プログラミング向いてないで
108:64
22/06/24 09:46:49.82 ec4i6GcX0.net
>>105
しょうもな、後からならなんとでも言えるから
109:デフォルトの名無しさん
22/06/24 09:58:54.60 VlIywyIA0.net
> ちなControl.Textがうんたらの人たちは、ただの改善おじさんやな
> 比較の話で共通部分のコード直せって意味わからんわな
110:64
22/06/24 10:03:47.04 ec4i6GcX0.net
>>107
それは誤りやったな、51には悪いことしたわ
そんときはTextの仕様知らんかったでな
他のやつは98の提示があって始めて証明できてたな
111:デフォルトの名無しさん
22/06/24 12:18:00.54 p+qJoCDWM.net
普段から速度意識してプログラミングしてない奴は、出力が遅いという当たり前の事を知らない事は良くある
そう言う奴には口で言っても感覚的に理解出来んから数字を見せるのが一番早い
112:デフォルトの名無しさん
22/06/24 12:58:40.19 kHrWfcT90.net
>>103
お前が言ったのは一般論の可能性だ
結果的にそれが正しかったとしても
それを個別事例に当てはめて検証したのは別の人だろ
ちなみに今回の原因は、コントロールのアクセスや出力が遅いことじゃないんだぜ
それならAもBも同じだけ遅くて差が出る原因にならんからな
113:デフォルトの名無しさん
22/06/24 13:05:30.94 VlIywyIA0.net
誰が原因を解明したかなんて質問者からすればどうでもいい話である
醜い
114:デフォルトの名無しさん
22/06/24 13:19:04.19 tHNubtgb0.net
出力が遅いとか条件次第でスキップする仕様等を知らなくても、
計測を目的としたループの中には対象(今回はRandom)以外の処理はなるべく入れない
と言う原則を守っていれば避けられた話だな。
115:デフォルトの名無しさん
22/06/24 13:26:09.89 kHrWfcT90.net
いや、そもそもRandomの速度を測定したいって話じゃないだろ、これ
116:デフォルトの名無しさん
22/06/24 14:24:15.51 nZzm6L7c0.net
>>110
実際に検証した人がGJであることは別に否定してないが?
大本の原因は同一インスタンスでは1ms以内だとシードが変わらない&同一文字列だと出力更新が成されないって事だったようだが、
「毎回newする vs インスタンス使いまわし」という本来質問者が意図してたであろうこの差を調べたいってことであればControl.Textへの代入を挟むと、本来調べたいヵ所が誤差に収斂してしまって調査不可能になるって結論だろ
そしてStopwatchクラスで順次調査すると順番によって速度が変わるなんてことは往々にしてあるから必ずしも「AもBも同じだけ遅くなる」とは限らないってこともちゃんと指摘してる
117:デフォルトの名無しさん
22/06/24 14:27:59.50 tEJIL7500.net
最初に指摘出来てぼくちゃんえらいでちゅねぇ
118:デフォルトの名無しさん
22/06/24 15:42:06.42 kHrWfcT90.net
>>114
>本来質問者が意図してたであろうこの差を調べたい
ああ、そもそもの食い違いはそこか
別にお前の指摘内容を個別にみれば間違ってるとは言わんが
インスタンス生成の速度みたいとか勝手な想像でしかないな
本来の質問者のベンチの意図は不明なんだがな
インスタンスの生成の差を見たかったのか、ローカル変数とクラス変数の速度差をみたかったのか
違う要因で速度計測してて最終的にあのコードまで落ちたのか
結果として予想と違うけど原因は何かって質問だぜ
質問した意図はボトルネックなコードは避けたいって話だったし
119:デフォルトの名無しさん
22/06/24 15:56:21.70 0JrGBM9l0.net
雑ッッッッッ魚
120:デフォルトの名無しさん
22/06/24 17:24:37.81 VlIywyIA0.net
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
121:デフォルトの名無しさん
22/06/24 17:51:39.39 MtTs9G+lM.net
解決したんだからしょーもない事で喧嘩するなよw
122:デフォルトの名無しさん
22/06/24 18:14:27.28 N
123:AI/rIyW0.net
124:デフォルトの名無しさん
22/06/24 19:22:50.70 nn4VojDf0.net
論点がズレて喧嘩始まるのはこの板の名物だな
125:デフォルトの名無しさん
22/06/24 22:04:14.69 3GxA+CY50.net
ワイだの草だの言ってんのみると、まとめキッズが大量に流入してきてるしな
126:デフォルトの名無しさん
22/06/25 12:00:40.04 Fily2x+h0.net
顧客の意図を汲んで問題を分析して解を出す速度もこの業界では重要スキルだからこれからも精進したまえ
127:デフォルトの名無しさん
22/06/25 12:03:57.86 1xFYE0ZgM.net
昔わざと炎上させて残業代を狙うやつがいて非常に厄介だった
128:デフォルトの名無しさん (ワッチョイ 0f6e-H0HQ)
22/06/25 21:08:15 YzwccikL0.net
非同期処理について質問なんですけど、taskを受け取ってその状態を見て処理が終わってるかどうかチェックして…みたいな感じじゃないですか
例えば通常の関数だったら、戻り値を受け取るのは呼び出した関数の処理が終わって、そこで初めてですよね
でも非同期だと処理終わってないのに戻り値が渡されちゃうって認識でいいですか?そして渡されたあとも進行状況に応じて変化し続けると
129:デフォルトの名無しさん
22/06/25 21:36:39.54 MoozsICfd.net
>>125
処理が終わっているかどうかのチェックなんかしない
Taskを受け取ったら、Taskに対して「完了後に次に実行したい処理」を登録する
そして完了後に次の処理を呼び出すのはTaskを返す側の責任であり、受け取った側は気にしない
次の処理が登録された時点で既にTaskが完了していれば次の処理がすぐ呼ばれるかもしれないし、数秒後かもしれない
非同期処理とはそういうもの
130:デフォルトの名無しさん
22/06/25 21:42:23.39 zqnvknwe0.net
>>125
> 非同期だと処理終わってないのに戻り値が渡されちゃうって認識でいいですか?
非同期メソッドを呼んで戻ってきてるのは戻り値を戻す処理を実行してるTask<TResult>であって、
その時点で戻り値が渡されている訳ではないよ。
Taskが終了した時点でResultに結果が格納されるが、
普通はTaskを直接弄ったりせず、awaitで待って結果を受け取る。
131:デフォルトの名無しさん (ワッチョイ 0f6e-H0HQ)
22/06/25 22:53:30 YzwccikL0.net
>>非同期メソッドを呼んで戻ってきてるのは戻り値を戻す処理を実行してるTask<TResult>であって、
ここと
>>その時点で戻り値が渡されている訳ではないよ。
ここのつながりがよくわからないのです
1行目でTask<TResult>型の戻り値が戻ってますよね
それなのに戻り値が渡されていないというのはどういうことでしょうか
あとiscompletedプロパティで終了しているかを判断するのは一般的ではないのですか?
132:デフォルトの名無しさん (ワッチョイ 0f24-5+LN)
22/06/25 23:06:32 dWIrjb1E0.net
>>128
Taskは作業管理機であって結果ではない
task.Resultをして初めて結果を取り出せる
task.Resultを呼び出す前に作業が完了していれば即戻り値を得られるし、そうじゃないなら内部でwhile (!isComplited) Sleep(1);みたいな事をして作業が終わるまで待機した後に得られる
「作業が終わっていたら結果を貰う、そうじゃなければ別の事をする」っていうシーンに限りIsComplitedで確認する(Resultを使うと終わるまで強制的に待機させられるため)
大抵の場合は「Task投げる→他の事する→Task結果を受け取る」って言う一本道なのでIsComplitedをせずにResultでそのまま貰うことが多い
133:デフォルトの名無しさん (ワッチョイ 3f2d-yeJY)
22/06/25 23:09:24 DJEgoMeR0.net
>>128
今はtask.IsCompltedやtask.Resultを直接参照することはあまりないな
var result = await Task;
みたいにawaitで待ちと返り値の取り出しを行う
134:デフォルトの名無しさん (ワッチョイ 3f32-iCO3)
22/06/25 23:14:34 gQjoPRQF0.net
>>128
値は確かに返っている、がタスクであってズバリ結果じゃないよね
ハンドルとかのイメージが湧かないなら…注文番号だけ返すみたいな
>iscompleted
使う機会がない訳ではないが、自前でノンブロッキングを書くと面倒くさいし
大抵は完了したら何をするって感じで、awaitやContinueWithを使うと思うよ
135:デフォルトの名無しさん (ササクッテロラ Spa3-u0tS)
22/06/26 01:35:05 qaLvjcDBp.net
待つなら同期でいいと思うんですが、awaitするメリットってなんですか?
他のことが出来るって言われても、他のことが非同期にやらせてる処理に
影響が出るような事象や処理だったらどうするんですか?
136:デフォルトの名無しさん (ワッチョイ 4f5f-85MC)
22/06/26 01:42:42 J3iRsr8e0.net
同期で待つとスレッドプールが占有されるからやめろ
複数のタスクから同時に読み書きアクセスされるリソースがあるならロックをかけて排他制御しろ
137:デフォルトの名無しさん (ワッチョイ 4f5f-85MC)
22/06/26 01:45:50 J3iRsr8e0.net
あとネイティブアプリでUIスレッド上で同期で待つと全てが固まるからやめろ
138:デフォルトの名無しさん (ワッチョイ 3f2d-yeJY)
22/06/26 01:49:34 naJNIbNQ0.net
>>132
良くあるのはGUIのボタンを押したら時間がかかる処理をやらせる場合
同期処理だとその間GUIが固まって、ウィンドウを移動したり出来なくなる
非同期処理なら処置中もGUIが動ける
排他制御等で影響が出ないようにするのはプログラマーの仕事
139:デフォルトの名無しさん (オッペケ Sra3-r+Rc)
22/06/26 02:07:33 DrXudPeHr.net
C10K 問題は20世紀に提起された話題で、現代も問題になるかわかたない。
実際、開発者であるあなたのパソコンでは数千のスレッドが在り、ハンドルに至っては数十万あると思う。
それで問題なく動いている。
非同期は広告の宣伝文句かもしれない。
140:デフォルトの名無しさん
22/06/26 02:31:28.25 thJDnK3H0.net
>>132
ついでに言うと、UIコンポーネントはUIスレッドしか触るなという制約がある
awaitは非同期待機だけでなく既定なら元コンテキストへ戻るという意味も含む
同タスク内でやるとアクセス違反、経過もIProgressなど同期コンテキストが必要
ContinueWithの後続処理としてもタスクスケジューラを渡してやらなければならない
>>136
GUIはイベント駆動だし、Taskの乱発はC10Kのスレッド作りすぎに近づいていくが…?問題ねぇよってプロパガンダ?
141:デフォルトの名無しさん
22/06/26 08:44:12.84 yfX3wl/l0.net
>>132
> 他のことが出来るって言われても、他のことが非同期にやらせてる処理に
> 影響が出るような事象や処理だったらどうするんですか?
魔法じゃないんだからそんなのは何を使ってもどうしようもないだろ
影響出ないケースなんていくらでもあって例えばネットワークとディスク(最近はSSDだからストレージか)の各々からデータを読んでからそれらのデータを処理して表示するなんて時にシリアルにやるより
1. ネットワークから読み出し開始
2. ストレージから読み出し開始
3. 1. と 2. の終了を待つ
4. 読み出したデータを処理して表示
ってやった方が早い可能性があるってこと
142:デフォルトの名無しさん
22/06/26 08:51:05.64 60uDe2Q5d.net
横からの質問ですが、デスクトップアプリならなんとなく理解はできてるつもりですが、ウェブアプリだと、複数のユーザからの処理をサーバ上のアプリが処理していく際に、同期処理で重たいのが動いている場合にほかのユーザまでまたされるということがありま
143:すか? アクセス単位で別々にスレッド処理されてるから、メソッドを同期非同期するのはあくまでもその単一ユーザの処理の中で考えれば良いですかね? それとも、他のユーザも待たされるから基本的には非同期で作っていくものですか? ちなみに、winformからblazor移行の勉強中です
144:デフォルトの名無しさん (ワッチョイ 8fad-d/rJ)
22/06/26 09:48:29 vVyuk1M20.net
Blazorって流行る気配があるの?
145:デフォルトの名無しさん (テテンテンテン MM4f-hYij)
22/06/26 09:58:33 MUUA0Nh2M.net
>>139
同時アクセスしてるユーザー数>Webサーバが用意してるスレッド数の上限 だと待たされることがある
これがC10K(クライアント10000台)問題
なので対策としてDBアクセスみたいなI/O待ちみたいなときにスレッドを占有せずいったんリリースさせようと考えて
async/awaitの仕組みが生まれた
146:デフォルトの名無しさん (スッププ Sd5f-2lfq)
22/06/26 10:02:10 PhXCrOZEd.net
Blazorはアーリーアダプタが一瞬遊んだくらいで消えた
もう誰も使ってないよ
147:デフォルトの名無しさん (ワッチョイ 0f24-5+LN)
22/06/26 10:04:32 FNTvXztu0.net
スレッド型非同期は時代遅れ
シングルスレッド非同期こそナウ
148:デフォルトの名無しさん
22/06/26 10:07:12.47 60uDe2Q5d.net
>>141
ありがとうございます
ということは、スレッドが枯渇しない限りは同期処理でほかのユーザは待たされることはないと。
プログラム上で主に考えるのは、ユーザ単位で同期で良いのか非同期にするべきか考えれば良く、ただ、規模やサーバの負担を考えるときには、非同期によりスレッドの占有は抑えられて効率よくスレッドが使われていくから、非同期処理を実装するメリットまたは必要があるという理解で合ってますか?
149:デフォルトの名無しさん
22/06/26 10:25:36.55 bTdujDmeM.net
>>144
それで合ってる
ぶっちゃけBlazorなんてお遊びの許されるちょっとした社内システムくらいでしか使わないんだからスレッドの消費なんて全く気にしなくてOK
Blazor Serverなら尚更
150:デフォルトの名無しさん
22/06/26 10:47:01.78 MUUA0Nh2M.net
極論すると、絶対にWebサーバでスレッド枯渇することがないって分かってるなら
async/awaitなんか使わないほうがパフォーマンスが良い
なので、万一本当にスレッドが枯渇したときに
サーバに処理余力があるにもかかわらずリクエストが処理できなくてレスポンスが致命的に悪化してもよければ
非同期の仕組みなんかまったく使わなくてよいし
現にVS2010以前はその前提のWebアプリしか構築できなかった
151:デフォルトの名無しさん
22/06/26 10:47:39.05 60uDe2Q5d.net
>>145
ありがとうございます
なかなかピンとくる記事に当たらなかったのですっきり疑問がとけました
国内のサードパーティー製のモジュールとか対応しだしてたりYouTubeなんかだと結構英語の解説とか多いので向こうでは多少使われてるのかなと思ったんですが、先は厳しそうですね、、、
本業でなくC#好きで触ってる自分にとっては一番作りやすいのではありますが
152:デフォルトの名無しさん
22/06/26 11:46:46.35 ITekl9D3r.net
データベースのこと考慮しなくていいんか?
重い処理は非同期で別スレッドに投げなくていいんか?
153:デフォルトの名無しさん
22/06/26 11:55:34.78 fnukxN9QM.net
CPUバウンドな処理だとスレッド枯渇しなくても他のユーザーが待たされる
I/Oバウンドな処理でもDB側で何らかの競合が発生すれば待たされる
スレッドが枯渇しなくても数が増えると該当スレッドにCPUリソースが割り当てられるまでの時間が当然増えるから処理完了までの時間は長くなる
短い時間で終わる単純なI/Oバウンドな処理のみでピーク時/オフピーク時のリクエスト数が十分に少なくて省リソースよりもプログラムの簡潔さを優先するような場合なら同期処理を選ぶ
154:デフォルトの名無しさん
22/06/26 12:26:18.51 +3C8D9l5M.net
サーバーアプリでCPUバウンドな処理なら非同期より同期で実装
フロントのサーバーを呼び出す箇所で非同期にする
155:デフォルトの名無しさん
22/06/26 12:32:44.97 35knD1Em0.net
BlazorならPolySnakeを再現してるサンプルを見て、すごい時代になったなと思ったよ
見ただけなのでどういう仕組みかは知らない
URLリンク(github.com)
156:デフォルトの名無しさん
22/06/26 12:39:31.07 6NjMnJeGM.net
>>148
Winアプリと違って、Webサーバーというのは基本的にレスポンスを返すまでスレッドをブロックしていいアーキテクチャなんだよ
例外としてNode.jsのようなシングルスレッドなサーバーもあるが、少なくともASP.NET(無印もCoreも)はそうではない
ローディングアニメーションを出すような場合は、処理を開始するAPIと進捗をチェックするAPIを分けてAjaxでポーリングするように作ったりすることもあるが、
その場合でもリクエスト単位では同期でいい
157:デフォルトの名無しさん
22/06/26 13:51:48.19 tmrZCe0Z0.net
>>144
は?単位時間あたり、仮に3分として
CPUリソースをトータルで食い尽くしたら足りない分と次の3分はどうなると考えてるの?
158:デフォルトの名無しさん
22/06/26 14:25:11.51 PhXCrOZEd.net
>>153
そうならないようにインスタンスの台数を増やすだけだね
同期だろうが非同期だろうが変わらん
159:デフォルトの名無しさん
22/06/26 14:30:57.64 tmrZCe0Z0.net
ええー
リソースある前提で作っちゃうのー?
160:デフォルトの名無しさん
22/06/26 14:57:18.69 PhXCrOZEd.net
>>155
何が言いたいのか知らんが、同期だろうが非同期だろうがCPUを100%使っている状況なら普通はWebならまずは水平分散する
Webでは一般にインスタンスの数を増やすだけでスケールするような作りになっていることが大前提として最重要であり、個別の最適化はその次だ
161:デフォルトの名無しさん
22/06/26 17:01:46.40 tmrZCe0Z0.net
webは知らんけど
最近ようわからんのにスレッド立てまくる奴が作ったプログラムがこんな動作だね
正直まずいレベルで下手っぴだと思う
c#の言語仕様のせいで
162:デフォルトの名無しさん
22/06/26 20:52:25.72 yfX3wl/l0.net
「こんな動作」とかフワフワした用語でマウント取りに来るなら自分のブログとかでやってくれ
ここは「初心者」スレ
163:デフォルトの名無しさん
22/06/26 20:59:48.87 NLYG3vIc0.net
>>157
正直まずいレベルで下手っぴな文章だな
164:デフォルトの名無しさん
22/06/27 01:26:20.48 wEAeif5H0.net
何言ってるかわからんと思ってたら他の人もそうだったので安心した
165:デフォルトの名無しさん
22/06/27 02:35:01.48 sfuoftVd0.net
ASDっぽい会話のコンテキストのおかしさ
166:デフォルトの名無しさん
22/06/27 02:35:22.77 l2B1RzVL0.net
>>160
言いたいことは>>153なんだけど
わからないほど悲しい脳みそしてるんだ?
167:デフォルトの名無しさん
22/06/27 03:01:17.94 lmKSzJyY0.net
ヌルヌル話法の特徴と根本原理|mentane|note
URLリンク(note.com)
168:デフォルトの名無しさん
22/06/27 15:08:18.79 Kbl5ft5+0.net
インターフェースのメンバーを呼び出す時には実装を確認すべきなのでしょうか
それとも 定義元のインターフェースへのキャスト必須ですか
(例)
class MyList : IList<int>
{
int IContainer<int> Count { get; }
...
...
}
169:164
22/06/27 15:22:13.53 Kbl5ft5+0.net
ドットが抜けてました
int IContainer<int>.Count { get; }
170:164
22/06/27 15:33:45.50 Kbl5ft5+0.net
ぐちゃぐちゃですみません
int ICollection<int>.Count { get; }
171:デフォルトの名無しさん
22/06/27 19:24:48.05 c9y9U1Yc0.net
聞きたいことがよく分からない
「実装を確認する」というのがどういう行為なのか
そのMyListを実装する側の話
172:なのか使用する側の話なのか 例が単にインターフェイスの明示的実装を書いてるだけでどこが疑問点か読み取れない
173:164
22/06/27 20:38:42.94 Kbl5ft5+0.net
>>167
var mylist = new MyList();
var c0 = mylist.Count; // build error
// MyList は IList<int> : ICollection<int> をもつので
var c1 = ((ICollection<int>)mylist).Count;
// MListでint ICollection<int>.Count { get; } という memberをもつので
var c2 = ((ICollection<int>)mylist).Count;
c1は 万能
174:デフォルトの名無しさん
22/06/27 21:10:43.08 lmKSzJyY0.net
プロパティにpublicつけ忘れてるだけじゃね?
175:デフォルトの名無しさん
22/06/27 21:49:28.21 oKLZ5l1i0.net
IList.Count って public int Count { get } じゃなかったっけ。
((ICollection<int>)mylist).Count; が出来るのは、別途 ICollection.Count が実装されているからじゃないの。
176:164
22/06/27 22:21:47.30 Kbl5ft5+0.net
>>169, >>170
var array = new int[]{1,2,3};
var c0 = array.Count; // build error
var collection = (ICollection<int>)array;
var c1 = collection.Count; // ok
177:デフォルトの名無しさん
22/06/27 23:11:12.57 oKLZ5l1i0.net
オマエ、きちんと日本語で他人に伝わるように説明する気ないの?
,前に書いたのに誤りがあるように見えないんだけど。
178:デフォルトの名無しさん
22/06/28 01:12:23.85 vCyl6X270.net
いきなりオマエ呼ばわりかよ、何様?
179:デフォルトの名無しさん
22/06/28 03:39:43.25 k21C1TP+0.net
攻撃的なレスは誰も得しない
>>172
前に書いたのってのは170のことで合ってる?
Countプロパティを定義してるのはICollection<T>
IList<T>はそれを継承してるだけ
だから
((ICollection<T>)array).Count
で正しく取れるし
((IList<T>)array).Count
と全く同じ意味になる
180:デフォルトの名無しさん (スップ Sd5f-3THJ)
22/06/28 08:26:27 UdVkVSJZd.net
URLリンク(ufcpp.net)
インターフェースの実装は
public int Count{get{...}}
のようにpublicで公開するのが普通。
MyList mylist; mylist.Count; のようにアクセスするのがまずいなら
int IContainer<int>.Count {get{...}}
のように隠すこともできる。
インターフェイスとしてしか使わないなら
MyList mylist;
IContainer<int> c1=mylist;
c1.Count;
のようにアクセスする方法もある
181:164 (ワッチョイ 4f02-lwqN)
22/06/28 14:11:24 gtViLG4V0.net
>>175
MyListでのインターフェイスの明示的実装の結果, 隠蔽されてしまうということですか
了解しました
182:デフォルトの名無しさん
22/07/05 02:51:20.89 pywdYBm60.net
SOLID原則のDの依存性逆転の原則がイマイチ分かりにくいんですが
上位は下位に依存してはならないって説明は何をもって上位と下位になるんですか?
依存の意味はインスタンス化したらもう依存したことになるって事でいいんですよね?
では上位と下位の意味は具体的にどういう基準で区分されるのですか?
183:デフォルトの名無しさん
22/07/05 08:09:11.15 ZZ3vHKnwd.net
>>177
処理の呼び出し階層
決済モジュールが中で銀行引落モジュールとカード決済モジュールを呼んでいるなら、決済モジュールが上位で他は相対的に下位
184:デフォルトの名無しさん
22/07/05 11:14:44.01 Iq0vQpEV0.net
>>177
いい質問
抽象度の高いものが上位、抽象度の低いものが下位
別の言い方をすればアプリケーションのコアに近いものが上位、コアから遠いものが下位
↓この図にある円の中心に近い方が上位、周辺に近いほうが下位
URLリンク(blog.cleancoder.com)
依存は適切なソース分割が行われてる前提で言えば
usingディレクティブでインポートしてれば依存してることになる
185:デフォルトの名無しさん
22/07/05 13:13:39.89 uajPnlyf0.net
フォームアプリのListV
186:iewで水平スクロールをボタンに連携して動かすことって 出来るでしょうか? HScrollVarの値を設定できれば実現できるのでしょうが、そういう情報が見つからず。 よろしくお願いします。
187:デフォルトの名無しさん
22/07/05 13:22:03.56 JMpS1h6ad.net
できらぁ!
188:デフォルトの名無しさん
22/07/05 18:34:58.72 ZFaGw7VU0.net
どのようにやれば出来るのか、取っ掛かりを頂きたいです!
189:デフォルトの名無しさん
22/07/05 18:39:12.96 Ar7iVMhG0.net
DataGridView.HorizontalScrollingOffset はreadonly
190:デフォルトの名無しさん (ブーイモ MMc6-ukjm)
22/07/05 20:00:12 37QL7ImaM.net
Listviewだからアライメントをleftかな
191:デフォルトの名無しさん
22/07/05 22:06:19.52 QtzVIzSeM.net
忘れたけどListviewはスクロールいじれないからスクロールオフにして
ドックして自動でスクロールバーが出る状態にしてそれを操作したような気がする
192:デフォルトの名無しさん
22/07/05 22:14:55.12 QtzVIzSeM.net
それともドックさせないんだったかな
思い出せない
193:デフォルトの名無しさん
22/07/05 22:36:02.80 ZxZIsqP00.net
よくわからんものはスクロールバー付きのパネルの子として移動させる方が簡単だな
194:デフォルトの名無しさん
22/07/05 23:12:26.77 WZVvg+4D0.net
ListView、水平スクロール、ボタンに連携
俺頭悪いから何させたいのかわからない
195:デフォルトの名無しさん
22/07/06 06:01:09.15 VxYrHSBA0.net
"xxx.zip .exe" みたいなファイルみたいに
水平スクロールを大量に行うと右端のあたりにボタンがあって
そこで本来あるべき機能が動き出すようなプログラムを作りたい
196:デフォルトの名無しさん
22/07/06 07:31:13.08 WpD2OlXKM.net
>>189
ダブルクリックでは本来あるべき機能は動かないんだ?
197:デフォルトの名無しさん
22/07/06 08:01:33.86 uv1GiNSha.net
LVM_SCROLLをSendMessageすればいいみたいな事が書いてある
198:デフォルトの名無しさん
22/07/06 08:45:43.56 y1Ju9pb60.net
凝ったことやりたかったらFormsを捨てることから検討したほうが良いのでは?
アレは単純なUIを手早く作る用途に適しているけど、複雑なものを始めるとどうにもならなくなる
199:デフォルトの名無しさん
22/07/06 09:06:38.00 3wWvjztO0.net
>ListView、水平スクロール、ボタンに連携
>俺頭悪いから何させたいのかわからない
高解像度のPCだとListViewのスクロールバーが小さいので、スクロールバーは捨てて
ボタンを1回押すとちょうちょいスクロールするものを作りたかったです。
プロパティでスクロールを動かす量を設定出来たら実現できるかなと思い。
ListViewのスクロールを捨てて、デカくしたスクロールバーコントローラで
パネル内のListViewのスクロールも試してみたいと思います。
200:デフォルトの名無しさん (ラクッペペ MMc6-kTQg)
22/07/06 09:38:47 0uANHcdZM.net
横スクロールできるマウス買うのをオススメ
201:デフォルトの名無しさん
22/07/06 11:04:46.38 CbuaQ7gOa.net
>>193
ListViewの部分だけWPF使ったら?
202:デフォルトの名無しさん
22/07/06 13:03:45.15 4CR35PoR0.net
WinFormsでカスタムコントロールって手間かかりすぎて敬遠されるんよ
高解像度用にフォント大きくしたり、ボタンにアイコン画像つけたり、とかも
出来なくはないけどさ、そんなくだらない苦労背負うよりWPFで解決した方が早いっていう
203:デフォルトの名無しさん
22/07/06 15:11:19.50 mycuJuFy0.net
高解像度のPCがどうたらって
WinFormsのDPIスケーリング対応機能を有効にするんじゃ駄目なのかな
204:デフォルトの名無しさん
22/07/07 01:17:45.97 dLA6OOclM.net
タブレットだと高DPIだとWPFだろうがwinformだろうが表示される要素がそこそこ大きくなって
操作しにくい
ボタンなどが縦に10個並べてあったとしてタブレットで表示すると下のほうが押せない
205:デフォルトの名無しさん
22/07/07 01:19:41.15
206:dLA6OOclM.net
207:デフォルトの名無しさん
22/07/07 01:46:44.86 5sXFliwx0.net
コンパイル時に文字列変数へアプリのバージョンを埋め込む方法を教えてください
FileVersionInfo ver = FileVersionInfo.GetVersionInfo( System.Reflection.Assembly.GetExecutingAssembly().Location );
だとWindows上で動かすと取得できますが、Linux上だと例外になります。
代替案として、コンパイル時に外部ファイルから読み込んでしまおうと考えたのですが方法が分かりません
asp.net core6のWebアプリなので、プロジェクトファイル(.csproj)のPropertyGroupのFileVersionから取得したいです
208:デフォルトの名無しさん
22/07/07 07:09:20.40 7GcCJzBFM.net
コンパイル時?にできんだっけ?
209:デフォルトの名無しさん (ワッチョイ 1e2c-Pt+j)
22/07/07 08:45:46 gjoYu6DS0.net
Linuxってファイルにバージョンみたいなメタデータ持たせてんだっけ
AssemblyオブジェクトからGetCustomAttribute<AssemblyFileVersionAttribute>()すればいいんじゃない
GetExecutingAssembly()が失敗するならtypeof(適当なクラス).Assemblyで
210:デフォルトの名無しさん
22/07/07 10:43:10.21 HZWhR94l0.net
>>199
コンテンツが表示し切れなかったらスクロールするようにしとけば
211:デフォルトの名無しさん
22/07/08 01:18:26.52 2uhV5uBf0.net
grepとかした時に、static変数と、staticメソッドの見分けが簡単につかないのは言語的に欠陥だと思ってるんだけど、皆さんどう思います?
212:デフォルトの名無しさん
22/07/08 08:34:52.99 skMpW7pT0.net
Visual Studio内で完結するからgrep要らないだろ
Visual Studioなきゃ何もできない言語って意味では欠陥だらけだが
213:デフォルトの名無しさん
22/07/08 10:06:43.45 0Bd0SGWId.net
grep -E 'static[^=]+\('
214:デフォルトの名無しさん (オイコラミネオ MM0b-auNL)
22/07/08 11:15:41 N2+ntTX1M.net
static 変数
private static int _count = 0;
static メソッド
internal static void Call()
215:デフォルトの名無しさん (オイコラミネオ MM0b-auNL)
22/07/08 11:16:19 N2+ntTX1M.net
C#だとこのように簡単に見分けがつくけど一体どの言語の話をしてるんだろうか?
216:デフォルトの名無しさん (ワッチョイ a363-Cam1)
22/07/08 12:37:30 hiK9rTst0.net
世界線が違うのかねえ
217:デフォルトの名無しさん (ワッチョイ a363-Cam1)
22/07/08 12:42:53 hiK9rTst0.net
変数は名詞でメソッドは動詞にするのが一般的なのでreadみたいな一部の単語を除けば言語によらず問題にならんだろう
リーダブルコードとか読んできてよ
初心者なら
218:デフォルトの名無しさん (ブーイモ MMb6-1w7x)
22/07/08 12:48:48 OZjMTx6FM.net
煽って教えて欲しかったパターンやろ
219:デフォルトの名無しさん
22/07/08 14:31:59.45 2uhV5uBf0.net
internal とか void とか判別しやすい例出して、判別できるじゃんと言われてもなぁ
220:デフォルトの名無しさん
22/07/08 14:34:05.05 G/CdBPp1M.net
>>212
ガチ馬鹿なのかな?これでも見分けつかんか?
static 変数
static int _count = 0;
static メソッド
static void Call()
221:デフォルトの名無しさん
22/07/08 14:34:31.26 G/CdBPp1M.net
間違えた
static 変数
static int _count = 0;
static メソッド
static int Call()
222:デフォルトの名無しさん
22/07/08 14:35:03.78 3SGLIVmR0.net
>>212
どこ見てるんだよw
()の有無だろ
223:デフォルトの名無しさん
22/07/08 14:43:00.23 G/CdBPp1M.net
rustを使うと馬鹿になるんだよな
224:デフォルトの名無しさん
22/07/08 15:11:15.93 ejQ2E0qh0.net
頭の欠陥の方だったか
225:デフォルトの名無しさん (ワッチョイ 9ebb-rOZM)
22/07/08 16:42:05 AegC83dn0.net
新興言語では、急激にOOPとの結びつきが弱まっていて、代わりに特別な指向を持っていてさ
そっちを学習した後にOOPベースの言語に
226:戻ってくると、ほんと感覚が狂う
227:デフォルトの名無しさん (ワッチョイ 5301-bw8e)
22/07/08 16:43:39 PiqGkGWC0.net
OOPS
228:デフォルトの名無しさん (オイコラミネオ MM0b-auNL)
22/07/08 17:45:25 G/CdBPp1M.net
>>218
static変数か関数か区別できないって相当おかしいけど
229:デフォルトの名無しさん
22/07/08 19:59:03.56 lD1r+WGYM.net
>>212
話を続けたいなら、逆にどの言語のgrep-abilityが理想的だと感じるか教えてくれんか
何を求めてるかはっきりしないから、括弧の有無で分かるだろタワケ以上の回答は得られないように思う
230:デフォルトの名無しさん
22/07/08 22:39:50.35 AegC83dn0.net
>>220
そういや、大文字か小文字かってのもちょっと狂うね
まあそんな表面的な違いは大したことはないんだけど
231:デフォルトの名無しさん
22/07/10 08:41:58.66 Ofnz2Mf40.net
vb.netとc#はセットでコードを載せてるwebサイト多いから同じ言語だな
232:デフォルトの名無しさん
22/07/10 09:17:42.49 2lWNRyj/0.net
>>223
まだ言うか
233:デフォルトの名無しさん
22/07/10 09:41:35.46 dRGk1maa0.net
文の書き方に違いがあるだけで、使ってる語句は同じだ。
234:デフォルトの名無しさん (ワッチョイ 4d78-TkQT)
22/07/10 10:04:57 X/cjUhFp0.net
同じに見えるのは病気ですよ
235:デフォルトの名無しさん
22/07/10 18:53:49.82 K6zNp1si0.net
まーたこいつか
SNSにでも垂れ流してろ
236:デフォルトの名無しさん
22/07/10 22:22:55.10 wMqDENwq0.net
c#はc++を発展させた言語であるかのように欺いたvbである。
237:デフォルトの名無しさん
22/07/10 22:27:43.20 XBuHMFXV0.net
C# も VB.NET も .NET を人向けにプログラム言語にしたもの
238:デフォルトの名無しさん
22/07/10 23:21:25.85 za66V9r/0.net
同じマンまだおったんか
239:デフォルトの名無しさん
22/07/11 00:28:27.54 CCGmUSBS0.net
いずれC#も廃れるだろうが、みんなVBおじさんみたいにはならんようにしような
240:デフォルトの名無しさん
22/07/11 01:27:39.35 HIY5g3Yw0.net
ここは人格攻撃をする場と思ってんのか
241:デフォルトの名無しさん
22/07/11 05:54:55.27 L4tB3bvp0.net
VBの事を騙るスレでは無いな
242:デフォルトの名無しさん
22/07/11 06:46:54.81 GGvKul+ur.net
実際、c#って人気ないからな
人気はあるのかもしれないが使われていない
大規模システムはほぼJavaだし
簡単なWinFormくらいだろう
有名なシステムでこれといってc#が使われているということを聞いたことがない
243:デフォルトの名無しさん
22/07/11 07:48:56.03 iksZ9aQE0.net
いきなり2行で矛盾やめろw
244:デフォルトの名無しさん (ワッチョイ a37c-TkQT)
22/07/11 10:01:05 lOE9m3Ds0.net
wwww
まぁ、Unityが無ければそこまで覚えたいと思えるものではないかもな
今だとWindowsアプリ作ったりする人も減ってるだろうし
サーバーサイドでの採用率も低そうだし
245:デフォルトの名無しさん
22/07/11 10:35:46.98 1W23UOpta.net
それなりに使われてるが
どうせ下請け孫請けなので
守秘義務で外に出て来ないだけ
246:デフォルトの名無しさん (ワッチョイ d501-wywk)
22/07/11 11:55:44 5PTk/FF60.net
C#で作成したライブラリを他者に使われないようにする方法はありますか?
難読化しても呼び出すクラスやメソッドが分かれば、利用する事ができてしまうものでしょうか?
247:デフォルトの名無しさん (テテンテンテン MMcb-KNsQ)
22/07/11 12:12:35 Mu0Fq/b9M.net
難読化ってどこまでやってくれんだろうね
引数の数もメソッド名もぐちゃぐちゃにするなら、不可能では無いにせよ現実的に難しいと思うけど
248:デフォルトの名無しさん
22/07/11 12:28:05.13 Mu0Fq/b9M.net
クラス名や引数そのままなら、普通に推測は出来てしまうと思う
どうしてもってなら、アクティベーションみたいなネットワーク認証しないと使えない仕組み入れるしかない
249:デフォルトの名無しさん
22/07/11 12:30:30.12 +1/8CWP60.net
>>238
難読化でライブラリの中のコードが見れないように出来ても、公開しているものを隠すのは無理じゃないか
仮に隠せたら、自分でも利用できないってことに
250:デフォルトの名無しさん
22/07/11 12:57:01.67 dmn56bqZ0.net
>>239
自分のソフトを自分で逆コンパイルしてみればわかるよ
251:デフォルトの名無しさん
22/07/11 15:59:29.22 o+Vp/fL50.net
>>238
具体的に環境(.NET Core、.NET Framework、Unity…)や制限したい部分にも依るかねぇ?
外部からの参照方法によってはクラスやメソッド名まで変えられはしないだろうし
単にクラスライブラリとして露出させたくなければ共有プロジェクトにする方法も有るけど
Frameworkの単体EXEへ出来ればMatcode comPRESSerでも簡易的にデコンパイル阻止とか
netshrinkとかはDLLもバインドできて…難読化だけよりこういった包括的パッカー向き?
いずれにしても解析を完全阻止するのは不可能であるから、どこら辺を及第点とするか
252:デフォルトの名無しさん
22/07/11 17:53:50.74 d1RSnGBRM.net
もう見られたくない処理だけc++で書いてモジュールキックとかでいいんじゃないかな?
253:デフォルトの名無しさん
22/07/11 18:08:22.09 Gc8t7u3Xr.net
JavaオワコンでC#がそろそろ来る
254:デフォルトの名無しさん
22/07/11 19:02:02.38 5PTk/FF60.net
>>241
そですよね
>>243のような方法か.NET7のネイティブコンパイラに期待するか、
>>240, 244のように.NET以外で何らかの認証をするくらいしかないようですね
255:デフォルトの名無しさん
22/07/12 07:42:04.63 d+D22Oihr.net
>>245
もう10年以上そう言われてるが一向にJavaがオワコンにならずc#がオワコンしてる
256:デフォルトの名無しさん
22/07/12 08:10:19.93 cwVe/GJo0.net
URLリンク(redmonk.com)
未だにJava3位なんだな
今どこで使われてんの
257:デフォルトの名無しさん
22/07/12 08:12:48.62 xes6G2QHp.net
JavaパイセンはもうCOBOLの域に入ってるやろ
258:デフォルトの名無しさん
22/07/12 08:13:01.75 I1ttMvVed.net
サーバーサイド
C#も今ではほとんどがサーバーサイド
259:デフォルトの名無しさん
22/07/12 08:22:48.21 O8wzjFzNa.net
>>250
サーバーサイドで使われているか?
260:デフォルトの名無しさん
22/07/12 08:28:10.27 KuQV4+SIa.net
10年前はともかくOracleの有料化のインパクトはでかかったからな
新規案件は壊滅したわ
261:デフォルトの名無しさん
22/07/12 09:46:46.14 w0UtJt4u0.net
Javaは単価安いし
262:デフォルトの名無しさん
22/07/12 10:26:31.62 Sm3tO535a.net
トラブル繰り返してる某みずほ金融なんかは Java ? COBOL ?
263:デフォルトの名無しさん (ワッチョイ bd49-ezAM)
22/07/12 10:52:02 bC3C9A550.net
金融とかの規模で言語統一なんて無理やろ
メインフレームは減ったらしいけど、サーバーなんかは数百以上の規模であるんやないか?
264:デフォルトの名無しさん (ワッチョイ d501-TkQT)
22/07/12 11:05:26 7D6kUfzj0.net
同一規格のサーバーで数千台展開したあとに不具合見つかってどうしようもなくなった某国営企業とかあったから
あまり統一しまくってもいいことないよ
265:デフォルトの名無しさん
22/07/12 11:58:30.45 O8wzjFzNa.net
JavaはCOBOLの置き換え案件で多いな
266:デフォルトの名無しさん
22/07/12 13:29:14.03 UDBx8Sz50.net
YouTube で有名な雑食系エンジニア・KENTA の、
月千円の初心者向けRuby on Rails サロンには、日本6位の3千人が入っている。
(1位は、キングコング西野の数万人)
そのKENTAの天敵が、SES のモロー
2年前のモローの主張は、KENTAがRailsを勧める理由は、
ポートフォリオ制作を長引かせて、サロンで儲けるためであり、
Railsはオワコンで、転職には、PHP, Java を推奨していた
【2022年版】Ruby on Railsの将来性
ところが、モローのYouTube のこの動画では、
日本ではRailsが主流なので、Railsのキャリア相談などをやっているw
PHP, JavaのSES案件は、どうなったの?w
267:デフォルトの名無しさん (ワッチョイ 856e-lTRq)
22/07/12 19:27:59 OqOLXv5J0.net
winformsってまだまだ現役なの?いろんな現場行くとあれもこれもwinformsでせめてwpf使おうぜ……って思うんですが
そもそもデスクトップアプリってもう死に体じゃないんですかね。そんな仕事まだいっぱいある気がする
268:デフォルトの名無しさん
22/07/12 20:10:31.06 cwVe/GJo0.net
君がWPFの開発手法を広めればいいんじゃないかな
業務用アプリだと見た目大してこだわらないとこ多いし
慣れてる人多いWinFormでってなりがち
269:デフォルトの名無しさん (アウグロ MMa9-qjp3)
22/07/12 21:05:38 INSzBWFiM.net
なんかWPFは普通に組むのもままならない感じ
270:デフォルトの名無しさん
22/07/12 21:27:40.52 cwVe/GJo0.net
個人開発で自分一人で作るなら何使っても構わんけど
会社だと引継ぎも考えないといけないから中々そうもいかん
新しい技術導入しようとするなら、現状よりメリットあるのを上に説明して
軌道乗るまで全部自分が面倒見るくらいの気概がないとやれない
271:デフォルトの名無しさん
22/07/12 22:06:12.97 xb5/kh2z0.net
新しく入ってきたメンバーがFormsしか使ったことがないとかそもそもC#知らないとか
そういうのがないわけではないし、そういう場合は教育するわな。
272:デフォルトの名無しさん
22/07/12 22:37:57.38 7D6kUfzj0.net
>>259
wpfのメリットって何かあるの?
273:デフォルトの名無しさん
22/07/12 23:00:05.49 c+hHR+kn0.net
かっちょええ画面が作れる
274:デフォルトの名無しさん
22/07/12 23:04:53.21 w0UtJt4u0.net
pant.net はform で作られている。後は判るな?
275:デフォルトの名無しさん
22/07/12 23:17:33.70 LCOK+7zxp.net
でもMS内製のPIXはWPFだし
276:デフォルトの名無しさん
22/07/12 23:19:17.64 OqOLXv5J0.net
画面レイアウトが崩れないのは本当に大きい
というかUIをXMLの形で読めるという最大のメリットがある
277:デフォルトの名無しさん
22/07/12 23:25:28.09 6tTlbHbB0.net
WPFはネイティブコンパイルできれば化けると思う
はよせい
278:デフォルトの名無しさん
22/07/12 23:33:27.23 w0UtJt4u0.net
PintaはGTK#で作られている。後は判るな?
279:デフォルトの名無しさん
22/07/12 23:42:10.05 GM5H0U27p.net
でもMS製のMSIX Packaging ToolはWPFだし
280:デフォルトの名無しさん
22/07/13 00:08:28.23 Pn4iWwXT0.net
たまに居ますね Winformsに親を殺された人
281:デフォルトの名無しさん
22/07/13 00:16:22.28 UzSTT+o30.net
Winformsに母屋を取られた人が最近も誰かに発泡酒してたからね
282:デフォルトの名無しさん
22/07/13 02:56:59.27 dyEYJovX0.net
>>264
Winformと比較しての話だけど、
コントロールを何でも入れ子にできる
リサイズに追従したUIが簡単
UIの見た目のカスタマイズが簡単
高dpiモニタ対応が簡単
gitで管理しやすい
あたりがメリットかと
逆にこれらがいらないならWinformでもいい
283:デフォルトの名無しさん
22/07/13 06:49:24.41 tapB8dwS0.net
WPFの欠点
284:は素だと面倒臭すぎるから 何らかのツールキットを使う事になる点 で、どれを使うのという争いが始まる
285:デフォルトの名無しさん
22/07/13 10:38:20.60 KXEqytHsr.net
WinUI 3のこともたまには思い出してあげてくださいね
286:デフォルトの名無しさん
22/07/13 11:09:56.32 PcPKVcW10.net
リリースされたんだっけ?
287:デフォルトの名無しさん
22/07/13 12:41:53.51 0lUZ9jOo0.net
ベータを脱却してから教えてくれ
288:デフォルトの名無しさん
22/07/13 12:44:29.98 xT0Do9A+0.net
MAUI…
289:デフォルトの名無しさん
22/07/13 13:54:06.66 9C8kcpqG0.net
UWP・・・
290:デフォルトの名無しさん
22/07/13 15:36:04.89 Vti+UkSh0.net
まうい!
291:デフォルトの名無しさん
22/07/13 18:27:42.42 n1OVHpGm0.net
うぃにゅい!
292:デフォルトの名無しさん
22/07/13 20:30:31.03 ng/P0rRL0.net
高dpi対応とかってフレームワーク変える程の事なの
293:デフォルトの名無しさん
22/07/13 20:53:16.22 dyEYJovX0.net
>>283
WinformからWPFのことなら、フレームワーク変えるまでもない
お互いに入れ子にできるしな
294:デフォルトの名無しさん
22/07/14 12:36:38.90 LJpGcg2yM.net
WEBアプリ作ってwebviewで表示。
295:デフォルトの名無しさん
22/07/14 16:21:18.28 byMNg0Sy0.net
せめてwebview2にして
296:デフォルトの名無しさん
22/07/15 00:51:54.21 lF4sBNwn0.net
webviewとかになると別にC#で作る必要無いんだよねぇ・・・
297:デフォルトの名無しさん
22/07/15 13:25:44.04 Wgy0KDmed.net
>>284
でもWPFて専用ツール要るんでしょ?
winformの一部だけWPFにしてる例って示せる?
298:デフォルトの名無しさん
22/07/15 13:40:19.64 laDvzGYl0.net
WPFってUI部分をxamlで書いて中身をC#って感じだからWinFormから簡単に以降できるでしょ…
299:デフォルトの名無しさん
22/07/15 13:43:28.52 w1A0sfi20.net
>>288
専用ツールは要らない
VSだけで良い
300:デフォルトの名無しさん
22/07/15 14:35:32.64 8JvUuYmY0.net
blender わい無能け?
301:デフォルトの名無しさん
22/07/15 15:11:28.33 oyGbt8u5a.net
>>288
専用ツールは必要ないよ
例はelementhostでググるといろいろ出てくるよ
302:デフォルトの名無しさん
22/07/15 15:40:36.99 l4dzAa6fa.net
>>289
WPFにはこの距離感で正解だろうね
303:デフォルトの名無しさん
22/07/15 20:59:06.88 xUkWxi720.net
winformならdatasetで決まりだけど
wpfなら何使えばいい?
304:デフォルトの名無しさん
22/07/15 21:02:37.56 NwjizpFI0.net
datasetが使いたいのならwpfででも使ったらいいんでないの?
なにをききたいんかよく分らん
305:デフォルトの名無しさん
22/07/15 22:17:23.22 tP5MISnn0.net
現場入ったらDAOなるSQL文字列や接続処理を大量にぶちこんだ数千行の巨大クラス経由でデータベースにアクセスするシステムだったんですがこれはC#でも普通のことなんでしょうか
検索したらjavaの例ばっかだったのであまり一般的ではないのかなと。もしそうならC#ではどういうふうにするのが一般的ですか?
306:デフォルトの名無しさん
22/07/15 22:51:43.52 8JvUuYmY0.net
LINQ to SQL
307:デフォルトの名無しさん (ワッチョイ a301-BBl9)
22/07/15 23:47:25 IXEhYVNJ0.net
>>296
RepositoryをEntity Framework使って実装するのが一般的だと思う
各リポジトリは数千行とかには普通ならない
308:デフォルトの名無しさん (ワッチョイ f6bb-qysg)
22/07/16 07:10:20 QBuuK8Ob0.net
>>296
現場の設計者がアホなだけ
自分で読んでみてそのクラスの機能が必要充分か一回確認してみれば
309:デフォルトの名無しさん
22/07/16 09:42:56.36 e0GJPcDwM.net
DataAdapter使ってORマッピングやバリデーションをベタ書きでやってれば1つの処理だけで数百行にはなるから
古いシステムならそこまで稀有な例ってわけでも無いと思う
310:デフォルトの名無しさん
22/07/16 12:13:59.25 v3eAMl7Q0.net
あーやっぱり今はentity framewokですか。そっちは使ったことあったんですが
例えば1処理でかくなったら関数を抽出するとか、各処理の共通部分をやっぱり関数にまとめるとか、そういうことはしないもんなんですかね
311:デフォルトの名無しさん
22/07/16 13:34:39.24 OINdK0ey0.net
SQL自分で書きたいマンならDapperがよさげ
312:デフォルトの名無しさん
22/07/16 14:51:32.70 QBuuK8Ob0.net
>>301
普通はすると思うけど仕事だと下手に既存コード弄ってリスク増やしたくないんだろ
テスト工数も増えるし
313:デフォルトの名無しさん
22/07/16 15:54:38.42 qXcuC04/M.net
SIの開発は一気に組み上げて一発動いたらあとは保守部隊に引き継いで終わりだから、継続的に手を入れていくようなことはそもそも想定されてないの
また、初期開発は請負契約で運用保守は準委任契約である場合が多いため、
初期開発はなるべく手を抜いておいて負債を運用保守に押し付けたほうが儲かるという構造的な欠陥がある
314:デフォルトの名無しさん
22/07/16 16:54:10.22 4LgQTAiH0.net
ゲーム作ってんだけどテキストファイルで間に合ってるんだがSQLなんて本当に必要なの?
なんかかっこいいから使ってるとしか思えん
315:デフォルトの名無しさん
22/07/16 17:50:03.59 J14KlJd8d.net
>>301
いや、entityはむしろ使わない
316:デフォルトの名無しさん
22/07/16 18:10:22.69 RR+kpv810.net
なんだかんだdapperばっかりやわ
317:デフォルトの名無しさん
22/07/16 20:52:07.85 Nb4vyBV3M.net
もう全然DB使わなくなった
使い道が自分にはない
jsonで大体事足りる
318:デフォルトの名無しさん
22/07/16 21:18:54.87 eZm0P5Ef0.net
業務システムをDB使わずに組んだら死ねる
319:デフォルトの名無しさん
22/07/16 22:56:48.44 OINdK0ey0.net
DB使わずに済むような規模のシステムだけ開発してりゃいいなら楽やろな
320:デフォルトの名無しさん (アウアウウー Sa39-flVQ)
22/07/16 23:13:14 5hVjLW07a.net
なんかDB使うのがすげーとか思ってる奴がいるなw
321:デフォルトの名無しさん (ワッチョイ 6102-Vb2/)
22/07/16 23:13:58 OINdK0ey0.net
DBの役割を知らない馬鹿は別に使わなくていいと思うよw
322:デフォルトの名無しさん (アウアウウー Sa39-flVQ)
22/07/16 23:16:27 PZXE3zO/a.net
DBの役割とか言い出したw
323:デフォルトの名無しさん (オイコラミネオ MMad-GsVe)
22/07/16 23:19:22 Nb4vyBV3M.net
割獄さん!
324:デフォルトの名無しさん (ワッチョイ 762c-lpz1)
22/07/16 23:19:56 2WLM14wy0.net
Ruby on Rails では、100% データベースとActive Record と言う、O/R マッパーを使う
325:デフォルトの名無しさん (オイコラミネオ MMad-GsVe)
22/07/16 23:21:25 Nb4vyBV3M.net
お前も管理職にならないか?
326:デフォルトの名無しさん
22/07/17 02:17:02.00 3rxTO6dh0.net
ふと思ったんですがC#なんかやっててもwindowsformとかの仕事が降ってくるばかりでいつまで経っても時代遅れな雰囲気から抜けられない感じですか?
なんとなーくC#の案件が続いてその流れになっちゃってるんですが、なんか方向性を間違ったような気がします
デスクトップアプリはもう斜陽なんて言われてるのにそんなことばかりやってる自分が嫌になっています
327:デフォルトの名無しさん
22/07/17 02:36:33.68 TvncEQ/d0.net
構造体は値型(スタック)なのでnewしてもGCは動かないので、
純粋にコンストラクタの初期化分のCPUコストがかかる認識でいいですよね?
328:デフォルトの名無しさん
22/07/17 03:03:37.04 9EQc+RYe0.net
>>317
ML.NET 使うような仕事にありつけないのは
本人の努力不足(`_´)
マ板に行って傷口舐め合って来たまえ
329:デフォルトの名無しさん
22/07/17 07:20:35.53 mehD60UK0.net
言語に関わらず、個人事業者やそれに毛が生えた会社に来る仕事なんて限られてるんじゃないのか?
330:デフォルトの名無しさん (ワッチョイ fa87-GsVe)
22/07/17 08:36:44 LHtPuDrX0.net
>>304
だよな
331:。 俺は途中からパッケージ開発に移ったんだが長い人はいいんだけど 最近入ってくる人はだいたい作り逃げ前提の糞バグだらけで保守性皆無の ゴミコード量産されて本当に困ってる でもSIの開発で作り逃げしかやってこなかった人たちってこうなるの自然なんだよな コピペだろうが自分が理解していなかろうが作って逃げればあとは知らんという
332:デフォルトの名無しさん
22/07/17 10:37:04.13 y0CsF7TYM.net
逆に考えたらオリンピックレベルの技能と努力を強いられず
生活ができるなんて幸せじゃん
30歳で引退みたいなアスリートレベルの世界に行きたいですか?
333:デフォルトの名無しさん
22/07/17 10:38:34.95 y0CsF7TYM.net
医者なんて凡ミス誤診しても患者が死んじゃったりするから
そんなに責任の重い仕事やりたいですか?
そんな強メンタルなんですか?あなたたちは?
334:デフォルトの名無しさん
22/07/17 11:40:04.58 3rxTO6dh0.net
>>320
C#の問題じゃなくてSESにいることが問題だったか……
335:デフォルトの名無しさん
22/07/17 14:02:58.20 885G8LEt0.net
Windows のシステム自体がない
今のシステムは、Docker が100% で、DockerはLinuxだけの技術。
大手は、Kubernetes でオーケストレーションする
一応、AWS Lambda のデフォルト言語に、C#, PowerShell は採用されているけど、
これで開発する人は少なそう。
たぶん、可読性の高い、Ruby で書く香具師が多そう
Java, Go,
Node.js, Python, Ruby,
C#, PowerShell
Goも採用されているけど、PHPは採用されていない。
たぶん、PHPはコーダー扱いで、プロとはみなされていない
Rust, Elixir も採用されていない
336:デフォルトの名無しさん
22/07/17 14:51:28.32 3yDcxDBnr.net
あわしろを召喚しちまうから、Linuxの話題はやめとけ。
337:デフォルトの名無しさん
22/07/17 15:17:19.36 QiBhjgara.net
>>323
SEなんて凡ミス埋バグしてもDATAが飛んじゃったりするから
そんなに責任の重い仕事やりたいですか?
そんな強メンタルなんですか?あなたたちは?
338:デフォルトの名無しさん
22/07/17 15:42:29.27 4FAeL+DS0.net
>>325
嘘ばっか
339:デフォルトの名無しさん
22/07/17 15:55:15.25 fvxh8ZLF0.net
仕事は仕事として粛々とやりゃええやん
やりたいことは趣味プログラミングで
340:デフォルトの名無しさん
22/07/17 16:08:59.03 eihDCF0Fa.net
>>328
相手すんなよ...
341:325
22/07/17 16:59:42.02 885G8LEt0.net
YouTube で有名な雑食系エンジニア・KENTA のRuby on Rails サロンは月千円で、
日本6位の3千人が入っている。1位はキングコング西野の数万人
KENTAの天敵がSES のモローで、
2年前は、Railsはオワコンで、KENTAがRailsを勧めるのは、
ポートフォリオ制作で、サロンの滞在を長引かせて儲けるためで、
Java, PHP の方が稼げると勧めていた
【2022年版】Ruby on Railsの将来性
ところが最近の、YouTube のこの動画では、
Rails一色で、キャリア相談まで始めたw
Java, PHPのSESは、どうなった?w
一方、KENTAはPHP, Scala をオワコン認定したから、
Laravel を使っているZOZO や、Scalaを使っているTwitter などは大変。
まともな開発者が集まらない
342:デフォルトの名無しさん
22/07/17 17:28:50.00 ByZDr6EM0.net
気持ち悪すぎワロタ
343:デフォルトの名無しさん
22/07/17 21:15:05.74 V9ww3jje0.net
こういう同じ内容を何度もコピペするのって、電車の中で車掌さんのモノマネしてる人と同じようなものらしい
344:デフォルトの名無しさん
22/07/17 21:47:03.84 ZrZAFIJX0.net
そんな表現せんでも知能ボーダーか発達だろうってことくらいわかるわ
345:デフォルトの名無しさん
22/07/17 23:20:39.17 3rxTO6dh0.net
仕事は仕事って割り切れる人強いなと思う。こんな長い時間かけるものがつまらないって辛いし、
やってることが有意義かどうか、将来性があるのかどうか、そういうこと全部考えちゃう。今どきC#でデスクトップアプリなんか作ってるともうね……いやC#という言語はバランス取れてて大好きなんだけど
ウェブの話なんか見ててもjavascript全盛って感じでASP.NETの話題なんてぜんぜん出て来ないし
346:デフォルトの名無しさん
22/07/17 23:25:54.07 ByZDr6EM0.net
ウェブなんか金になんねーからやめとけって言ってるだろ
347:デフォルトの名無しさん
22/07/17 23:35:41.92 ByZDr6EM0.net
足が早い業界ってのはいいことばかりじゃないぞ
ウェブ系ってのは1年後には使ってるライブラリがゴミになるから
設計やらドキュメントを書く能力ってのがつかない
その環境で育つと今度大手から比較的しっかりしたアプリの改修依頼なんて請けても全く何の役にも立たずに終わる
せっかく大きな仕事もらったのにね
クソみたいなアプリをベンチャーで組み続けるのはオススメできない
クソにいるとクソに染まる
なぜ外注に出すか?
そりゃ自社の社員にやらせたくねーゴミ仕事だからさおk?
348:デフォルトの名無しさん
22/07/17 23:49:55.40 ByZDr6EM0.net
お前のプログラムは
工場のロボットアームを動かすか?
病院の医療機器を動かすか?
空港の飛行機を飛ばすか?
ダムの水門を開くか?
防災装置を動かすか?
街に警報を鳴らすか?
電車の運行管理をするか?
精密部品のレーザー加工ができるか?
半導体を作れるか?
本やお札を印刷するか?
お前のプログラムは世界を動かしているか?
こういう仕事に関われないと
結局世の中に必要ないってことなんだぜ
それを忘れるなよ
その現場では最新技術なんて使われてはいないんだ
349:デフォルトの名無しさん
22/07/17 23:58:52.02 anUNIeB80.net
気持ち悪すぎワロタ
350:デフォルトの名無しさん
22/07/18 00:00:01.14 PCxCS/eQ0.net
言いたいことはわからんでもない
一時期は組み込みや制御系と比べて帳票出したり画面に明細表示するような仕事が同等とは思えなかった
最近は餅は餅屋だと割り切って目の前の仕事に集中するように切り替えたけど
351:デフォルトの名無しさん
22/07/18 00:12:21.41 /clcF0nA0.net
>>335について言えば
失礼だけど>>259以降のレス見る限りIT土方続けたほうがいい人材に見える
今時DAOベースのシステムが普通かどうかとか質問してる時点でロクに勉強してないのが分かるし
デスクトップアプリはどうたらぐちぐち言ってるが
その状態でWeb系行ったところで誰でもできる仕事しか任してもらえず同じことにしかならんよ
面白い仕事がしたいならまず技術を身につけろ
352:デフォルトの名無しさん
22/07/18 00:12:53.45 WqaevNOB0.net
>>こういう仕事に関われないと
>>結局世の中に必要ないってことなんだぜ
なんという選民思考だ
そもそも仕事として存在するなら誰かが必要としたってことだぞ
353:デフォルトの名無しさん (ワッチョイ f6bb-qysg)
22/07/18 00:48:13 J/WuRN6s0.net
>>335
黙々と目の前の仕事こなして生活の金貰えてりゃそれでいいんじゃねーの?
デスクトップアプリ作って金になるんならそれでいいだろ
現状に満足できないならここでうだうだ曖昧なこと言ってないでとっとと勉強して転職でもしろよ
つまらない仕事が辛いってのは同意だけど今のお前に何が出来るの?