ふらっと C#,C♯,C#(初心者用) Part153

■ このスレッドは過去ログ倉庫に格納されています
2021/12/13(月) 22:53:21.18ID:dhjmiKBp0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part152
http://mevius.5ch.net/test/read.cgi/tech/1629888256/
■関連スレ
C#, C♯, C#相談室 Part94
http://mevius.5ch.net/test/read.cgi/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
2021/12/14(火) 15:04:57.66ID:DHQEOVX70
stringデータの容量を小さくしてソフトのAPIに送りたいのですが
APIの都合でstringのまま送らなければならない場合、
これ以上容量を小さくする手段はありませんか?
圧縮したバイナリデータをどうにか送信できないかと調べたのですが無理そうで……。
2021/12/14(火) 17:52:43.39ID:vmKXmndG0
何らかの方法で圧縮できたとして
受け取る方のソフトは圧縮されたデータを伸長できるの?
2021/12/14(火) 17:56:17.81ID:WeLzug3DM
uudx / uuex か?
2021/12/14(火) 18:19:29.34ID:DHQEOVX70
>>3
圧縮して送りたいのはただのセーブデータなのですが、
サーバー側の保存形式がstringを使ったkeyValueで作られているので文字列形式でしか保存できないみたいで。
保存しておいた文字列をこちらで読み込んでからデコードすればいいのでstringのまま圧縮できればよくて、
どうせ日本語までしか扱わないデータなのでSHIFT-JISをutf-8で圧縮……みたいなことができれば理想なのですが
そんなピンポイントなのあったりしませんよね、と……。

>>4
解釈があってるかはわからないのですが、
一応圧縮したバイナリデータをBase64でConvertみたいなことは試してみたものの
容量を減らすという目的ではむしろ文字数が増えてしまって。
何か手段がないかなあと思っている次第です。
6デフォルトの名無しさん (ラクッペペ MM8f-JWjg)
垢版 |
2021/12/14(火) 18:26:30.90ID:QT7QgCvlM
使用できる文字に番号振って
圧縮したバイナリを文字に割当る
いわゆる復活の呪文方式
文字が足らなければ32bitsバイナリを31bitsにずらしていくなど工夫してみな
2021/12/14(火) 18:35:23.50ID:70QYvgE2a
>>5の文章はユニコード(utf16)で720バイト、ユニコード(utf8)で921バイト
>>5の文章をzip圧縮したらバイナリで678バイト。その圧縮バイナリを2文字ずつ(utf8)にしたら2倍の1356バイト(圧縮したらバイト数が増えた)
でも前スレ(utf16で348,236バイト)を圧縮したらバイナリ104,639バイト、圧縮utf8で209,278バイト。圧縮したバイナリをテキストにしたほうが小さい

送りたいデータ次第じゃ一度圧縮してから無理やりテキストにした方が容量小さくなるから
どっちが有利か生と圧縮を自動選択しながら送る手もある
2021/12/14(火) 19:00:02.18ID:DQcTzC4QM
通常のデータ圧縮は8ビットフルに使うので、
そのままでは難しいのでuuと組み合わせて作ったら?
2021/12/14(火) 19:40:08.80ID:vmKXmndG0
UTF-8でバイナリ化してdeflate圧縮してBase64化した後2文字ずつを1つのcharに詰める
まあ基本ライブラリで手軽にやるならこんな感じじゃない?
2021/12/14(火) 20:14:03.30ID:4rMew3mV0
7zかなにか圧縮率の高い奴で圧縮しておいてbasE91だな。
http://base91.sourceforge.net/
2021/12/15(水) 07:44:21.38ID:viWcJGha0
圧縮することによっぽどのメリットがないと無駄にややこしくなるだけだぞ
サーバー側が必要に応じて圧縮するのが筋かと
UTF-8に変換して送信とか脆弱性の問題もあってサーバー側で禁止してることもある
2021/12/15(水) 08:20:09.42ID:KIyi4EVP0
皆さんありがとうございます! Base64化したものを自分でさらに詰めるというのは思いつきませんでした……なるほど……。
BasE91もまさに机上論こねくり回してるときに欲しかったものの気配がするので中身覗いて調べてみます!

