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

レス数が900を超えています。1000を超えると表示できなくなるよ。
2021/08/25(水) 19:44:16.81ID:tgvUkE6r0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part151
https://mevius.5ch.net/test/read.cgi/tech/1621129559/
■関連スレ
C#, C♯, C#相談室 Part94
https://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/
・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/11/28(日) 23:11:57.25ID:5dBNAjGC0
>>805
個人的に「文法って何?」ってレベルだけどググりながら調べてアプリいくつも作ってる
人に教えたいとかならそういう勉強したらいいけど、それ以外なら不要
2021/11/28(日) 23:29:11.96ID:QHerQIRk0
文法もvsがインテリセンスで教えてくれるし、どこにどんなデータが詰まってるかもデバッグで覗けば推測できる
vsのおかげでテキストで調べる時間が地味に短縮できる
809デフォルトの名無しさん (アウアウウー Sa5b-UL9W)
垢版 |
2021/11/28(日) 23:46:58.95ID:rti4oQQSa
昔formアプリ作るときにc#でやろうとしてイディオムがなんちゃらみたいなの本はお世話になった気がする
2021/11/29(月) 01:24:04.95ID:leVTYOqkd
>>806
車輪の再発明は(コーディングの)勉強中なら良いと思うけどね。
いざ物を造るって時にはやっぱり数多あるライブラリをどう使うかがコスト削減につながるから、欲しいものを見つける力、利用する力ってのは必要だけど
2021/11/29(月) 07:53:47.43ID:nkF9doEfM
>>803
軽く目を通すべ
http://www.kumei.ne.jp/c_lang/index_cs.html
2021/11/29(月) 11:16:06.45ID:BRD3cVdW0
>>810
ライブラリ程度ならまだしも、
極端な話でいえば条件分岐のelseを知らないから全部ifで書くって事が起こりうる
だから子細とは言わないまでも全容を把握する必要はあるってこと
2021/11/29(月) 12:14:41.39ID:HZy6GzpY0
elseなんて害でしかないけどな。
2021/11/29(月) 13:49:48.73ID:h6SrhnyS0
ビットマップ消去埋めで
pen.Color = Color.FromArgb(0, 0, 0, 0);
gr.FillRectangle(pen.Brush, 0, 0, 200, 100);
こうすると透明色は何も描画されません(Javaの場合は透明色で消されます)

pen.Color = Color.Black;
こうすると透明でない黒で消去されます
Javaのように透明色で消すにはどうすればよいですか?
2021/11/29(月) 14:18:42.70ID:692Uu7Kx0
>>814
gr.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0, 0)));
でもだめかい?
2021/11/29(月) 14:19:42.44ID:692Uu7Kx0
>>815
gr.FillRectangle(new SolidBrush(Color.FromArgb(0, 0, 0, 0)), 0, 0, 200, 100);
だった
2021/11/29(月) 14:26:25.88ID:fU6A/Nzl0
同じ結果のようです
2021/11/29(月) 14:33:18.46ID:692Uu7Kx0
>>817
これだな
http://bbs.wankuma.com/index.cgi?mode=al2&;namber=37839&KLOG=65
2021/11/29(月) 14:34:38.77ID:692Uu7Kx0
リンクおかしかった
http://bbs.wankuma.com/index.cgi?mode=al2&;namber=37839&KLOG=65
2021/11/29(月) 14:36:41.83ID:692Uu7Kx0
EdgeからURL貼り付けると&のあとに;が入るな
;を抜いたURLです。
2021/11/29(月) 15:15:14.82ID:fU6A/Nzl0
一応できました 他の事象もでましたが
ありがとうございます
2021/11/29(月) 15:43:55.34ID:eIWrHApta
>>819
これがGraphicsのプロパティーなのは何か間違ってる気がする

まあすべての描画メソッドにいちいちこのオプションを指定する
オーバーロードを実装させるのは煩雑だって判断なんだろうけど
2021/11/29(月) 16:34:12.32ID:/HK8Z1xK0
実はこのあとに次の文字描画が続くのですが
gr.DrawString("ABC", font, pen.Brush, x, y);
一度これをしてしまうと
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

後でSourceOverに戻してもgr.Dispose();して新規作成しても
DrawStringが例外発生して文字が描画できないのです
これの原因がわかりません
2021/11/29(月) 17:42:32.66ID:daOVtdvf0
雑に作っただけだと再現しないねえ
GraphicsのSaveとRestore使ってみるとかどう?

