ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part136
http://mevius.5ch.net/test/read.cgi/tech/1520057345/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>653
当然だよ。変数使うには課長級の決済が必要。変数管理台帳ファイルに全部記録されている。 >>655
そうか、公開用にリファクターしたのかな
いちいち一覧表見ないと何処につながってるか見えないなんて不便だもんね >>654
変数名が妥当かどうか聞いてるんじゃなかったの?w
そのInitialValueとやらのクラスを使う実装方法が妥当かどうかは実現すべき仕様を誰も知らないので
誰にも分からないと思うよw
ローカル変数の命名に関しては、型名InitialValueをそのまま変数名にしても
何をやってるのか理解できるような文脈なら変数名をivにしても同じことでしょう。
だったら短い方がいい。
ただしローカル変数でも説明的な名前の方が適切な場合もあるので馬鹿の一つ覚えはダメ。
情況に応じて柔軟に int[] intData = new int[10];
int intThread = -3; // 閾値
int intCount = 0;
for (int i = 0; i < intData.Length; i++)
{
if (intThread >= 0)
{
if (intData[i] > intThread)
{
// 処理
intCount++;
}
}
else if (intThread < 0)
{
if (intData[i] < intThread)
{
// 処理
intCount++;
}
}
}
閾値がプラスとマイナスで条件式を変えたいんだけど、
中の処理が一回で済む書き方ってあります? =を含まない条件式。
そして閾値というキーワード。
まとめない方がいいよ。 >>660
せめてCountメソッドにしとけと思うぐらい。 >>660
単に同じ処理を2回書く無駄をなくしたいだけなら&&と||を使って
条件式をまとめるだけ
if((threshold >= 0 && x > threshold) || (threshold < 0 && x < threshold))
{
....
}
値が不変のはずのthresholdの符号をループで毎回評価する無駄が許せないなら
Func<int, bool> predicate = x => x > threshold;
if (threshold < 0) predicate = x => x < thredhold;
....
if (predicate(x))
{
....
} async/awaitって呼び出しのネストが深くなると、大元の呼び出しで波線が立ってすごくもどかしいんですが、気にしなくていいでしょうか?それとも呼び出しのやり方を見直したほうがいいのでしょうか >>660
カウントをCountメソッドにして引数に突っ込むラムダ式を閾値によって切り替える ごめん。Count以外の処理もあるんだね。おらの回答は無視してくれ。 dataGridViewのデータソースをBindingListにしています。
この時にデータの絞込を実装する方法はあるのでしょうか。 >>664
波線が立つのは単にasyncなメソッドをawai付けずに投げっぱなし呼び出しの警告出ているだけじゃないのか
>>665の言う通りネスト関係ない すいません。ちょっと教えてください。
//Form1にて
Form2 f = new Form2();
f.show();
this.visible=false;
としてForm2を開いて、Form1を非表示にします。
//Form2にて
Form1 f = new Form1();
f.visible=true;
this.visible=false;
としてForm1に戻った場合、先程form1で入力した内容が消えてしまいます。
form1の内容を消さずにform2からform1に戻る方法を教えてください。 >>670
Form1 f = 「new」 Form1();
新しいForm1を作ったんだから前のはVisible=false;のままで表示されていない
例えばこうする
//Form1にて
Form2 f = new Form2(this);//Form2のコンストラクタの引数にForm1の参照を渡す
f.show();
this.visible=false;
//Form2にて
private Form1 form1;
//コンストラクタ
public Form2(Form1 f)
{
InitializeComponent();
form1=f;
}
//戻る処理
form1.Visible=true;
this.Visible=false; >>670
目の前の問題を解決するよりまずインスタンスとは何かちゃんと理解した方がいいねw もっと簡単にこれでもできるよw
var f2 = new Form2();
f2.Shown += (s, ev) => Hide();
f2.ShowDialog(this);
Show(); class Program
{
TargetOpe targetOpe = new TargetOpe();
static void Main(string[] args)
{
Target [] target= targetOpe.InitializeTarget();
Console.WriteLine(target[1].x);
}
}
Target [] target= targetOpe.InitializeTarget();の行のtargeOpeで
静的でないフィールド、メソッド、またはプロパティ 'Program.targetOpe' で、オブジェクト参照が必要です
のエラーがでます。
newしてるのになんででしょう? C#初心者です。
ある変数のその時々の値によって呼ぶメソッドを変えたいため初歩的にifやswitchで分岐させていたのですが、毎回分岐させるのもどうかと思い変数が変わるタイミングでデリゲートに代入して呼び出す方法を試してみました。
しかしながらパフォーマンステストを行ったところ、10程度の条件分岐であればifでメソッド呼び出し >>> デリゲートで呼び出しという結果でした。
速度を重視しつつ動的に呼び出すメソッドを変えるという場合はデリゲートではなく毎回条件分岐を行ったほうが良いということなのでしょうか? >>677
どうでもいい
そんなミクロなレベルの速度が問題になることはない
IO一つで跡形も無く吹き飛ぶ くだらねーパフォーマンスとくだらねー暗号化の話題が大好きだよな パフォーマンスは重要だよ
だけど、そんなのを語る以前に、コンピュータの仕組みについての素養を極端に欠く人が多すぎるんだよ
最近のC#入門書はよく出来ていて、大抵の本が最低限の仕組みが知識が身につくようページを割いて解説してるわけだけど・・・・分かっていない人ほど読み飛ばすんだな
その結果、コンピュータの仕組みからしたらとてもありえないことを言い出す高卒様が出来上がるんだ >その結果、コンピュータの仕組みからしたらとてもありえないことを言い出す高卒様が出来上がるんだ
ありえないことなんてないだろ。頭硬すぎじゃねーの。「コンピュータはこうあるべきだ」とかに縛られてると新しい発想のソフトが生まれない。 新しいものができたってのならいいけど、言うこと為すこと高卒様じゃあ・・・・ >>677
条件次第なのでなんとも言えない
インライン展開とかCPUのキャッシュとかまで関わってくる可能性がある
気にしなければいけないほどパフォーマンスを気遣うなら、JITの結果を比較したほうがいいけど、多くはそこまでするほどではない >>685
いや、初心者がググった知識で背伸びしてるんだろ >>676
ありがとうございます。
私アホでした。 public class TargetOperation
{
Target[] target = new Target[Constants.MaximumNumberOfTarget];
public Target[] InitializeTarget()
{
for (int i = 0; i < Constants.MaximumNumberOfTarget; i++)
{
target[i] = new Target();
target[i].x = 100;
}
}
return target;
} 最後の行で
クラス、構造体、またはインターフェイス メンバーの宣言でトークン 'return' が無効です。
です。
またアホなことをしてそうな気がしますが、昨夜からわからず・・・。 >>689
}
}
return target;
}
じゃなくて
}
return target;
}
}
じゃね デリゲート使うくらいならストラテジパターン使うけど DataGridViewのセルのValueを取得すると、既定の型がObject型なんですが、既定の型をstringに変更する方法はありますか?
今はConvert.ToStringで変換してるんですが、記述数が多くなりすぎて参ってます。 C#初心者でフォームアプリを作っているんですが
例えばあるクラスAが非同期で外部機器を延々ポーリングしていて、トリガーが発生したらクラスBの処理を行いたいといった場合
・クラスAにクラスBのインスタンスを渡して、クラスBのメソッドを呼び出す
・クラスAに宣言したデリゲート(evemt?)にクラスBのメソッドをコールバック関数として登録し、クラスAはデリゲートを実行する
どちらが一般的なコーディングなんでしょうか
後者だと複数実行したい処理があるとかなり冗長な気がするんですが、他にセオリーあれば教えて頂きたいです
よろしくお願いします >>697
前者
デリゲートは現段階で呼び出し先が定まってなくて後でアドホックに処理を差し込みたいときに使うも
最初から呼ぶ相手が決まってるならそんなまどろっこしいことをしないで直接メソッドを呼べばよい >>697
騙されちゃダメwww
そういうのはイベントで実装する。
何故か?
前者で作っちゃったら、その外部デバイスをポーリングしてるクラス(普通はそのデバイスの名前を付けると思うけど)、
前者で作っちゃったら他に流用できないよ >>700
YAGNI
もしそれが必要になったらそのとき変更すればいい
そして、ほとんどの場合において結局必要にならない
職業プログラマじゃないとアプリのコードを目にする機会って少ないから、
.NET Framework自体のクラスのような不特定多数向けの設計を真似してしまいがち
一般に、アプリケーションプログラミングにおいては無駄な拡張性は極力組み込まずに必要最小限のコードでコンパクトに実装するのが正解
そのほうが結果的に変更時のコストも小さくなるよ >>701
YAGNIなんか関係ない
アホか
必要もない仕様変更を想定して寛容に複雑にするのは愚かだが、
抽象度の高い(つまり汎用性も高い)方のクラスにより具体的(つまりそのプログラムでしか利用できない)クラスの
参照を持たせて依存させるなんてもっと愚かだ >>702
自己矛盾してるね
依存させるのが何故愚かだと思う?
理由は、「必要もない(質問者のレスにない)仕様変更を想定しているから」に他ならないだろ >>703
たぶん言っても無駄な人だと思うけど、普通はViewをModelに依存させるように作るのであって
ModelをViewに依存させない(Modelの参照をViewが持ってはダメ)なのと同じ。
こんな基本が分からない奴が回答する側に回ってはダメだと思うw >>704
いかん酔っぱらって逆を書いちまったw
× (Modelの参照をViewが持ってはダメ)
〇 (Viewの参照をModelが持ってはダメ) あと、仮に>>700の想定が正しいとするなら、抽象化すべきはクラスBではなくAの方でしょ
例えばAのデバイス依存部分だけをIDeviceインターフェイスとして切り出して委譲するとかね
Aにイベントを持たせるんだと、別のデバイスを監視するクラスCができたら
AのイベントとCのイベントをそれぞれ個別にイベントハンドリングしなきゃいけなくなる
ちゃんと頭使おうね >>705
揚げ足取るようで悪いけど、Viewの参照をModelが持つこと自体は何の問題もないよ
というか、そうしないとMからVへの変化通知が実現できない
イベントを使うにしても結局参照は持ってるよ
MVPといって、IViewのようなインターフェイスを通してMからVを呼ぶパターンもあるね
なるべく疎にしたいのは型同士の依存関係の話で、参照するのがダメなわけじゃない >>706
そういうのをYAGNIっていうんだよw
本当に何もわかってないねお宅w まあ質問者の>>697に言うけど、実際書いてみれば
イベントで実装した方がずっとコンパクトかつ可読的に書けることが分かると思うよ。
Bが仮にAでしか利用しないクラスだとしても、普通はAはイベントを発行するだけ、
Bはそのイベントを受信して何か処理をする、ってやった方がずっと分かりやすい メソッド一つだけならイベントでもいいけど、少なくとも>>697はメソッドが複数あるときもあると言ってるんだからイベントは不適切でしょ
インターフェイスで纏めたほうが扱いやすい
あえてそこにインターフェイスを噛ませる必要があるかどうかはYAGNIの問題だが、それとはまた別の観点の判断だ プログラムで使用するテキストデータを、excelで管理しています
closecXMLを使ってアクセスしていて、これ自体は無事に実装できました
テストが一通り終わって、テキストデータも確定したので、データの散逸や
改ざんを防ぐために実行ファイルに埋め込みたいのですが、リソースとして
取り扱うことってできないでしょうか
具体的には、
workbook = new XLWorkbook(filename);
として開いているところがあるのですが、このfilenameにリソースファイルの
名前を当てることができないのか調べています
string filename = "Properties.Resources.textdata.xlsx";
としてアクセスできれば簡単だと思っていたのですが、そうはいきませんでした 具体的にどういう手順を踏めばよいのでしょう?
excelデータは1,000行以上あるので、取り込みではなく手入力が必要だと
ちょっと切ないです
でももう修正しないもの(修正するとしても部分的)ですから、機械的に
データを移行できるのであればそれでも問題ありません 静的に呼びだすなら5つのAPI
FindResource()
LoadResource()
SizeofResource()
LockResource()
FreeResource()
動的に更新するなら更に3つ
BeginUpdateResource()
EndUpdateResource()
UpdateResource() >>701
こういう奴が頻繁に現れるのを見るとYAGNIの罪は大きいなって思う 別に複数でもそんな多くなければイベントでも問題ないんじゃねぇかな >>714
ありがとうございます、それぞれのAPIについて調べてみます 結局バランスの問題だな。もちろん人によってバランス違うけど。
イベントによって結果再利用性あがるけど、
>イベントで実装した方がずっとコンパクトかつ可読的に書けることが分かると思うよ。
の通り、可読性の観点からしてもイベントの方が分かりやすいと思う。
これぐらいもYAGNIとかいってるようじゃ、極端すぎてバランス感覚おかしいんじゃねぇかな。 >>718
極端なのは君だと思うぞ
まさかクラス間の依存関係に全部いちいちイベントを噛ましてるってわけではないよね
その上で、この例において特にイベントを使うのが適切だと判断した合理的な根拠は?
少なくとも>>697のレスからはそれを具体的に読み取れないから、根拠のない仮定に基づいた無駄な拡張性だと言ってるんだけど >>691
( ゚д゚)
ありがとうございます。
その通りです。
一晩見直したのに気づかなかった・・・。 >>697です
みなさん色々なご意見ありがとうございます
基本的にはイベント等で疎結合にしたクラス作りが望ましいが、ケースバイケースで状況に応じてどちらの実装でも問題はないといったところでしょうか
レスして頂いた内容は非常に参考になり、まさにその両者のいい分で自分もどちらが最適解なのか悩んでいましたが、結局状況を判断出来る私が決めて実装するしかないのかなと思いました
途中インターフェースをかましてすれば良いとのレスがありましたが、どういった実装をすればいいのか全くわかりませんでした。この方法でも検討してみたいので、すみませんが具体的な実装を教えて頂けないでしょうか >>721
interface IAlert {
void Set(Severity severity);
void Unset();
}
たとえば、あるアラートに対してこういうインターフェイスを定義する
クラスAはこれをコンストラクタで受け取り、温度センサーの値が閾値を超えたら危険度に応じた引数でSetメソッドを呼ぶ
温度が低下して閾値を割ったらUnsetを呼んで解除する
このIAlertインターフェイスを、具体的な実装、たとえばパトランプを操作するクラスが実装するわけ
こうしておけば、
パトランプじゃなくて画面でアラート状態を表示したくなったときにAに手を入れずにIAlertを実装するだけで済む
もちろん、パトランプしか想定しなくていいなら直接パトランプクラスのメソッドを呼んでもいいし、Unsetが必要ないならイベントでもいいかもね
ただしイベントの場合はBからAへの密結合が発生するとか、それを避けるなら追加で橋渡しのコードが都度必要になるといった懸念点もある >>722
早速ありがとうございます
ちょっとまだピンときませんが、じっくり検討してみたいと思います BASICしか経験がないど素人がC#始めたんだけど、
クラス間の参照の受け渡しというのが難しいです・・・。
クラスの参照を配列に入れて、それを受け渡しするとか動くコードはなんとかかけてるんだけど、
自分で一体何をしているのか分からなくなる時がある。 >>725
真っ先に直さなきゃならないのは、「スコープの広い配列にインスタンスを入れておけば、どこからでも全てのデータにすぐにアクセスできていいじゃん!」と思っちゃう点でさあ
C#のスキルの無さから設計までメチャクチャにしてるんじゃないのかねえ BASIC系って悪い習慣を覚えちゃうよね
特にVBAはひどい >>722
それだと温度センサーがアラートをコントロールしているように解釈される
常識的に考えてアラートのコントロールは温度センサーの仕事ではないだろう
これは名前の問題であってインターフェースよりイベントを使えと言ってるわけではない >>726
その通りです。
すべての変数をどこからでもアクセスしたい衝動にかられます。
Aのクラスの機能がA1とA2に分化できるから分けようと思うと、
AはCを参照してたからA1とA2両方にCのインスタンス参照を渡そうとなり、
結局機能は分けれたものの、どのクラスがどのクラスを参照してるのかがよくわからなくなってきました。 値1、2個を渡すのは簡単なんですけど、
クラスのインスタンスを100個つくるためにその参照を配列にいれる
参照の入った配列をreturnで返す
とかしてるとなんの値をいじってるのかわけわかめです。
これまで値と参照の区別をして思考してこなかったからなのかなぁ。 >>730
オブジェクト指向で参照を共有することは少ない
共有するとしてもイミュータブル、ステートレスにして共有によるデメリットを消した上で共有する
長時間生存するインスタンスがあちこち参照しあって状態を刻々と変化させていくような設計が最悪のパターン >>719
それは君が経験値不足なだけ。>>697である程度は想像できる。 >>731
なるほどCを参照しているA1、A2はCと独立したオブジェクトじゃなくなってしまいますものね。 Target[] target = new Target[Constants.MaximumNumberOfTarget];
public Target[] InitializeTarget()
{
for (int i = 0; i < Constants.MaximumNumberOfTarget; i++)
{
target[i] = new Target();
target[i].x = 100;
target[i].y = 100;
}
}
こういうふうにForm1のクラスでターゲットの座標100個発生させて表示させます。 ターゲットをクリック出来たら消す
一定時間クリックできなかったら点滅させる
ゲーム終了後にターゲットの座標をテキストファイルに書き出す
などの処理がすべてForm1上に存在することになるのですが、
それでもいいのでしょうか?
これらの作業を無理にクラスに分けようとすると
ターゲットクラスインスタンスの参照100個を渡さなくてはいけなくなります。 >>736
何が駄目なのかわからない
何か縛りプレイしているのならその前提から出してもらわないと
たとえば特定のデザインパターンの勉強が目的だとか どうせこの人は一生治んないよ
ただプログラムなんてちゃんと動けば目的達成できるんだし、まあ、これでも良いんじゃないの listやdictionaryを使ってないのかな
だったらまだそのアプリを作る段階まで届いてない target class
にx,y,timeなどメンバ変数7個程度を入れてます。
このターゲットを表示するためForm1上にクラスのインスタンスを参照する配列を置くと、
表示とゲームのコントロールすべてがForm1上におくことになって見苦しいのかと思いました。
でもテトリスとか他のミニゲームみても同じような設計になってるんですね。
無理して別クラスにするよりもtargetクラスの配列に関連した、表示、ゲーム処理はForm1上に置いてみます。
(というか実際に配列を別クラスに切り分けたら、余計読みづらくなった・・・) >>738
縛りはなかったのですが、見やすいコードということを考えすぎてました。
まずは動くコード書いて、人の書いたプログラムも見ながら勉強していきます。 >>740
最初Dictionay使うつもりだったのですが、
構造体かクラスに変数をまとめたほうがよさそうだったので今の形になりました。 >>736
何故そのような結論になるかわからない提示された仕様からだとテキスト出力クラスを作ろうって気になるかな
targetの渡し方はコンストラクタやメソッド引数にするかは自由
Hoge hoge = new Hoge();
bool Output(){
hoge.Set(target);
return hoge.Output();
} >>742
複数のTargetを管理する専用のクラスを書くんだよ
Formが全てのTargetを管理するのはオーバーワークだろ >>729
貴様にはpublicを禁止する呪いを掛ける そしてinternalを使い始めた!
ゴミグラマの出来上がり と、すでに出来あがったゴミグラマが申しておるようですが >>746
はい。
それやってみたのですが、フォーム2から初期設定値を初期値格納クラスに入れていて、
初期値格納クラスの参照、Targetクラスの参照、Targetクラス管理クラスの参照が入り乱れて書いている自分でもわけわかめになりました。
二つのプログラムを見比べた結果Form1でTarget管理させたほうがまだましなのかと・・・。
もっと規模の大きなプログラムだと違ってくるのかもしれないのですが。 >>751
小さいの組み合わせてでかいの作るんだから
でかいと組み方が変わるなんて言ってるやつは
そもそも下手クソなんだよ 素人が責務に応じたクラスの分割を理解するなんて
一朝一夕どころか数ヶ月単位の時間が掛かると思うが、このやり取りそこまで続けるの? ■ このスレッドは過去ログ倉庫に格納されています