>>11
こちらは利用する側なのでサーバーの仕様を変える事はできず、
用意されたフォーマット(これが文字列形式での送信)従うしかないやつですね。
ユーザー毎に使用可能なデータの容量が決められていて(しかもそれがやたら少ない)、
少しでも軽減するためにこちら側でデータを小さくできないかと画策しています。
2021/12/15(水) 08:43:57.49ID:doly6UKJ0
ビットマップ間で部分的に画像コピーするのはDrawImageでできますが
コピーする際に左右を反転してコピーする方法はないでしょうか?
検索でビットマップ全体をまるごと反転する表示はたくさん出てくるのですが
DrawImageの部分コピーで反転するのは見当たらないのです
2021/12/15(水) 09:39:43.96ID:SWORTfJ40
g.ScaleTransform(-1, 1)
描き出す先の座標も反転するから座標指定注意
2021/12/15(水) 10:18:47.15ID:IF/hKOzS0
できました、ありがとうございます
2021/12/15(水) 20:55:12.09ID:KtX6zlRp0
DrawImageに渡すWidthやHeightを負の数にするだけで反対向きに描画するよ
2021/12/15(水) 22:41:30.07ID:9OkRwsNs0
LinuxでC#でソフト作りたいのですが
.Net 6とmonoは同じものでしょうか?
2021/12/15(水) 22:58:53.71ID:RALnEWNsa
monoは.NET4.6か4.7相当
2021/12/15(水) 23:37:58.07ID:9OkRwsNs0
ありがとうございます
.Net 6をインストールしました
2021/12/16(木) 12:03:30.27ID:GoezKG390
 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);
  }
 }
2021/12/16(木) 12:04:03.26ID:GoezKG390
このプログラムbutton1押しで開始して、キーが押されるとループ中のブレークポイントで止まるものなんですが
これで一般文字キーを押すとちゃんとブレークポイントで止まりkeyCodeが確認できます
Enterキーを押した場合はなぜか止まりません
anThread();のように別スレッドから動かさずに直接test();で呼ぶと
一般文字キーもEnterキーの時も止まりkeyCode 13が確認できます
別スレッドで動かした時に、Enterキーの時だけForm1_KeyDownさえ呼ばれなくなるのは
どうしてでしょうか?
2021/12/16(木) 12:25:18.98ID:6kTxk0Gya
直接呼びで停まる?
直接呼ぶと無限ループに入って、keycode変数が変化しないから(代入が行われるのはループの外だから代入が起きない)
ブレークポイントに入ることもないんじゃないかな?
ここに書き込む過程でコードを書き換えたなら、そこで略した部分に問題ありそう
2021/12/16(木) 12:36:40.33ID:GoezKG390
いえ止まるというのはブレークポイントで止まるので正常に機能しているということです
直接呼びの時はEnterキーでもkeycode変数が変化するのです(正常)
別スレッド呼びにした時にEnterキーだけ変化しないようになります 文字キーは変化します
button1にEnterキーが吸収されてるのではないかと思い
button1.Visible = false;
button1.Enabled = false;
さらにForm1.KeyPreview=true;
としたのですが、結果は変わりませんでした
2021/12/16(木) 12:59:19.79ID:6kTxk0Gya
デバッグ開始する
ボタン押す
enter以外のキーを押す=止まる
再開する
enterを押す=止まらない
って順番ということ?それならreturnで抜けてるから

デバッグ開始する
ボタン押す
enterを押す=止まらない
enter以外のキーを押す=止まる
って順番ということ?
2021/12/16(木) 13:04:12.22ID:GoezKG390
そうですね、デバッグ実行は毎回やりなおしてますが
enterを押す=止まらない ここのところですね問題は
Enterキー故に何かわからないですがviewのどれかに吸収されてるんではとも考えられるんです
2021/12/16(木) 13:11:56.87ID:GoezKG390
inr fs;
 public void button1_Click(object sender, EventArgs e)
 {
  if (fs==0) {
   button1.Visible = false;
   button1.Enabled = false;
   anThread(); // ここをtest();に変えると直接実行になる
  }
  fs=1;
 }
2021/12/16(木) 13:12:29.66ID:GoezKG390
もっとボタンのとこ具体的にかくと上のようにして一度しかtest()呼ばれないようにしてます
2021/12/16(木) 13:19:59.88ID:6kTxk0Gya
なら
KeyPreview=true;