var bmp = new Bitmap(128, 32, PixelFormat.Format32bppArgb);
var f = new Form() { BackgroundImage = bmp };
f.Click += (s, e) => {
var now = (int)DateTime.Now.Ticks;
using (var brush = new SolidBrush(Color.FromArgb((now >> 16) & 0xff, (now >> 8) & 0xff, now & 0xff)))
using (var g = Graphics.FromImage(bmp)) {
g.Clear(Color.Red);
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
g.FillRectangle(Brushes.Transparent, new Rectangle(32, 8, 64, 16));
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.DrawString("あいうえお", new Font("メイリオ", 12f), brush, 0, 0);
}
f.Invalidate();
};
Application.Run(f);
2021/11/29(月) 17:54:00.35ID:/HK8Z1xK0
手数かけて頂いてありがとうございます
今丁度SaveとRestore使っていました
なんとか解決できたようです
ありがとうございます
2021/11/29(月) 23:14:42.20ID:Vvd11AJl0
初めてC#でTaskを触りましたが、分からないことがあるため知っていたら教えてください。
ボタンをクリックしたイベント(1階層目)から3階層下の関数内でTask.Runをして4階層目の関数を実行して3階層目にawaitを付けました。
3階層目の関数は待っているのですが、2、1階層の関数は待たずに進んでしまいました。
原因分かる方いらっしゃいませんか?
イメージとしては↓の感じです。
void btnClick()
→void test1(←進んでしまう)
→→void test2(←進んでしまう)
→→→void test3(←ここでtest4をawait)
→→→→void test4
2021/11/29(月) 23:18:35.41ID:daOVtdvf0
voidなメソッドはawaitできない
test1からtest4まで全部Task返すようにしてそれぞれawaitして
2021/11/29(月) 23:25:00.09ID:6/yij7hO0
これがasync汚染か
2021/11/30(火) 00:27:25.41ID:LFRa8U690
そういう時はtest1〜4を全部同期メソッドにして
await Task.Run(()=>test1());
に変更する
2021/11/30(火) 05:27:43.45ID:YI8pY0990
ありがとうございます。
そうだったのですね、知らなかったです。
btnClickもtest4の処理が終わるまで後続処理はしないようにしたいので、btnClickまでreturn task?するようにしてみます。
2021/11/30(火) 11:13:24.34ID:46JZSEzy0
タイマー定期処理を行いたいです
public Form1()のところで timer = new Timer();〜Interval〜EventHandler(Timer_Tick);の記述をしています
Timer_Tickの中でInvalidate();がありOnPaintで画面の更新描画がされるようにしています
Form1上のボタンを押すとtimer.Start();の記述があり
for(x++){}のループの中でビットマップへ線の連続描画がされるようにしています
予想では線が右にずれながら描画される姿が連続的に見えると思ってたのですが
forが終わるまで真っ暗で全部描き終わってから最後に描画の全貌が表示されてしまいます
forループで描画中はTimer_Tickが呼ばれてないようです
ループ中も定期で呼ばれるようにするにはどうすればよいでしょうか?
2021/11/30(火) 11:21:49.74ID:46JZSEzy0
forの中というか実際はもっといろいろな処理が入っていて
全体が終わるまでは数秒かかるかんじになってます
Console.WriteLine("Timer_Tick呼ばれた"); でチェックしたのですがTimer_Tickは呼ばれてないようです
2021/11/30(火) 12:27:33.83ID:qX5mLnYT0
>>832
forループを別スレッドか非同期処理に入れる
2021/11/30(火) 13:53:17.77ID:c6SfutN/a
>>831
タイマーのイベントハンドラを実行するのはちっさいおじさん(UIスレッド)
の仕事なので、当然のことながらちっさいおじさんが別の仕事をしている
時には呼ばれない。

