ふらっと C#,C♯,C#(初心者用) Part147
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part146
https://mevius.5ch.net/test/read.cgi/tech/1576069931/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://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/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://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 始めたばっかの頃の自分を思い出すと、おそらく>>106がやりたいのはこれ
int[10] a;
for(......){
a = new int[10];
......
} >>106
後者はループ処理毎にaが初期化されるが
前者はループ処理毎にaは初期化されない
って違いがあるので、バグが発生しにくいのは後者で
バグは発生しやすいけど効率がいいのが前者
前のループのaを使わないなら、どちらも正しいよ for内部で毎回一時バッファが必要ならfor内に書くべきだけど、ループ枚に配列生成は高コストなのでstackalloc使って良いと思うけどな
unsafe for ()
{
var a = stackalloc int[10]; //配列サイズが[200000]ほど以上になるとスタックオーバーフローの恐れが出てくるので注意
a[0] = 123;
} >>110
それ106と全く同じ事だよ
予め配列変数を用意しておいたところで参照型である配列の変数なんてあくまでポインタに過ぎず肝心の中身はnew毎に生成されるからコスト的には全く変わらない 言語ではなくて設計のことなのですが、C#でデスクトップアプリを作っていて、canvasに描画する処理を書いてます
そこで、描画部分で状態の更新(例えばlabelで表示する値の計算)を一緒にやった方が負荷が減らせるなと思ったのですがこれは設計としていいのでしょうか?
描画部分は複雑になっていくので、そこにcanvasの描画に関係ない処理を持ってくるのはどうなのかと悩んでます
でも一連の処理で共通部分があるので出来る限り負荷を減らしたいです
canvasの描画とその他の更新でうまく分けた方がいいでしょうか >>113
悪いけど、それは全く意味ないと思うよ
ループ内で配列を生成する必要があるとしたら、それを他の非同期なメソッドなどに渡していて毎回インスタンスを別にしなければならないケースだろう
stackallocだと領域が結局使い回されてしまうから、それでいいんだったら単純に最初にnewした配列をループ内で毎回クリアして使えばよい >>115
描画処理は今の状態のスナップショットを画面に反映させるだけなんだろ?
そんなもん状態の更新処理と何をどう共有するんだよ
分けるかどうかは別にして、そんな頭がごっちゃになった状態で書かれたコードなんて俺は読みたくないな >>116
ループ内で生成しないやり方と迷ってるってことはret時にもループ内でも他に渡す盤面は無いってことじゃないかな
なので最高のやり方はSpan<int> a = stackalloc int[10]として最初に確保をしてループ毎にa.Clear()
>>113のやり方も悪くは無いけど使いまわせるのに毎回stackallocするのは無駄 >>117
すみません誤解を招く書き方でした
状態の更新ではなくviewの更新です
viewで表示する値を計算するのに一連の処理が必要ということです
改めて考えてみたら元のデータは頻繁に変わるものではないのでメモ化で対処できそうです 自分で使う用のWindows用WinFormsくらいしか作らない俺もSpan利用したいんだけど、そろそろ.NetCore3.1インスコしてええの?
CoreのWinFormsは不完全みたいな事どっかで聞いたからもうかれこれ1年以上.Net Framework4.7.2しか使ってないんだけど System.Memoryパッケージ入れれば、slow spanになるけど.NET FrameworkでもSpan<T>が使える SpanならnugetからSystem.Memoryを入れればNET47でも使えるんじゃ? Hoge[] h = new Hoge[]{...};
ArraySegment<Hoge> slice_of_h = new ArraySegment<Hoge>(h, a, b);
Hoge[] new_instance = slice_of_h.ToArray(); FormアプリケーションのGUIをそのままWebサイトにできますか? >>127
懐かしい話だな
.NET Standard はあろうことか 2.1 で .NET Framework を切り捨てたから、もはや .NET Standard には何の意味もなくなり事実上消滅したよ >>130
下の方は誤解を招く書き方(というか本人が理解してなさそう)だね
.NET5は.NET CoreとXamarinの新バージョンを含むが、.NET Frameworkは含まない
.NET Frameworkは4.xが最後のバージョンとなり、(Xamarinを除けば).NET Coreへ一本化される > Xamarin は、テクノロジー自体は、.NET Framework と C# を基盤としていますが、
> Mono というライブラリを使用します >>132
それは明確に間違いだね
Monoは元々MSとは無関係の会社による.NET Frameworkの非公式かつ独自な互換実装で、.NET Frameworkとはソースを共有していない
based on かなんかを誤訳したんじゃね テクノロジーを基盤してるって書いてるだけじゃん
ライブラリがおかしい >>133
今はだいぶ本家のを使ってるよ。Monoも。
本家がMITになったからね。 毎度のことだけど用語の定義のあいまいさからくる混乱だろうね
>>132の引用部分を書いた人は「NET FrameworkをVS2002とかの時代の意味で使ってるんでしょ。
当時は仮想OSみたいに言われてた
その定義だと.NET Coreも.NET Frameworkになっちゃうので(以下略 C#の正規表現についてですが...
new Regex(@"^a").IsMatch("abc",0) → true : 納得。
new Regex(@"^a").IsMatch("abc",1) → false : 納得。
new Regex(@"^b").IsMatch("abc",0) → false : 納得。
new Regex(@"^b").IsMatch("abc",1) → false : 納得...できん!!
第2引数が1なら、^で示す入力文字列の先頭が2文字目になってて欲しいじゃん!?
MSDNとか、この挙動について何か書いてある?見つけられなかったわ。
substringとかしたくないんだよな...
なんでこういう挙動になるか、ご存じの方いますか。 第二引数は探索の開始位置を指定するのであって検索範囲をどうこうするためのもんじゃないってことかな?
でもその理屈だと二つ目がfalseである説明にならんし流し読みだから解釈間違ってるかもしれないわ 139は間違いっぽいので忘れて
IsMatch("abc",0) → abcを探索
IsMatch("abc",1) → bcを探索
リンク先を見るに^は行頭を表すもんでbは行頭ではないのでfalse
aは探索外なので二つ目もfalseってことかな
https://docs.microsoft.com/en-us/dotnet/standard/base-types/anchors-in-regular-expressions new Regex()するときにRegexOptions.Multilineを指定して『^』『$』の意味づけを変更・・・しても駄目そうだね
日本語のほうで
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-options?view=netframework-4.8#multiline-mode
を読んだけど、
あくまで『^』は入力文字列全体(>>137のなら"bc"ではなく"abc")の先頭、MultiLine指定時は\nを行区切りとした行頭についてのみマッチするんだろう >>138-141
ありがとう!
俺だけではそれらの情報を見つけられなかったわ。
いったん \G を使用することで何とかなりました。
というか \G の仕様(影響範囲)もよくわからん。
最終のマッチってRegexのインスタンスに保存されるのかな?
そうだと思うけど、今一つ確証が持てない。
あと、 \A が正しいんじゃないか、って思いましたが、\Aは「文字列の先頭」でしかないんだね。
Singlelineの場合は^と同じみたい。 プログラムではなくライセンスについての質問なのですが、NAudioというライブラリを使いたくてプロジェクトに導入したのですがMs-PLライセンスとなっていて、この場合著作権表示等は具体的にどう表示すればいいのでしょうか。
著作権表示自体がいまいち分かりません。ライセンスの文書(LICENSE.txt等)とは別なのでしょうか。
調べているのですが具体的な表記方法が書かれている記事が無く分かりません。
ご教示お願いします。 相談させてください。
以下のような MyClass1 クラスを作ると、
「IDE0054 複合代入を使用」というメッセージが表示されます。
class MyClass1 {
int MyProperty { get; set; } = 0;
public void IncreaseMyProperty(int x)
=> MyProperty = MyProperty + x; // ここでメッセージ
}
まあそりゃそうでしょうということで以下の MyClass2 のように直すと、今度は
「IDE0052 C# プライベート プロパティ は、
その get アクセサーが呼び出されることがないため、メソッドに変換できます。」
というメッセージが表示されてしまいます。
class MyClass2 {
int MyProperty { get; set; } = 0; // ここでメッセージ
public void IncreaseMyProperty(int x)
=> MyProperty += x;
}
なんだそりゃと思いつつ言われたとおり以下の MyClass3 のように直せば
メッセージは表示されなくなるのですが、こんな直し方でいいのでしょうか。
class MyClass3 {
int _MyProperty = 0;
void SetMyProperty(int value) => _MyProperty = value;
public void IncreaseMyProperty(int x)
=> SetMyProperty(_MyProperty + x);
}
ご意見をお聞かせいただけると幸いです。よろしくお願いいたします。 MyPropertyが本当に自動実装プロパティなら
そもそもフィールドでいいんでは? 最近のIDEは賢いから定義されてるけど使用されないことが明らかなプロパティやメソッドが見つかったら警告が出るようになってる
>>144のは文法等のお勉強でてきとうなソースを書いてるんだと思うけど、MyClass2なら
MyPropertyをpublicなプロパティにするか、MyPropertyを参照するような処理をちゃんと書けば警告解消するはず
ToString()あたりをオーバーライドして override string ToString() => MyProperty; とか書いてもいいかもね >>145
レスありがとうございます。
説明が不十分で申し訳ありません。
実際には、以下の様な感じにしていまして、
できればプロパティを使いたいと考えております。
class MyClass4 {
int _MyProperty = 0;
event EventHandler MyPropertyChanged;
int MyProperty
{
get => _MyProperty;
set {
if (value != _MyProperty) {
_MyProperty = value;
MyPropertyChanged?.Invoke(
this, EventArgs.Empty);
}
}
}
public void IncreaseMyProperty(int x)
=> MyProperty += x;
} >>146
レスありがとうございます。
おっしゃるとおりなのですが、MyProperty += x; で
MyProperty の get アクセサーが参照されていることに
ならないため困ってしまっています。
C# の文法的に、自動実装プロパティでなければ
int _MyProperty = 0;
int MyProperty { set => _MyProperty; }
のような書き方も許されているようなのですが、
MyClasss2 の MyProperty の定義をこのように書き換えると、
MyProperty += x;
のところでエラーが出てしまうのです。 警告とエラーを混同しないで
+=オペレータがget使ってないだけでしょ
開発中で今後使う予定がありまだ未実装なら警告はスルーすればいい いやだからIDEからは「結局MyPropertyってインクリメントで更新はしてるけどどこからも参照されてないんでしょ、無駄なんじゃない?」と怒られてるわけで
他のC#ソースなりXAMLなりでMyPropertyが参照されてればそのメッセージは出ないはずだけど
例示されてるソースであればMyPropertyだけでなくインクリメントする処理も意味のない無駄な処理だから削ればいいし
GUI側etcのソースがまだ書けてないのであれば中途半端な書きかけソースで警告が出るのは当たり前のお話
というかそもそもでいえば、VisualStudioの設定がデフォルトならそのメッセージは
「コンパイルエラー」でも「警告」でもないただの注意喚起なメッセージでしかないから開発にも実行にも一切支障がないので
とりあえずほっとけばいいと思うんだけど >>147
MyPropatyをSetメソッドにして、インクリメント_MyPropaty+xを渡せばいいんじゃないの?
これでいいんでしょうか?って内容通りだけど単に値を入れるだけならフィールド直接やればって感じだけど追加作業あるならメソッドでやるのは普通だと思う 読んでる入門書の練習問題にアクセサのGetNameメソッドで八文字以下の文字列が渡された場合だけname変数に代入するプログラムを書きなさい
というのがあるんですが、どうやって書けばいいのでしょうか?文字数を判定するプログラムは習ってないので困ってます >>153
stringクラスのメンバーを見てみよう >>155
ありがとうございます。とけました!
確かな力がつくC#超入門って本ですが見返してみても書いてないですね…
また良さげな本探してみます 猫に分かるわけがない、こんな難しいものを。
「ハゲでもわかる」だろ、どう考えても。 猫は誰でもできるということを比喩的に表している
じゃあハゲは? 能力の劣る者でもできる
このハゲー、と言われるような者でも >>155
たまに「Stringのマニュアルを確認してどんなことができるか確認しておこう」みたいな初心者なめとんか的な項目があったりはする
たぶん説明するの面倒なのだと思う >>153
てかなんでGetNameなんだ?SetNameじゃないの? >>162
主観の違いかと思ったけど、確かにセットですね プロポーショナル文字の場合に、画面上の文字の表示位置はどうやって求めるんでしょうか?
1文字ごとに(x,y)座標を計算して配列変数に記憶しておく、
文字を削除、挿入などして位置がずれたときにはすべて計算し直す
というような方法しか思いつきません そんな感じです
毎度毎度文字列の長さを測定するのもなあ〜と、ちょっと思ったもので質問しました 削除・挿入した文字列のサイズを全体から足し引きする フォントは左右は良いけど上下に謎のスペースが入って扱いづらい。フォント毎に仕様が違うので厄介 >>164
基本は再描画時に行頭から行末まで1文字つずつカウントアップ http://www.wisdomsoft.jp/59.html
ここのコード1はなぜ8になるのでしょうか?
論理積の理屈はまあまあ分かったのですがビットがどうこうってのが分からないのですが >>173
0cと0aを2進数に直してもなぜそうなるのかわからないのですが…
沼に嵌りそうだから後回しにしたほうがいいかな・・ >>174
正しく2進数にできてないんじゃないか?いくつになると思ってる? >>175
1010と1100と思います
それで論理積で評価してtrueが帰ってくるとなぜ13になるのかわからないです 図2に書いてあるのが全てだが
8という数字ではなく結果が2^3と考える
各ビットについて
「ビットnが1同士=結果は1」を繰り返して全部の桁を足す
この場合ANDの結果が1なるのは4ビット目だけなので
2^3 x 1
+
2^2 x 0
+
2^1 x 0
+
2^0 x 0
の結果が8だ >>177
かなり噛み砕いて説明ありがとうございます
・・・でもわからない;;^は排他的論理積の記号ですか?
2進数とビットをもっと勉強して出直してきます あ、C#には累乗演算子ないか
2^3は「2の3乗」の意味です
Math.Pow(2, 3); >>177
ごめんなさい、理解できました
長々と付き合っていただきありがとうございました どうでもいいんだけど二乗でわざわざMath.Powを使う人の狙いって何?
普通にx*xで良いじゃん 累乗であることを明確にできるんでMath.Powのほうがいいような気がするなあ。 あえてこじつけるなら仕様書通りの表現ができること
2乗の値をってなってるのが3乗の値に仕様変更された時差分で2が3に変わってる方がわかりやすい >>184
同じこと繰り返したくない。
変数名がクソ長くてよく似た名前のが存在してたらMathPowの方が安心できる。その程度だぜ。速度的なことは知らんけど。 実数ならMath.Pow使うけど整数ならx * xにするな double x = p1.X - p2.X, y = p1.Y - p2.Y;
var dist2 = x * x + y * y;
var dist2 = Pow(p1.X - p2.X, 2) + Pow(p1.Y - p2.Y, 2);
結論:べき乗演算子欲しい var Dist2 = Func<double, double, double> (dx, dy)=> {return dx*dx+dy*dy;};
var dist2 = Dist2(p1.X - p2.X, p1.Y - p2.Y);
あほだな
var Dist2 = Func<Point, Point, double> (p1, p2)=> {return Pow(p1.X - p2.X, 2) + Pow(p1.Y - p2.Y, 2);};
var dist2 = Dist2(p1, p2);
いまいちだな Point型にDistanceメソッドつけといてくれたらええのになあ System.Drawing Point Distance なし
System.Windows Point Distance なし
Xamarin.Forms Point Distance あり!!! 描画面上の距離が必要になるケースってあんまりないような気はするね。
直交座標上の点を表すstructがあってそっちに付いてるなら分からんでもない。
.NETのライブラリって数学の名前空間がないんだよな。
MathってSystem直下のstaticクラスになってて、今となっては疑問を感じる設計だよね DistanceよりsqrMagnitudeの方が多用する System.Numericsってなんだと思ってググったら、存在知らずにだいぶ前にこれと似たようなの(しかも劣化コピー)自作したぞ。
今ひどい黒歴史が出来たわ・・・・・ >>196
あるのかぁぁぁぁ!!!!!!
Xamarinてことはスマホアプリか。UI関係で使うんかな? XamarinがMSに買収される前からあるんだろ?
零細企業のアホ社員がまともなコードレビューも受けないままリリースしちゃったんだろうな WinForms で、MDI の場合、子フォームのメニューは親フォームにマージされるようですが、この動作を変更して、マージせずに子フォームのメニューバーの位置に直接メニューを表示することは可能でしょうか?
可能な場合、どうすればできますか? >>205
子フォームのそれぞれにメニューバーが欲しいってこと?
すごく邪魔そうだけど… ■ このスレッドは過去ログ倉庫に格納されています