protected override bool ProcessDialogKey(Keys keyData)
{
return false;
}

protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
}
2021/12/16(木) 13:24:57.28ID:GoezKG390
おおEnterキーでもブレークポイントで止まるようになりました
ありがとうございます
2021/12/16(木) 13:28:58.72ID:lYga0rvW0
Formに配置したbuttonがEnterキーの制御を奪うから
その前にFormでキーを取得したいならPreviewKeyDownイベントを使う
31デフォルトの名無しさん (ワッチョイ e701-p36F)
垢版 |
2021/12/16(木) 14:09:04.68ID:i/INwEgL0
docs.microsoft.com/ja-jp/dotnet/api
にバージョンとかあって.NET 6とか選択するじゃないですか?
これって、どれを選べばいいのでしょうか?
自分のPCにどの.NET入ってるか調べる方法はありますでしょうか?

よよろしくおねがいします。
32デフォルトの名無しさん (ラクッペペ MM8f-JWjg)
垢版 |
2021/12/16(木) 14:38:33.33ID:k8cIynuMM
自分のPCではなくユーザーの環境を考えて選ぼう
Windows2000なら2.0
WindowsXPなら4.0までしか使えない
33デフォルトの名無しさん (ワッチョイ 675f-Rkf/)
垢版 |
2021/12/16(木) 15:37:50.09ID:y2oCKs8P0
今から始めるなら.NET 6選んでおけば問題ない
34デフォルトの名無しさん (ワッチョイ e701-p36F)
垢版 |
2021/12/16(木) 17:43:59.24ID:i/INwEgL0
Environment.Versionだと6.0.0
RuntimeEnvironment.GetSystemVersionだとv4.0.30319でした
35デフォルトの名無しさん (ワッチョイ e701-p36F)
垢版 |
2021/12/16(木) 17:53:32.89ID:i/INwEgL0
System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription
だと.NET 6.0.0-rtm.21522.10でした
36デフォルトの名無しさん (ワッチョイ e701-p36F)
垢版 |
2021/12/16(木) 17:56:18.18ID:i/INwEgL0
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
2021/12/16(木) 18:05:33.14ID:6CYDlCWX0
https://i.imgur.com/jv9gyBg.png
2021/12/16(木) 20:33:18.00ID:SBcuHk850
mauiって流行りますか?
2021/12/16(木) 20:45:26.99ID:9+J81CzA0
Xamarinって流行ったか?つまりそういうことだ
2021/12/16(木) 20:53:46.41ID:p4ec86X90
人脈が無い人には無理
2021/12/16(木) 21:37:09.74ID:nAiVmB6z0
mauiも期待はしてるけどいつも通りなんだろうなあ。。
2021/12/16(木) 22:11:02.45ID:6kTxk0Gya
マルチプラットフォームっていう目的での利用は流行らないだろうな
でも普通にGUIアプリ作る一手段としては使われるんじゃないかな
2021/12/16(木) 23:26:32.48ID:el7qs11a0
言語仕様が多すぎてうんざり。
2021/12/17(金) 00:31:22.94ID:A3/Tt7aa0
Linuxに本気で移行しようと思う。
2021/12/17(金) 01:19:48.74ID:OxYtcTfz0
>>44
おっ、.NET Core + Linux いいね
2021/12/17(金) 01:35:44.89ID:0Acfg8Fxd
これからMSワールドの外へ出てみたら実感すると思うけど、MSスタックは全部MSで揃えて他には見向きもしなくていい状態にこそ意義があるんだよ
いったん外にはみ出し始めちゃって歯車が狂うとたちまち不便なところばかりが目につくようになって、気がついたらMS成分は跡形も残らない、という結果になるのがオチだ
MSスタックをディスるつもりはなくて、これはむしろ最大限の賛辞だ
2021/12/17(金) 08:09:16.08ID:GkoM7wOP0
あれ?MAUIのターゲットにLinuxが入ってない。。。
https://docs.microsoft.com/ja-jp/dotnet/maui/what-is-maui
2021/12/17(金) 08:24:00.59ID:ObFlVNVZM
LVGLを使え。という託宣。
2021/12/17(金) 08:44:31.07ID:dbqWYop50
>>47
linuxはコミュニティによってサポートされます
50sage (ワッチョイ a301-izju)
垢版 |
2021/12/17(金) 11:45:19.21ID:2+pcMu4G0
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
51デフォルトの名無しさん (ワッチョイ a301-izju)
垢版 |
2021/12/17(金) 13:11:43.35ID:2+pcMu4G0
c#を勉強しはじめたのですが、メモリ関連でヒープとスタックというのがあるのを知りました。
で、C#で型がstaticのデータはヒープ領域に格納されるのですか?それともスタック領域に格納されるのですか?
2021/12/17(金) 13:38:19.99ID:g/fCEX7wa
スタックって日常でも使うことあるけど、積み重ねるって意味だからな
積み重ねちゃってるから下にあるものを無理に取り出そうとすると崩れてぐちゃぐちゃになる
だから下にあるデータは上にあるのがなくなるまで取り出せない
データは上下関係なく好きなところにあるデータにアクセスしたいものだからスタックにはしない=ヒープ