ちっさいおじさんは別の仕事(forのビジーループ)にかかりきりで忙しい。
だからTimer_Tickは実行されない。
2021/11/30(火) 14:10:35.52ID:+pE1HCGZ0
タイマーは複数種あるんですね
System.Timers.Timerのタイマーでなんとか解決できましたm(_ _)m
2021/11/30(火) 14:33:06.41ID:nsEaThE+r
ゴミ言語
837デフォルトの名無しさん (ワッチョイ ffbb-Z91i)
垢版 |
2021/11/30(火) 14:58:37.89ID:OTX12hhF0
>>835
どっち道、UIスレッド上でfor文がループしてる途中なんだろ?
そのタイマーからUIを書き換えるのは、たまたまその時は動いていてもまずいだろう・・・・
C#の言語自体なんて出来ても何にもなんないんだし、先に情報科学の基礎を固めた方がいいんじゃないの
2021/11/30(火) 15:58:44.14ID:ARnSQzz0r
ウンコ言語、async/waitでUIなんて作ってるwww
2021/11/30(火) 16:26:44.72ID:2niMnZWKd
>>837
C#できてもなんにも何にもなんないってどういうこと?
2021/12/01(水) 08:49:58.20ID:5XL66mYQa
>>838
C+SDKじいさん乙!
2021/12/01(水) 12:12:03.66ID:GG/I4Skr0
ちょっと待って!>>837がいい事言った
>先に情報科学の基礎を固めた方がいいんじゃないの
2021/12/01(水) 12:58:21.55ID:OSLu0EtY0
UIスレッドの使い分けってどんなサイトで勉強すればいいの?
2021/12/01(水) 13:02:10.03ID:R9kNDfRh0
できるふりしてソフトウェア開発部門へ就職し、
業務利用されるソフトを作るのが一番の近道

