◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:ふらっと C#,C♯,C#(初心者用) Part153 ->画像>3枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1639403601/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980 を踏んだ人は新スレを建てて下さい。
>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part152
http://2chb.net/r/tech/1629888256/ ■関連スレ
C#, C♯, C#相談室 Part94
http://2chb.net/r/tech/1553075856/ ■コードを貼る場合は↓を使いましょう。
https://ideone.com/ https://dotnetfiddle.net/ ■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries/ https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/ https://docs.microsoft.com/en-us/dotnet/standard/class-libraries/ https://referencesource.microsoft.com/ https://source.dot.net/ ・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html ・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
stringデータの容量を小さくしてソフトのAPIに送りたいのですが APIの都合でstringのまま送らなければならない場合、 これ以上容量を小さくする手段はありませんか? 圧縮したバイナリデータをどうにか送信できないかと調べたのですが無理そうで……。
何らかの方法で圧縮できたとして 受け取る方のソフトは圧縮されたデータを伸長できるの?
>>3 圧縮して送りたいのはただのセーブデータなのですが、
サーバー側の保存形式がstringを使ったkeyValueで作られているので文字列形式でしか保存できないみたいで。
保存しておいた文字列をこちらで読み込んでからデコードすればいいのでstringのまま圧縮できればよくて、
どうせ日本語までしか扱わないデータなのでSHIFT-JISをutf-8で圧縮……みたいなことができれば理想なのですが
そんなピンポイントなのあったりしませんよね、と……。
>>4 解釈があってるかはわからないのですが、
一応圧縮したバイナリデータをBase64でConvertみたいなことは試してみたものの
容量を減らすという目的ではむしろ文字数が増えてしまって。
何か手段がないかなあと思っている次第です。
使用できる文字に番号振って 圧縮したバイナリを文字に割当る いわゆる復活の呪文方式 文字が足らなければ32bitsバイナリを31bitsにずらしていくなど工夫してみな
>>5 の文章はユニコード(utf16)で720バイト、ユニコード(utf8)で921バイト
>>5 の文章をzip圧縮したらバイナリで678バイト。その圧縮バイナリを2文字ずつ(utf8)にしたら2倍の1356バイト(圧縮したらバイト数が増えた)
でも前スレ(utf16で348,236バイト)を圧縮したらバイナリ104,639バイト、圧縮utf8で209,278バイト。圧縮したバイナリをテキストにしたほうが小さい
送りたいデータ次第じゃ一度圧縮してから無理やりテキストにした方が容量小さくなるから
どっちが有利か生と圧縮を自動選択しながら送る手もある
通常のデータ圧縮は8ビットフルに使うので、 そのままでは難しいのでuuと組み合わせて作ったら?
UTF-8でバイナリ化してdeflate圧縮してBase64化した後2文字ずつを1つのcharに詰める まあ基本ライブラリで手軽にやるならこんな感じじゃない?
7zかなにか圧縮率の高い奴で圧縮しておいてbasE91だな。
http://base91.sourceforge.net/ 圧縮することによっぽどのメリットがないと無駄にややこしくなるだけだぞ サーバー側が必要に応じて圧縮するのが筋かと UTF-8に変換して送信とか脆弱性の問題もあってサーバー側で禁止してることもある
皆さんありがとうございます! Base64化したものを自分でさらに詰めるというのは思いつきませんでした……なるほど……。
BasE91もまさに机上論こねくり回してるときに欲しかったものの気配がするので中身覗いて調べてみます!
>>11 こちらは利用する側なのでサーバーの仕様を変える事はできず、
用意されたフォーマット(これが文字列形式での送信)従うしかないやつですね。
ユーザー毎に使用可能なデータの容量が決められていて(しかもそれがやたら少ない)、
少しでも軽減するためにこちら側でデータを小さくできないかと画策しています。
ビットマップ間で部分的に画像コピーするのはDrawImageでできますが コピーする際に左右を反転してコピーする方法はないでしょうか? 検索でビットマップ全体をまるごと反転する表示はたくさん出てくるのですが DrawImageの部分コピーで反転するのは見当たらないのです
g.ScaleTransform(-1, 1) 描き出す先の座標も反転するから座標指定注意
DrawImageに渡すWidthやHeightを負の数にするだけで反対向きに描画するよ
LinuxでC#でソフト作りたいのですが .Net 6とmonoは同じものでしょうか?
ありがとうございます .Net 6をインストールしました
private void Form1_KeyDown(object sender, KeyEventArgs e) { keyCode = (int)e.KeyCode; } public void button1_Click(object sender, EventArgs e) { button1.Visible = false; anThread(); // ここをtest();に変えると直接実行になる } private void anThread() { Task task = Task.Run(() => { test(); } } private void test() { int dt; while (true) { if (keyCode!=0) { dt = keyCode; // ここにブレークポイントを置く キーが押されると止まる return; } Thread.Sleep(10); } }
このプログラムbutton1押しで開始して、キーが押されるとループ中のブレークポイントで止まるものなんですが これで一般文字キーを押すとちゃんとブレークポイントで止まりkeyCodeが確認できます Enterキーを押した場合はなぜか止まりません anThread();のように別スレッドから動かさずに直接test();で呼ぶと 一般文字キーもEnterキーの時も止まりkeyCode 13が確認できます 別スレッドで動かした時に、Enterキーの時だけForm1_KeyDownさえ呼ばれなくなるのは どうしてでしょうか?
直接呼びで停まる? 直接呼ぶと無限ループに入って、keycode変数が変化しないから(代入が行われるのはループの外だから代入が起きない) ブレークポイントに入ることもないんじゃないかな? ここに書き込む過程でコードを書き換えたなら、そこで略した部分に問題ありそう
いえ止まるというのはブレークポイントで止まるので正常に機能しているということです 直接呼びの時はEnterキーでもkeycode変数が変化するのです(正常) 別スレッド呼びにした時にEnterキーだけ変化しないようになります 文字キーは変化します button1にEnterキーが吸収されてるのではないかと思い button1.Visible = false; button1.Enabled = false; さらにForm1.KeyPreview=true; としたのですが、結果は変わりませんでした
デバッグ開始する ボタン押す enter以外のキーを押す=止まる 再開する enterを押す=止まらない って順番ということ?それならreturnで抜けてるから デバッグ開始する ボタン押す enterを押す=止まらない enter以外のキーを押す=止まる って順番ということ?
そうですね、デバッグ実行は毎回やりなおしてますが enterを押す=止まらない ここのところですね問題は Enterキー故に何かわからないですがviewのどれかに吸収されてるんではとも考えられるんです
inr fs; public void button1_Click(object sender, EventArgs e) { if (fs==0) { button1.Visible = false; button1.Enabled = false; anThread(); // ここをtest();に変えると直接実行になる } fs=1; }
もっとボタンのとこ具体的にかくと上のようにして一度しかtest()呼ばれないようにしてます
なら KeyPreview=true; protected override bool ProcessDialogKey(Keys keyData) { return false; } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); }
おおEnterキーでもブレークポイントで止まるようになりました ありがとうございます
Formに配置したbuttonがEnterキーの制御を奪うから その前にFormでキーを取得したいならPreviewKeyDownイベントを使う
docs.microsoft.com/ja-jp/dotnet/api にバージョンとかあって.NET 6とか選択するじゃないですか? これって、どれを選べばいいのでしょうか? 自分のPCにどの.NET入ってるか調べる方法はありますでしょうか? よよろしくおねがいします。
自分のPCではなくユーザーの環境を考えて選ぼう Windows2000なら2.0 WindowsXPなら4.0までしか使えない
Environment.Versionだと6.0.0 RuntimeEnvironment.GetSystemVersionだとv4.0.30319でした
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription だと.NET 6.0.0-rtm.21522.10でした
clrver.exeだと、こう PS C:\Users\a\source\repos> clrver.exe Microsoft (R) .NET CLR Version Tool Version 4.8.3928.0 Copyright (c) Microsoft Corporation. All rights reserved. Versions installed on the machine: v2.0.50727 v4.0.30319
Xamarinって流行ったか?つまりそういうことだ
mauiも期待はしてるけどいつも通りなんだろうなあ。。
マルチプラットフォームっていう目的での利用は流行らないだろうな でも普通にGUIアプリ作る一手段としては使われるんじゃないかな
>>44 おっ、.NET Core + Linux いいね
これからMSワールドの外へ出てみたら実感すると思うけど、MSスタックは全部MSで揃えて他には見向きもしなくていい状態にこそ意義があるんだよ いったん外にはみ出し始めちゃって歯車が狂うとたちまち不便なところばかりが目につくようになって、気がついたらMS成分は跡形も残らない、という結果になるのがオチだ MSスタックをディスるつもりはなくて、これはむしろ最大限の賛辞だ
>>47 linuxはコミュニティによってサポートされます
C:\Users\a>dotnet --info
.NET SDK (global.json を反映):
Version: 6.0.100
Commit: 9e8b04bbff
ランタイム環境:
OS Name: Windows
OS Version: 10.0.19042
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\6.0.100\
Host (useful for support):
Version: 6.0.0
Commit: 4822e3c3aa
.NET SDKs installed:
6.0.100 [C:\Program Files\dotnet\sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
To install additional .NET runtimes or SDKs:
https://aka.ms/dotnet-download c#を勉強しはじめたのですが、メモリ関連でヒープとスタックというのがあるのを知りました。 で、C#で型がstaticのデータはヒープ領域に格納されるのですか?それともスタック領域に格納されるのですか?
スタックって日常でも使うことあるけど、積み重ねるって意味だからな 積み重ねちゃってるから下にあるものを無理に取り出そうとすると崩れてぐちゃぐちゃになる だから下にあるデータは上にあるのがなくなるまで取り出せない データは上下関係なく好きなところにあるデータにアクセスしたいものだからスタックにはしない=ヒープ でもスタックとかヒープとか覚えなくていいよ C#のテスト問題にそんなのが出たら「もっとまともな問題出せ」って回答用紙に書いときゃいいし C#の本やサイトにそんなのが出てるなら投げ捨てときゃいい
メモリの確保と開放って元々C言語の概念だったよね Javaではなくなったようだけど
メモリを確保するのはアセンブラでもそうだよ。開放するのは動的に使うってことだよ。 スタックはCPUの基本機能、ハードで実装、提供されてるものだよ。だから高速。 SPレジスタ書き換えるだけだからね。速いコード書く人はスタック、ヒープは常に意識してる。
そんなの意識するわけないだろ。どう意識するんだよw アセンブラならpush/pop使うこと多いけど、C#じゃそんなの意識して組むのは非常に困難 意識するのは例えばこれはList<int>よりも基本通りint[]でいった方が速度有利だけど、こっちはListでいいとかそういう(ヒープの)使い方程度だよ
Marshal.AllocHGlobal使うときとかヒープ意識するな
大昔独自のC言語使った組み込み開発で、StaticはROMにマッピングされるやつが有った いやあ、確かに便利だけど言語仕様くらい守れよとは思った
ただしstack overflowはバイブルな。 これさえあれば、大抵のことは何とかなる
>>51 ちょっと検索した感じだとstaticな「変数」(あくまで変数ね)は
ヒープに置かれるって意見とヒープでもスタックでもないって意見があって
はっきり分からんねw
個人的にはstaticな「変数」は一度staticコンストラクタが呼ばれて
作られてしまった後は管理が不要なので後者の方が正しいように感じるがどうだろう
MSスタックどころかWindowsフォームしかできないのがMSワールドの外に出ることなんて不可能だろうな
C#は適当にGC呼び出せば適切なところでメモリ解放がんばってくれるじゃん
>>51 メモリ領域にはヒープとスタックとコードがある
staticはコード領域に確保される
コードていうのはそのまんまの意味で命令が書かれてる場所
ちなみにC#のヒープはGCが管理してる特殊な領域
これ?? PS C:\Users\a\source\repos\stack\stack\bin\Debug\net6.0> dumpbin /headers stack.exe Microsoft (R) COFF/PE Dumper Version 14.30.30706.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file stack.exe PE signature found File Type: EXECUTABLE IMAGE <<中略>> SECTION HEADER #3 .data name 14F8 virtual size 24000 virtual address (0000000140024000 to 00000001400254F7) A00 size of raw data 21C00 file pointer to raw data (00021C00 to 000225FF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers C0000040 flags Initialized Data Read Write
>>62 >staticはコード領域に確保される
これはあってんの?
xpSP2以降、自己書き換え禁止されたはずだから嘘だと思うけど
>>64 ざっくりだけどあってる
AppDomainのLoaderHeapのHigh Frequency Heapと呼ばれる場所に
MethodTable Strucureの一部として確保される
Heapと名前がつくがGC HeapやLarge Object Heapとは別で
GCはされずAppDomainがアンロードされるまで生きてる
AppDomainをざっくり言えばコード領域
ざっくり曲げすぎ。そもそもいわゆるコード領域はリードオンリーだよ
とにかくGC連打 メモリ管理をどうこうしようなんて考える必要なし
結局、Dispose()だらけで汚いコードだらけみたいな。
某現場で提供されてたDB接続クラスがIDisposable持ってるからusingで書いたら全然動かん よく見たらdispose内でロールバック処理が入ってて目を疑った
>>73 周りに聞いたらみんなusing使わないようにしてた
ライブラリは別部署からの提供品で、修正してもらう手続きがめんどくさいから・・・
usingはMSの提供品ならアリ それ以外のライブラリでは信じるに値しない 精々努力目標がいいとこ
>>75 別にDisposeの実装だけが特別バグりやすい理由はどこにもないので、
それは羹に懲りて何とかそのものだねw
別にStreamWriterのusingも疑えって言ってるわけじゃない ただ、チェックされてる保証がないモノを無条件に信じるのはやめろってこと 少なくともMS提供品以外のusingは使うなら一度はdisposeの実装に目を通したほうがいい ブラックボックスのライブラリはメモリリークしてても不思議じゃないから場合によっては 別プロセスにしてキックしないといけないかもしれない
そもそもなまじガベコレなんてあるから 綺麗な後始末にはヘルプをよく読まないといけないクラスが多い気がする まあ、その前にアプリを終了してしまえば問題は起きないが サービスとかだとこいつが牙をむく場面が多い
>>78 人の話聞かない人?
だから、同じことはDispose以外の全てのメソッドについても当てはまるでしょ。
他人の作ったものは全て信じられないから使わない。
これなら偏執狂的ではあっても論理的に一貫している。
しかしDisposeだけ疑うのは羹に(
>>68 厳密にいうと微妙に違う属性みたい
SECTION HEADER #1
.text name
1830C virtual size
1000 virtual address (0000000140001000 to 000000014001930B)
18400 size of raw data
400 file pointer to raw data (00000400 to 000187FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
>>72 トランザクション処理を行っていたらロールバックする仕様は普通じゃね?
>>82 失敗してないのにやるんじゃない?
usingを正常に抜けるための何らかの条件があってそれがされてないと
disposeで失敗とみなしてロールバックするんじゃね?
その条件はソースを見るか組んだやつしかわからんが
>>55 以下ソースで30000ちょっとでスタックオーバーフロするから、
それなりに意識する必要のある人もいるように思われ
企業が作るデカイアプリとか
public class Hello
{
public static void a(int n)
{
System.Console.WriteLine(n);
a(n + 1);
}
public static void Main()
{
a(0);
System.Console.WriteLine("hello world!");
}
}
https://dotnetfiddle.net/tXv7Oq ランダムで0〜100までの数値を出して0〜50と50〜80、80~100の場合に分けてそれぞれを表示するプログラムです
場合分けを増やすとどうしてもforが複数回繰り返してしまいます、2回目以降の
for (int i = 0; i < 5; i++)
を1回に抑えたいのですが何かいい方法はありませんか?
なんかのデータ構造を3つ用意して一回のループで分けるとか 一回全部ソートして前から見ていくとか
linqなんかを使うって方法もあるけど実質同じだからなしだよな stringをいくつか用意しといて、最初のforの中でconsole出力するんじゃなくてstringに値を格納 for抜けてからconsole出力するとか?
普通にcommitしてからdispose()すればrollbackしないんじゃねーの? 原因不明で途中終了されたらrollbackするのは普通に見える。 とにかくデストラクタがC++と同じタイミングで走ってくれれば C#にdisposeはいらなかったんじゃないのかと初心者のボクは思うわけですよ。
速度重視なのかメモリ効率重視なのかによるよな。 普通は分けたデータは再利用するので3つ分の配列を作ってそこに入れるかな。 なら場合分け処理は最初の1ループ一回しかしないで済む。
>>86 その例なら単純にdata[]を昇順にソートしてから
var i = 0;
Console.Write("0以上50未満:");
for (; data[i] < 50 && data[i] >= 0; i++) { ... }
Console.Write("50以上80未満:");
for (; data[i] < 80 && data[i] >= 50; i++) { ... }
とかでいいんじゃないの?
>>90 disposeでrollbackするのはConnectionじゃなくてTransactionだと思う
いずれにしても動かなくなるのは使う側の問題だね
>>90 正確には、コミットしたあと、何もない処理をロールバックするんじゃないかな
実質何もしないのと同じ
未コミットあるかないか確認するのが丁寧ではあるだろうけど
なんにせよIDisposableなDB接続クラスを未コミットでDisposeするのは使い方が悪いわ
ここってスキル高そうな人いるみたいだけど、以下でランキング入りできますか? paiza.jp/botchi/ranking paiza.jp/steins_gate/ranking paiza.jp/logic_summoner/top/ranking
色々ありがとうございます、自分に合ったものを探してみたいと思います
1.jpg 10.jpg 2.jpg を 1.jpg 2.jpg 10.jpg のように自然順ソートできるライブラリありませんか? Windows,Mac,Linuxで動かせるものがほしいです
ライブラリはないと思うよ 君の言う自然順の定義が適当すぎるからね
nugetとかgoogleで「natural sort」
全角ぐらいならnatural sortにCompareOptions.IgnoreWidth渡せばできる 漢字はやりたきゃ自分でやるか日本語対応のを探すしかないだろうな
漢数字やローマ数字対応してもICompareを実装するのにおそらく10分。
こういう手合いは追加要件が出てくるのが基本だから最後には自分で実装しろって回答になってるはず
なんか頭おかしい奴が大量に湧いてるけど、少なくとも2000年代の前半には 「自然順ソート」という概念はあった。 何が「こういう手合い」だバカw ウンコはお前の方だろ。
"2.jpg" "123.jpg" "500.jpg" "百日紅(さるすべりの花).jpg" "百.jpg" 用途によっては漢数字も数字としてソートしたい場合もある 今回は漢数字不要だろうけど、「こういう手合い」になることは多い
ソート順って問題になることが多いからな 特に日本語は色んな文字を使うので厄介 カナとか漢字あたりの動作がめちゃくちゃでいいならライブラリなんていくらでも見つかるだろうけど後からケチ付けられないようにしとくのは大事
タブコントロールの色ってフォームのデザイナーから変えられないの?
職場でcsc.exe使ってフォームアプリつくろうと思ったけど コマンドプロンプト自体制限されてて使えなかったなり
csc.exeのショートカット作って、 プロパティでオプションやソースファイル指定するとか
自然順ソートっ標準で搭載されている言語って結構少なかったんですね PHPから入ったので当たり前に貼るものだと思ってました 頂いた情報で組んでみます
chartコントロールについてですが、折線グラフを使用したときにデータポイント間の線上の任意のX位置を取得してその箇所のY値を取得することは可能でしょうか
線の中にPoints[]があってそこにXValueとYValueがあるからそれ読めばいい
>>117 ありがとうございます
ちょっと試してみます
116の人が聞いてるのはいわゆる「内挿」ってやつのことだと思うけど、 そんな気の利いた機能がchartについてるかな。 使ったことないから知らんけどついてないと思うw
ああ、そういう意味か。それはないな 読めるのは追加した点だけ
>>116 です
そうですか。。できませんか
では取得した位置の近いほうのデータを使うことにします
ありがとうございました
>>121 でも求め方は中一レベルの数学だから難しくないでしょ
>>123 あっ。そうですね。2点のXYデータがわかるわけだから折線だったら計算でだせますね。ありがとうございます
すみませんがもう1点だけ質問いいでしょうか
グラフの拡大縮小をしたときにX軸にスクロールバーがでると思いますが、それを元の表示に戻したいときにスクロールバーの横の小さいボタンを押すと戻りますが、これを自前のボタンイベントで実装するにはどうしたらいいでしょうか
>>124 AxisScaleView.ZoomReset ?
使ったことないのであってるかどうか知らない。
>>125 ありがとうございます!
期待通りの動きが確認できました
海外の12歳の少女が、NFTで1億8000万円を稼ぐ 12歳のナイラ・ヘイズ氏のNFT(※)コレクションが、数時間で160万ドル(約1億8000万円) を稼ぎ出したと、米メディアの『Business Insider』が報じている。 ヘイズ氏は4歳で絵を描き始め、9歳のときにスマートフォンを使って彼女の代表作 「Long Neckie Ladies」を描いたという。このシリーズは3333点からなる、首の長い 多種多様な女性を描いたコレクションだ。出品後わずか数時間で売り切れとなり、 総額は約1億8000万円にのぼるという。 「アートは私が自分自身を表現し、言葉では不可能なやり方で人々を 驚かせるのためのもの」と述べている。 これまでにヘイズ氏は、NFTで1394ETH(約6億6000万円)を稼ぎ出してきた。 若きアーティストのさらなる活躍に期待しよう。
c# winForms webView2 Form1にウェブビューとボタンを配置しました。 表示したwebサイトの方のボタンを、コードで指定して押させたいんだけどできますか? (フォームに配置したボタンを押すと、HTMLの方のボタンが押される)
ありがと! お手数おかけしますがどなたか教えてください
form上のボタン押したら、web上のボタンを押すためのjavascriptをwebview2に突っ込む 詳しくは WebView2.ExecuteScriptAsync をぐぐれば出てくる
JavaのSpringフレームワークみたいにウェブサービス関係を学ぶにはASP.netでいいのですか? net coreとかnet6とか用語が新しくできてASP.NETは廃止されたりしてませんか?
.NET 6 のASP.NET Core Web Apiでの質問です。 [ApiController] [Route("[controller]")] public class UserController : ControllerBase { private readonly ILogger<UserController> _logger; private readonly IConfiguration _config; public UserController(ILogger<UserController> logger, IConfiguration config, IBearerTokenValidater bearer) { _logger = logger; _config = config; } [HttpGet(Name = "GetUsers")] public string Get() { ★ var _ = Request.Headers.TryGetValue("Bearer", out var apiKey); return apiKey; } } というControllerを作りました。 ★の処理を本当はコンストラクタで行いたいのですが、移動すると以下のエラーが出ます。(もしくはもっと前に行いたい) System.NullReferenceException: 'Object reference not set to an instance of an object.' Microsoft.AspNetCore.Mvc.ControllerBase.Request.get が null を返しました。 ★の処理をコンストラクタ(もしくはもっと前)で行うにはどうすればいいでしょうか。 (コンストラクタではHttpcontextを参照できないのでしょうか。エラーになるのは起動時ではなくRequestで到達した時です。)
>>138 Requestヘッダにアクセスするユーティリティクラスを作ってそれをDIする。
ちょっとstackoverflow検索すれば出てくると思うが。
https://stackoverflow.com/questions/24024291/web-api-read-header-value-in-controller-constructor まぁAPIキーを調べたいなら、いちいちControllerでやるより
StartUpの段階で検証処理を割り込ませておくのが定石だと思うが。
char[] str = { 'A', 'A', 'A', '\0' }; Span<char> span = str.AsSpan(); char[]型からSpan<char>型へは、AsSpan()を使って取り出せるのですが、 Span<char>型からchar[]型へ、取り出す方法はないのでしょうか? SpanのToArray()は新しい配列を作ってしまうので、それではないです
List〈staring〉の中に複数四角の座標点が入っていて、四角と四角重なってるものを再計算して重なりがなくなるまで繰り返したいんですが、これは無限ループですよね? 重なった時の再計算方法は別にしてコードの構成ってどうやってやるのか教えて欲しいです。
>>141 よくわからないけど
List<Rect>みたいな感じ?
>>141 重なりは無くならないのですか?
無くなるのなら無限ではありませんね
2つの四角が重なってたら最大5つの四角に分割するってことなのかな こんな関数用意して全組み合わせのstaringが分割しなくなるまでぶんまわす List<staring> 分割処理(staring a, staring b) { (aとbが重なってたら分割して返す)}
携帯なので伝わるかあれですが、まず元リスト(oLst)を 昇順に並び替えた上で下記のループを通すと1個に対して1個の重なりに関しては問題ないんですけど、2個3個と重なるともちろん無理なんですけど、、、、 ====================== for oLst ループ ※数値変数格納 if nLst.Countが0はoLst[i]をadd else for nLstのloop ※数値変数格納 ※oLst変数とnLst変数で重なり計算 計算結果でnLst書き換え、追加 ======================
重なってたらどうするん? 重なってたら重ならないように移動って処理なら無限ループありえるよ そもそも与えられた領域に対して四角形の面積のが大きかったらどう処理しようが重ならないようにするのは不可能でしょ
>>139 返信ありがとうございます。
やっぱりどこかで取ってからDIしたほうがいいですよね
.NET 5 まではStartupでいろいろやってたんですが、
.NET 6 のASP.NET Core WebだとStartup.cs自体やConfigure周りがないんですよね・・・
(少なくともプロジェクト作成時点で)
なので起動後、URLアクセス時点でコントローラに直に行ってるように見えます・・
.NET 6のググラビリティもそんな良くないですが、
DI自体はbuilder.Services.AddTransientあたりでできているので、そっちで出来ないか、
最悪はStartupを自作出来ないかまた調べてみます!
>>140 君はspanの実態がchar[] strと知ってるかもしれないけど言語側からはそんなこと分からないからそれは無理だね
char[]含めマネージ型はアンセーフな方法で作る事は不可能なので、もしそのspanの実態がstackallocとかだとしたら大変な事になるし
どうしてもやりたいならMemory<T>を使えばできる
>>151 .NET6でもStartupがC#9.0のトップレベル構文に変わってProgram.csに組み込まれただけでしょ? 例えばJWTならProgram.csで以下のように検証処理を登録可能じゃないのかな using (var serviceScope = app.Services.CreateScope()) { services.AddAuthentication( JwtBearerDefaults.AuthenticationScheme ).AddJwtBearer( options => ほげほげ); }; でservice取得して.NET5以前のConfigureServices相当の処理が出来ると思うが。 (というか出来ないと困るw) services取得する文が抜けてた失礼 using (var serviceScope = app.Services.CreateScope()) { var services = serviceScope.ServiceProvider; services.AddAuthentication( JwtBearerDefaults.AuthenticationScheme ).AddJwtBearer( options => ほげほげ); };
>>153 ありがとうございました。
コードまで書いてもらってすみません。
Jwtでのやりかたは
https://www.c-sharpcorner.com/article/jwt-token-authentication-and-authorizations-in-net-core-6-0-web-api/ のやりかたで出来ました(サービスのDIみたいな。staticですが)
ですが今回は、JWTでなく独自のランダム文字列で、DBで検証したいと思っています。
AddAuthenticationは参考になりました!
.NET 5 ではAuthenticationHandlerを継承しHandleAuthenticateAsyncをオーバーライドしてrequestを処理してました。。
いまだにHttpContextをコンストラクタ前に参照するやり方がわかりませんが、悩んでみます。
しかし、requestHeaderを全URLでDBで解析したいってだけなので、本来複雑になるのもおかしいんですよね・・・
FilterもちょっとアレですしJwtにしても複雑になっててちょっとな・・・
>>152 なるほどです、ご解説ありがとうございます
Memory<T>の方も調べてみます
オブジェクトをバイナリで直列化するにゃ結局どうすりゃええんじゃ。 binaryFormatterはASPじゃ使えんし、nugetで見つけたBinarySerializerも すぐ無限ループで止まるし遅いしで使えなさそう。 JsonSerializer感覚で使えるバイナリのシリアライザは無いんか……
バイナリであることに意味があるとは思えないので(だって全てはバイナリだから) 要するに吐き出すサイスが小さい and/or 高速であればいいんだよね? いや答えは持ってないけどw
MSは廃止されたWCFの代替としてgrpcを推奨してるから、バイナリ形式のシリアライザはprotobufでいいんじゃね
>>158 せや。今ワイは差分データを管理してオブジェクトグラフの去就を眺められるようなアプリを作っとるんやが、
バイナリにすりゃ20バイトのデータがJsonを経由すると5倍とかに膨れてまうんや。
そんだけ差があると1000オブジェクトの各1000差分で100MBとか差が出ちまうわけで。
ここをもっと高圧縮+高速展開できるフォーマットにしたいんや。
あのclassもこのclassもなんでもかんでもシリアライズしたいんだ、じゃなくて特定のデータか ならbinarywriterで十分だろ というか、binaryformatterよりもはるかにいいだろ
binaryWriterでやりくりするにもインスタンスが持ってる別のオブジェクトの参照をどうするか問題が面倒すぎるやろ。 binaryFormatterならその辺はスルーできるわけで。
フォームにいろいろ書き込んだ内容を印刷したんですけど、フォーム直印刷だとリストビューとかあるので見きらないんで、なんかいい方法ないですか? Excelに貼るとかですかね?
>>160 速度、データサイズ共に最高な汎用シリアライズフォーマットはGoogleが開発したProtocol Buffers
>>165 GDI+の印刷は多少面倒くさいけど別に難しくはない。
好きなように自分で実装するのが一番じゃないの?
WinFormsのデスクトップアプリ開発でデスクトップアプリ内に組み込むデータベースはSQLiteしかないですか? むしろSQLiteが最適ですかね?
>>169 accessのファイル形式のmdbとかaccdbとか
>>169 LiteDBもSQLiteと同じシングルファイルだから運用楽でオススメ
>>170 >>171 ありがとうございます!
その後調べてSQLiteが定番っぽいですね
信頼性と速度も速いですし
>>172 馬鹿って人の言うことに耳を傾けないから馬鹿なんだよな
理系ってバカ文系にいくら説明しても無駄だと散々経験してるから無視するよね。
litedbとかaccessよりsqliteの方がよほどいいからな。注意しないと激遅だけど
>>173 なんか変なこと言いました?
教えてくれた4つを調べて比較したんですが
正直、褒めてるのかディスってるのか分からないレスだよな。
信頼性いうならSQL Server LocalDBじゃないの
>>180 それ組み込みDBじゃないから
SQL-Server Compact Edtion はまだ提供されてるけど開発止まっちゃてるしねぇ
そういえばATOKのジャストシステムって、内部DBは昔から自社で抱え込んでるだけだっけ?
ちなみにSQLiteはWindowsならwinsqlite3.dllとして組み込まれてるから別途dllをダウソする必要なくDllImport("kernel32.dll")と同じ感覚で使える winsqlite3はstdcallだから尚更何も設定せずに呼べる 逆にオフィシャルsqlite3.dllはcdecl呼びなので注意 まぁ今時ネイティブ呼びなんて一々する奴はおらんか
個人的にはFirebirdがEmbeddedでもC/Sでも使い方変わらなくてとても扱いやすいけど まあ誰も使ってないからなあ
>>186 nugetでラッパークラス持ってこればいいだけでしょ
チキンマックナゲット? あれバーベキューソース以外はうまくないよね
>>189 C#er でnuget知らないのはモグリだね
マックはやっぱり朝マック ソーセージマフィンとハッシュポテト最高
ここ1年ぐらいで急に最近もの忘れが増えた なんでだろう カルボナーラのレシピ間違えて大失敗 (´Д`)ハァ…
>>194 シチューじゃないんだけど
シチューでも美味しいだろ?w
キャラメルみたいな奴:それはヌガーや
Xファイルの...:それはドゲットや
>>194 フルスクラッチで作らんでもレトルトで十分おいしいねw
ベーコンとブラックペッパーを足せば
.Net 6 を利用してlinuxで開発することは不可能ですか? ほとんどWindowsの記事しかないのですが、できないと考えていいでしょうか?
.Net 6 を利用してGUIソフトをlinuxで開発することは不可能ですか? ほとんどWindowsの記事しかないのですが、できないと考えていいでしょうか?
.net6はlinux対応してるし、linux対応のvscodeなんかもあるから十分linux完結でできるだろ やったことないからどんなトラブル起きるか知らないけど
コンソールとかならできると思うけど、GUIはどうなんだろう? Xamarin.Formsとかでいけるんかね?
unoというUWPアプリを作ると、スマホやリナックス、webに翻訳してくれるソリューションがあるな
AvaroniaUIってどうなったんだ マイナーすぎて消えた? XAMLじゃ流行らんよな。。。
XamlもBlazorも微妙なんでXMLリテラル導入してJSXパクってCSXとかやれば良いのに
>>202 最近 git credential manager で採用されたから君も実は使ってるんじゃない?
guiはラズパイでwinformが起動はしたけどちょっと動かしただけでアレがねーコレがねーでコケまくったので諦めた コンソールアプリはサーバ用途でcから置き換えたりと普通に使ってる
なんでGUIって一向に解決しないんだろ WinFormsがゴミだったからIEObjectかなんかでブラウザ表示させてそこにhtmlとcssのGUIをつくったことあったけどそれも手間で微妙だった
>>207 MS的には既にツール系はElectron、業務系はWebで解決してるからだよ
本気でWinUIが成功するとか社内でも誰も信じてなさそう
エレクトロンは遅いからなー 見た目もそこそこで速くて開発が楽なフレームワークならまだ需要あると思うけど
一時期はGUIアプリのuiをwebにするの流行ったけどそれも消えたな 結局素のwinformで十分 マルチプラットフォームでのGUIアプリはそもそも需要がない
15年以上迷走してる最大の原因はたぶん大企業病だね バルマーさんが「デベロッパー」連呼しなくなった頃でもあるよね あと、ラピッドリリース的なアメリカ人好みの「ノリ」もよくない。 使えねーから利用者が増えず利用者が増えないから〜の悪循環の原因になってる。 たまたまC#と.NETは割とうまくいったけど他はだいたいこれで消えてるよね
>>208 TeamsはElectronを捨ててWebview2に移行したし、MSはそういう流れだよ
GUIはWebでいいから裏はc#ってのはないの? Electron.Netってあったみたいだがどういうのかは知らん
>>214 ガワはWinforms、フロントGUIはWebView2でReact、裏側はc#って可能?
>>216 ありがとう!
素晴らしすぎる!
これで長年求めていたものがすべて作れそうだ
MSはwinformsをブラッシュアップするだけでいいのに 他のことに気を取られてばかり
>>218 よく読んだらちょっと違うかも
実行環境にわざわざNode.jsをインストールしないといけない時点でElectronより面倒
あとバックエンドがc#ならNodeはなんのために入れるんだ?
>>220 そんなもの要らんだろ。
create-react-appで作ったアプリをそのまま実行する気なの?
いわゆるガワネイティブにするならaspnetcoreを使う必要も無い。
>>210 消えてない消えてない
BADUSBがあるからUSB経由でデータが持って来れないから
WEB画面でデータ登録させるのは現役よ
ルータ設定みたいな画面出る
>>221 バックエンドはC#で書きたいという要件なんだからそんなこと言っても意味ない
>>223 別にasp.net coreで受けんでもC#のメソッドとWebView2内のJavaScriptのinteropはできる。
>>224 そういうことじゃなくてサーバーサイドのDB処理などのビジネスロジックをC#で書きたいとか普通にある要望だろ
あーすまんやっぱできそうだね
https://qiita.com/NagaJun/items/baf00494e0841a5e767e >>225 そうそう
バックエンドはc#でフロントはjs + React + bootstrapなどのcssフレームワークがいい
別にNode.jsでもいいんだがそれだともはやElectronになってしまうしこのスレ的に意味がない
とにかくWinFormsだとGUIが限界だしかといって今更wpfやuwpは使いたくない
ツールバーはアイコン集めと選択が面倒で好きじゃない
しかしWebView2、割と良いな。 XamarinのWebViewもEdgeベースになってるので、ガワネティブはホントに捗るかも。
WebView2ってhtmlやcss、javascriptの知識が必須でしょ? 一から覚えるのは少し敷居が高すぎるんだよなぁ
htmlやcssやったことがないならムリだろうね 俺は25年くらいやってるからむしろ何も考えずに作れる
>>232 XAMLで日本地図書いてホクホクしてた連中にとっては割と朝飯前だと思うぞ。
どっちにしても今時htmlとjsは避けて通れないやろ スクレイピングツールの一つや二つは作るだろうし
表 html css javascript 裏 C# で開発するのって効率的なのか?
フロント開発はReactが多分ベストなんで仕方なくJSかAltJSを使います バックエンドは強い制約がないので好きな言語を使えばいいでしょう そして自由に選べるならC#より快適な言語なんてありません
>>238 まあ開発効率はともかく、今更XAML系のゴミを覚えるよりはスキルの価値を加味すればマシなんじゃないかな
JSに慣れたらそのうち裏もTypeScriptで書きたくなるだろうけど
時代遅れのWindowsフォームからそろそろ逃げ出す先がほしいってことだよね Web技術が好きならReact Native for Windows + macOSが選択肢になるんじゃないかな
c#スレですよ c#で積み上げたライブラリを別言語で書き直すのヤダ!派に救いの手を
何年か前からだけどC#は目的がはっきりしてる人が使う言語になった感じがする スキルの価値とか気にする人には全く向かない システムプログラミング用の言語とスクリプト言語だけあればいい世界になってきた感じ C#のような立ち位置の言語の利用シーンが広がっていくことはないのではないだろうか
>>238 いずれWebでやる前提ならいいけど、スタンドアロンで動かすだけなのに
わざわざそんな構成にするのは手間が増えるだけだな。
角が丸い四角や吹き出しや、そういうのGUIを純粋なC#で作るの面倒なんだよ そういうときにhtml/css/javascript使うと簡単に作れる。スタンドアロンでもそういう構成にすると手間が減るんだよ 俺は手間かけてc#でやる方が好きだけど。html使いだすとソースがごちゃごちゃして最悪だしオーバーヘッドも大きいから
>>246 手間が増えるだけか?
俺は楽だけどな、この方法。
>>249 それはちょっと変な話で、自分の手でゼロベースで作るなら
C#の方がはるかに簡単で可読性も高いと思うw
>>252 こういう話は「コードは書く物だ(つまり書いたら終わり)」
と思ってる人と「コードは読む物だ(つまり他人に理解しやすくなければ無意味)」
と思ってる人で意見が割れるw
コードで角を丸くするのってそんな大変だったっけ・・・
角丸めるだけなら簡単だなw でも丸めるだけだとダサいだろ。そういうデザインのことだよ
こういうビジュアルデザインの実装に対する方法論って、ガチのWeb開発をやったことがある奴とない奴とでは話が通じにくいんだよね この線とこの線は何ptの太さで間に何ptの隙間があって色は#aaff12でとか指定されるんだぞ
そもそも、一貫したUIガイドラインに沿うべきGUIと、それぞれのサイトで独自色を出したいWebの方法論って かなり方向性がq違うからあまり混ぜないでほしいがなぁ。
今年は厚生労働省が「マスクの供給は十分です」と発表したのでマスク買い溜めて、厚生労働省が「トイレットペーパーは無くなりません」と発表したので即座にトイレットペーパー買いだめしたので、一年中ウンコできたわ。 来年もこの調子で厚生労働省の流すデマに惑わされないよう生きようと思います。
>>262 できるかできないかで言えばそりゃできるだろうね
今日の折込チラシのうちで一番凝ったデザインのものを完全再現した画面を作るのを想像してみ
で作って見せたらここの角はやっぱり丸くしないとか影付けて強調したいとか変更が入るんだよ
WinFormsだと技術的に対応しにくい例をあげるとすれば、例えばテキストボックスを角丸にしたとして、
統一感を持たせるためにその隣りにあるボタンも同様のデザインにしたくなったとする
こういうのはCSSなら一瞬だけど、WinFormsなら一大事だよね
>>255 これはわかる。
俺はロジックではない部分は積極的に外に出してしまいたいし、誰でもできるようにしておきたいなと思う。
そういう部分で、HTML+CSSでテンプレート作るのは滅茶苦茶ラクだよなぁって思ってる。
角丸ぐらいだったら良いんだけど、みんな無茶言ってくるからな。
>>252 まずC#とJSの2つの言語を使うってだけでもディスアドバンテージでかいと思うがな。
デバッグやテストも手間が増えそうに思うけど、UIフレームワークは何を使って?
まだ時代遅れのWinForms使ってる人いたのか あれはデザイン性やUXを捨てたものしか作れないから使わないほうがいい
>>268 実のところここは凄く楽になる。
C#側は正しくデータを入出力できる事を確認すれば良い。
JS側(というかHTML側)は与えられたJSONなりを検証して画面を正しく構築して、C#側から何かjsをevalする可能性があるならそれを全てこなせることを確認するだけ。
パキッと分けられるしどちらも自動化できる。
UIのフレームワークは業務ではReact使うことが多いけど、メンツ的な問題で個人的にはガワネイティブにはVueの方が楽だと思ってる。
流行に乗るならSvelteでも良いのでは?
>>271 それってただのWebでは?
俺はC#のGUI(Forms or WPFもWeb(React+express)もやってるけど、デバッグやテストはやっぱり
スタンドアロンのC#の方が楽だと感じている。
それが
>>238 みたいにGUI側をhtmlにしてもっと楽になるんであればと思って訊いてみたけどどうも違うようだな。
>>273 UIがWebかどうかなんかあんまり関係ないのでは?
ローカルのリソース使うんだし実際あんま関係ないと思うが。
CordovaやelectronをWebと言うかどうか、みたいな問題に聞こえる。
正直WPF以降であれば、慣れの問題では?と思うけどなぁ。
定義はどうでもよくて、気になったのはのは実際にFormsやWPFより楽になるのかなんだが。 スタンドアロンアプリの話をしているわけじゃなさそうだからもういいけど。
>>258 むしろそこまでキッチリ指定されてるなら面倒ではあるけど難しくはないだろ
>>275 スタンドアロンアプリの話してるよ。
ガワネイティブ理解してないだけでは…?
C#で作られたDLLでSafeFileHandleを返す関数があるんだけど C++で呼び出すラッパーDLLを作ろうと思うんだけどどうするのがベターなんだろうか ラッパー側でSafeFileHandleを格納するvectorとか作っておいて Openで格納、Closeで削除するって感じでいいのだろうか
Svelte使うスタンドアロンアプリってのは興味深い。
>>278 C++/CLIだったら変に集中管理とかしないで普通にRAIIなラッパークラス作ればよくね
それでどこまで楽になるのか興味深かったんだが >WebView2でやるのがちょっと面倒なだけで。 本末転倒やん
楽なのはVB6、winformあたりが限界で それ以上何かやろうとしてもどんどん面倒になるだけだな。
>>282 お前は本当に何も理解してないんだな。
WPFでつくる方がよっぽど面倒なんだよ、そもそも。
BlendとモックのDLL使ってコントロール作って貰ってたのが、Web技術で作って貰えるだけでも相当工数下がるの。
デザイナー×制作にでも作れるんだから。
>>283 MSがあれだけBlendを振り回して叫んでた「デザイナーと技術者で役割分担」という絵空事を解決したのは結局これというね。
昔はASP案件が多かったから経験ある人はWEBまわりの学習コストが下がるがWPFはね。
このスレは能力低い人が多いからWinForms以外をすすめても意味がない あれしか理解できない
WinFormsで事足りる案件をそれ以上でやる意味なんてないからな
なんかwinformに一族を滅ぼされた人がいるっぽいな
>WPFでつくる方がよっぽど面倒なんだよ、そもそも。 >BlendとモックのDLL使ってコントロール作って貰ってたのが、Web技術で作って貰えるだけでも相当工数下がるの。 つまりhtml+jsの方が楽ってのはこういうふうにカスタムコントロールを作る前提での話なのかい? それとも、それがなくてもhtmlの方が簡単っていうことなのかい? こんなふうにどんどん後付け条件が出てくると話が迷走していけない。
>>290 ほとんど全ての場合だよ。
カスタムコントロール作らない事の方が珍しいだろ。ペタペタと直接、素のコントロール置いて作ってるとか狂気の沙汰じゃん。
後付け条件も何も俺は最初からその想定で言ってる。
お前がどんどん原始的な例ばっかり挙げて後付け条件出してるんでは?
コモンコントロール以上の何かがほしいってそれはもうRICHなGUIですよ。 アナログメーターだのバーコードだのね。
>>289 それはお気の毒に。
仇討ちするなら助太刀いたしますぞ。
WPFは結局見た目重視の癖に他のデザインツールとの連携がゴミカスだったからな お前に食わせられるデータって何のアプリで作れるの?っていう根本的な問題が解決しない
flutterみたいにGUIが整備されていればいいだけなのにマイクロソフトには作れないのか
https://codezine.jp/article/detail/15063 つか、データ内容から言ってイラレとの連携が必須なのにそこの対応がおざなりなのがいけない そして見た目にこだわらせるツールなら 全コントロールカスタマイズ可能にしろ もちろんイラレのデータで これができんからwebview2なんて使ってんだろそいつも
なんでイラレなの?XDとかFigmaとかでは? Storyboardで見ながら全カスタマイズ出来て当然かと。 デザイナーや制作にもそれができるからWebView2とかelectron使うんだが。
>>297 いや、俺が最近のツール知らんだけ
まあ、アドビ製品で作れないと辛いと思うなってことで
>>297 いや、俺が最近のツール知らんだけ
まあ、アドビ製品で作れないと辛いと思うなってことで
>>298 最近はAdobe製品あんまり人気ないよなって感じしてる。
デザイナーの人、だいたいFigmaかなぁ。人によっては直でCSS書いてくるよ。
>>292 メーターはCommunity Toolkitにあるな
このあたりが出来るのが楽。
https://observablehq.com/@d3/zoomable-sunburst JSのエコシステムは割と手厚くて、結構色々できる。
変わり種だと最近はこれも使った。今までだったら相当大がかりな仕組みになってた。
https://modelviewer.dev/ IEベースのWebViewだったら出来なかったんよね、これ。
何の話で盛り上がってるんだっけ? 結局MSは今後デスクトップは何使えって言ってるんだっけ? もうWin32を追放してUWPで統一する計画は頓挫してたよね?
MSは何も示せなくてユーザーたちが独自になんとかしようともだえてる
>>304 やっぱりあいかわらずそうなんだね。
今後はこういう展開をしていきます、みたいなの(横文字で何って言ったっけ?)
も一切ないんだっけ。
UWPってアレ結局なんなん? MSのうさんくさい説明見ても正体がさっぱり掴めんわ ちなXAML使い
>>302 IEコンポーネントは初期設定がIE6になってるだけで、その制限解除するだけで使えるんじゃないのかな?
設定しないと使えないのは多かったけど、設定して使えないものがあった覚えはないな
>>307 IEコンポーネントはパフォーマンス悪すぎて大変だったんよ。本当に悪かった。
WebGL 2.0は全くダメだし。
そしてごく最近の記法が使えないので、古い書き方で苦労するかトランスパイラで相当トランスパイルしないといかんのだけど、これもこれで大変。
そういえば、IEのコンポーネントって他プロセスから普通にDOM掴めたけど今のはそんなこと無いよな、さすがに。
>>309 今のIE11でも変わらない。Chromium Edgeは無理。
C#でNewtonsoft.Jsonを使用して [272,1496922300000,1496934000000,"Y3913",true,"XA","XA","HSZ-HAC","HAC-DFS-WCY",1496913600000] のようなJSONを作成できますか? (数値と文字列の混合配列)
名前なしのカンマ区切りだったらそれはcsvとして処理した方がはやいんじゃないのか
>>319 CSV一行分をjsonのValueとして持てばいいんだよ
var objs = new { hoge = "hoge", fuga = new object[] { 272, 1496922300000, "Y3913", true, "XA" }, }; var json = JsonConvert.SerializeObject(objs); できない理由はないけどなんか他に条件とかありそうでアレだな
>>321 おお、出来るんですね。
ありがとうございます、試してみます
var json = 結局何の型だよってイライラくるよね
>>323 Visual Studioだとvarの上にカーソル持っていったら型が表示されるだろ
型が分からなくてもソースが読み書きできる人が羨ましいわ。 どういう脳の論理構造してるのだろう。分からないまま読み進めるとかイライラしないの? 昔、『菊次郎の夏』って映画見て、映画見ながら、だから菊次郎って誰だよ?って 最後までイライラして発狂しそうになったの思い出したわ。ほんと糞な脚本だと思ったわ。
インテリセンスとAPIデザインが優秀って前提はあるだろうね 適当に.で繋げてけばなんとなくコードが出来上がる 間違ったらコンパイルエラーになる だったらもうそれで型名は書かなくてもいいじゃない 型付スクリプト言語はその辺がまだまだ雑魚なんで型名をしっかり書かないと間違えるようにできてる
>>326 いや、型がメソッド名や右辺式から推測しづらいと思ったら
var使うなという方針は基本的には間違ってないと思うよw
>>326 なんでvarの上にカーソル持って行かないの?
>>330 俺はvar推奨派だが、コードレビューでGitHub上で読むとかあるだろ?
コード工の数が多いといちいち全部pullしてVSで開くとかやってられない
>>326 わからないままに何かしてない。
よめばわかるだろ。
326はC#の話じゃなくてジャバスクとかの話してるんだろ
>>333 そういうことか
型推論は型が確定してるのに意味不明なこと書いてるなと思ってた
型が分からないとほんとイライラくるよな。 今回の反応でスルーできる奴の脳みその構造がだいたい分かってきたわ。わかったつもりで何も分かってない。 ジャバスクの話だ!! そういうことか!!! ←こいつらの脳の構造はこれなんだよ。馬鹿かこいつら…
>型が分からないとほんとイライラくるよな。 varは型が確定しています イライラしているのはあなたがバカなだけ
ジャバスクの話だ!!! varは型が確定している!!! ほんと馬鹿かこいつら…
>>338 コーディングした時点で確定してるよ
varの上にカーソル持って行ったら確認できるだろ
>>321 から
>>323 ときてジャバスクとか後付感半端ないわ
こういうのとは仕事したくねーわw
>>323 見たときに
var json =
こうあったとき、デコード後のclassが入ってることあったり、json stringが入ってたり、varやjsonなんて型や変数名だとわけわかんねーよ!
って話かと思ったら全然違った。なんだこの流れ・・・
これこれ。
>>341 おれは一言もジャバスクなんて言ってないのにジャバスクの話にされて、
さらにはおれがジャバスクを後付したと妄信し、いきなり仕事したくないとかキチガイ妄想炸裂。
仕事先でこんなキチガイいたらガチで名誉毀損で訴えるわ。
これが型をスルーできる奴の脳の構造。リアルでアホだろ、こいつら…
※現在は削除されています
TypeScriptは型ヒント付きスクリプト言語にはよくあることだけど型が嘘をつけるので積極的に使わない方がいい 「型がついてるから安心だ」と思っていたら実行時に違う型の値が入っていることがよくある なんなら生のJavaScriptの方が「型がないから全ての変数が信用できない」という前提に立てる分まだマシまである
>>346 それ言い出すとC++もreinterpret_cast多用で型の嘘つけるからなあ
>>347 まさにそれだね
cppは名前付きのキャストを使い分ける習慣が広まってるから状況は多少、マシ
TSにはanyとかいう負の遺産がある
それにJSはそれ自身ではできることが少ない言語なのでインフラapiコールに頼りがちだ
そこでanyを使いたくなくても多用するのでとにかく間違えやすい
自分がうっかり間違える可能性
チームメンバーが間違える可能性
ライブラリ作者が間違える可能性
とにかく間違いが起こりやすい
なのでTypeScriptは使わないほいがいい
・間違ったコールバックの型付け ・間違ったasの使用 ・間違った.d.tsの使用 ・間違ったユーザー定義タイプガード TypeScriptで肩を間違える可能性があるのはこんなところかね。 まぁ、自分で使いこなせないものを使わない方がいいってのはその通りだが、 他人も同じように使いこなせないわけじゃないしな。
>>349 間違える余地が在ることが問題
特定の個人が使いこなせるこなせないという低次元な議論じゃない
型Aと書いたものが実際にはAでないという可能性が生じた時点であらゆるコードが信頼性を失い
その検証のために心労とコストが増えて
そして実際にバグが増える
C#では例えば「DateTimeと書いた変数に実際にはstringが入っているかもしれない」などと考えてコーディングする人は誰もいない
C#ではよほどのことがなければ基本的に型が嘘をつかないからそれで上手くいく
DateTimeと書かれたらそれはDateTimeであってstringであることを考慮する必要はない
しかしTypeScriptは違う
型は平気で嘘をつく
Date型と書いた変数が実際は文字列だろうが数値だろうがお構いなしだ
TypeScriptでは型が嘘をついていないことを確かめるには
その型が嘘をついている可能性があるという前提でバリデーションを追加するか
依存してるライブラリの内部の隅々までソースを追いかけるか
そういった対策をしなければならない
それはあまりにも非生産的だ
function ExternalLibFunc(): string function example() { const s: string = ExternalLibFunc(); if (typeof s === “string”) throw new Error(“type errro”); // do something } これが安全なTypeScriptコード stringと宣言されたものを本当にstringかどうか確かめなければならない この確認はバカバカしいと思うがやらなければバグを踏む可能性がある でも全てを確認するなんて大変だ だからみんな確認を怠る そして実際にバグが発生する そういう言語なんだTypeScriptってのは
Form1csにイベントがたくさんあるので行数が多くなってしまうのですが 部品ごとにファイルを分けてコードを書く方法を教えてください
>>352 メニューやツールバーみたいのがあったら
イベントハンドラの数が増えること自体は仕方ない。
行数が増えて困ることは目的の場所を探しにくくなることだから、
対策は#regionディレクティブをうまく使って分類することぐらい
>>352 void HogeEvent(object s, EventArgs e) {
//長いコード
}
↑これを
↓こうする
void HogeEvent(object s, EventArgs e) {
_hoge.DoSomething();
}
class Hoge {
public DoSomething() {
// 長いコード
}
}
>>350 そうは言ってもc#だってobjectや継承あるからな・・・
>>350 ネイティブ呼び始めたら嫌でもチェックせんか?
タグ付きユニオンとか使い始めたらどうせそうなるし。
>>357 本来バリデーションが必要がないところでバリデーションが必要になることが大問題
それはバリデーションじゃなくてバグのチェックだねw
そだね TypeScriptdではそういうことも必要になってくる 言語上の欠陥なんだけどランタイムがJSだから永遠に解決しないだろうなこれ
>間違える余地が在ることが問題 完全無欠な言語以外は認められないと? >型Aと書いたものが実際にはAでないという可能性が生じた時点であらゆるコードが信頼性を失い どういう場合にそのようなことが起きるかがわかってないんだろうね。結局使いこなしの問題。
>>363 完全無欠な言語しか使わないとまでは言わない
ただ大きな欠陥のある言語は使いたくない
感覚としてはその程度だね
どういう場合に起こるか?
それはあらゆる場面で起こりうる
ライブラリすら信用できない
>>360 本来バリデーションは必要なのに必要じゃないと思い込んでるだけだろ。
カナリア置いたりした経験無さそう。
>>364 あるゆるは言い過ぎでは?
ほとんどの場合信頼境界を越えるからかと。
formsのchartを使ってるんだけど、20系列くらいを100ms以下でリアルタイム更新って厳しいのかな 色々試したけど更新にどうしても時間がかかる。。
>>365 c♯においてdatetime型の変数の中身がdatetime型以外である可能性があるの?
本来必要なバリデーションって何よ?
>>364 Cのポインタだって使い方を間違えたら正しい型を示さないことになるし、C自身も安全でない言語と見做される
こともあるが、それを分かったうえで正しく使う人はいるし実際広く使われている。そういうこと。
>>368 外部のAPIで1899年以前を扱いうる場合。
>>367 サードパーティ製のチャートを探すことをお勧め
詳しくないから具体的な名前は特に挙げられないけど
とりあえずScottPlotって名前を最近見かけたので試してみては
しかし20系列もあると読みづらそうだな
>>367 ただの折れ線グラフとかでビジュアル的に凝る必要がなければ
UserConrolから自分で作った方が早いかもね。
昔散々そういうのやってたけど、やってみると案外簡単だ。
WPFを選択するとパフォーマンス問題にぶち当たるから注意。
おすすめ本あります? アマゾンで独習を見たのですが第4版は不評、第3版おすすめとなってたんですが 2010年出版っというのが引っかかっているので他を探しています。 スキルはPythonでPyGameのサンプルを打ち込みつつ、解説を見て勉強してるレベルです。 その他言語の経験はなし!
>>365 違う
本来バリデーションは必要ないのにTSでは(というか型がゆるゆるのスクリプト言語全般だが)余計なバリデーションが必要ということ
string x = func();
と書いた時にC#ではxが本当に文字列であることを検証する必要はない
nullになっていないか、文字列が特定の書式を満たしているか、といった心配はあるだろう
しかし、xにintが入ってる可能性は考慮する必要はない
TSではxにnumberが入っているかも、という可能性を考慮しなければならない
これが本来やらなくていいはずのバリデーションだ
これは型が嘘をつくから起こりうること
TSの代表的な欠陥の1つだ
var x = func(); var y = x.func(); 型が分からないとイライラくるよね。 スルーできる奴の脳みそってそれをすべて妄想で埋めてることが社会実験で実証された。
>型が嘘をつく この言い回しをよっぽど気に入っているようだけどw当然TypeScriptが勝手に嘘をつくわけはなくて、 嘘をつかせたのはそれを使うプログラマ自身だわな
相変わらずコードが読めてもテンプレ読めない人が多いな
>>377 TSが勝手に嘘をつくことはないがC#と比べて嘘をつかせるように導くのに長けている
プログラマは世界中に沢山いてTSを使うと漏れなくその脅威に晒される
また彼らが作成したライブラリにも嘘が潜んでいるかもしれない
>>374 違わないよ。
全てTSの中であればNumberであることが担保されているのは、全てC#の中である場合と同程度に正しい。
C#の場合でも信頼境界を越えるのであればその可能性は考慮しないといけないし、TSの場合でも信頼境界を越えないのであれば気にする必要は無い。
ましてやTSというかJSはシングルスレッドなので別スレッドに壊される事も無い。
>>381 お前信頼境界って言葉一切ググらずに喋ってるだろ。
言われたことぐらい理解して反論してこいよ。
>>382 全てTSでも型が保証されない
最も簡単な事例は
const x: string = 100 as any
もちろんこんなコードを書く人はいないが
複雑で膨大なアプリケーションコードを扱うプロジェクトのなかで誰一人としてミスをしないかというと
そんな保証は全くなく型に嘘をつかれることになるだろう
C#ではI/Oが生じる場合にも型が嘘をつくことはない 例えばこうだ int x = Parse<int>(inputStream); パースエラーにより実行時に例外が発生することはある それはどの言語でも起こりうることだ しかし、依然としてxにstringが入ったり、DateTimeが入ったり、という、TSでは普通にあり得る悍ましい挙動を示すことは無いのだ なぜならC#はTSと違って型が嘘をつかないから C#の型は信頼できる TSの型は嘘つきで信頼できない
>>384 大規模アプリ開発では、何層もの見えない層があった結果これが起こる。
オブジェクトの型を破壊的に変換 - C#と諸々」でググってみ。
>>387 じゃあTSはどうしてxにStringやなにがしかが入るの?どこで入れてんのよ?w
>>386 全く異なる
C#ではdynamic、リフレクション、コード生成を使えばコンパイラの検証を回避して、間違った型の変数に値を設定できる
しかし、C#でこれをやると実行時にエラーになるのだ
TSで何事もなく処理が進むのとは、全く趣が異なる
そう、TSではstringと指定した筈の変数にnumberやDateの変数が入ったまま、何事もなく進んでしまうのだ
これは本当に恐ろしい挙動だ
つまり、バグを仕込んだところから、しばらく処理が進んだところで被害が顕現する、ということだ
これはまるで、潜伏期間の長いコロナウイルスのように厄介な特性だ
この挙動はC言語などではよくあるものだったが、原因と結果が離れているのでデバッグがしにくい、とのことで先人達は大いに苦しめられたものだ
まがりなりにも後発の言語であるTSが、大昔の言語設計と同じ失敗を繰り返しているのは残念でならない
>>388 低レベルなメモリアクセスでランタイムを破壊できるのはどの言語でも当たり前のことだろう
TSのように低レベルメモリアクセスでもなんでもない、ただの代入で型安全を破壊できるようなものと同列に扱うべきではない
>>389 困ったことにTSではどこででも起こりうる
だから欠陥言語なんだよ
C#のように低レベルメモリアクセスで無理やり破壊すればできるよ、といった次元とはわけがちがう
>>379 varの上にマウスカーソル合わせてツールチップに表示される型を見るだけ
>>384 既に
>>349 で挙げているがそこに注意してプログラミングすればいいだけ。
お前は馬鹿だからそれができないんだろうが世の中の人間がみなお前と同じように馬鹿なわけではない。
JSなんて使いたくて使ってるやつはいないって事だよ ほかに選択肢がないから仕方なく使ってるだけで そもそも本来TSのようなトランスパイラはこの世に存在し得ない存在
WinFormのlistViewをタブレットで使いたいのですがlist部分を指で上下してlistをスクロールする事は出来るでしょうか スクロールバーで上下出来るのですがスマホのように出来ないかなと
>>394 挙げられたリストでは全く足りない
こういう認識の甘さがバグを仕込むキッカケになるのだろう
そもそも人間は間違える余地があれば、いつか必ず間違える
注意してれば大丈夫、などという考え方では到底ダメだ
>>396 しつこく返してくる奴がいるから仕方なく付き合ってやってる
そいつがTSの型は安全でないという当たり前の事実を素直に受け入れれば俺もこんなレスバしなくても済むんだが
TypeScriptなしではJS開発やってられなくなってしまったな 特にチーム開発
>>398 一応標準でサポートされてるはずだけど
なんかスクロール遅いし慣性の扱いが下手糞だけど…
>>400 おまえは相手がうんと言うまでスレチ議論続けるつもりか
例えばリストビューを作るときにアイテムのTagに日時を代入しとく そうしたら選択したアイテムの日時がすぐにわかるから。こんなのはよくやる手法だよね で、実際にアイテムがクリックされたときにTagを読んで日時を取得しようとしたらstringだったりDateTimeだったりして型エラー。バリデーションwが必要になる こんなの(アホがプログラミングしたら)c#でも日常茶飯事だからな tsでも同じ。アホがプログラミングしたらバリデーションwは必須だし、普通にプログラミングしたら不要
>>404 君は議論の焦点を全く理解してないようだね
すまんが、昔、Linux + LLDBでのC#のデバッグ方法が公式サイトに書かれていたようが気がするんだけどさ そんなようなページってどこにあるのか、誰か知ってたら教えて!!!
昔OSも乗ってない小規模組み込みをアセンブリでずっと書いてたけど、 アセンブリには当然型なんて概念そのものが存在しないが、 だからintとBCDを間違えたり、構造体のポインタを別の構造体のポインタと勘違いする ミスが多いかと言うと、そこは意外とそうでもなかったりする。 それより生産性に対する影響の方が大きい印象だね。 まあこれは小規模かつ基本1人の開発だったからそうだっただけで、大規模かつチーム開発だと 話が変わってくるのかもしれない。 この辺はゲーム業界の人が詳しそうだね。 あの世界は下手したら90年代の終わり頃までアセンブリでやってたはず
バグには様々な要因があるから、不正な型が代入された場合だけを過度に心配してもね
>>384 自分が守らなければそりゃ保証もされないだろ。
C#ならある型にはある値しか入らないと思ってそう。
例えば構造体につっこんでFieldOffsetで上書きすればあっさり壊れるぞ。
[StructLayout(LayoutKind.Explicit)]
struct XXX {
[FieldOffset(0)] public DateTime Value;
[FieldOffset(0)] public ushort Tag;
}
でXXX.Tagに適当なもの入れたらValueは無茶苦茶になる。
参照型の変数にnullが入ってるかもしれないし、C#の場合は例外の型もドキュメントの記載を信じるしかないよね 結局は程度問題なんだよ 前者のnullの問題についてはnull許容参照型を使えば型として区別できるけど、null非許容だからといって絶対にnullが入らないわけではなく簡単にnullを混入させることができる 彼の大嫌いなTSと同じく、特にランタイムチェックのない紳士協定だ
っていうかこれたしか元はvarの話だよね。 繰り返しになるけど、元々の問題提起、つまり 「右辺の型が推測しづらいケースでもvarを使うのは不適切じゃないのか?」は正しいよ完全にw 匿名型を受ける場合以外のvarの目的は、「見れば分かる」冗長な繰り返しを避けて シンプルにすること。 「かっこ悪い」みたいな中二病的動機で意地でも型を明示しないことに固執する奴はアホだが、 困ったことに現実にはそういうアホが結構いる。 この辺LINQの乱用が嫌われるのと同じなんだろうねw シンプルにするための道具を使ってわざわざ難解にするバカw たぶん彼はシンプルとは文字数が少ないことだと倒錯している
varの型が分からん分からんってこいつメモ帳で開発してんのか?
IDEだけでしかソース見ない奴は問題ないんだよ ぐぐってブラウザ上で見るソースなんてマウスあてても型表示してくれないからな
どんだけ小さなプロジェクトしか関わったことないのか知らないが code reviewするときに数百、数千というvarをおまえはいちいちマウス乗せてチェックしてるのか? 型を気にしないならオープンソースもコードを確認せずビルドして使うタイプだろう。 OSS品質=誰かがチェックしてくれるはず=テストしてない=今のMSのコード品質
var使ってるぐらいで崩壊するようなとこは大きいの作れないから気にする必要ないよw
varなんて大抵は右辺見たら型わかるやろ? 何が分からんのだ?
実験結果は分かった気になって実は全然分かってないでした。 でも分かった気になってるのでいつまでもなぜ分からないのだ?と問い続ける。
つか、変数名見ればクラス名も分かる程度にしておくのが普通だから マウスで調べなくてもだいたい分かる
自演じゃないよ、彼はそう信じてるんだ。笑わないでほしい。
>>421 このスレの住人はお前のことを笑っているぞ
そして彼は笑いながら未テスト納品を繰り返す。そしてまたスパコンのデータを吹き飛ばす。
コードレビュー時にローカル変数の型をいちいち調べる意味がよくわからん 必要になるのってバグの原因調査する時だけでしょ
TS、JSの型がゴミなのはわかる c#のvarも俺は嫌い 普通に読みにくい 最近は派遣先会社のVSに仕込まれた強制変換スクリプト?で保存すると勝手にvarが明示的な型に置き換えられて 久しく見ない問題だったが
>>425 人のソース読むのにvarで省略されてるよりも、型が使われてる方が理解しやすい
もちろん
>>420 のようにしてくれればvarでも変わりゃしないけど、世の中そういうソースばかりじゃないし酷いのになると名前で型を騙されることあるからな
整数型にn、floatにfついてるからdがついてたらdoubleかと思ったらそれも整数だったり。そりゃないだろ・・・
限度の問題では? MSの規約にあわせれば良いでしょ。 IEnumerable<T>で受けるべきなのにList<T>で受けてるとかそういう不適切な状態になってない限りvarで良いと思うけどな。 varは省略の為に使うのではなくて推論の為に使うんよ。
varなんて右クリックメニューで元に戻せるから書くだけ書いたら明示的な記述に直しちゃった方がいいよ
>>429 推論はするよりしない方が脳への負担が低いはずなので、
君の説を採るとvarは全面禁止すべきという結論になってしまうよw
少なくともコードの読み手(書き手ではなく)にとってのvarのメリットは
右辺の型が分かりきっている時に左辺の方でもくどくどそれを繰り返される冗長さが回避されることだ。
書くやつは楽 コピペ盗作するやつは脳味噌が必要 var大勝利じゃん
>>432 そもそもこれがゴミなのか有効なのか?
って議論がなされないまま突然導入されてほら使えだからな
VSの右クリックメニューにもvarを元に戻す機能が付いたってことはあんまり評判よくないだろコレ
>>435 お前の会社は社長が1番技術力高いのか?
varで推論しないほうが脳への負担が低いというのはどういうことですか?
>>437 型が分からなくてもイライラしない人はそもそも負担がありません。
アホが作った無意味なマトリョーシカクラス追わなくて済むからな
15年近く前から導入されてるものに対して いまだに文句を言い続ける「熱量」には感心する
>>440 正直、クラスから嫌いです
構造体以上のメリットを全く感じたことない
>>441 そこは「しっくりこないんです」、と書いて欲しかったw
わかってる奴がvar使うのはOK 馬鹿がvar使うのはNG
>>431 推論させる方が脳への負担は低いよね?
型がわからなくてイライラすると言うけど、解る必要ある部分ではないのでは?
極端な話メソッドの入口と出口は型が決まってんだから。
そのメソッド追っ掛けるのが面倒だって話ではないのか
>>446 推論の主語が変わってるよw
あなたの言ってる推論の主はコンパイラ(開発環境)だよね?w
ついでに言うと、あなたがたぶん言いたいことは「書く時の負担が減らせる」ということ。
だからそうじゃなくてコードの読み手にとってのメリットが重要なのよw
そう書いてるよね?
>>431 だってそうでしょ。
コードを書いてる時の書き手にとってはどの変数がどの型かなんて
当然自明なんだからvarにはメリットしかないよ。そんなの当たり前でしょw
結局varについても意見が割れるのは前にも書いた(>255)こういう意識の差があるからだろうね。
世の中KISSなんてただのお題目だと思っててなぜ重要か体感レベルで実感できない人が結構いる。
>>448 >コードを書いてる時の書き手にとってはどの変数がどの型かなんて当然自明なんだから
馬鹿はvarを使えばエラーが出ないという理由でvarを使っているだけで型なんか理解もしとらんのだよ
>>449 その発想はなかったわ
バカの考えは馬鹿にしかわからないのだな
>>448 違うよ。
コードの書き手も読み手も楽が出来る。
varで宣言されている変数に関しては、推論を行わせて、自動的に型が決まっていても良い、というシンプルな話。
Task<IQueryable<Bar>> foo()
{
var masters=getMasters();
//なんかmastersを使った処理
// :
var predictate= e=> ... ;//変換したmastersを使った関数
IQueryable<Bar> result = xxxx.Where(predicate).Take(10);
//resultの確認
return result;
}
こんながあったとき、predictateとmastersはvarで充分では?
全く論点が不明 コードレビューでは全てのvar変数をマウスオーバーして型を確認しなければならないと言うのもシチュエーションとして理解不能、猿が働いてる企業なのか? そもそもそんな使用の是非の議論が必要な話なら世の中にvar禁止の組織はさぞかしあるんだろ? 御託並べる前にgithubでvar禁止にしてるC#プロジェクトでも持ってこいよw
この手の「一人のstaticおじさんに大勢が説教する図」はさまざまなスレで見かけるけどまったく生産性ゼロで不毛だよな ほかに同調する奴いない時点で自分が間違ってる可能性か考えろよ まず自分を疑うのはエンジニアの基本やろ
>>440 また低能馬鹿論理でましたね。WPFでも同じ馬鹿なこと言ってる人がいました。
>>451 C#だとresultの型は推論できないんだっけ?
>>ID:BMV6DlOj0 論点すら分からない馬鹿でも喋らなきゃ無知はバレない。
初心者スレで無知晒しても別に構わんだろ ちゃんと教えてやれよ
>>455 resultというか、メソッドの宣言的には省略不可。
なので、returnしているということはvarでも良いかもしれんな。
>>ID:BMV6DlOj0 いちいち捏造してはマウンティングしてきて 相手を猿だの罵倒してくるクソ野郎にはクソレス返しで十分。
数千のvarをマウスオーバーして型を調べるってんだからそんなもん猿以外の何者でもないだろw それでカネ貰えるんだからいい仕事だなあ で、var禁止のC#プロジェクトは見つかったのか? さっさと探してこいよ
ID:BMV6DlOj0 ←無職のクソ野郎が仕事を語る
>>463 馬鹿の壁の社会実験。参加してくれた馬鹿に感謝する。
>>458 メソッドの宣言?
ここの話だろ
> IQueryable<Bar> result = xxxx.Where(predicate).Take(10);
xxxx の定義によるけど普通は var で良くね?
IQueryable<Bar> result = xxxx.Where(predicate).Take(10); ↑だとこの一行でBarとってるとわかる var result = xxxx.Where(predicate).Take(10); これだとなにかを取ってるとしかわからない。たった数文字の差だけど受け取れる情報が多くなって読みやすい 俺みたいなエスパー能力低い人間にとっては普通に書いてくれた方がありがたい
試してみたけどpredicateの型を明示的にExpression<Func<T>>にしてないと WhereがIEnumelableで解釈されてだめやね resultの型をIQueryable指定しててもコンパイルエラー Whereにlambdaのリテラル入れた場合は varでOk
>>465 すまん、そこ間違えた。varで良い。
言語によってはTask<IQuerable<Bar>>が要らない言語があるんよ。
確かにBar取ってるとわかるが、Barを取っているとわかる必要はある?
>>467 スマホで書いたらダメだな、すまん。
Barだと分かる必要はないけど分かったほうがありがたい 無地のジグソーパズルでも問題なく完成できるけど、絵柄があったほうがありがたいのと同じ
わかる必要はないのわかったほうがありがたい? 初心者にありがちな必要ないのにやけに細部にこだわるタイプなのかな?
その行の前後見ればvarとあってもそれがBarだとわかる でもBarと明示してくれたら前後見る手間なく分かる、たったそれだけの差をありがたいと言ってる var result = colBar.Where(predicate).Take(10); xxxxでなくcolBarというように書かれてたらvarでもBarだと分かるからありがたいし もっと言えばresultとかやめて var resBarTop10aroundPOI = colBarInTokyo.Where(predicate).Take(10); こんな風にしてくれたら、この一行見るだけでそれが何しているのかが分かってありがたい 俺みたいに理解力に乏しい人間にとっては情報量多いほうがありがたいんだよ。無駄に多すぎるのは勘弁だが
class HogeBase { ・・・ } class Hoge : HogeBase { ・・・ } static Hoge GetHoge() { return new Hoge(); } の場合 HogeBase hoge = GetHoge(); だと右辺の型確認しない主義の人はhogeの実態がHogeBase型だと勘違いしたまま作業することになるからまずいんじゃないの?
それはHogeBaseとして扱いたいからHogeBaseに入れてるんでしょ 中身はHoge2やHoge3かもしれない。Hogeと知らなくてもいいよ
virtualメソッドがHogeとHogeBaseで違う動きするよ?
virtualがHogeBaseの動きする前提でレビューしていいのかい?
>>473 >>474 HogeBaseがさらにIBaseってインターフェース派生だったらどうするよ IBase hoge = GetHoge(); hogeは何も実装できないInterfaceだから何の動作もしないはずなんて思うやつはいない そもそも型に対して前提としてる考え方が違う GetがHogeじゃなくてHogeBase返してきたら右辺見ても区別つかないよ static HogeBase GetHoge() { return new Hoge(); }
>>476 へー、呼ばれるメソッドを間違えて認識しててもレビューできるんだ
すげーな
>>477 うん、だからレビューするなら真面目に右辺のメソッドの中身まで確認しろってこと
使ってるからこの話題持ち出したんだけど
>>480 hoge.fuga(); って言うコードをレビューする時に実際に呼ばれるメソッドがまだ作られてないケースもあるんだけどどうやってレビューしてるの?
>>451 人の話聞かない人?何が言いたいのかさっぱり分からん。
恐らく誰も、少なくとも俺は
「varを使うと自動的に左辺の変数が不明瞭になるからvarは一切使うな」
などとは言ってないの。
例えば
>>431 むしろ現実的にはほとんどの場合varでいいんだよ。
それはコードの書き手にも読み手にもメリットがある。
論点は
>>412 に書いた通り、「右辺の型が推測しづらいケースでもvarを使うのは不適切じゃないのか?」だ。
var嫌がってるのってもしかしてテストコードを書かない種族の人?
ワイはvarのほうが効率あがる うちはそこはレビューよりも書き手優先でvar推奨(c#) レビューも気にするならその段階でIDE起動してる その現場でいちいち書かせたいんなら型明示を強制すればいいんでね うちのとこはそんなとこまでちまちま言い合うほど暇じゃないし、それ以上にテスト充実してほしい勢 まあvarにわざわざ書き直させたりもしないねw
俺はvarが嫌なんじゃなくて読みにくいコードが嫌 で、読みにくい要因の一つがvarだということな さらに自分がvar使うのが嫌なんじゃなくて他人が使ってるのが嫌。自分のコードだったらそんなこと気にしなくても読めるし 自分に優しく他人に厳しくがモットーなんだよ
私C#良く分からないのですが、 そんな私がC#の説明することになりました。 クラスが参照型なのですが、どういう理由でこうなっているのか、 どういう意図でこうなっているのか、何と言って説明すればいいの? 本読んでも「参照型はポインタ的な雰囲気の何か」的な説明しかなくて なんでこうなっているのか全く書いてなかった。 ちなみに、参照型=ポインタと言い切っちゃってもいいのかな?? よろしくお願いいたします。
コード書くときはvarで書いて、 それをintとかlongに変換してくれるツールを作ればいいだけなのでは??
>>487 書籍に例えるとどちらも目次に該当する
ポインターがページ数だとすると参照型ってのはタイトル
>>487 参照型はデータそのものじゃなくデータへの参照を持ってる型
C言語しか知らない人にC#を説明するんじゃなければわざわざポインタとの対比で説明する必要ないよ
Varでも何でもいいけど読みながらその都度型を類推するよりは読む前に何をしてるか理解してから読む 大まかな流れを理解してから読むのとメクラ滅法に読むのじゃ時間が100倍も1000倍も異なるからね 書く時だってそう
>>483 > 論点は
>>412 に書いた通り、「右辺の型が推測しづらいケースでもvarを使うのは不適切じゃないのか?」だ。
具体的にどういうケースを言ってるの?
>>492 型が分からなくてスルーできる脳みそが羨ましいわ〜
そもそもvarがいいのって書くときだけじゃん 戻り値なんかでやられると最悪じゃん
結局宣言行まで戻って型見る面倒 ショートカットでいいような
>>493 そういうレスしかできない時点でなにも困ってないのがバレバレやん
>>496 トラが檻に戻ってないのに確認しないで施錠できる脳みそみたいな
>>489 >>490 返答ありがとうございます。
「参照型とは何か」を問うているのではなくて、
クラスが参照型なのは、どういう理由でこうなっているのか、
どういう意図でこうなっているのかを問うています。
クラスを参照型にしている思想は何かということです。
>>499 推測しづらいケースが一つも思い浮かばない→推測をしたことがない→馬鹿の壁
>>498 逆に参照型じゃないならどうする?
多くのデータを抱えたクラスを毎度毎度コピーして渡すコピー型にでもする?
>>498 C# クラス 参照型
でググれば一番上にお前が望んでいる答えがあるぞ
var addFunc(var a, var b){ return (a + b); } とかはありですか??
>>503 その宣言内容だけでどうやって型推論するのか
いくら何でもコンパイラに与える情報が足りなさすぎる
>>471 これ、古より嫌われているシステムハンガリアンだから結構嫌がる人多いと思うよ
winapiのクソキャストにはハンガリアンぐらいが丁度いい
>>487 問題設定自体を変えた方がいいかもね。
なぜ値型ではだめなのか?と。
値型だと少なくとも「フールドを増やしたサブクラスの値を
ベースクラスの型の変数に入れる」なんて芸当は難しくなるね。
というか、こういう禅問答みたいな話は(たぶん重要なんだろうとは思うけど)
初心者は後回しにした方が絶対にいいと思う。
>>498 参照型を理解してないんだからそれを理解するのが先
クラスが参照型なのはポインタ型や値型だと困るから
文字列が値型だとどうなるか考えてみれば?
ポインタを理解してるならすぐわかる
C#のスレでメソッド名の先頭が小文字から始まってる時点で、 ・意識が低い ・まともに調べたり勉強していない どちらかであることを認識すべき。
>>512 今時C++でさえ型推論付いてるというのに
どうしてもc++でやっつけコード書きたいから追加した仕様だろ
やっつけコードしか書かないプログラマだらけの時代に何言ってんだ 昔はOSの無償サポートは10年とかだったのに今はすぐサポート切れの切り捨て。 なぜならやっつけコードで保守する気ないからだ。Win8とかEdgeとかWPFとかぜーんぶやっつけで作ってたからすぐ捨てられた。
型推論はやっつけなのか。 古き良きなのか、時代についてこれないのか 考え方は人それぞれよね
型推論付きの言語はやっつけ専用か 普段この人は何言語でやっつけじゃない開発してんだろう
最近は「int key = 0」でなく「Key key = new(0)」みたいに書いてるからvarは使わんな
>>520 ・老害のCOBOLer
・自称スーパープログラマーな組込C使い
・Javascriptのvarと混同してるボンクラPG
var一切使わない人ってラムダの引数型もクソ真面目に書いてそう
知らないうちにLINQスレもなくなってる。過疎なム板で落ちるとかよほど人気ないのか。
>>523 そうやってガキみたいに初心者相手にマウンティグして全部追い出したんじゃないのか。
>>524 初心者のくせにラムダなんて生意気だ!
ってマウントですね
>>509 >> 値型だと少なくとも「フールドを増やしたサブクラスの値を
>> ベースクラスの型の変数に入れる」なんて芸当は難しくなるね。
すみません。良く分かりません。クラスが値型のC++で
「フールドを増やしたサブクラスの値をベースクラスの型の変数に入れる」
なんて芸当、なんの問題もなくできると思うのですが
>>510
>>文字列が値型だとどうなるか考えてみれば?
文字列は内部実装は参照ですが、ユーザ見えは値型と同じだと思うんですが・・・
内部でどう実装されているのかは、そんなに説明するつもりもないし・・・
>>528 ベースクラスの変数に入れることはなんの問題もないけど逆の操作派生クラスに戻せなくなる
C++でもそうだけどnewされた時の型をベースクラスが覚えておかないとvirtualとかasが使えない
返答ありがとうございます。
>>501 >>逆に参照型じゃないならどうする?
c++ではクラスは参照型ではないですよね?
c#では構造体は参照型ではないですよね?
>>502 >> C# クラス 参照型
>> でググれば一番上にお前が望んでいる答えがあるぞ
配列が参照型なのを考慮すると、高速化・・・・
いや、そのサイト見てると高速化よりも
ポインタを無理やり追い出した弊害に思えてきました・・
>>528 型ってのはコンパイル時に大きさ(byte数と配置)が決まってないといけないという縛りがCのときからある
長さがいくつになるか分からんstringは参照型にするしかない
クラスや構造体の中にポインタもって動的にメモリを確保するだけである。型のサイズは変わらない。
>>529 >>C++でもそうだけど
まことに申し訳ないけど、何を言いたいのか全く理解できません。
クラスが値型のC++でも通用する話を出してきても???と思うんですが
>>530 生のポインタだとオブジェクトを移動して断片化したメモリの整理が出来ない
>>532 それだとクラスは値型でOKという話になっちゃいます。
>>535 ひょっとして私根本的な所を理解していないのかな?
class clsA { class clsB { class clsC { xxx }}}
みたいなクラスの内部にクラスを含んだクラスであっても
GCでガンガン割り当てられているメモリアドレスを
動かされると言いたいのでしょうか??
で参照の何を議論してるんだ? c#のクラスが参照型なのが許せない!!って言いたいのか? キミがそういうのならそうだろう。キミの中ではな。
>>538 >> c#のクラスが参照型なのが許せない!!って言いたいのか?
質問を読んでそういう理解なのでしょうか?
質問を読まずにそういう理解なのでしょうか?
>>540 誰が質問をしたかすら知らないが、質問を質問で返す。つまりそれは構ってちゃんだ。
流れを読まず、適当なところに突っかかる つまりそれは荒らしだ
話題が分散しすぎて流れが分からないから聞いただけなのに酷い言い掛かりだ。 C#のクラスがなぜ参照型かだって? C#は関係ないよ。.net側の仕様だから。vb.netでも同じ。で終わりの話。
>>543 その仕様をなぜ決めたかを聞いているんでしょ
こんなところで
>>537 そう頻繁では無いにしろ移動されない保証は無いね
>>544 え? コピーのコストが違うから分けたという単純な話だが。
Cだって配列のコピーは重いから引数で参照渡しされるだろう?
だからみんな単純な回答してるじゃん あ、俺はどちてぼうやじゃないよ
>>546 >> コピーのコストが違うから分けたという単純な話
確かにそんな感じですね。
クラスが値型のc++が遅くて
クラスが参照型のc#が早いなんて
全く聞いたことないのですが、
MSがトチ狂って高速化を優先(それ以外を犠牲)したようですね。
>>548 C++ は値型のクラスを作れるけどそれをそのま他の関数に渡すなんてことはほぼやらんぞ
そもそもCでも構造体をそのまま渡したらコピーされるからコピーコストを言うなら参照型にしてるだろ
要はC/C++はそういう制御もプログラマに開放してるがC#は開放してない(コピーはそれなりのメソッドを呼び出す)ってだけの話
>C++ は値型のクラスを作れるけど なんかもう、松永パソコン大先生みたいな話だな
割りきればいいものを、どうでもよく無駄にこだわるやついるよな
>>546 >>Cだって配列のコピーは重いから引数で参照渡しされるだろう?
つ【std::vectorは参照ではない】
Unityの座標系って左下起点がデフォなの? WindowsのGUIとのやり取りが凄い大変なんだけどなぜこういう仕様になってるのか教えてもらいたい
>>554 >> 正直C++よく知らんので調べてみたけど、だから↓にあるような「問題」があるわけだよね
菱形継承はいろいろと問題あるからね。菱形継承問題でググってみな
それにc#は多重継承できないからね・・・
>>555 push_backでコピーorムーブが発生するってことを言いたいん?
そのコピーコストを無視できないくらい大きなもの扱ってるときは正にC#の参照型Listのようにポインタ型のvectorを作るか、resize+インデクサアクセスで直埋め込みするじゃん
>>554 >> ベースクラスの変数のメモリ上のサイズは
いや、ベースクラスの変数のメモリ上のサイズは
ベースクラスが持っている変数のメモリ上のサイズの合計
(パディング考慮)でしょうが・・・
>>556 Unity知らんけど、印刷考えなきゃ最初から普通のデカルト座標採用してくれた方が
自然ではあるね。
むしろCRTなんていう前世紀の遺物の仕様をいまだに引きずってる方が「なぜ」のような気が
>>559 だから、そうだとしてそれにフィールドを追加した派生クラスの値を入れられるんですかと
>>558 引数で参照渡しされるだろう?
と言ってるので『std::vectorを引数にする時は参照渡しではない』という意味で言ってるが
>>562 C/C++には参照型も糞なく全部値型だからvectorそのままだと当然値渡しになるから言葉そのまま受け取ればそういうことになるけど
std::vectorって配列へのポインタを持ってるだけだから疑似参照型みたいなもんってことを言いたいんだろ
sizeof(std::vector<T>)のTが何であろうと固定で16byteくらいだし
>>561 つまり『ポインタを無理やり追い出した弊害に』だよなぁ
>>560 WindowsGUIの方がレアだったのか
C#でもSIMD命令呼べるようになったから_mm_add_psとかで一気にやりたいのにxとyで加算減算分けないといけないから出来ないのが残念すぎる
>>555 それC++やないか。しかもそれはC++でも配列やない、classや。
しかもC++はclassの参照渡しできるねん。
>>564 いや何でそうなるw
意味が分からん。
問題設定は「なぜクラスの変数はポインタなのか?」
だからポインタを使わないとどうなるかを示しているわけで、
実際はC#はポインタを追放なんかしてないよ
他人の話を聞かないタイプだから相手するだけ無駄よ 相手するならMSはトチ狂ってるってのに同意する方向じゃないと
だから.netの仕様だと。 言葉を借りるならポインタを追い出したのが値型だ。値型と参照型の機能の違いを仕様書で確認しなさい。 つまるところガベジコレクションからの分離。値型はスタックに乗せれる。確保も開放も高速。 つまり型が分からなくてもスルーできる奴は元から何も考えてないということだ。
手動でメモリ確保して解放すんのめんどくせぇなぁって流れから、 全自動でメモリ確保と解放するC#が生まれたってだけの話じゃないの?
大昔にVBで作られた社内業務アプリをC#で作り直す事になったけど、 GUIはWinForms?WPF?WinUI?どれが一番メジャーなの? WPFは死んでるとか言われてるようだし、WinUIは出たばかりで情報少ないっぽいし、古いけどWinFormsがいいの?
>>573 一番メジャーなのはWinFormsだけど
社内でよく使われているモニターが高解像度で
スケーリング表示をきれいにしたいなら
WPFかWinUIの方がいいよ
WinFormsって2番目だぞ 1番使われているのはWPF 社内アプリならとりあえず.NETのバージョンは6にしたほうがいいな 以前のとパフォーマンスが段違いなので
>>573 何がベストかは結局何を重視するのかの関数だよね。
だからたぶん各選択肢のいわゆるpros and consを挙げてもらった方がよい気がする
コスト重視ならVBにもっとも近いFormがベストだ。
視覚効果や高DPI対応が重要ならWPFがベストだけど、学習コストが高いし、
はっきり言ってパフォーマンス的にまったく使えない分野もある。
WinUIは知らんw
一番楽チンなのはVS2008のコンバーター使ってVB6→VB.netにコンバートし、コンパイルエラーが発生する部分をちょいと修正する事 複雑な計算式使ってる場合に計算式の移植間違いを防げる
関係ないけど、こういう案件て段々広がって収拾つかなくなるか、 客がビビりはじめて結局ほぼ何もしてない変わらないみたいになるか、 ってなりがちよね 客にも腰据えてもらわないとぐだぐだになる
Webで作るという選択肢はないのかな? ある程度の規模があるところなら配布やサポートコストまで考えるとWebのほうが安上がり
社内業務アプリの内容によるけど今どきならWebだろうね サーバーやDBMSの構築すらままならんとかならしゃーないけど
クラサバとかの業務システムをWeb化するのはよくある話だが、スタンドアロンで済む ただのGUIアプリをわざわざWeb化するのは割に合わんと思うがな。 それを上回るなにかメリットがないと。
データをサーバー管理するようなのならまだしも、普通のアプリなら普通に作ったほうが圧倒的に楽
今どき社内業務システムでローカルに閉じてるやつなんてある?
ローカルアプリから直接DB見に行くとかならあるんじゃね ストアで更新配賦とか夢見たこともあったなあ
>>573 の業務アプリというのがどういうものかは
>>573 に聞いてみなけりゃわからんが、
業務で使う内製アプリがスタンドアロンだって例はいくらでもあると思うが。
逆に、なんで無いと思ったの?
社内業務アプリって言ってもいわゆる業務管理システムだけじゃないからな ローカル完結なんていくらでもある ちょっとしたツール類なんて全部そうだろ
Web化すべき案件なら最初からそっちで検討してるんだから余計なお世話やで
ツール類って具体的には? そりや業務端末でも一般的なフリーソフトとか使ってることはあるけど、 業務用に作られたスタンドアロンなツールなんて機器制御関連以外では滅多に見かけないわ システム連携が不完全なためにローカルなアプリやVBAで局所的な自動化をやってるケースはあるけど、結局その入出力は手動で他と連携するわけで、スタンドアロンとは違うでしょ
VisualStudioでデバッグ中に変数やらクラスの中身を追っていくとき 大量にプロパティがあるとアルファベットの後半追うのに ▼で下まで流すのがかなりまどろっこしいんですが スクロールバーもでないし・・・ もうちょっとスムーズにする方法ってあるんですかね
>>590 テキストファイルの文字数や段落数カウントするだけ
指定したウインドウのスクリーンショットを取るだけ
画像をpngにするだけ
ファイルをリネームするだけ
動画からフレームや動画を切り出すだけ
こういうの実際に作ったツールだな。フリーソフトでもできるけどそういうのも開発することあるんだよ
デスクトップアプリじゃなきゃダメな強い理由がなければ WinFormならともかく今からWPFとかやるのは無駄だよね
>>593 そう言うのを社内業務アプリって言うの?
>>596 仕事に使うなら全部業務アプリだろ
区別する意味はないと思うが
業務といっても何を指すかで見当違いなことを言い合ってたりするからな ちなみに俺は追記式で容量が10メガ超えるログファイルを待ち時間なしに検索&色分けフィルターするビューアー が必要だったので作った
プロパティの値についてなんですが 値が変わらないプロパティに関しては Visual Studioの右側のプロパティから変更するのか それともForm1.csのなかで変更するのどっちが王道でしょうか?
変更したってことを把握しにくいからできるだけForm1.csだな
>>595 変数にカーソル合わせてポップアップででてくるクラスや変数の中身がでますよね
デバッグ中にそれで実際に入っている値を追っていくことがよくあるんですが
大量にあるとアルファベット順に並んでいるせいで
たとえば コンボボックスでいうと Selected〜まで見に行くのに
Sまで下りてこなければならないですよね
ポップアップにはスクロールバーもでないから毎回スクロールしないとならなくて
それが面倒で・・・
デバッグで実行止めてるときに、デバッグ->ウインドウ->ウォッチでウォッチ1開いて、そこに見たい変数をドラッグ&ドロップ 配列の一部だけ見たいなら.Skip(100).Take(20)みたいに適当なlinqでもつけて
ArrayクラスのResizeメソッドの引数が参照渡しなのは何故ですか? 他のReverseやSortメソッドが値渡しなので統一されていないと感じてしまうのですが
ReverseやSortは要素を置き換えるだけで済むけど 配列は固定長である以上Resizeするには新しく配列を作り直すしかない
>>604 レスありがとうございます
ウォッチ、使ったことがなくて知らなかったです
クイックウォッチでも簡単に見渡せるんですごく楽になりました
感謝です
.net6だとプロジェクト作成時にいつものusing systemとかが無かったんですけど暗黙的に使えるようになったか、あるいはどっかに記述を引っ越したんですかね?
global usingとかいう迷走の果てみたいなものがあったような覚えがある
>>611 Implicitusingsってやつですか
このglobal usingってのはユーザが任意に追加できるんですかね?.net標準分だけ?標準だけだと有り難みがイマイチ・・・
implicitなのはSDKで固定のはず
global using自体は.csprojに自由に書けるよ
https://ufcpp.net/blog/2021/11/implicitusings/ >>614 書けるけど1つに書くと全ファイルに影響するのは怖くね?
なんかやりすぎ感ハンパない
>>615 悪ふざけじゃなくて、書いたらちゃんと認識されるよって意味ね。
え、readme.txtとかに書いてても影響しちゃうの?
何度も同じことを書かせる仕組みはプログラムの基本的な考えと違うと考えればglobal usingは妥当
global usingもあれば楽だけど書ける場所は限定された方が良かったような
>>619 それなら.csprojとかでいいでしょ
どこかに書いたら全体に影響するのはなんか違う
もうあっちゃう時点でキモいから書けるなら制限なしでいいでしょ
VS2022からC#やる人は結構わかりにくいやろなぁ。 なぜimportもusingもなにも書いてないのに、Console.Writel... みたいにいきなり書けるのみたいな。 グローバルにいきなり書いてるがクラスに属さないグローバル変数はあるのないのとか。
えーーーんTT Console Programつくろうとしたらmain()がないよー>< なにこれ、こわい>< たすけてー
従来のようなプロジェクトテンプレートでもプロジェクトを作れるようなオプションなりテンプレートなりあればいいのにね テンプレートぐらい自分で作れって?面倒じゃん
C#作ってる人たちはC#をスクリプトにしたいの?? 何を目指してるのかよくわからない
なんでもできることを目指してるんだよ もちろんスクリプトとしても使えるぞ。アプリの拡張プラグインをc#スクリプトにするとか簡単にできる
>>627 IDEによるコード生成を完全に排除しようとしている、と考えると理解しやすい
最近の内製系の開発では、コードの自動生成は避けてソースを極力コンパクトに保とう、という考え方が主流になっているんだよ
何で自動生成やめたらコードがコンパクトになるの? そんなわけないと思うんだけどw
コードの自動生成と言うか簡便さを求めてるのだろう 他の簡易な言語と比べると不必要な部分があるからそれを簡略化する ボイラープレート(決まり切った特定のコードの記述 )やおまじないのような入門者にとって敷居の高いものを減らす それ自体は問題ないはず C#は言語的に無駄な記述が多すぎたから一気に来たんだろうな
ファイル内のnamespaceは一個なのにそのためにインデントが一つ増えてエディタでのコードが見通しが悪くなる こんなの早くから導入してくれと思ってた
てかusingみたいに冒頭宣言みたくできればよかったのにな
>>629 コードの自動生成はむしろ最近より進んでるやろ
gRPC周りやソースジェネレーターなんてその最たるもの
>>631 それってVBの思想だよねw
ただしい選択とは思えんな
スクリプトとしては異常に使いにくいよ、 特にアプリのプラグインとしては致命的。 やったことあるひとならわかるよね。 スクリプトだろうと1回実行したら、そのクラス型は解放されないから。 .netは型生成してしまうと、そのクラス型は基本的にアプリ終わるまで解放されない、 間違ったと思ってクラス型の部分のスクリプト変更して再実行しても反映できないのよ、アプリ終了しないと クラス型が解放されないから。
コンパクトに書けるようになっていくのはいいと思う 元のC#は長く書くことを是としていたようで他の言語と比べると見栄えが悪い
C#はいいんだけど、ASP他諸々がなあ Authorize入れるのも一苦労
>>636 作り方しだいだけどアプリ終了しなくても
スクリプト実行&終了→スクリプトファイル書き換え→スクリプト実行で書き換えた編集が反映されるよ
開放されないってのと反映されないってのは別問題でしょ
おれはC#とASP.NET Core WebAPIが最もやりやすい フロントは流石にReactとか使ったほうが楽だがJSもAltJSも罠だらけで洗練されてないね
>>636 まさにクラスを書き換えて実行するのをやってるけど
そんな現象に出くわしたことがないぞ?
>>642 糞アプリの名前も書けない無能の相手すんなよ
質問です。
ピクチャーボックスに描画された物をボタン投下で色を印刷用に変更したいです。
元は背景色黒。線は水色。文字は黄色。四角は緑色塗りされてる物を
背景色白、四角は外枠黒線白塗り、他黒に変更したいです。
これを参考に弄って、背景色は直変更し、線は無事変更、文字は滲んだ感じになり、ほかはそのままでした。
https://dobon.net/vb/dotnet/graphics/setremaptable.html こんなのやるなら色を再設定して再描画した方が早いですかね?
イメージ的にはCADで書いてる物を印刷時に白黒反転するみたいな感じなんですが。
>>644 印刷の品質の観点から言っても「ビットマップを流用する」
という発想自体が不適切で、「描画処理を流用する」べきでしょうね。
.net 6の Windows Forms の TreeView のサブクラスを作ったのですが、 サブクラスでOnMouseDownをオーバーライドすると動くのに、OnMouseClickをオーバーライドしても動きません。 何が原因でしょうか?
そもそもTreeViewのMouseClickはノードのある行の部分しか発生しないけど ノード上でクリックしても反応しないの?
こういう実装の隠蔽ってありだと思う?
https://ideone.com/XNNgQM リポジトリクラスでしか使わないキークラスを外部から勝手に生成されたくないっていう着想なんだが、
特定のクラスからのみメソッド叩かせたいときとかにも使えそうな気はする
雁字搦め感は出てるし、将来の健忘症になった俺が手を付けてしまう恐れも減るしでメリットはある
ただぶっちゃけちまうとinternalで十分では?と他でもない俺自身が思ってしまった
質問させてください using System.Collections.Generic; class TestEnumerable { static public Ienumerable FromTo() { yield return 1; yield return 3.14; } static void Main(string[] args) { foreach(var I in FromTo()) { Console.Write(I); } } } 上記のようなコードがあった場合 yield return1を表示、続きから実行されて yield return3.14を表示すると思うのですが そのあと、メソッドが終了した場合の処理がイメージできません FromTo()メソッドが終了した後は何か値がreturnされるのでしょうか? FromTo()メソッド終了時の挙動の詳細を教えてほしいです
CreateProxyをpublicにしないとエラーになるんじゃないかな
yieldを使ってるメソッドの末尾には 「yield break」が暗黙のうちに挿入される、みたいなイメージをもっておけばいいんじゃないかな
>>650 そんなページ開いたらダイレクトに書いてあることを指摘されたいわけじゃないんだ
ニュアンス通じれば良いかなって思いながらも一応直したんだけど張るURLを間違えたんだよ
>>649 メソッドのシグネチャのみたまんま
FromToはIEnumerableを返すのであって1とか3.14を返すんじゃない。
何言ってるのか理解できなかったら川俣さんの記事のイテレーターの
説明でも読んでもらった方が早いよ。
>>648 キークラスから派生してリポジトリクラスって構造が変
駄目な継承の使い方だと思う
>>655 キー生成クラスだぞ?
本来リポジトリ内部で生成するものなのに基底に置いては駄目とは何ぞ
>>656 この場合は継承(is-a)ではなく包含(has-a)にすべき
>>648 VBは確か型Bが型Aの内側で定義されている時、
BのインスタンスをAが握っているとBのprivateメンバーに
アクセスできる裏技があった気がしたんでVBならそれを使う手はあったかも。
試してみたらやはりC#ではできないw
まあセキリティー的な目的じゃなく単なる精神衛生の問題なら 単純にKeyのコンストラクタをprivateにして必要な個所ではリフレクションで使えばいいよね
「早い者勝ち」にしちゃうのもありかなとか思った。いやねーかw public class Key { public int Value { get; private set; } private static int serial = 0; private static Func<Key> func = () => new Key(serial++); private Key(int val) { Value = val; } public static Func<Key> GetCreator() { var ret = func; func = null; return func; } }
>>649 関数内にyield returnがあったらイテレータブロック扱いになって普通の関数じゃなくなる
IEnumerable<T>の約束通り、Tの要素を返してって終端がきたらおわり
>>649 FromTo()が返すのはIEnumerable
foreachは大雑把に言えば↓に展開される
var iterator = FromTo().GetEnumerator();
while (iterator.MoveNext()){
var I = iterator.Current;
Console.WriteLine(I);
}
イテレータとかイテラブルでググるといい
.NETの型名だとIEnumrator<T>とIEnumerable<T>
>>651 有能
>>654 ,662 無能、聞きたいのはお前のチンケな知識じゃねーよ
>>663 馬鹿だねこいつw
質問した人と別人みたいだけど
今週のNDワッチョイ ドコグロ MM4f-KcIn
WindowFormでTimerクラスを使ってlabelのTextを定期的に変更したのですが 「有効ではないスレッド間の操作」ということでエラーになってしまいます。 どのようにすれば実現できるでしょうか? public Form1() { InitializeComponent(); var timer = new System.Timers.Timer(); timer.Elapsed += new ElapsedEventHandler(OnElapsed_TimersTimer); timer.Interval = 5000; timer.Start(); } private void OnElapsed_TimersTimer(object sender, ElapsedEventArgs e) { label1.Text = "1"; }
>>667 Timerには何種類かあって
WinFormsならSystem.Windows.Forms.Timerクラスを使うのが簡単
スレッド間の〜は Invoke((MethodInvoker)delegate{処理}); ってやればわんちゃん
Windows.Forms.Timerクラスでやりたいことができました! 後学のため、Invokeも調べたいと思います ありがとうございます
OpenCVSharp入れたらexeのフォルダがdllだらけになったんですが、 これ全部リリースの時にこのまま一緒に渡さないといけないんですか? exe1個にまとめられないんですか?
教えていただきたいのですがWindowsでc#のプログラムが落ちた時にメモリダンプを吐くようにするにはどうすればいいのでしょうか? よろしくお願いいたします
>>677 メモリダンプをvisual studioに食わせるといろいろ分かります!!
メモリダンプを解析できない人たちのスレですよ、ここは。
C#でゲロ吐く方法はしらん Windows Error Reportingで取得するはずなので、呼び出せば行けるかもしれない
先輩社員から「まずはメモリダンプとって調べてみろよ」と無理難題言われたとか
メモリダンプを見ると 変数とかスタックとの内容がじかにわかるので デバグの助けになるかもしれない そこまで必要になることは珍しいけど
>>677 ダンプ解析入門 - Visual Studioでの可視化によるC#トラブルシューティング - Grani Engineering Blog
の説明読むとどういうことがわかるかわかります
>ダンプ解析入門 - Visual Studioでの可視化によるC#トラブルシューティング 読んでみたけど支離滅裂な記事だった でもメモリダンプ吐くよう設定する方法はちゃんと書いてたぞ
>>683 出世して Watson Server として MS で働いてます
C#でメモリダンプが必要って、C#の利点捨てまくったクセの強い作りしてるんちゃうか UnsafeゴリゴリとかそれC#で作る意味あるのっていう
>>686 書くやつも書くやつなら読むやつも読むやつってことだな
まあ、そんなもん調べても結局使ってるライブラリがタコでしたなんて可能性もあるし それより先にやることあんじゃねーの? 的な
長時間連続運転するプログラムなんだけど、ちょっとずつメモリ使用料が増えていくななんて 時はメモリダンプ一択だと思うんだが・・・ というかID:8g0F/aL60さんはC#のメモリダンプ何回くらい使った経験あるの? ゴミクズのような経験から導かれた結論は、やっぱりゴ
例外機構が当たり前になった今ではアプリ内でcatchするだけですからね。 仮にテストですり抜けてもcatchしたらエラーログに吐けよと。 今ではWinDbgでカーネルダンプ解析するぐらいかな。
C#はガベコレあるからメモリリーク気にしないでいいって後輩が言ってました!!!
少しずつメモリ使用料が増えていくとか、 Ruby みたいに、世代別GC を使っていたら、 古世代は閾値を越えるまで実行されないかも知れないし、 さらに、メモリ領域が大きいと、閾値もかなり大きいだろうし、なかなか実行されない
>>692 正直ないね
無駄だから
c#でリークの対応なんて無駄
精々頑張った挙げ句にウチの会社が組んだところじゃない箇所でリークしてて対応できません
みたいな事実がわかるだけ
まず、c#みたいな
厳密なメモリ管理ができない言語での
組み方を学ぶべき
3日に一度再起動するとか
機能毎にモジュール化して動かすたびに破棄するとかな
廃棄したらガベコレ適当に実行してりゃOSが片付けてくれるだろ
何のお役にも立てんけど、「メモリ使用料」って結構じわるねwww まあマネージドなユーザーコードでリークが発生する原因は限られてるし、 ユーザーコードじゃないならどうしようもないし、ブル中野みたいな大鉈振るう必要って 確かにあるのかなという気はする
>>692 メモリ使用量が増えるならまずはプロファイラーじゃないか?
C#でも断続的に性能が極端に悪化する問題みたいなのが発生したときに 性能悪化したタイミングでダンプ吐かせると糸口がつかめたりする そういうのはだいたい.NET Frameworkとか下位の部分が原因だけど 原因が明確になれば回避策が取れる
>>699 それもうガチでわかんねーときの最後の手段で
まずはデバッガで見てみるべきじゃね?
最近は結構いい機能が付いてる
VC6の時代とは違う
C#でのリークは大抵長寿命のeventに+=してるだけでしょ
リリースの特殊な(?)解放方法なんて半ば作ったやつの趣味だからな 可能であれば別モジュールにしてキックして終わりがいい 個人製作的な(会社内であっても)ライブラリだとusingのdispose実装忘れはよくある 信じて使うと後ろからバッサリだ
もう半年以上起動しぱなっしの.NET5で作ったスクレイピンクツールあるけど25mbで安定してるな
マネージドな世界で閉じている限り、Disposeの実装ミスや呼び出しの忘れは リークの原因には普通はならないと思うけどね。 単にリソースの解放が逐次的でなくなるだけ。
>>708 Disposeが呼ばれたらstaticなイベントからハンドラを削除するような実装は低品質なライブラリなんかだとたまに見かける
>>708 > GDIなどのシステムリソースの解放忘れとか
の話の流れで
> マネージドな世界で閉じている限り
とか頭おかしいのか?
>>710 頭がおかしいのは君の方
普通のプログラマはマネージドなライブラリを挟んで
間接的にGDIのリソースを利用するんであって直接使ったりしないの
だからライブラリのコードにバグがない限りGDIを間接的に
利用しているからといってリークの原因にはならないんだよ
ついでに言えば、俺は別に
>>702 に反論したわけじゃないw
すごい被害妄想だよねw
ネトウヨさんじゃねえのw
普通のプログラマw 無能の言い訳に多用されてて笑う
理想のマネージドだったらdisposeなんて関係ないし、メモリリークなんて起きない でもc#は理想のマネージドじゃないんだよ・・・
低レベルな質問で恐縮です。VisualStudioを使っています。 やりたいことは、定期的に更新されるcsvからデータを取得しDataGridViewに表示させたいです。 (つまり、DataGridViewでリアルタイムに更新されているように見せたい) 取得・更新することはできたのですが、更新時にソート状態が解除されて困っています。 DataTable・DataSet・DataSource・データバインドなどのキーワードを見つけて調べているのですが、理解力が乏しく解決できていません。 こんな方法があるよと、ヒントになる助言をいただけたらありがたいです。 よろしくお願いします。
>>718 DataGridViewのSort順を復元するだけでは?
・DataGridViewにどうデータをセットしているか、どう更新しているか ・どうソートさせているか ・ソート状態が解除というのは結局どういう状況になっているのか を具体的に
反応ありがとうございます。
>>719 更新前にソートされている列を取得して、更新後に強制ソートする
という感じですね。試してみます。
>>720 >DataGridViewにどうデータをセットしているか
今の状態は、あるサイトにのっていたコードをコピペして試しています。
//フォームデザイン
//csvデータ:person_read.csv
//button4のソース
ソースコードはこちら
https://dotnetfiddle.net/i89pR3 ///////////////////////////////////
>・どう更新しているか button4を押すたびにcsvからデータを更新しています(実現したらtimerで自動更新に変更予定) >・どうソートさせているか >・ソート状態が解除というのは結局どういう状況になっているのか button4クリック→初期状態(csv並び順) GUIのdataGridViewの任意の列(例えば年齢)をクリックしソート 1,山田,25 3,鈴木,28 2,佐藤,30 4,山田,46 csvに 5,田中,37 が追加される button4クリックで更新 csvの並びに戻る(希望はこの順で表示させたい) 1,山田,25 → (1,山田,25) 2,佐藤,30 → (3,鈴木,28) 3,鈴木,28 → (2,佐藤,30) 4,山田,46 → (5,田中,37) 5,田中,37 → (4,山田,46) 以上です。
リンクが404になっていたので貼り直しします。
これで大丈夫か心配ですが。
https://dotnetfiddle.net/ulZ3M9 DataTableの場合ソート順は dataTable.DefaultView.Sort に文字列で格納されるからこれを使えばいい
C#で正規表現のperlでの「tr」と同じ事をしたいのですが、 Regexクラスにそれっぽいのがありません。 何か方法はありませんでしょうか?
trは置換なのか?だったらc# regex 置換とかでぐぐりゃ方法出るだろ 痴漢じゃないなら知らない
置換ではあるのですが、 pattern [a-z] replacement [a-z] とすると半角英字が全角英字に変換されるといった感じです
正規表現でマッチした位置とマッチした文字列を取り出すのはできる 正規表現関係なく文字列を全部変換するってならできる これを組み合わせて自分でやるしかないんじゃない?
Regex.Replace(mojiretsu, "[a-zA-Z]", p => ((char)(p.Value[0] - 'a' + 'a')).ToString()); 動確はしてない。
なるほど、やはりないですか ありがとうございました
全角半角ならVB.NetのStrConv使えばいいじゃね
c#って全角半角変換でまともなメソッド用意してないよな
>>718 です。
.SortedColumn で現在のソート選択列を取得
ListSortDirection で昇順・降順の状態を取得
データ更新後、.Sort で更新前のソート状態を復元することができました。
>>719 さん
>>724 さんヒントをありがとうございます。
>>720 さん、気にかけていただいてありがとうございます。
また何かあればよろしくお願いします。
>>732 C#の言語仕様にそんなのあるわけないだろうが
頭がおかしいのかな?
全角無視した比較はあるんだから変換もあればいいのにな .net6はいたるとこでCultureInfo受け取れるようになってるから、オリジナルCultureInfo作ってやればtolowerなんかはできそう
nuget辺りに.net言語で使える漢字処理モジュールみたいのないの
あの、Asp.netMVCでサイトを作ったんですが、 robots.txtって Global.asaxと同じ場所もしくはViews\Layout.cshtmlと同じ場所 のどっちに置けばいいんでしょうか?
WebProgという板があるからそっち言ってみれば?
>>738 デプロイしてみればわかる話を、何故聞いてしまうのか?
めんどいじゃん ネットでクダ巻いてるゴミが代わりに試して教えてくれれば儲けもんだろう?
>>741 うそを教えられるという可能性は考えないのか?
すでにサイト作ってる段階なら、掲示板で聞くより自分で試すほうが早いと思うんだがなぁ
共変と反変という言葉がよく分かりません アップキャスト/ダウンキャストと何が違うんでしょうか?
class B{} class C:B{} class D:C{} static D Function(B b){ return new D();} Func<C,C> fp = Function; Functionの返り値DはCの派生クラスだから返り値CのFunc扱いしても大丈夫だよねってのが共変 Functionの引数BはCのベースクラスだから引数CのFunc扱いしても大丈夫だよねってのが反変 両方ともアップキャスト(asがいらない)が約束されてるから許される
ハロウィンの子供にチョコレートを渡せることが反変で チョコレート工場をお菓子工場とみなせることが共変ってことか
よく理解できるね これを理解したとしても他人がコードを読むの大変だよね コメントに書いておくものなの?
c#自体にそういう機能があるので楽だねって感じ うまくいかない場合は何か思い違いしてる
>>746-747 めちゃくちゃ分かりやすいです
ありがとうございました
なにこれ もしかしてnullになるかもしれんやつは片っ端から?つけなきゃいけなくなったの??
nullチェックをコンパイラが管理するやつだから慣れれば神機能
参照前に必ずnullチェックというコーディング規約から解放される?
on/offを行単位で切り替えられるから混乱すると思う
まあ利点がわからないなら君は今のままでいいんじゃね?
5年ぶりに.Netで作ることになったんだけど、.Net Frameworkってオワコンなの? Coreとか出てきてさらに.Netに統合されるとか混沌としてて何が今の最適解なのか解らない。 どうせ作るなら今の最適で作りたいからお聞かせ願いたい。 つかWPFって普及前に死んだ感じ?
.NET FrameworkはオワコンだけどWindowsに標準で入ってるのでWindowsユーザー視点だと一番有難い WPFもWinFormsのWindowsであれば現役
.netもオワコンだが WPFもオワコンなので 代わりがない状態 他のはもっと過疎ってて .netやWPFより更に消えやすい感じ なので何もオススメできない状態
オワコンっても単なる流行の話だからな中身はオワコンでもない .NET Framework 4.8 .NET6 今選ぶならこのどちらか。どっちも長期サポートになってるはず 表面的にはどっち選んでも同じ。昔の記憶が残ってるなら4.8使った方がスムーズに扱える UIは色々増えてるけどwinだけならWinFormsが無難
>なので何もオススメできない状態 調べる限り、今はコレってのが無いんだよね。 WPFも生き腐れしてるみたいなので、 無難なWindowFormsと.Net Framework4.6.Xで良いやって思ってます。 ぬるぬるUIによる快感性はiOSに任せようと。
>.NET Framework 4.8 ユーザーのコンピュータには.NET Framework 4.6が入ってるので 5年程度を稼働を目安にすると.NET Framework 4.6のが導入のハードルが 低くて良いなと思うのですが、.NET Framework 4.8のが何か優れてるんですかね? 純粋にサポートの長さかな。
4.6だと今年でサポート終了かな サポート気にしないなら・・4.xの差で機能的にはほとんど変わってないから何使っても同じ ただちょこちょこソースコードの書き方が追加されてる(変更じゃなくて追加だから昔の書き方で問題起きない) ぐぐってソースコードコピペしたときに新しい書式のソースコードだと思わぬエラーがでて困るかもしれないって程度 わざわざ古いの選ぶ意味もないけど、新しいの入れるのが面倒なら古いままでもいいんじゃないって程度だよ
基本的には.NET6を選べばいい 既存システムのメンテナンス・マイグレーションなら資産状況次第だけどFW48の方が低リスクで間違いない ランタイムのサポート期間は意外にもFW48の方が長い でも開発環境のサポート期間はわからない
最近は4Kとか高解像度ディスプレイ対応(スケーリング対応)が必要になって来たせいか WPFを使ってる所が前よりは増えた印象 他に良いのが無いから消去法で採用って感じ何だろうけど
>>766 スケーリング対応は4.8の方が改良されてる
もっと言えば.NET6の方が進んでるけど
WPFでもMVVMを考えなくてもWinFormsと同じように使えるし、スケーリング対応が楽なのはいいよね あと最近のWindows10は標準で4.8が入ってなかったっけ?
サポート期間を気にするなら.NET6は問題外だよ なんと2024年にサポート切れ
十分だよ .NETは互換性が高いから.NET8への移行も苦労はせんだろう 他の言語と比べたら天国だ
>>771 WinFormsの*.Designer.csと*.resxから解放されるのも大きいね
差分を見たりマージするのに問題あり過ぎた
Windows10はMay 2019 Update(1903)から標準で4.8が入ってる
現在サポート中のバージョンは全部4.8が入ってるね
.NET Frameworkは最終版の4.8でもC#7.3までの対応 C#8.0は.NET Core 3 C#9.0は.NET 5 C#10.0は.NET 6 C#のバージョンを上げるなら.NETも移行せざるを得ない
WPFの方が高DPI(高「解像度」では必ずしもないよね)対応が優れているっていうのは DPIが異なる複数のディスプレイ間をウィンドウが行ったり来たりするような状況を想定した話?
WPFってWebみたいに解像度に合わせて画像切り替えるとか標準じゃできないだろ? HDPI対応が優れているとか片腹痛い
俺社環だと2012R2なんで4.5.1なんだよな サポート外だからさっさと4.6移行に切り替えたいけど、不具合出てないから誰もやりたくないという
>>779 そんなもん解像度は取得できるしなんとでもやりようあるやろ
つうデスクトップGUIアプリに求めることかそれ?
どんなシチュエーションで必要なのかわからん
>>780 誰もやりたがらないけど、OS のサポート切れが迫ってきて対応中。w
いまさらその上で動いてるオレ様ソフトのインストールの手順とか覚えてないんだけどなあ。
昔自分用に作った(家で自分の時間を使って)アプリがあって退職時に無理やり引き継ぎさせられて勝手に使われてる PC壊れたときに連絡あってアプリを送った思い出…
毎日使うものなので劇的に工数が減った あくまでも自分用 それを恨みこそすれ感謝してない元会社がタダでずっと使ってる
Main内 Test t = new Test(); t.Num = 1; t.Add(10); Console.Write(t.Num); class Test { public int Num {get; set;} public int Add(int p) { return Num + p; } } これで出力が1になるのは何故なのでしょう?11になると思うのですが…
return Num + p; これは足したものを返してるだけで Num自体に変更をかけていないからな Num = Num + p; return Num; ならわかる
あ、、、確かに。納得しました。 ありがとうございました
すみません、初心者で何からしたら良いのか、何をすべきなのか分からなくて助けてください。 計算アプリを作らなければならず、調べてなんとかボタン配置とかはできたのですが、プログラミングが何をどういった順番でするのか分からなくて… 計算は 固定数字÷ボタン入力した数字(+必要に応じて選択した数字)×ドロップダウンで選択した数字 これを出来るようにしたいのですが、やるべきことは @ボタンとドロップダウンの紐付け?認識? A入力した数字の表示 B()の条件付け C計算結果の表示 これで大丈夫でしょうか? うまく質問できず、申し訳ありません。 今までプログラミングに触れたことが無く、必要情報が不足していましたら追加致します。
ボタン押したらボタンに対応した値を表示する(固定値で割らなくておk) それができたら、次は固定値で割った結果を表示するように修正 それができたら、次はドロップダウンの選択が変わったことを知る方法と選択された値を取得する方法調べる それがわかったら、ドロップダウンの値を掛けた結果を表示できるように修正 それができたら、どんな条件でこういう計算するって条件別け かな?
それを決めたら他の人がコードを書いてくれるのか? それならマルナゲをオススメ
>>793 ありがとうございます!
直ぐにやってみます。
やるべきことを分かりやすく教えて頂き、本当にありがとうございます。
>>794 いえ、コードも私が書かなければなりません。
丸投げする相手が居ないです…
やっと、数字の表示ができました…… 何故か一桁しか表示されなくて、次の数字押したら上書きされるけど、表示はできました… 何のたしになるかは分からないです… 曰く『コロナ禍だけど、この機会に家で出来きることをしよう!』って事らしいです。
投稿が重複してしまいました、誠に申し訳ありません。
メンバー'hoge' はインスタンスデータにアクセスしないため、static にマークできます
四角をグラフィックに描画する場合の座標について g.DrawRectangle(pen, 始点x座標,始点y座標,幅,高さ); このようにあります ならば幅が2,2の場合 g.DrawRectangle(pen, 16, 16, 2, 2); これで(16,16)-(17,17)で2ドットだけの中抜きがないものを想像するのですが 実際は (16,16)-(18,18)の中央に穴がある状態の四角が描画されるようです これは3,3指定なら理解できるんですが 幅指定なのになぜこのようになってしまうのでしょうか?
g.DrawRectangle(pen, 16, 16, 1, 1); g.DrawRectangle(pen, 16, 16, 0, 0); こいつらはどういう挙動をするべきかを考えたら?
GDIは終点は描画領域に「含まない」 だから、幅として成立する。 FORTRAN由来とかで「含む」系 もあるので注意だ
>>801 まあこうは言える。
まずユークリッド幾何学的な数学的に抽象化された世界で考えるべき。
その世界では、1対の平行線の距離がペンの幅より大きければ必ず平行線の間に「隙間」が出来る。
GDI+の描画はこういう抽象化された世界をピクセルの世界に写像してるだけ
まあたぶんこんな感じだね (1) 論理座標の原点は(0, 0)のピクセルの中心に設定されている。つまり論理座標とピクセル座標は 0.5ずれている(少なくともペンの幅が奇数ピクセルの時は) (2) DrawRectangleは論理的な矩形の辺がペンの中心になるように描画する (3) だから描画された矩形はペンの幅の1/2 * 2だけ指定したサイズより大きくなる
小数のない世界なら厚みゼロで隙間がないんだろうけど、塗りつぶすならFillRectngleで明示しろってことかな。
独習C#やってるんだけど、これを一通りやれば基本は身に付くと思っていい?
>>807 その本なら自信持って良いよ。
record, using var, initなどのC#8以降の機能は別途学習が必要。
LINQや正規表現などは実践でないとなかなか身につかないので、だいたい理解したらどんどん読み進めるのがおすすめ。
ちなみにプログラミング未経験で、全部読むのに3ヶ月かかりました。
自分だったら3か月かかるならモチベーションが保てそうにないなw 20年前はそんな本がなく手探りだったけど逆に良かったのかな…
仕様もライブラリも今よりペラペラだったから入門しやすかった
>>809 ありがとう
プログラミング経験はエクセルVBAのみ
C#は簡単な方だと聞いてたけど難しいね、頑張ります
やっつけ仕事するだけなら今も昔も変わらんと思う C#の便利機能が山ほど増えてて書きやすくはなってるけどどこまでが入門なのかは正直わからん
DTOだらけの低品質なコードが量産されてTypeScriptみたいになりそうな気はしてる
おれも独習で勉強した 分厚いから真ん中ぐらいまでくると最初の方忘れてるわ んでもう一度戻ってやり直したり、途中で挫折したりで 1年以上うだうだ読んでた 読み終わる前にいろいろ作って遊んでたけど イベントとか非同期処理とか分からないとまともなの作れないんで 途中すっ飛ばしてその辺読んだり
>>817 その独習、旧版(ハーバード・シルト)?
シルトは過去の人 昔読んだ時もそういうイメージ 文法ぐらいが得意分野
>>819 では最近の教科書で優れたものは、どなたの著作ですか?
俺はオライリーの薄いやつで大体把握して、デザパタをjavaの結城さんのやつで学んだな
C++の本で勉強した知識だけでC#の本は買わず、dobonを見ながら書いてる
dobonよく参考にしてるけどもしかして見てるとバカにされる風潮とかあるの?
昔はよくお世話になったけど、今となっては古い記事が多いので最近はあまり見ないな
全ページのヘッダに古い言語仕様の内容であることの明示くらいはしてほしい あと初心者向けと言いながら 同じ処理でベストプラクティスと非推奨な書き方を同列に載せてるのも印象よくない
recordはvalueobject作るのに便利 使い捨てのアプリ作るのには不要
お世話になります。
ComboBox.IsReadOnly を使おうとしてエラー(usingまたはアセンブリが不足)が出ました。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.combobox?view=windowsdesktop-6.0 で調べ、
名前空間:System.Windows.Controls
アセンブリ:PresentationFramework.dll
を追加しました。
しかし、現時点でエラーに変化がなく困っています。他に考えられる原因があればお教えてください。
>>828 追加したのはWPF用のアセンブリだけどお前が作ってんのはWPFじゃなくてWinFormsだとか
ComboBoxのインスタンス作らずにプロパティ見ようとしてるとか? プロジェクトのエラー起こしてるコードさえないからわからん
>>829 >>830
反応ありがとうございます。
はい。WinForms(VisualStudio使用)です。
ソリューションエクスプローラーの参照からアセンブリを探して追加しました。
WPF用ではなかったか確認します。
using System.Windows.Controls と書いて追加した気になっていましたが、
ソリューションエクスプローラーに同名がないのを確認しました。これが原因かもしれないので調べてみます。
>>831 盲点でした。確かにインスタンス化していません。やってみます。
みなさんのアドバイスのおかげで糸口が見えました。あとは自力で頑張ってみます。
また困ったことがあればよろしくお願いします。
>>832 横からレスだけど、次からは情報を端折らずに書いてね
場合によるから
>>832 833の追記
WinFormsのComboBoxはSystem.Windows.Formsの方だったはず
>>832 反応ありがとうございます(横レスでも大歓迎です)
情報を端折ってしまったようで今後気を付けます。
必要になる正しい情報とはこちらでよろしいですか?
エラー CS1061 'ComboBox' に 'IsReadOnly' の定義が含まれておらず、型 'ComboBox' の最初の引数を受け付けるアクセス可能な拡張メソッド 'IsReadOnly' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
それとも部分的であってもソースでしょうか?今回の問題では必要ないと判断してしまいましたが、次回以降気を付けます。
次回もぜひお願いします。ありがとうございました。
>>835 エラーメッセージもそうだけど、こっちが言ってたのは「WinFormsかWPFか」の方だね
WinFormsの方のComboBoxにはDropDownStyleプロパティがあるからこれにComboBoxStyle.DropDownListを渡せば選択可能で文字列入力を受け付けないタイプになるよ
(まあ、他の人がすでに提示しているようだけど)
みなさん親切で涙が出てきます。
>>836 ・837・838 反応ありがとうございます。
・C#にはWinFormsの他にWPFがあったのですね。WPFという言語なのかと思っていました。
今後はエラーメッセージと共にWinFormsであることを最初に宣言します(初心者すぎてすみません)
IsReadOnlyプロパティが存在しない
・はい。通常のプロパティでは見つけられませんでした。
こちらのサイトを参考にさせてもらい挑戦していました。
https://blog.t5o.me/post/20140316/c-sharp-xaml-combobox-read-only.html ・ComboBoxStyle.DropDownListとEnabledも試しに設定しました。
やりたいことは、
コンボボックス横にチェックボックスを設置
チェックボックスが真の時、コンボボックスを規定値にし操作不可能にすることですが、
上記設定でもドロップダウンボタンが反応するので別の方法を探し、上記サイトにたどり着きました。
・第2案として、チェックボックスが真の時、コンボリストを規定値以外を削除し対応しようかと考えています。
(ドロップダウンリストが空白で1行出てきてしまうのがかっこ悪いかなと考えて最善を探していました)
なんとか頑張ってみます。みなさんありがとうございました。
>>839 System.Windows.Forms.ComboBoxを継承してカスタムコントロールを作るってのが調べると出てくると思うよ
例えばこんなのとか
http://jeanne.wankuma.com/library/readonlycombobox/ >>839 839のリンク先もそうだけど、記事にXAMLって単語があったらWinFormsと無関係だと思って良いよ
WinFormsのコンボボックスの操作不能にするのは、comboBox.Enabled = false;
c# + visual studioでデータブレークポイント使えますか? c#のクラスは参照型ですが、値のコピー (int型変数i,jだと、i = jに相当する処理) するにはどのようにすればよいのでしょうか?
コピーはコピー先をnewして作って、メンバー変数の値をそこに一個ずつコピーしてく クラスによってはそういうnewとコピーをしてくれるClone()を持ってることもある
独習C#で学習されている方が多そうですがマルチスレッド難しすぎないですか(泣) 新版を使っておりますが、P530〜の説明が意味不明です awaitとWait()メソッドの違いがよくわかりません どちらもタスク(サブスレッド)の処理を待機するという同じような意味という理解ですが、 なぜかサンプルプログラムで両方使われています 試しに片方削除して実行すると、ループが最後まで実行されないので、意味が違うんでしょうが調べてもよくわかりません… どなたかご教示いただけないでしょうか
>>845 大別するならawaitは非同期、Task.Wait()は同期的、という所だけど
Task.Wait()は単純にその場でタスクの終了を待つので足踏みする事になる
awaitを使うと内部的にはその後のコードもTask化されてasyncメソッドの返り値になる
awaitまで到達した時点で呼び出し元に処理が戻るので、主にUIスレッド等でよく使われる
後続処理を追加するだけならTask.ContinueWith()も有るんだけど
UIコンポーネントは作成スレッドからしかアクセスしてはならない制約とか
後続処理を担うスケジューラ指定とか煩雑なのを纏めて糖衣構文にしたのがawait
>>845 助手(他のスレッド)がタマネギを炒め終わるのをジャガイモの皮を剥きながら待つのがawait
手を止めてじっと待つのがWait
awaitが画期的なのは、「助手の仕事が完了するまでは別の仕事をしつつ、完了後に
やりかけの仕事の続きをする」という本来シーケンシャルでない手続きを、あたかも
「助手の仕事が完了したら続きをやる」という単純なシーケンスであるかのように記述できること
awaitの正体は「Taskがすぐに終わらなかったらすぐにreturnする特殊構文」ってことを知っておけば理解はしやすいと思う Taskが終わったらさっきawaitしたところから(途中処理を飛ばして)再開する 関数先頭に特殊構文を使うことを明記(async)しなきゃいけない (FormとかWPFとかのGUIアプリなら裏で勝手にやってくれるから気にしなくていいが) Taskが終わった後にawaitから再開できるように呼び出し元のスレッドでDispatcher.Run()しとかなきゃいけない
await 〇〇やっといてよろしく。私いったん席外すんで終わったら連絡ちょうだい。続きこっちで引き継ぐから Wait 〇〇やれや!終わるまで後ろでじっと見とるからな!はよせえよ! どっちがいい?
たとえが分かりやすいですw イメージがわきました、みなさんありがとうございます! もう一点だけ確認なのですが、asyncメソッドのawaitよりあとのプログラムに移るタイミングですが、 メインスレッドでプログラムが実行中のときはどちらが優先になるのでしょうか?
WinFormという前提でいうと まず前提としてメインスレッドではずっとメッセージループっていうループが回ってる でマウスの入力とか再描画要求はメッセージって形でキューに貯められる メッセージループはキューから1つメッセージを取り出してはアプリの実装に流してくる ちなみにその辺のシステムメッセージはWinFormだとMouseMoveとかPaintとかのイベントとしてアプリが対応することになる await以降の処理もこのメッセージを使って実現してるから メインスレッドの手が空いて次のメッセージを処理できる態勢になるまで待たされる
スレッド 注意点一覧 ・シングルコアで動くか? ・応答がないときに自決するか? ・失敗時のメモリリークはないか? ・タイムスケジュールはあるか?(例:1分の内AスレッドはX秒、BスレッドはY秒等) ・生存確認方法はあるか? ・実行中の状態は取得できるか? ・ログは出力できるか? ・最大使用メモリは把握できているか? ・失敗時のリザルトの受け取り方法は適切か? ・処理が複数失敗する可能性は考慮できているか?(例:ファイルオープン成功→ファイル書き込み失敗→ファイルクローズ失敗→tempフォルダ削除成功のとき何が返る?) ・本体終了時に終了できるか?
C#のマルチコアなんたらっていう非同期処理のテキスト読んだらいいよ
async/awaitとTask.Runの使い分けが今でもよくわからん。。
>>856 それどこかに書いてあったな
5年くらい前の記憶でそのリストがあった
それ多分C#じゃなくて組み込みとかの話だから参考にならんよ
>>861 え?どこにC#だと助かる要素があるの?
>>856 この記事の内容が組み込みc++じゃないのかと
C++だと駄目でC#だと助かる要素なんて1つもないけど 今まで何やってたん?
>>856 これスレッドに限らずどのプログラムにも言えることだと思うわ
出典元知りたい
>>859 Task.Runとawaitは組み合わせて使うものだし、使い分けって何のことだろうか
(同期する必要が無ければawaitしないことはある)
助かるってどっかの方言なのかな。まったく意味わからなかったw ほぼすべてがc#(とVSの組み合わせ)で助かるか、マルチスレッド関係なくそのぐらい考えとけって項目
>>867 は?c#に特別なギミックなんてないが
君はスレッド使わないほうがいいね
awaitのおかげで非同期書きまくる現代のプログラミングでこんなチェックリストいちいち考えてたら工数足りん それに現代の実行環境は優秀なんでほとんど考えなくていいよう出来てる C#もJavaScriptもそう C++とはもう時代が違う ・シングルコアで動くか?→普通に書けば当たり前に動く ・応答がないときに自決するか?→普通に書けばライブラリ側からタイムアウト例外出て落ちる ・失敗時のメモリリークはないか?→普通に書けばあり得ない ・タイムスケジュールはあるか?(例:1分の内AスレッドはX秒、BスレッドはY秒等)→大半のケースで環境に任せるのが正解。制御したいならより上のプロセスレベルで制御する ・生存確認方法はあるか?→死んだら例外でる出てないなら生きてる ・実行中の状態は取得できるか?→大半のケースで取得要件はない ・ログは出力できるか?→出来ないことなんてあるの? ・最大使用メモリは把握できているか?→環境に任せるのが正解。したいならより上のプロセスレベルで制御する ・失敗時のリザルトの受け取り方法は適切か?→例外で標準化されてる ・処理が複数失敗する可能性は考慮できているか?(例:ファイルオープン成功→ファイル書き込み失敗→ファイルクローズ失敗→tempフォルダ削除成功のとき何が返る?)→例外出たら止めろ。例外出ても進めるならしっかり設計しろ。そしてそれは非同期関係ない ・本体終了時に終了できるか?→普通に書けば猶予期間内に終了する。ロングランニングの時だけ気をつけろ
各アプリケーションの機能テストで確認すべき項目と 非機能要求のテストで確認すべき項目と フレームワークの仕様テストで確認すべき項目と 全部ごちゃ混ぜだから分かりにくい タイムアウトを含め失敗時の振る舞いは一般的な品質レベルなら全部テストする項目
組み込みになるとシングルコアで動くのにマルチコアで動かないとか、通信ライブラリが処理をつかんだままだとほかのスレッドが止まるとか(それマルチスレッドなのか?でも本当に起きる)
そんな感じになっていくからな。特にFreeRTOSは・・・
c#だとlockとかを知らないと色々トラブル。そっちの方が重要だろ
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/statements/lock doxygenって何処のスレで質問すれば良いですか?
>>870 。oO(ああ、こいつダメだ、経験が少なすぎてなんも当たったことねぇのなw)
GUIアプリ作るのにシングルスレッド縛りはありえねーって
>>878 GUIアプリでシングルスレッド縛りだと重い処理で画面固まってるように見えてしまうからうまく行かないね
>>870 のどこがダメなのか分からない
スレッド制御を自前で1から書かなきゃいけなかった00年代ならともかく
async/awaitにほぼすべてを任せられて非同期を安全お手軽に書けるようになってる時代なのにさあ
脳みその中もPentium4あたりで進化が止まった老害が
async/awaitを当たり前に使う現在のコーディングスタイルについていけなくて
誰彼かまわずケチをつけてるだけにしか見えない
年取ってこういうゴミみたいなジジイにはなりたくないもんだ
何がしたいかによる await/asyncを使うのは主に外部要因で待たされる時 ダウンロード残り1GBとかSQLサーバーからレスポンスが2秒以上かかってるとか そういう感じの時クルクル回したりプログレスバーとキャンセルボタンが欲しいわけ ボタンすら反応しませんだと、クソ重いソフトと因縁つけられちゃうの 一方マルチスレッドでCPU100%がん回しですってのがしたいことだったら Partitioner.CreateとParallel.ForEachを使うawait/asyncは関係ない
大半のケースで考慮不要 この一言でまあそうだよねと納得できないなら開発経験不足としか言えん
もともとがc#に合わせた話じゃないからどうとでも読み取れちゃうんだよ 分かりやすいとこで言えば例えば > ログは出力できるか?→出来ないことなんてあるの? プログラミングの話をしてるのだからきちんと意図通りに動くことを把握するためのDebug.WriteLineのようなログと捉えたらできないことなんてあるの?となる でもログファイル出力と捉えたら、マルチスレッドから同じファイルに対して書き込もうとして・・・なんてできないこともある
そんなのはloggerがなんとかしてくれるから気にするな つか今時はログは全部標準出力でいい 標準出力を拾って何処に吐くかは環境が担当するところ
>>883 > でもログファイル出力と捉えたら、マルチスレッドから同じファイルに対して書き込もうとして・・・なんてできないこともある
キューに書くなりして排他制御するだけじゃね?
そうなんだよ だからログ取るならこのクラス使え(c#が勝手にスレッドセーフにしてくれたり管理するよ) マルチスレッドからファイル操作するならlockで排他制御しろ(自分でスレッドセーフにしないとトラブルぞ) ってチェックシートならいいんだけどな
オラオラ交通整理マン仕事しろや早く議論スレに誘導しろよ まさか交通整理マン自身が議論してるんじゃねえだろうな?ん? まあ、個人的には議論は結構だけど論点は明確にして欲しいね。 正直何を争ってるのかさっぱり分からんw こんなあいまいな話で藁人形と戦ってる奴って普段よっぽど邪険にされてるのかねwww
>>886 > マルチスレッドからファイル操作するならlockで排他制御しろ(自分でスレッドセーフにしないとトラブルぞ)
スレッドセーフならいいって話じゃないことぐらいは理解してから議論に参加しようよ…
凄まじく複雑な相談なんだけど良い? インスタンスと対になる鍵オブジェクトって xxxIdかxxxKeyかxxxTokenのどれで名付けるべき? ちなみに中には格納番号が入っててリポジトリからインスタンスを引き出すのに使う
初心者スレだぞ 簡単な使い方ならともかく なんか動かんだのデータ壊れただのデッドロックしただのの対策を一気に詰め込んでも無理でしょ
>>891 そもそも専用クラスにする必要あるの?
っていうかこの板命名スレもあるよ
いや目くじら立てて行くべきと言いたいわけじゃないw
IDを使うときは配列でインデクサがある、とか Keyを使うときは辞書でKey-Valueの対がある、とか Tokenを使うときは重複しない文字列(大抵はハッシュ)が入ってる、とか そういう話なのかな、C#とどう関係するのか知らんけど
object xxxと対になる鍵オブジェクト = new object();
TextBoxの高さに合わせてFormの高さを調整したいのですが、下記のようにすると、TextChangeのたびに高さが減ってしまいます。 何が原因でしょうか? private void textBox1_TextChanged(object sender, EventArgs e) { textBox1.Height = textBox1.Lines.Length * textBox1.Font.Height; ClientSize = new Size(ClientSize.Width ,textBox1.Height); }
TextBoxの高さに合わせてFormの高さを調整したいだけなのに textBox1.Height = でテキストボックスの高さまで変更してるからでは?
>>897 一回目の呼び出しで
フォントの高さに合わせてtextBox1.Heightを設定する(小さくなる)
textBox1.Heightの高さに合わせてフォントの高さが変わる(小さくなる)
二回目の呼び出しで
フォントの高さに合わせてtextBox1.Heightを設定する(小さくなる)
textBox1.Heightの高さに合わせてフォントの高さが変わる(小さくなる)
というループだからでわ?
少なくともtextBox1.HeightはtextBox1.Font.Height より少し大きいはずだから
そのまま代入していくとどんどん小さくなるんだと思うわ
>>897 これで出来た でも何か気付いてない問題がありそうw private void textBox1_TextChanged(object sender, EventArgs e) { var delta = textBox1.PreferredSize.Height - textBox1.Height; Height += delta; textBox1.Height += delta; } TextChangedのイベントごとにHeight+=deltaの設計自体良くないとは思う イベントごとにテキスト内容からHeightの再計算させるなら理解できるが
>>902 言いたいことは分からないでもないが、
恐らくセッター自身にプロパティーの値に変更がなければ何もせず戻る処理が
入っているはずなので考えすぎ。
実際問題動かしてみてそれに起因する問題があるようには見えない
WinFormsのListViewで、仮想モード、LargeIcon表示にしたとき
Shift+マウスクリックでの項目の範囲選択がクリック位置より広く選択されてしまいます。
以下は2008年の古い情報ですがWindowsXPの不具合のため回避困難とあります。
https://social.msdn.microsoft.com/Forums/ja-JP/484c578a-df46-4624-a4e7-99ceaa0588ef/2020624819212701237512383listview12391389173044612398350792596836?forum=vsgeneralja Windows10でも解消していないようなのですが、
検索しても有用な情報が見つからずどなたか回避できてる方いないでしょうか。
スクリーンロックを抑止したくてネットで調べて下のようなプログラムを書きました。 static async void Test(){ for(;;){ SendKeys.Send("Break"); await Task.Delay(10000); } } 目的は達成したのですが、Test()メソッドを終了するにはどう書けば良いでしょうか? よろしくお願いします。
static bool _stopTest; public void StartTest() { _stopTest = false; Test(); } public void StopTest() { _stopTest = true; } static async void Test() { while( !_stopTest ) { SendKeys.Send("Break"); await Task.Delay(10000); } } 止めたいところでStopTestを呼ぶ
CancellationToken使おう private CancellationTokenSource cts = new CancellationTokenSource(); private Task task; public void Start() { this.cts = new CancellationTokenSource(); this.task = Test( cts.Token ); } public void Stop() { this.cts.Cancel(); this.task.Wait(); // 必要があれば } static async Task Test( CancellationToken ct ) { while ( ! ct.IsCancellationRequested ) { SendKeys.Send( "Break" ); try { await Task.Delay( 10000, ct ); } catch ( TaskCanceledException ) { } } }
>>842 >> c# + visual studioでデータブレークポイント使えますか?
これひょっとして使えな
c#でAddressSanitizerみたいなツールはありますか? >>これひょっとして使えな これは「これひょっとして使えないのでは?」です
https://stackoverflow.com/questions/209281/c-sharp-equivalent-to-javas-wait-and-notify l
foo.notify() => Monitor.Pulse(foo)
foo.notifyAll() => Monitor.PulseAll(foo)
foo.wait() => Monitor.Wait(foo)
>>907 だと、クリティカルタスクの最中に例外が起きたら壊れそうだなw
>>906 は、Pulseが抜けてる
ピクチャーボックスに直線を実寸(o)で引きたいんですけど、どうすればよいですか?
GraphicsオブジェクトのPageUnitプロパティを変更する
>>913 GDI+はたぶん常にdpiを96dpiと仮定しているので
モニターのdpiが96dpiなら
>>914 で上手く行くがそれ以外の場合は
自分でページ変換を設定しないとだめだと思うよ
GDI+のDPIは可変だよ 印刷にも使うんだから 描画先がモニタの場合WindowsのDPI設定に依存して変わる 例えば125%なら120dpiだな まあDPI設定に従うだけでモニタのDPIは恐らく別だからモニタ上で正しく表現できるわけではないけど
>>916 それってやっぱりモニターの解像度は96dpi固定ってことだろ
32インチ4Kスケーリング100%なら138dpiが取得できる方法を示さないと
>>916 印刷時に物理単位(mmやインチ)を選択できるのは
プリンタの場合はdpiを報告する仕組みが最初から確立してるからで
ディスプレーの場合は残念ながらそうじゃないんでいろいろややこしいよw
質問させてください。 起動すると適当な番号でhttpポートを開くアプリがあります(仮にaaaa.exe) このaaaa.exeのパスが分っている状態で、アプリが使用しているポート番号を取得したいのですが、どのように処理したら良いでしょうか?
>>919 対象プロセスのプロセスIDを取得してGetExtendedTcpTable/GetExtendedUdpTableで取得できるデータと突き合わせる
>>920 >>921 ありがとう。今日の夜試してみる。
スクリーンロック抑止の者ですが、遅れながらメカニズムを理解できました! ありがとうございます! SendKeysで"Break"を定期的に押すと文章書いてる時に ガッツリ消えるので、何のキーが良いかは探求したいと思います。
似たようなソフト作ったことあるけど、キーを押下するよりマウスを現在位置から現在位置に移動するほうが普通に使ってるときの影響なくていいよ
>似たようなソフト作ったことあるけど、キーを押下するよりマウスを現在位置から現在位置に移動するほうが普通に使ってるときの影響なくていいよ キーインする限り、どんなに使わないキーでも影響は避けられないと気が付きました。 マウス操作をトライしたいと思います。ありがとうございます。
画面ロックというのが具体的になんなのかだけど Windowsシステムのスリープとか退席モードのことならAPIで抑制した方がいいのでは
そりゃSetThreadExecutionState呼んでるやろなあ
あとはキーボードフックでWin+Lを握りつぶせるかだな
>Windowsシステムのスリープとか退席モードのことならAPIで抑制した方がいいのでは SetThreadExecutionStateを使うことでやりたい事がダイレクトに出来ました。 ありがとうございます! キーイン、マウスカーソルぷるぷるも、非同期処理の使い方を知れたので、 実り多かったと感謝しております。
質問させてください EntityFrameworkを使用して自PC内(localhost)のPostgreSQLを操作しています 普段正常に参照や更新といった処理は出来ているのですが、極々まれにデータベースとの接続がタイムアウトするケースがあります データベースのログにもエラー等が無く、なぜタイムアウトになるのか根本の原因が掴めていないのですが、試しにタイムアウト設定の秒数を伸ばしている状態です お聞きしたい事は、EFは接続に失敗した場合、タイムアウトの秒数になるまで何度もリトライしているのでしょうか? また、失敗したクエリを再試行する事は可能なのでしょうか? 直接C#とは関係のない質問かもしれませんが、アドバイス頂きたいです
ほんとにタイムアウトなのかい? どこか閉じ忘れて接続数上限まで使い切ってるとかは?
PostgreSQLだと割とあるみたいね、接続数の上限というの
>>935 ありがとうございます
接続する際はusingブロックで囲って使用しているので解放漏れは大丈夫だと思ってはいます…
(こういう接続の仕方です:
https://qiita.com/Nossa/items/b6d84aeb134abc85f027 )
接続数に関してもpg_stat_activityを使用すると、タイムアウト発生時は見れていないのですが、正常時は15程度でした(デフォルトはMax100)
>>938 System.TimeoutExceptionとSystem.Data.Entity.Core.EntityExceptionが発生している事は確認出来ました。
ただ、例外処理を書いていなかったので「ハンドルされていない例外が発生しました」以上の情報は得られませんでした…
これらを調べても接続文字列が正しいか確認をするなどの記載が多いのですが、基本的に処理が正常に行われているのでここは問題ないのではかと考えてます…
接続上限を疑って再現を目指すなら接続数をデフォルトから100→10に変えてもいいと思う ありうるシナリオは接続上限→接続空き待ち→待っても開かないからタイムアウト
>>934 に便乗して
NpgsqlでDB接続するコンソールアプリを1分おきに起動するタスクがあるんだけど、
それなりの頻度でStsyem.TimeoutExceptionで接続失敗しちゃう
どこに問題があると疑うべきなのかなあ
と思っていまログを確認したら
半年くらい前までは2〜3日に1回(=1/1000〜1/5000位の確率)でTimeoutしてたのが
最近だと月1回くらいしか起こらなくなってた・・・
環境というかPostgreSQLサーバの負荷等の問題だったのかな・・・・・・?
同時に書き込アクセスできず待たされるのはよくある 書き込んでる奴が時間かかってたらタイムアウト プログラミング分かりやすくするなら、DBアクセスは排他処理して同時に複数接続しない。それで失敗はなくなるだろ
>>939 TimeoutExceptionのエラーメッセージに何をした時にタイムアウトが発生したのかが書いてあるから
まずそれを確認したら?
一概にタイムアウトと言っても、「接続タイムアウト」と「コマンドタイムアウト」があるからどっちが発生しているかをよく確認しないとね。
接続文字列のTimeout、CommandTimeout
(もしくはコード上でef経由で個別設定しているとか)
>>939 npgsqlが吐いてる例外をInnerExceptionで見れません?
- 詳細エラーメッセージ - npgsqlとpostgresのバージョン - 再現コード この3点セットがあれば誰か調べてくれるよ .NETやOSの情報もあればなお良い
>>940 ありがとうございます
なるほど、確かに下げてみれば再現が出来るかもしれません
早速試してみます
これで同じエラーが出てくれれば良いのですが…
>>944 タイムアウト設定に関して、Timeout、CommandTimeout共にデフォルトで運用していました
現在試しにそれぞれ60に伸ばしています
InnerExceptionは例外の詳細ですよね?
お恥ずかしい話ですが、例外処理を書いていなかったため、今回このエラーが分かったのもwindowsのイベントビューアで発見しました
急遽例外処理を入れたのですが、エラーが再現せず…
>>945 ありがとうございます
現在分かるエラー内容
@System.TimeoutException
ASystem.Data.Entity.Core.EntityException
各種バージョン
Npgsql:ver.4.1.3.0(ランタイムver.v4.0.30319)
PostgreSQL:PostgreSQL 13.3, compiled by Visual C++ build 1914, 64-bit
.NetFramework:4.6.1
OS:Windows10pro
エラー発生箇所コード
static void GetStartProcessTime()
{
using (var context = new DbContext())
{
var processingTimeTable = context.CheckprocessingTimeTable.First(x => x.id== 1);
processingTimeTable.CreateDate = DateTime.Now;
context.SaveChanges();
}
}
>>947 すいません言葉足らずでした
エラーはその2つの例外情報は分かるのですが説明は「ハンドルされない例外のため、プロセスが中止されました。」となっており、それ以外はエラーに至るまでの内部的な関数?が呼ばれた場所が記載されている状態です
その呼ばれた場所の最後が、エラー発生箇所コードとして記載させて頂いた部分です
>>856 これをありがたいと思うのは変な人
分からないでありがたがってる
>>870 が正解
まずは作成日みたいなフィールドを後で更新するなと。
>>947 これ同じ処理が複数同時に走る?
複数同時に走る場合でread committedならデッドロックになるケースじゃない?
それが原因かどうかはわからないけどlog_lock_waitsがoffならonにしてしておくといいかも
>>949 ちゃんとチェックするとこに行ったら全弾被弾して
○○さんって大したことないよねって評価をいただくわけですね
スタイリッシュなつもりでいるようだけど自分の処理の状態も把握できないもん作って悦に浸ってるのがダセェ お前がよく見るのはあくまでサンプルだからな
>>951 デッドロックやDB上のロックタイムアウトなら、普通はDBサーバ上で確認できるだろ
まず何がエラーになったのかちゃんと確認すべきじゃね
DB側で何の(接続要求すらの)感知もできてないなら、おれならまずはネットワーク系の問題を疑うがな
ソケットの枯渇とか名前解決の不具合とかファイアウォール関係とか、その辺があやしい
>>951 ありがとうございます
このGetStartProcessTimeが複数の箇所で同時に呼ばれる事はありません
教えて頂いた設定等は私の知識不足で全然触れたことがないので一度調べてみます
>>954 ありがとうございます
postgresのログも見てみましたが、タイムアウト発生時にはエラーや何らかの処理をしているログ自体ありませんでした
データベースがEntityFrameworkから接続を要求されているというのは後からでも見ることが出来るのでしょうか?
>>954 >まず何がエラーになったのかちゃんと確認すべきじゃね
そりゃそうよ
ただ本当に詳細が確認できない状態で再現もできないのなら
次に発生した時に情報を取れるようにしておくのは重要
DB側のログで何が確認できるかは設定次第
https://www.postgresql.org/docs/current/runtime-config-logging.html そもそもタイムアウトが起きるぐらいの処理時間かかってるの?
>>952 c#のwindows環境でシングルコアで動くか?ってやってるところどこにあるんだよ
脳みそ何のために使ってんだ?
>>955 自PC内ってことだったからnpgsqlのtraceレベルのログも仕掛けといたら?
NpgsqlLogManager.Provider = new ConsoleLoggingProvider(NpgsqlLogLevel.Trace, true, true);
https://www.npgsql.org/doc/diagnostics/logging.html >>957 各クエリの時間を測った事は無いのですが、アプリケーション自体の一連の処理が0.5〜0.7秒程度で終わっているので、今回のDBへの接続がタイムアウトになるほど長くかかる事は通常は無いと考えています…
テンプレートにあったサイトを使ってエラーを記載してみました
上手く出来ているか分かりませんが、以下が現在確認出来ているエラー内容です
https://ideone.com/rIerhm >>958 っていうかそういう自分の思い込みでしか物事を判断できないから
バグまみれのスレッド立てても気にもならないんだろうな
シングルコアで動かしたログがあればマルチコアで並列で動作してるか
どうかチェックになんだろ
得にオメーのはどうせ並列でなんか動いてねぇからシングルでもマルチでもログかわんねーだろw
>>961 シングルコアが分からないなら口出ししなければいいのに
あなたの会社ではどのシングルコアCPUを搭載したwindowsPCでスレッドの動作確認を行っているんですか? そんなことしてる会社などないだろ
初代ラズパイ+monoかな 脳みそ何のために使ってんだ? ← 妄想
>>963 わざわざ相手するなよ
その人ろくに有益なこと言えないのにひたすらマウント取ろうと粘着するから
無駄にレス流れて迷惑なんだよ
脳みそはマルチコアでも容量が1bitしかないようだなハハハ
Windowsフォームのプログラムをタブレットでも使いたいという要望があったのですが comboboxのスクロールバーを大きくすることはWindowsフォームで出来るでしょうか? というかタブレットかつ高解像度のPCが出てくると いよいよWindowsフォームがキツくなってきた気がします。
>>968 プロパティでどうこうみたいなお手軽な方法は無くって、カスタムコントロールを作るとかしないとダメだった気がする
つーかAndroidタブのコンボボックスにスクロールバーなんかないよね 指で操作するためのUIに変える必要があるってことよね オーナードローなんかで解決するかな
>指で操作するためのUIに変える必要があるってことよね フォームアプリがタッチパネルに反応するだけでも御の字と思っている状況なので、 出来るなら是非とも欲しい動作です。
>指で操作するためのUIに変える必要があるってことよね フォームアプリがタッチパネルに反応するだけでも御の字と思っている状況なので、 出来るなら是非とも欲しい動作です。
スクロールバーを出ないぐらいコンボボックスの範囲を大きくしておけばいいのでは? オーナードローとかしだしたら大変だからやらない方が身のためかもしれない
WPFのコンボもフリックしてタップで止めるとかできないんだっけ? まあWPFの方が不十分とはいえ一応タッチパネル系のイベントに対応してるんで できるならWPFで作り直した方がいいんだろうねたぶん
>>975 これできないな。メッセージ飛ばせば終わりだろと思ったけどまったくだった
コンボボックスやめてパネルにでかいボタンを並べてスクロールさせるかリストボックスだな そうなるとやっぱオーナードローか
.Net6.0にしようとしたらSJIS削られてて焦った
>>979 まじかよ、俺社一生使えないじゃん・・・
CodePageEncodingProvider.Instance.GetEncoding("shift-jis") こんな感じで取得できたはず
CP932とshift-jisは実は別物と2chブラウザを作ったときに理解した 大体20年近く前の話
会社で新しくC++MFCからC#に移行しそうなのですが、結構違いますか?
むしろ共通点はほぼないと思いますよ。 UIにWindows Formを使うならWin32の知識が無駄にはならない程度
>>988 MFCのDocument/View構造とWPFのMVVMは考え方がほんのちょっと似てるかも
ありがとうございます やっぱり違うところもそれなりにあるんですね 本格以降の前に勉強しないと…
Javaと同じ人が作っただけあって Javaのが似てると思います
MFCとC#のWPFなら基本的にまるで別物だよなぁ WinFormsも別物だけど、C++よりはC#の方が簡単だと思うけど ラムダ式やらその辺の書き方に付いていけない奴は結構いるらしい staticおじさんにはC#は辛いかも知れないw
JAVAじゃなくてDelphiでしょw JAVAやC++はむしろ反面教師として否定的継承をしてるのがC#
MFCのカオスに耐えられた人がC#は理解できないとかないと思うよw ラムダ式なんてむしろC++やってた人には馴染みやすいでしょ
mfcを初めて触ったときはなんて簡単にwindowsアプリが作れるんだって感動したものだけど、c#はそれより数十倍簡単だからな mfcとc#はまったく違うけど、mfcできるなら一瞬で使えるようになるよ
拡張子がcppってだけのC言語使い方だときついでしょ
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 58日 23時間 48分 33秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250218091712caこのスレへの固定リンク: http://5chb.net/r/tech/1639403601/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「ふらっと C#,C♯,C#(初心者用) Part153 ->画像>3枚 」 を見た人も見ています:・ふらっと C#,C♯,C#(初心者用) Part160 ・ふらっと C#,C♯,C#(初心者用) Part154 ・ふらっと C#,C♯,C#(初心者用) Part148 ・ふらっと C#,C♯,C#(初心者用) Part137 ・【初心者用】虹ヶ咲学園入門スレ ・PC版限定【仁王/Nioh】初心者用 ・PC版限定【仁王/Nioh】初心者用 ・くだすれFORTRAN(超初心者用)その6 ・くだすれFORTRAN(超初心者用)その7 ・【初心者用】マイニング情報交換スレ30 ・【初心者用】マイニング情報交換スレ36 ・Webサイト制作初心者用質問スレ part253 ・【第五人格】IdentityV 初心者用スレ 22 ・Webサイト制作初心者用質問スレ part251 ・【第五人格】IdentityV 初心者用スレ 18 ・【まず1嫁】くだすれPython(超初心者用) その56 ・【初心者用】パズル&ドラゴンズ【パズドラ】★127 ・レイプ初心者だけど、これだけは絶対やっとけっていうことある? ・世界情勢を占うマンデン占星術20(研究者用) ・詰めチェス部(初心者歓迎) ・C#でゲームを開発したいんだけど、、、(初心者) ・27: Google AdSense 超初心者スレ35(熟女装師vs薔薇野郎) ・/ ´,_ゝ`\初心者のための富士山登山入門131m(ワッチョイなし) ・初心者△チビー ・初心者Vtuber ・carver初心者 ・精神障害者用金融スレ ・VJ初心者あつまれー ・ほぼ初心者だが… ・自転車初心者です ・SF初心者からの質問 ・麻雀初心者あるある ・5ちゃんねる初心者です ・[級位者用] 棋譜診断スレ ・精神障害者用ゲットー必要論 ・美容整形 初心者 ・鬼初心者から一個質問 ・★完全初心者です★ ・TS初心者勉強会 30頁目 ・絵初心者が頑張るスレ ・将棋ウォーズ級位者用 88手目 ・菜食主義初心者スレ 2 ・ダイエット初心者 ・浪人初心者 Part2 ・将棋クエスト 級位者用スレ 10 ・BL/YT 初心者質問用スレ ・初心者の俺に教えてくれ ・ダテめがね初心者のスレ ・初心者登山相談所123 ・初心者特定班つくらない? ・作曲初心者のためのスレ23 ・ギター初心者応援スレ ・初心者登山相談所90 ・初心者 質問コーナー ・暗黙の了解とかを初心者に教えて ・【患者用】双極性障害 249【コテ禁・総合】 ・FX初心者スレ 323pips ・FX初心者スレ 235pips ・FX初心者スレ 231pips ・パソコン初心者だけど ・冬山初心者スレ その73 ・FX初心者スレ 244pips ・FX初心者スレ Part96 ・FX初心者スレ 226pips ・FX初心者スレ Part85
23:43:57 up 50 days, 47 min, 0 users, load average: 7.97, 8.92, 9.09
in 0.82040190696716 sec
@0.82040190696716@0b7 on 030413