でもスタックとかヒープとか覚えなくていいよ
C#のテスト問題にそんなのが出たら「もっとまともな問題出せ」って回答用紙に書いときゃいいし
C#の本やサイトにそんなのが出てるなら投げ捨てときゃいい
2021/12/17(金) 13:41:20.99ID:eUY6ZgLC0
メモリの確保と開放って元々C言語の概念だったよね
Javaではなくなったようだけど
2021/12/17(金) 14:24:53.34ID:A3/Tt7aa0
メモリを確保するのはアセンブラでもそうだよ。開放するのは動的に使うってことだよ。
スタックはCPUの基本機能、ハードで実装、提供されてるものだよ。だから高速。
SPレジスタ書き換えるだけだからね。速いコード書く人はスタック、ヒープは常に意識してる。
2021/12/17(金) 15:05:27.40ID:g/fCEX7wa
そんなの意識するわけないだろ。どう意識するんだよw
アセンブラならpush/pop使うこと多いけど、C#じゃそんなの意識して組むのは非常に困難
意識するのは例えばこれはList<int>よりも基本通りint[]でいった方が速度有利だけど、こっちはListでいいとかそういう(ヒープの)使い方程度だよ
2021/12/17(金) 15:35:53.88ID:Uf0Oj/NFd
Marshal.AllocHGlobal使うときとかヒープ意識するな
2021/12/17(金) 15:38:33.74ID:8qM/JwoR0
大昔独自のC言語使った組み込み開発で、StaticはROMにマッピングされるやつが有った
いやあ、確かに便利だけど言語仕様くらい守れよとは思った
2021/12/17(金) 16:30:31.61ID:xwFg4/y80
ただしstack overflowはバイブルな。
これさえあれば、大抵のことは何とかなる
2021/12/17(金) 17:26:57.23ID:OLbNm50pa
>>51
ちょっと検索した感じだとstaticな「変数」(あくまで変数ね)は
ヒープに置かれるって意見とヒープでもスタックでもないって意見があって
はっきり分からんねw

個人的にはstaticな「変数」は一度staticコンストラクタが呼ばれて
作られてしまった後は管理が不要なので後者の方が正しいように感じるがどうだろう
60デフォルトの名無しさん (ワッチョイ 535f-j66Y)
垢版 |
2021/12/17(金) 19:03:20.75ID:FDMn0ZP00
MSスタックどころかWindowsフォームしかできないのがMSワールドの外に出ることなんて不可能だろうな
2021/12/17(金) 19:14:42.55ID:25ZW3+3Or
C#は適当にGC呼び出せば適切なところでメモリ解放がんばってくれるじゃん
2021/12/17(金) 20:16:20.89ID:hfvLzPNZ0
>>51
メモリ領域にはヒープとスタックとコードがある
staticはコード領域に確保される
コードていうのはそのまんまの意味で命令が書かれてる場所
ちなみにC#のヒープはGCが管理してる特殊な領域
63デフォルトの名無しさん (ワッチョイ a301-izju)
垢版 |
2021/12/17(金) 20:53:34.58ID:2+pcMu4G0
これ??
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
64デフォルトの名無しさん (ワッチョイ 3ebb-fVZy)
垢版 |
2021/12/17(金) 21:35:28.65ID:IQClZtiS0
>>62
>staticはコード領域に確保される