はっきりいって独学じゃムリ
844デフォルトの名無しさん (アウアウウー Sa5b-UL9W)
垢版 |
2021/12/01(水) 21:53:31.39ID:d+Yo+uULa
使い分けも何もUIのメインスレッドだけで処理してたら具合悪いとなれば別スレッドでやるしかないんじゃ?
普通に調べればinvokeやらなんやら色々出てくるでしょ
適当に調べて自分でデバッグしてみれば最適解見つかると思うけど
845デフォルトの名無しさん (ワッチョイ bfe9-3PcT)
垢版 |
2021/12/01(水) 21:53:49.92ID:kCj+gN+70
Excelから実行ファイルを起動するとカレントディレクトリが起動したExcel基準になるようです
実行ファイルを直接動かすとカレントディレクトリが実行ファイル基準になるので困ってます
世間様ではどのように解決してるのでしょうか
2021/12/01(水) 21:58:15.63ID:K43krm2i0
>>845
どこがカレントディレクトリだろうが動くようにプログラミングする
847デフォルトの名無しさん (ワッチョイ bfe9-3PcT)
垢版 |
2021/12/01(水) 22:43:33.38ID:kCj+gN+70
>>846
そうしたいですが
コンフィグでパス指定すると移動した時に動かなくなったりするんで何が良いのか悩んでます
2021/12/01(水) 22:54:45.65ID:K43krm2i0
>>847
コンフィグにはカレントディレクトリからの相対パスを記述しているのかな。
だとするとexeのあるディレクトリのパスとコンフィグにある相対パスを結合させた絶対パスを使うんだよ。
2021/12/02(木) 01:45:33.06ID:Cd8C69Nla
っていうか今時そんな四半世紀前のスタイルを使ってる人がいるんだねw
2021/12/02(木) 01:53:55.42ID:Z/KKuSnhd
>>849
コンフィグってconfig.sysのことと思ってる?
2021/12/02(木) 02:22:27.63ID:Cd8C69Nla
appのことでしょ
いや時代錯誤だなと感じるのは「カレントディレクトリ」という概念。
そんなものにわざわざ依存する必要ってあります?
どこにもないよね。
2021/12/02(木) 03:41:52.86ID:tCUN1pkY0
まあまあ、
exe のディレクトリ==カレントディレクトリ
前提でコーディングするって初心者あるあるだからそうやって馬鹿にするなよ
2021/12/02(木) 06:53:06.04ID:BMgfYVOUM
>>852
> exe のディレクトリ==カレントディレクトリ
これ Excel あるあるなんだけど…
初心者あるあるとか言ってるお前が一番馬鹿w
854デフォルトの名無しさん (ワッチョイ 5701-3PcT)
垢版 |
2021/12/02(木) 07:18:07.12ID:HY05Xx580
ExcelのVBAと連携する小さいシステムなので伝統的なカレントディレクトリ使ってるんです
Excelと実行ファイルを同じフォルダに入れれば解決なのでしょうが実行ファイルのライブラリが多いのでExcelが埋もれて見難いなとそれはそれで困り
2021/12/02(木) 07:27:14.41ID:YVKX2AcGM
pushd popd は?
2021/12/02(木) 11:49:27.62ID:7dnZygEt0
namespace System.Collections.Generic
{

public class List<T> : ICollection<T>,…の中にある、
public void Add(T item);の具体的な処理(リストの最後に加える)はどこに書いてあるのでしょうか?
2021/12/02(木) 12:19:20.09ID:c3Ghpzze0
.NET Frameworkならmscorlib.dll, .NET 5以降ならSystem.Collections.dllの中
ソースコード見たいなら
.NET Frameworkのはreferencesource.com
.NETのはgithubのdotnet/runtime
2021/12/02(木) 12:58:34.73ID:07tMJNiS0
>>854
VBAからexe起動する際にそのexeにとってのカレントディレクトリを指定する
exeに渡す引数じゃなくて、exeの実行環境としてね
2021/12/02(木) 15:25:00.14ID:HUSWEurn0
>>854
ExcelをC#のライブラリとして使う方向にしたら?
普通はそうする
2021/12/02(木) 16:02:12.03ID:B97F3cDod
VSTOでExcelの拡張をC#で書いてしまえば
2021/12/02(木) 18:17:26.30ID:7pZIqj+v0
>>845
そもそも論としてWindowsではカレントディレクトリの扱いが環境として定義
されるようになっているので、プログラミングしてアプリを作るときにカレント
ディレクトリっていう使い方をするならば自分で必要な設定を行えば良いんだよ

まぁお約束(嫌いな人ゴメンねw)でdobonだけど

https://dobon.net/vb/dotnet/file/currentdirectory.html
2021/12/02(木) 19:13:04.88ID:IM4axE/K0
dobonいいじゃん
俺の量産するコードの半分はdobonのコピペだ
2021/12/02(木) 20:21:44.09ID:2Y5uTKRe0
Excel VBAからどうやってEXE起動してるのかしらんが
必要ならカレントディレクトリ変えればいいだけじゃないのか
2021/12/02(木) 21:56:32.95ID:7dnZygEt0
>>857
ありがとうございます。問題が解決しました。
次に湧いてくる疑問なのですが、

Visual StudioでList<T>を右クリックして、「定義へ移動」をすると。下のように書かれています。

//
// 概要:
// Adds an object to the end of the System.Collections.Generic.List`1.
//
// パラメーター:
// item:
// The object to be added to the end of the System.Collections.Generic.List`1. The
// value can be null for reference types.
public void Add(T item);

初心者としてはreferencesource.comにあるように↓こう書かれていたらわかるのですが

public void Add(T item) {
if (_size == _items.Length) EnsureCapacity(_size + 1);
_items[_size++] = item;
_version++;
}

なぜこれで動くのでしょうか? そしてどうして下のように処理を書いてないのでしょうか?
2021/12/03(金) 00:14:41.65ID:QhpimBIa0
> なぜこれで動くのでしょうか?
mscorlib.dllの中にコンパイル済みのが入ってるから
> そしてどうして下のように処理を書いてないのでしょうか?
コンパイル済みのしか入ってなくてソースがないから
2021/12/03(金) 00:52:15.83ID:z+zUeQIZ0
ILSpy使えばmscorelibも含めてC#に逆アセンブルしたソースコードを直接確認できるよ
2021/12/03(金) 20:46:41.26ID:9rfUUeSM0
>>865
ありがとうございました。スッキリしました。
なるほど、こんな感じで動いているのですね。

>>866
ILSpyを使ってみました。これは便利そうですね。
すごく勉強になりました、ありがとうございます。
2021/12/04(土) 09:48:16.38ID:+8uP6ahU0
VCLは偉大だった
2021/12/04(土) 12:39:42.98ID:3AJK8KN00
利用者は尊大だった
2021/12/04(土) 15:21:42.70ID:iCwoSy6wa
逮捕者は日大だっあ
2021/12/04(土) 19:18:15.48ID:RmSrjW3jM
5chが高齢化してきてこんな感じでレベルの低い無駄なレスが増えてってる
2021/12/04(土) 20:11:05.81ID:grkGode/0
S/N比は昔からたいして変わってないだろ
昔の方が良かったなんてのはそれこそ年寄りの繰り言だ
2021/12/04(土) 20:14:22.47ID:KZXGnJ6pM
> 5chが高齢化してきてこんな感じでレベルの低い無駄なレスが増えてってる
>>871 のことだなw
2021/12/04(土) 20:40:20.96ID:RmSrjW3jM
年を取り感受性が低下して正常な感性が失われて昔も変わらないと言う
ジジイのダジャレを垂れ流すスレではないぞここはw
2021/12/04(土) 20:45:50.00ID:grkGode/0
>>874
お前のクソレスがダジャレ並だと言ってるんだよ
まぁ俺のもだがな
2021/12/05(日) 00:05:53.41ID:nyTfINJm0
ダジャレを言うのは誰じゃ
2021/12/05(日) 05:39:51.38ID:xWrtzU7s0
>>870
これは最高につまんない
878デフォルトの名無しさん (ワッチョイ ce89-PP5C)
垢版 |
2021/12/05(日) 19:03:31.29ID:a+muEo/d0
ASP.net MVC 3.1を触り始めたんだが、これ、どんな些細な変更もいちいち発行しないと見れないのかな?
いままでのように「IIS Expressをプロジェクトのディレクトリ指定して起動しておいて、ビューは変更した都度リロード、ロジック変えたらビルドして確認」なんて気楽な開発が出来なくなってかなり面倒……
2021/12/05(日) 19:37:11.95ID:nyTfINJm0
実行時にコンパイルしてくれる設定はあったはず
2021/12/05(日) 20:22:19.92ID:c+AK18I70
ほっとりろーど
2021/12/06(月) 10:28:43.40ID:88ozVNfm0
>>879-880
ああ、なるほど。ASP.net MVC 3.1(というか、VisualStudio2019や2022)では、【デバッグしながら】ソースをいじって、それをすぐにブラウザで見れるんだ。
chtmlは今までも出来たけど、コードビハインド(と今は呼ばないかもしれないが)の変更も可能になってて、それを反映する「コード変更を適用」なんてボタンもVSに追加されてるんですな…。
これなら確かにわざわざIIS Expressを別に起動する手間は必要ありませんね。
例外が出た時にコマンドプロンプトからも確認できなくなったのがちょっと不便になったが、これも仕事で書くまともなコードならNLogなりを入れている筈だし。

アドバイスに感謝。いやはや、便利になったモノですなぁ…
882デフォルトの名無しさん (ワッチョイ 56bd-QDcv)
垢版 |
2021/12/06(月) 20:25:20.35ID:kcw1evd50
文字と数値が入り混じるリストのソート掛けが分かりません。

[0]丸/B/30/40/B/60/0
[1]丸/B/70/20/B/20/0
[2]丸/B/30/5/B/60/0
[3]角/B/70/20/B/20/40
[4]丸/B/30/40/B/60/0
[5]角/B/20/20/B/20/100

1番左の丸、角等の文字でまとめ、
[0]の40の位置の数値を昇順、
[0]の30位置の数値の昇順に並び替えたいです。
丸角の順番はまとまってれば良くて、数値は小数点ありです。

どなたかコードを、教えて頂きたいです。
2021/12/06(月) 20:41:57.32ID:Qbq2EdCDa
>>882
そのリストの要素(例えば「丸/B/30/40/B/60/0」)
は文字列なんだよね?

だったら要はスラッシュで区切られた文字列の中から
n番目の要素を取り出すメソッドが書ければ目的は達成できるのと違うの?
2021/12/06(月) 23:26:59.64ID:qid4C38qM
>>882
普通は何らかの自作クラスにその文字列をパースした値を入れてソートする
2021/12/06(月) 23:30:33.29ID:qid4C38qM
まずね

> 文字と数値が入り混じるリストのソート掛けが分かりません。

これはリストじゃないね
ただの文字列だろ

自分の好きなようにパースしたらいい
2021/12/07(火) 20:03:11.57ID:hXBXLlEy0
new object[][] { new object[] { "丸", "B", 30, 40, "B", 60, 0 } }
とかだったりね。

まあ 894 の言う通りだと思う。
data.OrderBy( a => (string)a[0] ).OrderBy( a => (int)a[3] ).OrderBy( a => (int)a[2] ) とかでも出来るかもしれないけど。
2021/12/07(火) 21:47:17.88ID:S2DijEtm0
>>882
result = list.OrderBy(x =>GetValue1(x))
.ThenBy(x => GetValue2(x))
.ThenBy(x =>GeValue3(x));

でGetValueメソッドの実装をするのが初心者でもわかりやすい
GetValueを共通化するとかはお好みで
2021/12/07(火) 21:47:55.35ID:cdrKb2eoa
この程度の話だったらどんな設計でも問題ないと思うけど、
>>882の人はそういう設計の問題で躓いているんじゃないでしょ。

恐らくいわゆる「分割統治」ができない人なんだと思う。
普通のプログラマなら当たり前のように自然に

デリミタで区切られた文字列の3番目の要素でソートしたい ⇒
(1) 3番目の要素を抜き出す
(2) 文字列を実数に変換
(3) 変換し数値を使ってソート

という風に大きな問題を小さな問題に分割して考えるけど、できない人にはこれができない
2021/12/07(火) 22:20:44.44ID:Is+OlLjN0
イコールだったら次の項目の比較をするって部分ができねぇのと違う?
2021/12/07(火) 22:21:56.47ID:Is+OlLjN0
つまりソートの優先順位の話をしてるのではないか?と
2021/12/07(火) 23:54:19.12ID:C4n8qnlb0
分割統治って今日本が米帝にやられてる統治法かよ
2021/12/08(水) 00:07:29.07ID:JmKuL7Fea
新しくbyte[]配列を定義してコピーせずに、byte[]を文字列に直すのはどうしたらいいのでしょう?

byte[] data = new byte[] { 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };  //末尾にnullがたくさんあるデータ
string text = Encoding.ASCII.GetString(data);
//string text = Encoding.ASCII.GetString((byte*)data,2); //こうしたいけどキャストできずエラー
Console.WriteLine(text); //「0???????????」が出力される
2021/12/08(水) 00:19:57.85ID:8icXIUsNd
>>892
そんなことはできない
そのポインタを引数に取るGetStringのオーバーロードも結局コピーする
Stringのコンストラクタにもポインタを引数に取るのがあるけどそれもコピーする
2021/12/08(水) 00:20:50.66ID:wMA9/Vnj0
質問内容がよく分からんが欲しいのはEncodingクラスの
GetString(byte[], int, int)
オーバーロードか?
length引数はその例の場合1にしないとtextに\0文字が入っちゃうぞ
2021/12/08(水) 00:23:08.99ID:8icXIUsNd
ああ文字列化のときにコピーが走るのはよくて、前処理としてbyte配列からbyte配列にコピーするのは嫌ってことか?
GetStringに範囲を指定できるオーバーロードがあるだろ
2021/12/08(水) 00:26:17.98ID:f3DwDnQi0
Encoding.ASCII.GetString(data, 0, 1);
じゃダメなの?
2021/12/08(水) 00:26:56.95ID:JmKuL7Fea
>>894
それ探してました。完全に見落として存在気づいてませんでした
ソース見てたら今見つけた・・・
https://source.dot.net/#System.Private.CoreLib/Encoding.cs,233647d04fbec0c0
2021/12/08(水) 00:32:14.59ID:f3DwDnQi0
>>897
まず公式ドキュメント見る癖つけた方がいいぜ
https://docs.microsoft.com/ja-jp/dotnet/api/system.text.asciiencoding.getstring?view=net-6.0
2021/12/08(水) 00:37:02.39ID:e703d0nc0
Spanを引数にとるGetStringを早く実装しろよ、MS
2021/12/08(水) 00:44:28.31ID:b+i+HzV1a
もう解決済みみたいだしもっといい方法がたぶんあると思うけど
いちいち手動で長さを指定せずにC文字列を文字列に変換したいってことならこれで出来た
var data = new byte[] { 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
var sb = new StringBuilder();
sb.Append(Encoding.ASCII.GetChars(data));
var text = sb.ToString();
2021/12/08(水) 01:08:03.30ID:f3DwDnQi0
>>899
自分で拡張メソッド作れば
2021/12/08(水) 09:34:35.47ID:lj53vMC40
あんまり行儀は良くないけど1行で出来るしbyte[]じゃなくてSpanで受け取るときって往々にして変換先もReadOnlySpan<char>で済ませたいときだから標準で必要だとは思わないな
Span<char> stack = stackalloc char[u8.Length];
string str = stack.Slice(0, Encoding.UTF8.GetChars(u8, stack)).ToString();
2021/12/09(木) 18:07:45.75ID:Oxvlsd/n0
VC#からVC++へは移植はしやすいですか?
904デフォルトの名無しさん (ワッチョイ 0a8e-9fbA)
垢版 |
2021/12/09(木) 18:12:01.88ID:T9HnMcRs0
>>903
その質問をここでするくらいの人にはどちらにしろ無理だな
2021/12/09(木) 18:27:06.11ID:vdjQHUNbD
全然
レイヤの違いが極端なので文法が少し似てる以外完全に別物
906デフォルトの名無しさん (アウアウウー Saab-wFmK)
垢版 |
2021/12/09(木) 19:40:17.12ID:RDoYY/RSa
久しぶりにc#書くんだけど今VSって2022が最新と思っていいのかな?2019のほうがいい?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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