これはあってんの?
2021/12/17(金) 21:40:51.67ID:A3/Tt7aa0
xpSP2以降、自己書き換え禁止されたはずだから嘘だと思うけど
2021/12/17(金) 22:19:09.70ID:RGFXVjzf0
嘘つきはMicrosoftの始まりって聞いたで
2021/12/17(金) 22:37:03.33ID:ePonqmC10
>>64
ざっくりだけどあってる

AppDomainのLoaderHeapのHigh Frequency Heapと呼ばれる場所に
MethodTable Strucureの一部として確保される
Heapと名前がつくがGC HeapやLarge Object Heapとは別で
GCはされずAppDomainがアンロードされるまで生きてる

AppDomainをざっくり言えばコード領域
2021/12/17(金) 23:21:12.45ID:g/fCEX7wa
ざっくり曲げすぎ。そもそもいわゆるコード領域はリードオンリーだよ
2021/12/18(土) 01:21:58.30ID:4KhQcFRSr
とにかくGC連打
メモリ管理をどうこうしようなんて考える必要なし
2021/12/18(土) 01:27:31.41ID:5vur9Hw60
結局、Dispose()だらけで汚いコードだらけみたいな。
2021/12/18(土) 01:36:05.34ID:T7YxQHIHa
いやいや。disposeは必ずしろよ・・・
2021/12/18(土) 01:51:37.69ID:pciZCSWm0
某現場で提供されてたDB接続クラスがIDisposable持ってるからusingで書いたら全然動かん
よく見たらdispose内でロールバック処理が入ってて目を疑った
2021/12/18(土) 02:07:40.04ID:hd7cWOei0
それどうなったの
2021/12/18(土) 02:38:11.15ID:pciZCSWm0
>>73
周りに聞いたらみんなusing使わないようにしてた
ライブラリは別部署からの提供品で、修正してもらう手続きがめんどくさいから・・・
2021/12/18(土) 03:04:40.74ID:+EDLAGXQ0
usingはMSの提供品ならアリ
それ以外のライブラリでは信じるに値しない
精々努力目標がいいとこ
2021/12/18(土) 03:11:34.73ID:4KhQcFRSr
>>72
何そのトラップw
作った奴アホだろ
2021/12/18(土) 03:25:01.34ID:rlJS0/xAa
>>75
別にDisposeの実装だけが特別バグりやすい理由はどこにもないので、
それは羹に懲りて何とかそのものだねw
2021/12/18(土) 03:48:54.74ID:+EDLAGXQ0
別にStreamWriterのusingも疑えって言ってるわけじゃない
ただ、チェックされてる保証がないモノを無条件に信じるのはやめろってこと
少なくともMS提供品以外のusingは使うなら一度はdisposeの実装に目を通したほうがいい

ブラックボックスのライブラリはメモリリークしてても不思議じゃないから場合によっては
別プロセスにしてキックしないといけないかもしれない
2021/12/18(土) 04:00:36.02ID:+EDLAGXQ0
そもそもなまじガベコレなんてあるから
綺麗な後始末にはヘルプをよく読まないといけないクラスが多い気がする

まあ、その前にアプリを終了してしまえば問題は起きないが
サービスとかだとこいつが牙をむく場面が多い
2021/12/18(土) 04:43:58.91ID:QLDMMuZWa
>>78
人の話聞かない人?
だから、同じことはDispose以外の全てのメソッドについても当てはまるでしょ。

他人の作ったものは全て信じられないから使わない。
これなら偏執狂的ではあっても論理的に一貫している。
しかしDisposeだけ疑うのは羹に(
81デフォルトの名無しさん (ワッチョイ a301-izju)
垢版 |
2021/12/18(土) 05:17:14.21ID:4kEqj5670
>>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
2021/12/18(土) 07:53:04.33ID:EMtIeou+0
>>72
トランザクション処理を行っていたらロールバックする仕様は普通じゃね?
2021/12/18(土) 08:55:44.41ID:+EDLAGXQ0
>>80
まあ、確認対象に入るだけとも言うな
2021/12/18(土) 08:59:22.77ID:+EDLAGXQ0
>>82
失敗してないのにやるんじゃない?
usingを正常に抜けるための何らかの条件があってそれがされてないと
disposeで失敗とみなしてロールバックするんじゃね?
その条件はソースを見るか組んだやつしかわからんが
2021/12/18(土) 09:13:54.47ID:4kEqj5670
>>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!");
}
}
2021/12/18(土) 10:36:30.21ID:rkAxz2WM0
https://dotnetfiddle.net/tXv7Oq
ランダムで0〜100までの数値を出して0〜50と50〜80、80~100の場合に分けてそれぞれを表示するプログラムです
場合分けを増やすとどうしてもforが複数回繰り返してしまいます、2回目以降の
for (int i = 0; i < 5; i++)
を1回に抑えたいのですが何かいい方法はありませんか?
2021/12/18(土) 10:42:34.52ID:/Zq/GLbL0
なんかの
2021/12/18(土) 10:43:28.05ID:/Zq/GLbL0
なんかのデータ構造を3つ用意して一回のループで分けるとか
一回全部ソートして前から見ていくとか
2021/12/18(土) 10:46:28.80ID:T7YxQHIHa
linqなんかを使うって方法もあるけど実質同じだからなしだよな
stringをいくつか用意しといて、最初のforの中でconsole出力するんじゃなくてstringに値を格納
for抜けてからconsole出力するとか?
2021/12/18(土) 11:37:28.63ID:5vur9Hw60
普通にcommitしてからdispose()すればrollbackしないんじゃねーの?
原因不明で途中終了されたらrollbackするのは普通に見える。

とにかくデストラクタがC++と同じタイミングで走ってくれれば
C#にdisposeはいらなかったんじゃないのかと初心者のボクは思うわけですよ。
2021/12/18(土) 11:57:23.73ID:EMtIeou+0
>>86
宿題っぽいから単純にメソッドを分けてみたよ
https://dotnetfiddle.net/639EZQ
2021/12/18(土) 12:12:33.65ID:5vur9Hw60
速度重視なのかメモリ効率重視なのかによるよな。
普通は分けたデータは再利用するので3つ分の配列を作ってそこに入れるかな。
なら場合分け処理は最初の1ループ一回しかしないで済む。
2021/12/18(土) 13:11:47.91ID:Y+I1/Zg80
自分も分離と利用を分けるかな。
こんな感じ。
https://dotnetfiddle.net/OMdmbO
2021/12/18(土) 14:04:14.85ID:GkRVZLhXa
>>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++) { ... }

とかでいいんじゃないの?
2021/12/18(土) 14:32:27.17ID:iUN/Cy1s0
>>90
disposeでrollbackするのはConnectionじゃなくてTransactionだと思う
いずれにしても動かなくなるのは使う側の問題だね
2021/12/18(土) 14:56:48.68ID:yfxR8FS90
>>90
正確には、コミットしたあと、何もない処理をロールバックするんじゃないかな
実質何もしないのと同じ
未コミットあるかないか確認するのが丁寧ではあるだろうけど

なんにせよIDisposableなDB接続クラスを未コミットでDisposeするのは使い方が悪いわ
2021/12/18(土) 18:11:55.26ID:iUN/Cy1s0
>>95
うー、俺が間違ってたわ
https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.close?view=dotnet-plat-ext-6.0#remarks
98デフォルトの名無しさん (ワッチョイ a301-izju)
垢版 |
2021/12/18(土) 22:12:35.26ID:4kEqj5670
ここってスキル高そうな人いるみたいだけど、以下でランキング入りできますか?
paiza.jp/botchi/ranking
paiza.jp/steins_gate/ranking
paiza.jp/logic_summoner/top/ranking
2021/12/18(土) 23:03:36.27ID:rkAxz2WM0
色々ありがとうございます、自分に合ったものを探してみたいと思います
2021/12/19(日) 14:12:33.67ID:XEu/0Ow00
1.jpg
10.jpg
2.jpg

1.jpg
2.jpg
10.jpg
のように自然順ソートできるライブラリありませんか?
Windows,Mac,Linuxで動かせるものがほしいです
2021/12/19(日) 14:34:22.80ID:O/qDX0wZ0
ライブラリはないと思うよ
君の言う自然順の定義が適当すぎるからね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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