TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
C言語なら俺たちに聞け パート0001
一般的な処理を関数型の書き方をすると遅い
Perlは10年後の2023年には消えてなくなる
【知識】俺のためのプログラム覚え書き【共有】
お前らプログラミング言語どうやって覚えたんや?
ねねっちと一緒にプログラムを勉強するスレ第3話
スレ立てるまでもない質問はここで 153匹目
Visual Studio 2017 Part6
HSP総合スレ【part 10】
CoffeeScript
ふらっと C#,C♯,C#(初心者用) Part137
- 1 :2018/04/06 〜 最終レス :2018/05/19
- 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.2ch.sc/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.2ch.sc/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part136
http://mevius.2ch.sc/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
- 2 :
- (*゚∀゚)v2get!
- 3 :
- ワッチョイ付きGJ
- 4 :
- 前スレ>>993, >>998
例外が発生しないようなコードを書くべきというのはそのとおりだと思いますが、例えば
ファイルパスが適切であることを確認してファイルが存在することも確認して、その上で
オープンしようとしてもそのタイミングでファイルが消されている、といった状況だと例外が
発生しますよね
流石にそういうケースでは例外で止めるべきだというのも一つの考え方ですが、それを
検出して処理を戻したいケースもあるだろう、と思っての質問でした
- 5 :
- >>4
誰かが編集中なときもあるし
そもそもぶっ壊れてるときもあるし
アプリの動作も含めて仕様を決めないとどうしようもないじゃん
- 6 :
- まあ、最初から言ってるように、抽象的な質問には抽象的な答えしか返しようがないw
例外に対処するイディオム的な物を教えてくれ、と言ってるように聞こえるけど
そんなものはないとしか...
- 7 :
- なかなか意図するところが伝わってないのですが、「例外処理をループの中に閉じ込めて、
例外が発生しなかった場合だけループを抜ける」という書き方を知りたかったのです
処理の内容とかはどうでも良くて、ループの囲い方とその抜け出し方を
なので、以前レスいただいたように、whileで無限ループを作って、tryブロック内にbreakを
置いてループを抜ける、という回答で私には十分でした
試してみれば一発で分かる話だったのですが、tryブロックから外側のループを直接抜ける
ことができると思っていなかったので、それに気づかなかったということです
皆様お付き合いいただいてありがとうございました
また質問をした際には付き合っていただけると幸いです
- 8 :
- https://ideone.com/lasZ8b
のようなクラスを他プロジェクトやライブラリでICollectionの型として使いまわしたい場合
どのように依存させる構成にすればいいのでしょうか?
インターフェースとかでこの型の実装を強制ってできるんでしょうか?
それかインターフェースは使わないで他の参照方法が望ましいんでしょうか?
- 9 :
- 困っているわけじゃないんだけどちょっと気になってることがあるので分かる方がいたら教えてください
次のコードを実行すると y に true が代入されますが、これはどういうときに使うのでしょうか
string x = null;
bool y = x is var z; // y に true が代入される
- 10 :
- private void button1_Click(object sender, EventArgs e)
{
if (sender is Button b)
{
}
}
方法: as 演算子と is 演算子を使用して安全にキャストする (C# プログラミング
ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/types/how-to-safely-cast-by-using-as-and-is-operators
- 11 :
- チラシの裏
C#の構造体にこんな落とし穴が存在することをついさっき知った
http://ufcpp.net/study/csharp/resource/readonlyness/#this-rewrite
- 12 :
- public class Test
{
public int Id{get;set;}
public string Text{get;set;}
public string Other{get;set;}
}
このようなクラスを他プロジェクトやライブラリで
ICollectionの型として使い回したい場合
どのような依存をすればいいのでしょうか?
インターフェースでこの型実装を強制させるとかでしょうか?
インターフェースを使わないで他の参照方法のが望ましいのでしょうか?
- 13 :
- 継承
- 14 :
- >>12
悪口言いたくないんだけど、俺様用語が多過ぎて何を言ってるのか全然分からないよw
- 15 :
- >>14
List〈Test〉等を他のプロジェクトでも扱いたいのでTest型で返す関数を作成して
それをこれをパッケージした時に他のプロジェクトでも受け取れるようにしたいって事ですね
public Test GetTest();
みたいな関数でTest型を使いまわせるようにしたいです
- 16 :
- >>13
Abstractって指摘も入ってるので
型クラス(Test)を実装しておき
これをベースにして
public Test GetTest();
を継承先に実装するようにするのが一番賢い設計ですかね・・・?
機能というよりはC♯を使った設計の質問と少し抽象的な話なのでスレチだったらすいません
- 17 :
- >>15
publicな型はそれを含むプロジェクト(アセンブリ)を参照する別のプロジェクトからも
普通に使えると思うけど、そういう話ではなくて?
- 18 :
- >>17
dll状態だと戻り値Test型って何?ってならないかと思って構造どうすればいいのか悩んでましたけど
そもそもそういう事を考えること自体がおかしかったかもしれないです・・・
Test型のみを他のプロジェクトに流用させたい時とかも考えていたんですけど
そもそもその設計自体がおかしいと思い至りました
- 19 :
- >>12
もうちょっと掘り下げて質問し直します
EntityFrameworkを使ってSQLにTest型の入出力をするクラスと
WebからスクレイピングしてTest型を返すクラスを作りたいのですが
ここでTest型を両方で共通で使いたいと思ってます
Test型はプロパティが減ることは無いですが追加はしたいものとします
この時Test型はどのように実装するのが好ましいのでしょうか?
今だとSQLに接続したい時とスクレイピングする時に読み込むクラスが分けれないので困っています
- 20 :
- >>19
これはTestクラスを作成して単独でビルドし
これを参照させたSQLクラスとスクレイピングクラスに継承させて扱うのが正解なのでしょうか?
- 21 :
- C#というよりクラスタイプoop全般の話だと思うのですが、クラスを呼んだ時のパラメータは、コンストラクタに与えるのが良いのでしょうか、メソッドに与えるのが良いのでしょうか
両方できるので無造作に使ってるのですがOO的に間違った事をしていそうで
よろしくお願いします
- 22 :
- クラスを呼ぶってなに?
- 23 :
- 場合によるのでその都度考えてください
- 24 :
- >>22
インスタンスを作るのとメソッドをコールすることと意識が混ざっている素人で失礼しました
インスタンスを作る時にパラメータを渡すのと、メソッドの引数にパラメータを渡すの、oo的にはどちらが正しいのかお聞きしたかったです
- 25 :
- >>23
oo的にはこう、というのは無く、スマートに記述できる方で良いという感じでしょうか?
今自分は気分や雰囲気で使い分けてるのですが、実はルールがあるのではと心配しておりました
- 26 :
- >>25
正直何が聞きたいのかよく分からんけど、
いろいろ想像してみると、たぶん本当に聞きたいことはコンストラクタ云々じゃなくて
あるデータをプロパティとしてオブジェクトに持たせるかどうかをどういう基準で決めるか、
じゃないのかな。
例えばSystem.Timers.TimerにはpublicなプロパティIntervalがあるけど、
これをprivateかprotectedにしてユーザーからアクセスできないようにして、
Startメソッドの引数として与える仕様でも同じじゃないのかと
- 27 :
- >>26
理解が浅く説明が拙くすみません
そのような事です
どちらでも出来てしまいますが、使い分けのルールや指標はあるのかなと
- 28 :
- そのパラメーターが変更可能なのかどうかでやり方がいろいろある
インスタンスを作るときに最初に決めたパラメーターを変える必要がないもしくは変えたくないなら
コンストラクタで渡してしまえばいい
毎回変えるかもしれないならメソッドで渡せばいい
- 29 :
- >>27
そんなもの無い
その時々で苦悩して答えを出すしかない
プログラミングってそういう仕事
- 30 :
- >>21
教科書的にはメソッドの引数しかありえない
- 31 :
- >>27
基本的には全部引数でも間違いではない
あくまで関数が主であって、オブジェクトは関数のコンテキストに過ぎない、と考えるのが今時のプログラミング
端的に言えば、毎回同じ引数を渡すのが面倒だと思うならクラスにすることを検討するというだけの簡単な話
- 32 :
- >>27
いや、プロパティとして持つべきデータかの判断は一般的にはそんなに難しくないはず。
上に例に挙げたTimerだって、Startの引数でIntervalを指定する方式だと
問題や不自然さがあることはちょっと考えれば分かるはず
- 33 :
- >>32
別に問題も不自然さも無いよ
System.Timers.TimerやSystem.Windows.Forms.Timerのインターバルがプロパティなのは、デザイナで設定できる必要があるからだ
実際、デザイナに貼れないSystem.Threading.Timerはコンストラクタかメソッドで周期を設定する
(ライブラリではなく)アプリケーションの開発に関して言えば、データクラス以外でプロパティを使う必要があるケースは稀だよ
データクラスを除けば、一度設定した値を取り出したくなるのは殆どの場合設計が間違っている
- 34 :
- >>21
・コンストラクタで渡す
var a = new Test(1, "A");
・メソッドで渡す
var b = new Test().SetId(2).SetName("B");
・オブジェクト初期化子で渡す
var c = new Test{
id = 3,
name = "C",
};
通常はコンストラクタで、メソッドチェーンはファクトリパターンでよく使う
オブジェクト初期化子は閉じてるクラスの可読性を上げたいときに使う
まあ統一性さえ確保出来ていればどれを選んでも大差ないよ
- 35 :
- >>33
System.Threading.Timerがプロパティを持たないのは何か意図があると思うが
使ったことがないのでよくわからない。(軽量であることが「コンセンプトだから?
あるいんた単に設計者の頭が古いだけかもしれない}
TimerのIntervalをプロパティとして実装しなかった場合。
(1) タイマー動作時にIntervallを変更するためにはStartを実行することになるが、
OOP的に不自然
(2) そもそもTimerオブジェクトは、少なくとも動作時にはIntervalの値を保持している。
だったらこれをプロパティとして公開する方が自然
- 36 :
- >>35
動作中にIntervalの値を変えられると困る場合、
Start時のみ設定可能にするのは別に不自然でもないよ
OOPの目的はメンテナンス性と事前の徹底したバグ潰しだから、値を変更できるルートを予め絞っておくことは理に適ってる
- 37 :
- >>36
現実と違う仮定を置いたら何でも言える
- 38 :
- 色々とアドバイスありがとうございます
統一性があれば、後はデザパタに従うか等で決定するのが一般的と解釈しました
田舎の中小1人情シスでコードレビューもされないので世間の動向が分からず参考になります
都会の大手の人は切磋琢磨し洗練されたコードを書くんだろうなと憧れます
- 39 :
- >>29
あまり我流過ぎるとチーム開発の時に混乱するという心配がありまして
- 40 :
- >>39
対象を無視してオレオレナントナク基準で決めるほうが我流
物事にはそれぞれ特性があり最適な答えはいつも違う
それを導き出すには都度考えて議論を重ね実験を繰り返すしかないんだよ
- 41 :
- 見積り終わってるのに時間かけても無駄
一円の利益にもならない
今回の開発で黒字でなければ2回目はない
よって一番時間がかからない方法が正義
- 42 :
- 業務系はそれでいいのかもね
保守するのは自分でも自社でもない
ならどんなに汚いコードでも早くしあげたほうが勝ち
ただし納品された顧客はとんでもない借金を背負うことになる
罪悪感ってないのかね
- 43 :
- >>42
いや
君のやり方だって怪しいもんじゃない?
具体的に○○さんのコードは見易くてわかりやすいですねって言われた実績あるの?
無いのに勝手な妄想で自分のコードを保守しやすいと思い込んでない?
- 44 :
- まーた始まった
- 45 :
- >>44
お前なんか全身elseで強化した俺の敵じゃねぇ
- 46 :
- >>45
ナマ言ってすみませんでした
- 47 :
- VisualStrudioのC#でPS4を入力を表示するソフトを作りたいんだけども、
どんなライブラリが便利かな?
- 48 :
- >>47
PS4の入力ってなに?
コントローラの事?
- 49 :
- 日本語でOK
- 50 :
- PS4を窓の外に出力する
入力すならまずはアマゾンで注文
- 51 :
- 作画ソフトを作成したいのですが
解像度より大きな領域を扱うことになりそうです
10%〜800%まで拡大縮小ができて
編集操作を行う必要があるのですが
どのような造りにしたら良いのでしょうか?
自分でスクロールバーを置いて編集領域は自前で描画するのでしょうか?
PictureBoxのようなコントロールでスクロール操作までできてしまうのでしょうか?
- 52 :
- ドロー系?
ペイント系?
- 53 :
- >>52
具体的には印刷すると模造紙ぐらいの大きさのでっかい回路図を作成します
保存するファイル形式はXmlです
- 54 :
- >>50
入力酢?
- 55 :
- >>51
自分でスクロールの機能まで実装してもいいけど、
特に理由がないならコンテナ(例えばPanel)の中にPictureBoxを入れて使うのが
普通じゃないですか
- 56 :
- >>51
PictureBoxにスクロールバー表示するのは
https://dobon.net/vb/dotnet/graphics/scrollimage.html
例ではコードでプロパティ設定しているけどデザイナで設定しても同じようにできる
- 57 :
- 模造紙レベルのでっかいpitureboxで画像のまま編集は現実的じゃないけどね
実際は表示部分だけ都度計算して描画することになる
ドロー系にしてもまあ普通は向いてない
C++でやるような内容だよ
- 58 :
- 論理座標とワールド座標、デバイス座標をよく理解すべき
- 59 :
- >>55-58
ありがとうございます
頑張って見ます
- 60 :
- すいません、PS4のコントローラをPCに接続して、
入力ボタンを表示したいのです。
- 61 :
- >>60
https://game.watch.impress.co.jp/docs/series/ggl/637329.html
- 62 :
- 配置が違うだけなのか。
でも認識させるにはDirectXのラッパーとか使うしか無さそうなのね。
- 63 :
- 出来ましたー、ありがとうございます。
DirectInput
http://nanoappli.com/blog/archives/4772
Xinput
https://gist.github.com/kb10uy/7368358
- 64 :
- Task.Factory.StartNew(またはTask.Run)で生成したスレッドの優先度を変える方法はあるのでしょうか。
- 65 :
- 63ですがスレッドプールを使わず、スレッドで対応することにしました。
- 66 :
- なぜレガシィな方向へ走るw
- 67 :
- >>66
Taskだと処理中に割り込み?が割と入ってきて、処理時間が遅延してしまうのです。
スレッドレベルで優先度を上げたいと思いまして。
結局Threadにして優先度を上げても割り込みは入ってくるのですが、多少マシになったような気がします。
- 68 :
- どんだけタイムクリティカルな要件なのよww
- 69 :
- パソコンぶん投げてPLCにしよう
- 70 :
- picでも使えよ
- 71 :
- >>67
それ単にスレッド生成で遅延しているなんてオチじゃないよな?
- 72 :
- 受託案件なのでC#で作らざるを得ないのです。
自分自身はファーム屋なので、マイコンでやりたいんですけどね。
>>71
まだ遅延の原因はわかってませんです
生成時だけの遅延じゃないので、違うとは思いますが・・・
- 73 :
- プロセスの優先度もあげるといいらしいぞ
- 74 :
- 糞多い要素群にlinqで遅延実行+ループとか?
- 75 :
- >>72
Win32で作る
- 76 :
- >>72
GCやJITは対策してる?
- 77 :
- ユーザーコントロールのプロパティをデザイン時のプロパティウィンドウでコンボボックスにしたく
人様のサイトで恐縮なのですが、以下をほぼコピペしました。
http://blog.okazuki.jp/entry/20070207/1170820895
が、テキストボックスのままで選択肢になりません。
公開プロパティに、なにか別の宣言が要りましたでしょうか?
- 78 :
- 継承ユーザーコントロールだったのですが、継承元にも
[System.ComponentModel.TypeConverter(typeof(〜 が必要だっただけみたいです。
すみませんでした。
- 79 :
- 引き続きすみません。
たとえばユーザーコントロールに
Folder
File
という2つのstring型の公開プロパティを用意します。
IDEのプロパティウィンドウからFolderを設定(通常のテキストボックス)すると
そのフォルダ内のファイルを舐めてFileの選択肢にしたいのです。
TypeConverterで、静的な候補が出て選択できるところまでは出来たんですが
動的に候補を変更する場合、どうするんでしょうか。
IDEのプロパティウィンドウに、どうアクセスしたらいいのか、そこが分かれば何とかなる気がしてるんですが。
- 80 :
- >>79
Visual Studio .NET プロパティ ブラウザによるコンポーネントの本格的な RAD 化
https://msdn.microsoft.com/ja-jp/library/aa302334.aspx#vsnetpropbrow_topic04
このドロップダウンでできると思う
- 81 :
- 初歩的な質問で申し訳ないのですが、
戻り値なしのメソッドと、引数なしのメソッドはどういう状況で使用するのでしょうか?
戻り値なしのメソッドは
その後にどこかに代入したりする予定はなく出力が目的の場合に使用すると
読んだのですがその通りですか?
万が一、後で代入したくなった場合に備えて取り敢えず戻り値は設定しておいたりしないのでしょうか?
引数なしのメソッドは
引数がない(=変数宣言がない?)とそのメソッド自体、動いてくれないイメージがあるのですが、実際は動きますよね
何も値を与えられていないのに動くのはどうしてですか?
宜しくお願いします・・・
- 82 :
- >>81
オーバーロードで検索してみると良い
- 83 :
- >>81
例えば
int Add(int a, int b) {
int c;
c = a + b;
return c;
}
というメソッドですと、Add(3, 5)ならaとbにそれぞれ3、5が入りc=8となると思うのですが、
abc = xyz,Add()といった風に使用しても、cの値も何も返ってこないのに、
引数なしのコードを見かける様な・・・
- 84 :
- >>81
デフォルト引数で統合しなされ
- 85 :
- >>81
メソッドってのは別に数値の計算だけするわけじゃない
何かの処理なので、その処理に引数が必要なら引数を渡すし
その処理に結果があるなら戻り値がある
- 86 :
- >>85
横からごめん
処理に結果がないならそれはもう何も処理してないのと同じじゃないの?
- 87 :
- >>86
君がうまい説明してあげてね
- 88 :
- >>87
>>85の説明が間違ってると言いたいんじゃなくて
単純に理解できなかったんだけど誤解させたならごめん
とはいえせっかくだから自分なりに説明を考えてみたんだけど
プログラムを動かすことが目的じゃなくて人間に読ませてアルゴリズムを
分からせることが目的の場合は最終的な結果は必要ないって感じかな?
- 89 :
- >>81
メソッドは外注さんへの作業手順書みたいなもん
引数は、その作業に必要な情報がある場合に外部から渡すための窓口
情報不要なら省略できる
引数なし=こっちから情報渡さなくても作業できるよね?みたいな感じ
メソッド内で作業が完了したあと、なんか返事してほしい場合は戻り値をつかう
返事不要の場合void
戻り値なし=作業さえしてくれたら結果レポートいらね!
メソッドコール(外注さんへ仕事依頼)したら作業はちゃんとされるので、結果のレポートを使って、さらになんか作業をしたいなら戻り値よこせよ!って作業手順書に書いておけばいいし、仕事さえしてくれたら、返事不要なら戻り値いらない
- 90 :
- >>81
コントロールにupdateってメソッドがあるだろ?
これは自身の再描画をするだけのメソッドなんだから引数を取りようがない
また再描画するだけなのに失敗するわけないんだから戻り値もいらない
無理やり成否を返すこともできるが、失敗する可能性があるメソッドに様変わりし、呼び出し元で失敗を意識した実装にしなきゃいけないから負担を強いることになる
って感じかな
- 91 :
- 引数のとりようも戻り値の返しようもなんぼでもあるわ
へんな忖度みたいな真似すんなボケ
- 92 :
- >>89
作業が行われればレポートは要らないというのは例えば殺し屋みたいな?
でもコンピューター上でそれを再現するならターゲットもターゲットの生死も0と1のデータなんじゃないの?
だとしたらそのデータはどこに消えるの???
>>90
同じようなことばっかり聞いて悪いんだけど再描画の結果も0と1のデータなんじゃないの?
それがメモリに残らないのに再描画は成功という意味がわからない
>>91
戻り値の返しようがあるというのは返さない選択肢もあるということ???
戻り値を返さないプログラムに人間に読ませる以上の価値があるとすればそれを教えて欲しい
- 93 :
- オブジェクトとは何かね
- 94 :
- >>92
横からで悪いけどたとえ話がおかしいし
言ってることが伝わらない
もっとまとめてから書くべき
- 95 :
- >>81
まあ、一言でいうと愚問だねw
そんなこと考えても時間のムダ。
真面目な話、その疑問はそのまま放置して前に進む方がいいと思う。
- 96 :
- >>93
オブジェクト指向ってやつか!
オブジェクトを使うと結果がない処理にも意味があるってこと?
>>94
まとめるなら「結果がない処理の価値がわからない」って感じかなあ
>>95
詰め込み教育への皮肉だと思うけど正直分かりにくいかも
もし本気で言ってるならさすがに時代遅れだから考え直したほうがいいよ
- 97 :
- >>96
経験が足りないために起こる疑問は経験を詰むことでしか解決しない。
構造化プログラミングの意義もOOPの意義も、体感できるのは
実際にコードを自分でコードが書けるようになってから。
本で読んだだけで最初からそれが分かるのは一部の天才だけ。
逆にいえば、>>81の疑問は頭の良い人が考えた難しい理論を理解しないと
解決しないような問題じゃなく、誰でも体験すれば自然と分かる程度の話ってこと
- 98 :
- >>92
0と1?何を言ってるのかわからん
14時に集合ってメール出して、全員からわかったみたいな返信きてもうざいだろ?
だから、14時集合(返信不要)ってメールをおくる方が受け取る側も返信しなくていいし、送る側も無駄な受信を減らせるしでwinwin
この辺りは経験だったりセンスだろうな
- 99 :
- >>96
成否の観点では単にフィールドの値を設定するメソッドを鑑みても
メモリに書き込み失敗の概念があっても、代入に失敗の概念はない
設定前の値を返すにしても、わざわざ退避する処理を強制するのか?
想定外の発生は基本的に例外をぶん投げるものだし
常人が気にしない様な事を考えて躓いてそうである
- 100 :
- 関数型プログラミングの才能があるな
- 101 :
- >>96
戻り値がないのは常に「成功」を返す関数と考えて良い
C#では失敗した場合は例外を投げるので、成否を戻り値で判定することはない
C言語とかgoみたいに例外という概念がない言語は、成功したかどうかが戻り値に入ってることが多い
それでも絶対に失敗しないか、失敗したらプログラムが強制終了するような処理は戻り値がない場合もある
- 102 :
- >C#では失敗した場合は例外を投げるので、成否を戻り値で判定することはない
えぇ…
- 103 :
- >>101
> C#では失敗した場合は例外を投げるので、成否を戻り値で判定することはない
ケースバイケース。何でもかんでも例外にしちゃ駄目。
- 104 :
- >>97
とりあえず>>95が本気なのとそれが思考停止の詰め込み教育信奉じゃないのは分かったよ
偉そうなこと言ってごめん
>>98
自分もちゃんとは理解してないけどコンピューターは0と1だけで動いてるらしい
でも初心者用スレで出す話ではなかったと反省
メール送信の例は分かりやすい!と思ったけど本当に結果が何もないと送信済みマークも付かないのでは・・・?
>>99-103
詳しい人でも意見が割れるくらい難しい問題なのね
>>100は皮肉なんだろうけど意味どころか自分に向けられた言葉なのかも分からないから反応に困る・・・
- 105 :
- >>104
元の発言の「結果が無い」って言葉を勘違いしてる。
関数で処理した結果を返り値と言う形で関数の呼び出し元に伝える必要が無いって意味だ。
ちゃんと意味のある結果は発生している。
- 106 :
- >>102-103
書き方が変だった
C言語やgoと比べて成否を例外で処理することが多いから戻り値がなくても良い場合が多い程度の意味で言った
>>104
メール送信の結果は戻り値ではない方法で返しているというだけ
C#には例外やイベントのように色々な機構があるから、とりあえず細かいことは気にせず先に進んだ方がいい
- 107 :
- 関数という言葉に惑わされてるということかな
メソッドは数学で言う関数そのものじゃない
(y=x+1とかそういうのじゃない)
やることを順番に書いてあるもの
サブルーチン
戻り値が定義されてたそれを返すだけ
ほかの言語で戻り値がないものは関数と区別してる言語もあるけど
わざわざ二種類つくるより戻り値なしで共通にしてある
- 108 :
- >>104
その辺は想定外と書いたように>>103よろしくケースバイケースだよ
十分想定され例外情報すら要らんなら戻り値で成否を返す事もあるし
InvalidProgramExceptionみたいに言語レベルでは処理できない物もある
話が逸れたけどOSレベルでは例外を発生させる余地などが有ったとしても
プラットフォーム次第になったりと言語レベルで突き詰めない場合は多い
- 109 :
- いろいろ調べたり考えたりしたのですが、解決出来ないので質問します。
https://dotnetfiddle.net/SoCII1
このようなコードがあって
List<ITest>にいれていったときに
ListのXだけを全て足して返す関数は出来たのですが、今後ITestのプロパティは増える予定で、それぞれに足して返す関数をつけたいです。
そのときに似たようなコードになるので一つに纏めようとしたのですが中々できず困っています。どのような書き方をすればいいでしょうか?
- 110 :
- >>109
基本的にはプロパティを動的に指定するのはリフレクションとかDictionaryを駆使とか、何らかの形でコストを払うことになると思う
状況にもよるけど、コンパイル時に確定してるならT4テンプレートとかコード生成とかで対応するのが一番正しいんじゃないかな
- 111 :
- >>109
そんなものは自作しなくてもList自身(正確にはIEnumerable<T>だけど)が持ってるw
名前もそのまんまSumだからよくMSDNを見てみ
https://msdn.microsoft.com/ja-jp/library/6sh2ey19.aspx
- 112 :
- >>111
んー、エスパーだけど、質問者はプロパティをforeachみたいに回して全てにsumするようなのをプロパティの数に限らず1行で書きたいってことじゃね?
- 113 :
- >>104
メソッドの戻り値とコンピュータの世界は全く関係がない
低級のマシン語をわかりやすくするための高級言語なんで初心者用スレで〜というよりは見当違いなことを言ってる
っで、結果とは低級レベルでの結果とメソッドレベルの結果のどちらをさしている?
低級レベルでの結果が表に出てこないのは普通のこと
メソッドレベルで見てもメールの送信済マークを含めてないのでメソッド戻り値の返さない
- 114 :
- >>110
リフレクションについて調べて何とか出来ました!ありがとうございます!
>>111,>>112
もう少し具体的に書いていれば良かったですよね・・・今後質問するときはもっと詳しく書くので、そのときはよろしくお願いします!
- 115 :
- 連続時間的な関数ってあります?
- 116 :
- 連続時間 is 何
- 117 :
- エポック秒のことかなぁ
- 118 :
- アナログメーター的なやつです
- 119 :
- >>118
プログレスバーでググってみてはどうか
- 120 :
- 時空連続体と空目した
- 121 :
- プログレスバーってもろデジタルメーターじゃないですか
数百〜数千の筋繊維を一本の糸で表現できるような関数はないですかね
- 122 :
- you!画像ファイル扱っちゃいなyo!
- 123 :
- >>121
>>118のアナログメーターも全く関係ないんだけど?
筋線維もよく意味が分からないし、糸の振動の軌跡の描画みたいなことやりたいのなら自分で作るしかないよ
- 124 :
- プリンタの印刷設定の縦横を変更したいです。
DefaultPageSettings.Landscape プロパティから変えられるのは確認しましたが
一時的なものではなく、プログラムが終了したあとも変わったままにしておきたいのですが
なにか方法はないでしょうか?
http://bbs.wankuma.com/index.cgi?mode=al2&namber=2377&KLOG=2
このサイトも参考にしてSetHdevmodeなどもやってみましたが、プログラム終了後にもとに戻ってしまいます。
Windows7,10 64bitです
- 125 :
- 筋繊維を糸で表現ってそれもう物理演算じゃん
- 126 :
- 何がしたいのかよう分からん
>数百〜数千の筋繊維を一本の糸で表現できるような関数
が欲しいなら
「アナログメーター」なんて単語は出てこんと思うのだが
なんか特殊な知識が必要なことやってるなら
なおさらキチンと説明しないといかんだろう
- 127 :
- >>124
次回そのプログラムを起動した時も同じ設定が適用されるようにしたい、
という意味なら、Landscape を永続化すればいいだけでしょう。
同じ設定が他のプログラムにも適用されるようにしたい、って意味なら、
たぶんそんなことは出来ないんじゃないかと...
よく知らんけど
- 128 :
- >>127
後者の方を考えています。
なにか方法があればいいのですが、、、
- 129 :
- 他のプログラムでも同じ設定を使いたいんならプリンタドライバの設定変更以外に方法はない
てかそれってC#関係ないよね
- 130 :
- [[['[] ]]] { {] ]][ '[][][] [][] [][][] [] '[] []
- 131 :
- c#勉強始めたての者です。
indexofで文字列を検索しようとしているのですが、長文を検索するとエラーが出てしまいます。
MSDNを見ると戻り値がint32とあり、戻り値がintの範囲を超えるとlongエラーになるように推測していますが対応方法はあるのでしょうか。
- 132 :
- すみません上記文中のlongは誤植ですので読み飛ばしてください。
- 133 :
- そう言われるともうlongしか見えない
- 134 :
- 文字数がintに収まるように文字列を切り出しながら検索すればいいんじゃないか
もちろん切れ目に検索対象の文字列が有るときの対策して切り出さなきゃならんけど
- 135 :
- ありがとうございます。
matchメソッドというのを見つけました。
全然見つからなかったのに投稿し出来すぐ見つかるものですね。
matchで出来なかったらint分割にトライしようと思います。
- 136 :
- フォーム上のコントロールを、プログラムから参照するいい方法はないでしょうか
SplitContainer上に配置した合計20個のチェックボックスについて、textをファイルから
読み込んだものに動的に変更したいと考えています
手元の書籍(作って覚えるc#)では、forループの中で
splitContainer1.Panel2.Controls[i].Text = mistakeText;
という形でやっていましたが、今回自分で用意したフォームはほかにもテキストボックスや
ラベルがあり、うまくチェックボックスを対象としてくれません
デザイン画面で配置した順番にやや依拠しているようですが、最後においたものほど添字が
小さそうだ、程度しかわかりません
今後デザインを変更する、あるいはチェックボックスを増やす可能性を考えると、何らかの
プロパティで順番を指定できるといいなと思いますが、発見できませんでした
Form1.Designer.cs のメンバ変数宣言欄に記載がある順番のように思えますが、IDEが
自動生成したコードを並べ替えるのも何やら気持ち悪く、今の所手を出していません
今回はチェックボックスですが、ほかにもラベルを順に参照するとか、テキストボックスを
順に参照する方法などあれば、教えていただけると助かります
なお、今回のフォームでは、とりあえずチェックボックスの名前は初期値(checkBox1など)に
なっています
- 137 :
- >>136
if (Controls[i] is CheckBox)
- 138 :
- >>136
根本的に考え違いをしてると思う。
たぶんありもしないものをあるはずだと勝手に思い込んでる。
コントロールをテーブル参照したいなら自分で明示的にテーブル(配列)を
宣言しましょう。
デザイナには君が欲しいと思っているものを忖度して自動で作ってくれるような
都合のいい機能は存在しない。
- 139 :
- >>137
とりあえずチェックボックスだけを選択することは可能になりました
順番はやはり思っているとおりにいきませんが、これは実行結果を見つつ、デザイナで
並べ替えるしかないかなと思い始めました
>>138
デザイナが忖度してくれるとは思っていないので、プロパティか何かで明示的に選択する
事ができないかな、と思ったのです
以前VBAで似たようなものを作った際は、
Controls("CheckBox" & i).Caption = Cells(i, 1)
こんな選択の仕方ができたので、c#でもなにか方法はあるのではないかと思いました
- 140 :
- >>139
コントロールに名前付ければいいじゃん
フォームにあるコントロールをどうやって特定したいと思ってるの?
- 141 :
- >>140
例えば
Panel.Controls.CheckBox[i]
みたいな形で指定できればいいなと思ってるんですが、残念ながらそうできないですね
>>138
が書いている、自分で明示的にテーブルを宣言するというのは、例えば
cbox[1] = CheckBox1;
cbox[2] = CheckBox2;
とかいうコードを予め書いておく、ということでしょうか?
- 142 :
- >>141
意味がわからない
何がしたいの?
@コントロールを特定する必要がある
A複数のコントロールに共通の処理がしたい
Aにしか目が行ってないけど@をやらなきゃいけない時点で
Aの方法なんてエレガントにできたってウンコブリブリじゃん
- 143 :
- オムツの取り替えまでやって欲しい要介護は大人しくVBやってろ
- 144 :
- >>141
だから、配列が欲しいなら配列を自分で作ろうよ。
配列が欲しい、でもなんだか自分で配列を書くのは嫌だ。
この発想がおかしい。
var cbs = new[] {CheckBox1, CheckBox2, ...};
これ書くのがそんなに面倒?
変な方向に努力する方が余程面倒でしょ
ローカル変数じゃなくてメンバ変数かプロパティとして実装する場合だって手間は大差ないよ
- 145 :
- >>144
配列を書くのは別に面倒でもなんでもないです
コピペしてちょっと直せば済むので
ただ、コピペで済む内容なら、コードで表現する方法があるのではないかと思ったのです
「新しくなにかプロパティを実装する」のではなく、「このプロパティを参照するとわかる」
という情報が存在するのかと考えました
>>138
が書いてくれたように、「ありもしない物をあるはずだと思い込んでる」のかもしれません
- 146 :
- >>145
それって同じフォーマットの行が並んだ設定ファイルみたいになんでしょ?
どの部分を自動でやってくれると思ってん?
- 147 :
- >>146
自動でやってくれると言うか、Controls[n] の n に相当する部分を、何らかのプロパティで
持っているのではないかと思ったのです
それがわかれば、IDEでプロパティを書き換えてやればそれで済むな、と
あるいはそれがなければ、例えば
for (int i = 0; i < CBOX_ELEMENTS; i++) {
string s = "checkBox" + (i+1).ToString();
Controls(s).Text = ...
}
みたいな形で指定できないかな、と思っていたのですが、これは無理そうですし
- 148 :
- 配列作って突っ込んどくのが何より簡単だし自由だろ
- 149 :
- >>147
インデクサじゃ駄目なの?
- 150 :
- >>147
ちがくね?
お前がやりたいのって別のデータとid(?)が一致する項目にデータを入れていきたいんじゃねーの?
でもそれってコントロールを特定する必要があるんだよね?
コントロールとデータを紐付ける何かはあるの?
- 151 :
- GetAllControlsのカウント取るとかそういう?
- 152 :
- Type.GetPropertiesの方かな
- 153 :
- VB6はコントロール配列があったけどなー。.Netの世界にはないからの。
- 154 :
- ttps://dobon.net/vb/dotnet/control/findcontrolbyname.html
名前で探せばいいのでは?
- 155 :
- だから配列に突っ込めば済む話を何でわざわざより面倒な方法で解決しようとするのw
- 156 :
- >>150
いや、単純にファイルから読み込んだ名前で、チェックボックスの文字を変えたいだけです
例えばファイルの中身が 犬,猿,雉だったら?CheckBox1-3の文字をそれぞれ犬、猿、雉にしてCheckBox4-20は「使用不可」にでもするような
だから機械的に参照できればよかったのです
>>154
これでほぼ解決です、ありがとうございます
- 157 :
- >>155
まあ一言でいうと、わざわざ自分で配列を作らなくても、それを実現する方法はすでに存在するだろうと思ってたのです
配列作ったら「そんなことしなくてもこう書けば一発で参照できるのに」って言われる方法があるんじゃないかと
- 158 :
- >>156
その下にインデクサによる説明もあるだろw
- 159 :
- public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Name ).ToArray();
}
private CheckBox[] checkBoxes;
}
- 160 :
- public class B : private A
{
}
みたいなこと C# じゃ出来ないんだっけ?
- 161 :
- >>160
継承元をprotectedにすれば継承したクラスからしかアクセスできないようにはできる
- 162 :
- >>160
何言ってるのかわかりませんw
- 163 :
- そのクラス経由でしかアクセスできないようにしたいってことじゃないの?
- 164 :
- ゆとりしか居ないのかなぁ
C#はprivate継承はサポートしてないよ
フィールドに持たせて移譲メソッド書くしかない
- 165 :
- >>164
ゆとりなんてもうオッサンやでおじいちゃん?
- 166 :
- これ参考にすればいいのかな
http://ufcpp.net/study/csharp/oo_conceal.html
protected internal 同一プロジェクト内のクラス内部、または、派生クラスの内部からのみアクセス可能
private protected (C# 7.2 以降)同一プロジェクト内のクラス内部、かつ、派生クラスの内部からのみアクセス可能
こういうこと?
- 167 :
- >>156
それで解決しねーだろ
バラっバラにくんじゃね?
俺はてっきりコントロールの
座標でソートして名前付けたいのかと思った
- 168 :
- 皆様いろいろありがとうございました
>>159
書いてくださった方法が、ほぼ私が求めていたものを完璧に実現しています
抱かれてもいいくらい惚れました
ただ、試してみたところピックアップされる順番は必ずしもコントロールを配置した
順番通りではなく、はっきりした法則性も見いだせませんでした
テストプログラムを書いて、インデックスと見た目を一致させるようデザイナで
コントロールを並べ替えようかとも思いましたが、後日コントロールを追加した際
悩むことになりそうなのでやめておきました
>>154
結局この方法でコントロールを検索し、発見したコントロールをリストに追加するという
方法で対応することにしました
>>155
配列に突っ込むにも、コード上に直接 checkBox1 とか checkBox2 とかのリテラルを
埋め込みたくなかったので、検索した上で配列を作ることにしました
>>149, 150, 151
実は書いていることがわからないレベルなので、これから勉強します
「作って覚える」は一通りやったので、「独習c#」を紐解いてみます
>>167
これで解決しました
158の方法で解決するかと思っていたのですが、やってみたところバラバラの順番でした
皮肉でもなんでもなく、コントロールの座標でソートとか、なぜそういう操作をしたいのだろうと
推測したのか教えていただけると嬉しいです
今後も質問すると思いますので、疑問点がわかりやすい文章を意識する必要があるので
- 169 :
- 今日からC#勉強し始めたけど、
結構ネスト深くなる言語っぽいね、これ。こんな…
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
try
{
checked
{
sbyte a = 64;
sbyte b = 65;
sbyte c = (sbyte)(a + b);
}
}
catch (OverflowException ex)
{
Console.Write(ex.Message);
}
}
}
}
- 170 :
- >>168
いやいやいやcheckBox1 とか checkBox2 とかはリテラルじゃないってw
ただの識別子(フィールド名)
コードにリテラルを埋め込むというか、コンパイル時に誤りを検出できない
(普通の理解では)お行儀の悪いコードになるのはむしろ>>154みたいな方法だってw
- 171 :
- namespaceとかcheckedがブロックなのが何かなぁ…
- 172 :
- >>170
おっと・・・
どうやら根本的なところで間違っていたようです
書いてあるとおりだとすると、質問とレスが噛み合っていない理由がわかりました
わざわざ行儀の悪い書き方を探していたのか
- 173 :
- >>168
>>159はOrderBy()でチェックボックスの名前(Name)順にソートしてる。
Nameの代わりに、TabIndexかTagを設定してそれを利用しても良い。
というか、Nameだとチェックボックスが10個以上になるとソートが望むようにならないか。
- 174 :
- >>168
おそらく配置したコントロールから欲しい情報は座標とサイズぐらいしかない
それらの特定情報は別ファイルにある
なのでコントロールが上から
もしくは左からか順番に取得できれば
別ファイルに記述した通りの順番で情報を並べることができる
Controlsで取得できる順番はよく知らないけど
作った順かあるいわなんの特徴もなくランダムか何かを保証するものではないのかな?と
- 175 :
- >>174
Controlsが返す順番は保証されてないけど、自分でソートすれば良い。
(1)TabIndex順 (各CheckBoxにタブオーダー(TabIndex)を設定しておく)
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.TabIndex ).ToArray();
(2)Tag順 (各CheckBoxのTagに数値を設定しておく)
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Tag ).ToArray();
(3-1)Location順(左から)
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Location.X ).ThenBy( x=> x.Location.Y ).ToArray();
(3-2)Location順(上から)
this.checkBoxes = this.Controls.OfType< CheckBox >().OrderBy( x => x.Location.Y ).ThenBy( x=> x.Location.X ).ToArray();
- 176 :
- >>156
そういう使い方なら、チェックボックスを先に作っておくんじゃなくて
ファイルから読んだ内容で動的に作っていった方が手っ取り早い
どうせチェックボックスは全部等間隔に並べるんじゃろ?
- 177 :
- WPFのサンプルでありそうな話だ
- 178 :
- >>127,>>129
>>124です
SetPrinter関数を使用することで実現できました。ありがとうございました。
- 179 :
- >>169
そのtry意味ないんだけど。。
- 180 :
- >>179
ネストのイメージ書きたかっただけだろうよ
- 181 :
- >>174
なるほど、コントロールから情報を取得する必要があると思えたのですね
実際はそれ以前の段階でしたが
>>176
それも考えたのですが、デザイナで画面を確認したいので、静的に用意して
おきたいという結論になりました
動的に置くほうが難易度高そうだ、と思ったのもありますが
- 182 :
- >>179-180
「意味無い」って、どういう意味?
- 183 :
- うぇぇ、C#、goto文使えるし…
- 184 :
- うーん、string x = "10"; に対して
x.toString(); するんじゃなくて、int.Parse(x); するのか…。
xオブジェクトにintegerを吐き出させるのではなく、
integerオブジェクトにxオブジェクトを与えてintegerを吐き出させる…。
これは初めての体験だな…。
- 185 :
- 何もかも間違っててワロタw
- 186 :
- なにゆえ?
- 187 :
- expression-bodied関数は、なんかエロいな…
- 188 :
- やってる事は違うけど、考え方的にはCのマクロに近いのかな…
- 189 :
- LINQ…、エロいな…。
- 190 :
- 関数名がアッパーキャメルなのは感心せんなぁ…
- 191 :
- ここ質問スレなんで日記は他所でな
- 192 :
- なんだよ、ToString()メソッドあるじゃねぇかよ…。
- 193 :
- >>191
ごめん。
質問です。なんだよ、ToString()メソッドあるじゃねぇかよ…
- 194 :
- VisualStudioでC#のフォームアプリを開発するときに
プロジェクトのプロパティから
出力の種類を「コンソールアプリ」にして
デバッグ用のConsole.WriteLineを出力できるようにしてるんだけど
リリースするときは、種類を「Windowsアプリ」にするだけで
コード中のConsole.WriteLineはコメントアウトとかしなくても
大丈夫ですか?
- 195 :
- >>194
デバッグ用に文字列を出したいなら、using System.Diagnostics;して、Debug.WriteLine()とか使うべき。
これならリリースビルドにするだけで無効になるからコメントアウトも不要。
リリースビルドでも使いたいなら、Trace.WriteLine()。
- 196 :
- >>194
パイプで繋ぐとみえちゃうよ
- 197 :
- >>195
おお、ちゃんとデバッグ用のがあるんだ
聞いてよかった
ありがとう
>>196
なるほど
別に見られて困るようなものでも無かったけど
無知を晒す所だった・・・
てか、独学でやってると気づかずおかしなことやってそうで怖いわ
たまたま、ネット上で解説見つかるか
質問して教えてもらえるかの
綱渡りで進んでるw
- 198 :
- >>193
おまえ出身言語化どこだよw
レヴェルが低すぎるぞ
- 199 :
- 引数の文字列が、データグリッドに含まれていない場合だけ追加したいんですが、追加されません。
何が原因でしょうか?
void AddToDataGrid(string[] strs)
{
bool exists = false;
foreach(string str in strs)
{
for(int i = 0; i <= view.Rows.Count; i++)
{
if(str == view[0, i].Value.ToString())
exists = true;
}
if(!exists)
{
view.Rows.Add(str);
}
}
}
- 200 :
- >>199
>view.Rows.Add(str);
これじゃね
- 201 :
- >>200
view.Rows.Add(str);
だけだと正常に追加されるので、条件判定かループあたりに原因があると思っています。
フラグの位置がおかしいので以下に修正してもダメでした。
void AddToDataGrid(string[] strs)
{
foreach(string str in strs)
{
bool exists = false;
for(int i = 0; i <= view.Rows.Count; i++)
{
if(str == view[0, i].Value.ToString())
exists = true;
}
if(!exists)
{
view.Rows.Add(str);
}
}
}
- 202 :
- >>201
exist=trueでブレークポイントを置いてデバッグ実行すればわかるのでは?
- 203 :
- そもそも exists = true; の行に到達してないというオチな気がする
- 204 :
- >>202とかぶってしまった
>>202の方が指摘として親切だからそっちだけ読めばいいよ
- 205 :
- >>201
for(int i = 0; i < view.Rows.Count; i++)//Rows.Count以下じゃなく未満
{
bool exists = false;//ここに移動
if(str == Convert.ToString(view[0, i].Value))//ToString()だとValueがnullのときエラー
- 206 :
- >>205はとってもそれっぽい
で、例外が握りつぶされるような場所でAddToDataGridが使われてるせいで気づけてないとか
こういう場合自分はtry{...}catch(Exception exception){throw;}で囲って
throwの直前にブレークポイントを置いたりしてるけどもっとうまい方法があったら誰か教えてちょ
- 207 :
- >>205はそれっぽいと言ったけど
よく読むと
bool exists = false;//ここに移動
の部分は自分には理解できなかった
>>205の勘違い?
- 208 :
- 全一
FXきた
- 209 :
- >>207
フラグよく見ていないからとりあえず
if(str == Convert.ToString(view[0, i].Value))
{exists = true;break}
に変更で
- 210 :
- みなさん本当にありがとうございます。
結局原因はわからず仕舞いでしたが、最終的に以下の方法で打開しました。
void AddToDataGrid(string[] strs)
{
foreach(string str in strs)
{
bool exists = false;
for(int i = 0; i < view.Rows.Count; i++)
{
if(Convert.ToString(view[0,i].Value) == str)
exists = true;
}
if(!exists)
{
view.Rows.Add(name);
}
}
}
- 211 :
- >>209
それなら納得
existsの宣言の位置を移動するとif(!exists)がスコープから外れちゃうもんね
>>210
>>205の方法で解決したんなら>>205の指摘が正しかったんでしょうよ
で、それに気づかなかったんならやっぱり例外が握りつぶされてたんでしょ
なら今後のためにも原因は分からずで片付けず例外の名前くらい確認しといたほうが良いと思うよ
- 212 :
- オブジェクト指向のプログラミングでは
変数じゃなくてプロパティにアクセスさせるべき
みたいな事をよく聞くんだけど
・プログラムの開始時にあるフラグ(true/false)を決めて、その後一切変更されることがない
・そのフラグには、コード中の様々な所からアクセスがある
って場合は、プロパティじゃなくてpublicな変数でフラグを定義してもいいんですか?
オブジェクト指向がよくわかってないせいか
プロパティを経由するのがどうしても遠回りというか
一つ余分な作業を挟んでるように感じてしまう・・・
- 213 :
- 変数は、公開しちゃダメ
その変数に、誰かが代入するかも知れないと考えると、
その変数に代入しているか、すべての場所を確かめないといけなくなるから、
プログラミングできなくなる
だから、プロパティで代入禁止に設定する
ただし、絶対に代入できない定数なら、公開してもよい
- 214 :
- >>213
後から書き換えられるのを確実に防止するために
プロパティを使うってことか なるほど
1人でコード書いてるからそういう発想が無かったけど
自分も後から絶対変な値を代入しない保証ないもんな
てことは、>>212の例だと
・引数付きのコンストラクタを使って、フラグの状態をインスタンス化
・そのフラグのプロパティはgetのみ設定
ってすればいいのか?
でもこれだと、そういうフラグを立てるタイミングがたくさんあったら
その分だけクラスを準備しとくことになると思うんだけど
そういうもんなの?
- 215 :
- あ、いや
クラスを複数準備する必要はないな
>>214の後半の話は無しで
- 216 :
- >>212
212は読まなくていい
フィールドだってreadonly修飾子で代入禁止できるが、212はそんなことも分かってないから
プロパティがフィールドと違う点は大ざっぱに
* 派生クラスでオーバーライドできる
* プロパティから構造体を返すとコピーされる
の2点
この2つの特性が必要ない(または避けたい)場合にフィールドを選択してよい
判断できないならプロパティを選択する
- 217 :
- IOption使っとけ
- 218 :
- >>212
>>216はどこかのコピペじゃないならすごい分かりやすくて尊敬
一つだけ補足すると、↓のようなこともあるからクラスがpublicの場合は
現状だけでなく将来の変更の可能性も考えてフィールドかプロパティか判断したほうが良い
public フィールドをプロパティに変える (2016/05/16追記)
https://qiita.com/chocolamint/items/f04665ce2db211abb2d2#public-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B-20160516%E8%BF%BD%E8%A8%98
あと>>213も善意で答えてるのは分かるんだけど
代入できるかどうかだけを判断基準にしてる時点でズレてて
定数の説明も参考にならない気がするから割と真面目に>>213は読まないほうが良いと思う
すまぬ>>213
- 219 :
- >>216
>* プロパティから構造体を返すとコピーされる
これが、全然分からんのだけど
classの代わりにstructを使った場合の話であってる?
今の自分が考えたところで、どうせちゃんと理解出来ない気もするけど
- 220 :
- >>213は別に全く問題ないだろ。
>>212の要はカプセル化の質問に対して、>>213はカプセル化の話として一般論として答えただけじゃん。
それに対して>>216と>>218はここはC#のスレだからC#特有のreadonlyなフィールドあるよとか言語依存の情報
つけ足してるだけじゃん。
- 221 :
- オブジェクト指向では、変数は公開しない。
公開できるのは、処理(関数)だけ
クラス内を開発する人と、そのクラスを使う人は、別の会社・人を想定しているから、
変数にアクセスさせたら、絶対にダメ
クラス内を作っている開発者は、後で付け加えられる処理を予想できないから。
クラス内を開発した後に、別人が変数にアクセスして、動きを変えたらバグる
異なる会社間での開発を可能にする、
オブジェクト指向の大原則・カプセル化
- 222 :
- プロパティから構造体を返すとコピーってのは意味わかんないね
コピーされるのは右辺がプロパティだろうがフィルドだろうが同じだよw
>>212
少なくともパブリックなメンバーに関しては、あえてフィールドを使う理由はないって
理解でいいと思うよ。例外はアンマネージドコードの呼び出しで使う型を定義する場合ぐらい。
フォールドのプロパティーに対して優位な点は
(1) 軽量である
(2) 簡潔に書ける
このぐらいしかない。
(1)が重要なケースなんかまずない。
(2)については、古いC#はともかく今のC#は儒分簡潔に書けるようになって来てる。
- 223 :
- >>221
カプセル化っていのは、触る必要がないもの、触られては困るものを隠すこと。
この質問にはほとんど関係ない話w
フィールドをプロパティにしようが、触る必要がない文脈で触られることを防げるわけじゃないw
せいぜいセッターで値が適切かどうかチェックできる程度
- 224 :
- まぁ、むしろ>>212のカプセル化などの話に対して、考え方説明せずに
初心者にいきなり言語仕様の詳細を羅列する>>216の方が教え方としてははぁーー??だわww
- 225 :
- >>223
質問者は
>オブジェクト指向のプログラミングでは
>変数じゃなくてプロパティにアクセスさせるべき
>みたいな事をよく聞くんだけど
で書いて始めてんじゃん。だから、カプセル化の説明した方がまずいいんじゃねぇか??
- 226 :
- >>225
何が「だから」なのかよくわかりませんw
質問は外部に見せるデータをプロパティとして実装すべきかフィールドでもよいのか。
カプセル化(余分なものを外に見せるな)は何も関係ないってw
- 227 :
- >>225
>オブジェクト指向のプログラミングでは
>変数じゃなくてプロパティにアクセスさせるべき
>みたいな事をよく聞くんだけど
を質問者が引き合いに出した以上、質問者はここからはしっかりわかってなくて、色々ごちゃ混ぜになってると
思われる。だから、そっから説明しなきゃ、おそらく習得できない。
- 228 :
- 自分はオブジェクト指向じゃない言語をちょっとだけやってたんだけど
そういう言語では、コードの最初の方に
public bool JudgFlag = true
って1行書いて、それにどこからでもアクセスするみたいな感じだと思うんだ
(全部独学だからこれも正解なのか知らんけど)
でも、オブジェクト指向ではこれやったらダメなんだよね?
ってのが知りたい
後、俺マジで初心者だから
質問文で聞きたいことが正確に表現できてる保証ないwすまん
- 229 :
- >>226だった・・
- 230 :
- >>228
別にダメじゃないよw
何度も言うけど、あえてフィールドを使う理由があんまりないだけw
フィールドをプロパティにしたらバグが減らせるとか可読性が上がるとか、
ほとんどの場合そんなことはない
- 231 :
- >変数じゃなくてプロパティにアクセスさせるべき
これが異なる会社間での開発を可能にする、
オブジェクト指向の大原則・カプセル化
どの教科書にも書いてある
その理由は、クラス内を開発している会社・人と、
そのクラスを使う会社・人は、異なっているから
オブジェクト指向では、これらの2つの立場からの見方が大切。
君はどちらの開発者ですか?
クラスを作る方・使う方?
クラス内を開発しているのは、過去だから、
そこから未来の、クラスを使う人の動きを予測できない
だから、変数に直接触らせたらダメ。
そこまで予測して、クラス内を作れないから
- 232 :
- >>230
そうなのか・・・
でも、解説サイト見てると
「ダメ」的な雰囲気で書いてあるとこばっかりじゃない?
俺の理解が間違ってるのかもしれないが
俺的には現状>>230に書いてある事が正解に思えちゃうんだよな
俺が1人で小規模な開発してるだけだから
いまいちオブジェクト指向のメリットを感じる場面が少ないのかな
- 233 :
- >>228
>public bool JudgFlag = true
変数を公開したら、ダメ。
カプセル化にならない
理由は、
>>213
に書いてある
- 234 :
- >俺が1人で小規模な開発してるだけだから
>いまいちオブジェクト指向のメリットを感じる場面が少ないのかな
まあこれだな
>>213の言ってる事は、OOPの「思想」としては間違いなく正しい
但し、単独での小規模開発という状況を前提にするなら「現実的なメリット」は無いに等しい
- 235 :
- >>228
うん。君のケースだとダメだね。それだと、クラスの内部状態JudgFlagが誰でも自由に書き換えられちゃう。
だから、まずは君は基本、>>221のようなC#とか言語関係ない一般的なカプセル化について勉強しよう。
で、君のケースだと自分で書いてるが
>・引数付きのコンストラクタを使って、フラグの状態をインスタンス化
>・そのフラグのプロパティはgetのみ設定
ってやるか、
getプロパティ書くの嫌なら>>216が書いたようにC#にはreadonlyフィールドというのがあるのでそれで代用できる。
- 236 :
- おまえら変数は公開しちゃだめだけど、プロパティやgetter/setterなら公開してもいいって思っとるやろw
- 237 :
- >>232
どこの世界でも教条的(思い込みが激しいともいう)人はいるからねw
外部から取得/設定してもらう必要がある値をフィールドではなくプロパティにしたからって
ヒューマンエラーを減らす効果なんかないのは事実
ただ機能がより少ないフィールドをあえて使うことないでしょってだけの話
オブジェクトの公開するデータは必ずしもいつも変数に入っているわけではなく、
何らかの処理の結果を返す場合もあって、その場合はプロパティになるから、
だったら全部プロパティの方が統一感があるという考え方はあるかもしれない
- 238 :
- >>234
嘘おしえるなよ
- 239 :
- まとめると
「1人で小規模なコード書いてるだけなら
public bool JudgFlag = true
を書き換えたらダメなことぐらい自明だから、フィールドに1行書いて終わりでいい
若干雑だけど楽」
って考え方と
「いや、自分で決めたルールを自分で忘れることもあるから
ちゃんとプロパティにして触れない様にすべき
多少面倒でもコストを払うメリットがある」
って考えの対立なのかな
get;set;とか全く意味がわからなかった頃の嫌なイメージのせいで
プロパティを書く事が、「面倒・難しい」って体が拒否反応しちゃうんだよね
自動プロパティとか実装されてる今の時代に
何言ってんだって笑われそうだけど
まあ、でも色々モヤモヤしてた所がスッキリしました
ありがとう
- 240 :
- >>237
処理の結果を返すならメソッドにしろよ
- 241 :
- >>240
具体例
https://msdn.microsoft.com/ja-jp/library/system.drawing.rectangle.right.aspx
- 242 :
- フォーム間のデータ受け渡しのやり方について教えてください
プログラムを起動して、最初にForm1でパラメータなどを設定、次にForm2で設定した
パラメータを元にデータを編集したいとします
(Form1で編集済みのデータをForm2に表示する、でもいいです)
このときにデータを受け渡すのは、program.cs で Application.Run(new Form1()); と
呼び出す前に
1. Form2 のインスタンスを作っておいて、それを Form1 の引数として与えてやる
2. 必要なデータのインスタンスを Main() 内に用意しておいて、そのインスタンスを
Form1 と Form2 のそれぞれに送る
3. どっちもダメで他の方法がある
のどれが良いのでしょうか。
Form1 の中で Form2 のインスタンスを作成して、Form2 に送るという方法も考えましたが、
そうすると Form1 が不要になったときに Dispose() すると Form2 も落ちてしまいます。
- 243 :
- 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ
http://rosie.2ch.sc/test/read.cgi/liveplus/1524621704/l50
- 244 :
- >>241
それは右座標を計算して返しただけであって処理を実行するのとは違う
面倒だからここ読んで
https://msdn.microsoft.com/ja-jp/library/ms229054(v=vs.100).aspx
- 245 :
- >>242
Form2にプロパティを追加
Form1の該当メソッド内でForm2を宣言&インスタンス化してプロパティにパラメータをセット
Show(Dialog)メソッドで呼び出し
- 246 :
- メッセージキューを勉強中なんですが、
MSMQとMessageQueueクラスって何が違うんでしょうか?
- 247 :
- >>245
ありがとうございます
この場合、もう二度と Form1 を使わないという状況であれば、Form2 の ShowDialog を
呼び出す前に this.Hide(); で隠しておいて、戻ってきたら this.Dispose(); でしょうか
Hide() だけで処理を抜けるコードを書き忘れて、いつまでもプログラムが残り続けるバグを
やったので、二度と戻ってこないフォームは Dispose() したいのです
- 248 :
- 今思ったのですが、そういう使い方だとむしろ Form2 を非表示で実行しておいて、
その中で Form1 を呼び出すべき?
で、Form1 を抜けたら this.Show(); とか
- 249 :
- >>244
頭悪そうだけど、単にバッキングフィールドの値をそのまま返すのではないケースを
「何らかの処理の結果を返す」と言っている。
処理 = 高価な処理ではない。
重かろうが単なる足し算だろうが処理は処理だ
- 250 :
- Applicationに共通のパラメータ持って、Form1とForm2で共有しちゃダメなんか
- 251 :
- 使い方次第じゃないかなとは思う
双方で同時に書き換えたりするならやめたほうがいい
それ以前にタダクソダサイと思う
- 252 :
- シングルトンの出番だ
- 253 :
- >>217
これやろ
- 254 :
- もう親フォーム作れば?
- 255 :
- 自作ツールをソースコード付きで公開したいのですが、
パブリックドメインソフトにするのが最善ですか?
- 256 :
- .netで簡単に実現できる機能(メールや圧縮、画像処理等)をネイティブCのアプリで利用したいです。VC++6.0の(C++ではなく)C言語で作るコンソールアプリでです。
C#で作っでdllを作って、C++のdllでそれをコールする関数を公開すれば実現可能ですが、もっといいやり方ないでしょうか?
- 257 :
- >>255
今のOSSはMITライセンスでGithubに晒すのが主流
- 258 :
- >>256
つ C++/CLI
- 259 :
- >>256
別プロセスにする
Win10のアプリなら WinRT のコンポーネントにすれば言語をまたがって普通に使える
- 260 :
- >>256
標準入出力のリダイレクト。
古典的でダサいけどね
- 261 :
- 皆様ありがとうございました
決まりきった定番の書き方はない、と理解すれば良さそうですね
自分で色々試してみます
- 262 :
- 今度はインデクサについて教えてください
https://ideone.com/TlRwJS
例として上記のようなコードを書いてみました
これで、インデクサを使って例えば anml["whale"] とすれば1が返ってくるような、
そういうものを作りたいと思います
(classified, lifeの各プロパティはユニークではなく、specificのみユニークとします)
本を紐解きながら書こうとしたのですが、animalsクラスの中ではリストになっていないので
書く場所はなさそうです。でもMainメソッドでは利用したい側なので、ここに実装することも
できない気がします。
多分インデクサの考え方そのものがわかっていません。どなたか教えていただけると
嬉しいです。
- 263 :
- ListじゃなくてDictionaryを使えばOK
- 264 :
- anml.FindIndex(_ => _.specific == "whale")でよくね?
- 265 :
- インデクサてのは自作のクラスにつけるプロパティみたいなものだから、List<animals>を内蔵するクラス作って
public int this[string p]{
get{ /* ここに検索して結果を返すコード書く */ }
}
でおkなんじゃねか?知らんけど。
- 266 :
- >>263
すいません、理解のレベルが低いので、具体的にどう実装すればよいのかわかりませんでした
var anml = new Dictionary<animals, string>;
としてディクショナリは実装できたとして、要素追加の際 Add メソッドをどう書くのか、理解が
追いついていないようです
>>264
この書き方で、求めている操作は実現できそうです
ラムダ式の理解が怪しいのは勉強するとして、毎回これを書くと面倒&間違えそうなのですが、
これは「十分に簡潔な書き方」なのか、それとも「メソッド等でさらに簡潔に書ける」のか、どちら
でしょうか。
>>265
この場合、各プロパティにアクセスする際は anml[i].specific とかではなくて anml(i, specific)等
メソッドを介してアクセスすることになるのでしょうか?
- 267 :
- >>265は良くないよ
インデクサはループ内で使用されることを想定しておかないといけない
毎回線形検索が走るのは非効率すぎる
- 268 :
- 番号が欲しいのかanimalsオブジェクトが欲しいのか
- 269 :
- >>267
今回の用途では速度は重要でなく、またそもそも実現方法がわからなかったので、アルゴリズムはまだまだ先の話ですね
>>268
今回欲しいのは数字です
- 270 :
- Index番号が欲しいなら>>264で十分じゃないか?
見つからなかったとき例外吐くらしいから気をつけろい
- 271 :
- まちがえた。例外じゃなくて-1だ。すんまそ。回線で首吊ってくる
- 272 :
- >>264
アンダーバーはやめとけ
- 273 :
- XAMLファイルからボタンを削除した場合、CSコードの方に呼び出されることのないコールバック関数の宣言が残ってしまます
こういうのを効率よく削除する方法ってないのでしょうか?
- 274 :
- >>273
WPF?
- 275 :
- >>274
Xamarin.Formsで使っています
- 276 :
- >>273
XML解析とリフレクション
- 277 :
- ここでいいのかわかりませんが、質問させてください。
C#でフレームワーク ASP.Net MVCで作っています。
テーブルのフォームをPOSTしたいのですが、
動的に作成した行をどのようにサーバー側で受け取ればよいのかわかりません。
<td>
<input class="form-control" id="no1" name="no2" type="text" value="" />
</td>
<td>
<input class="form-control" id="no2" name="no2" type="text" value="" />
</td>
このように、複数行があって、noの後ろの数値は、行を追加したら増えるように
javascriptで制御しています。
サーバー側の処理として、引数を
(string no1, string no2, ・・・)と列挙してすべて書けば、
POSTデータを受け取れることは確認済みです。
ただ、ユーザーの操作で行を何行追加するかもわからず、あらかじめ想定する
最大数の引数を列挙するのも現実的ではありません。
すべてのフォームデータを一挙に受け取って、
サーバー内部のロジックで処理する方法はないでしょうか。
- 278 :
- >>277
namaに添字をつければList<T>でバインディングできるはず
https://qiita.com/kazuhisam3/items/94542f6d7ccf3acca41c
- 279 :
- どうせJavaScript書いてるんならJavaScript側でJSONの配列に纏めてからAJAXでポストするのもアリ
- 280 :
- [[[ ][ ]]]\[[]] [[[]]]],[[[ [][] ]
- 281 :
- Entity FrameworkでDBへのselectとかのリトライしたい場合ってどのようにすべきでしょうか
一時的なエラーだったりしたらもう一回トライとかしたいのです
例外全キャッチするのも無駄なのかなぁと思いまして
- 282 :
- 普通のRDBなら一時的なエラーなんか滅多にないだろ
400でいいよそんなもん
- 283 :
- Azure相手だと普通にあるで
- 284 :
- >>281
DbExecutionStrategy
- 285 :
- >>284
ありがとうございます
試してみます
- 286 :
- [[[ []]]]*[[ [][] ][] } } {} [[[
- 287 :
- とりあえず、連休ぐらいゆっくりな
オマエラ
- 288 :
- 連休は機械学習でずっと計算させる予定
人間は休む
- 289 :
- 人間はILコードを覚えてハンドアセンブル出きるようになるべき
- 290 :
- winformの左辺や上辺をドラッグするとフォームのサイズが変わらずにフォームが移動してしまいますが
サイズを変更するように設定するプロパティなどはありますでしょうか
コードを書く必要がありますか?
- 291 :
- >>289
古い脳の感覚でいえば、IL なんてハードウェアの裏づけのない、空想上の約束にしか過ぎないので、覚える気が起きない
x86-64 でおなかいっぱい
- 292 :
- >>291
情報処理試験のCASLとかも?
- 293 :
- >>292
CASL くらいはやったよ、8080、z80/6809/80x86/z8000/r3000、まだ若かったからどんどん覚えることができたんだ…
でも、もうおなかいっぱいだ…
- 294 :
- 次元が違うだろ
ILは高級なオブジェクト指向言語
そもそも機械語に似せることを意図されていない
- 295 :
- >>294
ハードウェアマシン語とプログラム言語との間に、なぜ仮想マシンと仮想的な言語(IL/JVM)が採用されるようになったのか?そこが今でも判然としないのです…
- 296 :
- >>295
ドライバは何故存在するの?つってる様なもんだぞそれ
- 297 :
- >>296
いえいえ、階層性を全否定するわけではありません
「仮想マシンと中間コード」の必要性を問うているのです…
- 298 :
- 仮想マシンに焦点を絞るなら、ハードウェアの差異を吸収する為では
(.netはJavaVMほどあちこちに移植されてないというだけで)
ILに関して言えば、複数の言語(C#、VB.net、F#、他)を共通のフレームワーク上で動かせる様にする為
- 299 :
- >>298
それならハードウェアや言語の統一を目指したほうが建設的なのでは?
- 300 :
- >>299
不可能だろう
収斂進化により表面上似た様な機能を搭載する事はあっても、内部構造は特許なり権利なり絡んで来るから同じに出来ないし
JavaScript+CSS3ですらブラウザベンダ間で足並み揃えられないのに、言語の統一なんて出来る訳が無い
- 301 :
- 現状、中間言語側でも少なくとも JVM/.net framework にわかれちゃっているからねえ…
- 302 :
- >>301
LLVMの中間コードをご存知でない?
- 303 :
- >>302
LLVM はコンパイラの中で完結しているのではないかな?
- 304 :
- ?
- 305 :
- >>303
コンパイラ開発者はとりあえずLLVM-IRに変換すればいいし最終段で機械語に変換するか直接実行するか他の言語のコードに変換するかは自由
というか最初と最後だけ作ればいいわけだから寧ろLLVM-IRが中心
- 306 :
- >>305
うん、それはよくわかる
すべての「構造化」を全否定するわけではないんだよ
- 307 :
- すまん、途中から意味分からん
- 308 :
- .netは仮想マシンなんかつかってないじゃん
- 309 :
- >>308
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA_(%E5%85%B1%E9%80%9A%E8%A8%80%E8%AA%9E%E5%9F%BA%E7%9B%A4)
仮想マシン VES は定義されているようだ
- 310 :
- おい!初心者の内容じゃねーぞw
- 311 :
- >>309
VESは最終段階のコンパイラだよ
- 312 :
- JITコンパイルはVMとしては認めない派閥が存在することは認める
- 313 :
- https://www.slideshare.net/ufcpp/ss-34533225
このスライドの67枚目の「良い例」のコードってこれで本当にいいの?
MSDNのParallel.Forの解説には
---
localFinally デリゲートはスレッドごとに 1 回呼び出され、各スレッドのローカル状態に対して最後の操作を行います。 このデリゲートは、同時に複数のスレッドで呼び出される可能性があります。したがって、共有変数へのアクセスを同期する必要があります。
---
と書いてあるから、countはアトミックに操作しないとまずい気がするんだけど
https://msdn.microsoft.com/ja-jp/library/dd783299(v=vs.100).aspx
- 314 :
- >>313
MSDNの使用例にも
localState => Interlocked.Add(ref result, localState)
とあるしそれで正しいと思うよ
- 315 :
- >>314
いやだから、MSDNのサンプル通りにするなら、>>313の
localCount => count += localCount
は、
localCount => Interlocked.Add(ref count, localCount)
でないとまずいと思うんですが
- 316 :
- そうだねだからどうしたの
資料公開してる本人に言えばいいんじゃないの
- 317 :
- 大して変わんねーよ
そんなに処理分けたきゃ
別exeにしてキックしろよ
後はできるならOSがうまくやるし
OSがうまくできなかったらそりゃできないんだろうよw
- 318 :
- どうした発作か
- 319 :
- >>315
いや、>>313の言う通りと言ったつもりなんだが・・・ふらっと怖いな
- 320 :
- おバカwebを鵜呑みにしない有望な>>313なんやからもう少し優しくレスしてやれよw
- 321 :
- この例だとForよりAggregate使ったほうがいいな
- 322 :
- >>319
自分の日本語に疑問を持たない君の方が怖いよ
「これ(A)」でいいのか、Bじゃないのかって質問に「それ」で正しいと答えたら
質問した方は普通は正しいのは「これ」の方だと理解する
- 323 :
- C♯でJavaScriptで生成されてるチャットサイトからコメントビューアを作りたいのですが、JavaScriptが生成したHTMLを取得するのに適したライブラリってどれでしょうか?
Formアプリで作る予定ですが
webBrowserコントロールが一番手軽でしょうか?
- 324 :
- >>323
追記
使う.Net frameworkは4.6.1です
Nugetで公開されてるライブラリ等でも問題ありません
- 325 :
- javascriptで生成といっても生成元になるデータを何処かでリクエストしてる筈
そっちを解析して直接的にHttpClientでgetしたほうがええよ
- 326 :
- ありがとうございます
単純にセッションが必要っぽそうだったのでHttpClientでもいけそうです
使い方調べ直します
- 327 :
- おバカwebと言えば↓みたいに日本語と英語で全く逆のことが書いてあったりする
基本的にwebに書いてあることは疑ってかかったほうが良さそうね
日本語
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage
> 比較のために文字列を正規化する場合は、String.ToUpperInvariant メソッドではなく String.ToLowerInvariant メソッドを使用します。
英語
https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage
> Use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you normalize strings for comparison.
(グーグル翻訳) 比較のために文字列を正規化するときは、String.ToLowerInvariantメソッドの代わりにString.ToUpperInvariantメソッドを使用します。
- 328 :
- >>327
X:webに書いてあることは
○:日本語訳は
- 329 :
- グラフィックの扱いについて教えてください
panelに複数の画像イメージを貼り付けたいと思います
(トランプのカードを任意の枚数置くような感じです)
WidthとHeightをpanelのサイズに合わせて、Bitmapオブジェクトを
作ってそこに必要な画像を貼り付けて、最後にPaintイベントでその
ビットマップを Graphics.DrawImage で表示すれば良さそうだ、という
認識です
問題はBitmapオブジェクトに画像を貼り付けることで、メソッドを
調べても、Bitmapオブジェクトの任意の場所に任意のイメージを
貼り付けるものはなさそうです
そもそも用意した画像は Image.FromFile で準備しているのですが、
Imageオブジェクトを貼り付けられるのは Graphics.DrawImage
メソッドになるので、そもそも Bitmap オブジェクトを用意すると
いう発想が間違っているような気もします
多分いろいろ間違って認識しているので、どこから考え直せばよいか
教えていただけると嬉しいです
- 330 :
- >>329
ベースの画像のいくつかの任意の位置に画像を貼り付ける描画ならそれで間違っていないけど
https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.drawimage(v=vs.110).aspx
https://msdn.microsoft.com/ja-jp/library/558kfzex(v=vs.110).aspx
どこを勘違いして悩んでいるのかいまいちわからない
とりあえずBitmap オブジェクトはImageオブジェクトの一種
他にMetaFileとかあるから
そしてGraphics.DrawImageメソッドを使って貼り付けてもベースのBitmap オブジェクトはBitmap オブジェクトのまま
- 331 :
- >>330
私の認識は、最終的に描画したいビットマップを用意して、それを Paint イベントで
描画するというものです
Panel1_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawImage(canvas, 0, 0);
}
で、上記の例で Bitmap canvas; とでもして用意したビットマップに、任意の画像を
貼り付ける方法を知りたいのです
例えば256x256ピクセルのサイズで用意したビットマップに、32x32ピクセルの
画像を3個位貼り付けた canvas を用意したいというものです
「そうではなくて、最終的に描画したいものはGraphicsオブジェクトで用意して、
Paintイベントで毎回描画するのだ」というのが正なのかもしれません
Panel1_Paint(省略) {
e.Graphics.DrawImage(image_1, image_1_x, image_1_y);
e.Graphics.DrawImage(image_2, image_2_x, image_2_y);
...
}
といった感じで
でもなんだか、毎回Paintイベントハンドラに描画処理を全部書くのは変な感じがして、
描画したい画像を用意するのと、実際に描画するのは別の処理ではないかと思っている
次第です
- 332 :
- 描画したい画像を用意するのと、それを描画するのは当然別の処理だ。
でもアニメーションさせたいとか画像の変更を即座に描画に反映させたいとかなら、用意した足で再描画させるしかないだろ?
- 333 :
- >>331
何でイベントでやるのか知らないけど複数の描画を同時にやるメソッドはなかったと思うよ
https://dobon.net/vb/dotnet/graphics/index.html
Bitmap canvas=new Bitmap(x,y);
Graphics g = Graphics.FromImage(canvas);
Graphics.DrawImage(image_1, image_1_x, image_1_y);
Graphics.DrawImage(image_2, image_2_x, image_2_y);
- 334 :
- あ、ごめん
Graphics g = Graphics.FromImage(canvas);
g.DrawImage(image_1, image_1_x, image_1_y);
g.DrawImage(image_2, image_2_x, image_2_y);
だった
- 335 :
- >>332
アニメーションさせたいとか、そういう意図はないです
単に、描画したい画像を用意するのに、Bitmapオブジェクトにさらに画像を
貼り付ける方法がわからなくて悩んでいます
>>333
イベントでやってるのは、単に参考にしたサイトで「Paintイベントハンドラで
処理する」と書いてあったので、それを鵜呑みにしただけです
https://dobon.net/vb/dotnet/graphics/drawimage.html
これを見て気づきましたが、そもそもパネルに直接描こうとするのが間違いで、
パネルにPictureBoxを貼り付けた上でそこに置けば良いのかな?
- 336 :
- >>335
どっちでも同じだと思う
Graphics g = Graphics.FromImage(panel1.BackGroundImage);
でやれば直接パネルに書き込めるし
ただ大きい画像を表示して画像の表示位置をスクロールさせたいのならパネルの上にPictureBoxが基本
とりあえず書いて動かしてみたら
- 337 :
- >>335
実現したい要件だけを明確に書いた方がいいと思うよw
そこが明確じゃないのに「俺が考えた実装方法」ばっかり詳細に書くから
答える方も何を返答していいのか分からないw
- 338 :
- >>337
実現したいことは、「任意の画像を任意の場所に配置したイメージを、panelに描画したい」です
これは明確で、それを実装するための方法でどう悩んでいるかが正しく伝わらないと、答える方も
こちらのレベルがわからなくて困るかと思ってました
実現したいことがちゃんと伝わっていませんでしたか
それ以前の問題でしたね。。。
- 339 :
- ファイル読んでバインドするだけちゃうのか?
- 340 :
- >>338
dobon.netにあるじゃん
- 341 :
- bmp1が配置先のイメージ、
bmp2がbmp1に配置したいイメージだとしたら以下になる
Graphics g = Graphics.FromImage(bmp1);
g.DrawImage(bmp2, x, y); // bmp1の(x, y)にbmp2を書き込む
g.Dispose();
pictureBox1.Image = bmp1;
これだけでパネルにbmp1が表示される
- 342 :
- あ、パネルにPictureBox貼ってる前提ね
- 343 :
- >>341
ありがとうございます
思っていることが問題なく実現できました
できるようになってみると、一体何を悩んでいたのか、自分でもわからなくなってしまいました
多分、DrawImage で書き込む先がVRAMだと思い込んでいたのでしょう
- 344 :
- private void Form1_ResizeBegin(object sender, EventArgs e)
{
leftEdge = this.Left;
rightEdge = this.Right;
topEdge = this.Top;
bottomEdge = this.Bottom;
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
if ((rightEdge < this.Right) && (topEdge > this.Top))
{
// 処理に入らない
}
}
このコードでフォームを右上にドラッグして拡大した場合に処理に入らないのですがどこがおかしいでしょうか
- 345 :
- 右上にってことは事後の方が top の値が小さくなってるからじゃないの?
- 346 :
- ああ、そう書いてあるのか。失礼。
- 347 :
- >>344
イベント有効になっている?
Form1_ResizeEndのメソッドに処理が入っているかそこから確認
int leftEdge, rightEdge,topEdge ,bottomEdge;
public Form1()
{
InitializeComponent();
this.ResizeBegin += Form1_ResizeBegin;
this.ResizeEnd += Form1_ResizeEnd;
}
private void Form1_ResizeBegin(object sender, EventArgs e)
{
this.Text = "start";
leftEdge = this.Left;
rightEdge = this.Right;
topEdge = this.Top;
bottomEdge = this.Bottom;
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
this.Text = String.Format("{0}:{1}", (rightEdge < this.Right), (topEdge > this.Top));
if ((rightEdge < this.Right) && (topEdge > this.Top))
{
this.Text = "OK";
}
}
これで動いた
- 348 :
- private void DataGridViewFilter()
{
BindingSource objBind;
DataTable objData;
string strFilter;
objData = (DataTable)DataGridView1.DataSource;
if (IsNothing(objData) == false)
{
objBind = new BindingSource();
objBind.DataSource = objData;
strFilter = "Color like '%" + txt_Condition.Text + "%'";
objBind.Filter = strFilter;
}
}
- 349 :
- >>347
ご回答ありがとうございます
イベントは有効です
左や上や左上への拡大縮小ドラッグは正常なのですが左下や右上がおかしいです
提供していただいたコードを試したのですが、何故かは分からないのですが rightEdge < this.Right がfalseになっています
もう少し調べてみます
- 350 :
- 申し訳ないけど、問題を再現できるそのまんまのコードを提示していない時点で
確実に原因はあなたの勘違いにあると断言できる
- 351 :
- Listを値渡しすべき所が参照渡しになってたせいで
くっそハマったんだけど
こういうのって、C#の解説本1冊読めば
注意しろって書いてあるもんなの?
参照渡し云々って単語はかろうじて知ってて
↓のサイトをたまたま見つけて、偶然解決出来たけど
https://webbibouroku.com/Blog/Article/list-copy
エラーや例外にならないバグが怖すぎる・・・
- 352 :
- そんなものここで聞けば3秒で解決するし
- 353 :
- c#って物体X(?)は全部参照渡しになるよね
- 354 :
- >>351
それ値渡しじゃない
- 355 :
- イメージの配置はできるようになりましたが、いろいろ触っていると、チラツキが
気になるようになってきました
テストしてみたところ、下記のレベルでもチラツキが発生します
private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = Graphics.FromImage(canvas);
g.FillEllipse(bg_brush, x, y, radius, radius);
x += 5;
g.FillEllipse(fg_brush, x, y, radius, radius);
count++;
g.Dispose();
pictureBox1.Image = canvas;
if (count == 10)
{
count = 0;
timer1.Stop();
}
}
timer1.Intervalは100msにしてあります
チラつきを押さえるには、フォームの DoubleBufferd を true にすると良いと見ましたが、
true にしても false にしても変わりないようです
そもそも PictureBox は内部処理でダブルバッファリングを行っているとも見ました
まだなにかできることはあるのでしょうか
- 356 :
- 書いてませんでしたが、bg_brushは背景色の、fg_brushは前景色のブラシです
Brush bg_brush = new SolidBrush(SystemColors.Control);
Brush fg_brush = new SolidBrush(Color.Black);
で定義しています
- 357 :
- canvasはどんな風に設定しているの?
- 358 :
- canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
として定義しています
- 359 :
- DoubleBufferdとか触らずともこっちではちらつかないけどなあ
ちらつくってのはどういうふうに見えることを言ってるの?
panelやpictureBoxのサイズやradiusの値もさらしてみては?
- 360 :
- どこで何やってんの不明瞭だから当てずっぽうだが
下手に自前描画してるチラつくなら大体OnPaintBackgroundのせい
- 361 :
- https://ideone.com/s4ddqO
これが全コードです
空のWindowsフォームアプリケーションで生成されたフォームに、ボタンとパネル、
PictureBoxを配置しただけの状態です
パネルとPictureBoxは、DockをFillにしてウィンドウサイズに合わせてあります
- 362 :
- これで、timer1のIntervalを50msにすると、はっきり分かる程度にちらつきます
- 363 :
- 垂直同期しろ。
- 364 :
- >>362
やってみたけとちらついたりはしないねw
ただフレームレートが低いから滑らかに見えないだけ
- 365 :
- 解決のヒントにはならないだろうけど
ちらつきって何かということについて
すでに表示されてるものが一瞬透明に見えるから表示がおかしく見えること
たとえば半径100の円が横に5ドット動くとする
普通に考えたらほとんどの円に背景は隠れたままだけど何も考えないで適当にやると
背景が一瞬見えてしまう
一度円を消してなにもない状態を表示して
次に円を書いてるから問題がある
何もない状態を表示しなければいい
- 366 :
- >>364
環境の問題ですか・・・
一応ディスプレイのリフレッシュレートは60Hz、タイマー設定が50msだと20Hzあれば
十分ですので、あまり関係ない気がするのですが
でも私の環境でしか出ないのであれば、環境依存かもしれません
>>365
これを避けるためにダブルバッファリングをするわけですし、書き換えた後のビットマップを
PictureBoxに貼り付けるようにして、描画途中では貼っていません
- 367 :
- だからハードの違いだって言ってんだろw
- 368 :
- >>366
いやいや何でそういう話になるのw
たぶん環境の問題なんかじゃなく、あなたが低フレームレートに起因する
カクカクした動きをちらつきだと誤認してるだけだと思うよw
- 369 :
- アホばっかり。
- 370 :
- >>368
カクカクした動きとチラつきを同一視しているわけではありません
>>365
が書いたように、今回の例だと黒い円が一瞬消えているような感じがします
移動量の x += 10; をもっと少なくすれば目立たなくなりますが、それでも
なんとなく嫌な感じがします
でも言葉で説明するのは難しいですね
低フレームレートの認識を誤解していたようですが、インターバルを100msとか
50msとかだとディスプレイのリフレッシュレート(あるいは人間の認識力)に比べて
低すぎるので、かえって目立ってしまうということでしょうか?
確かに、インターバルを思い切って5msとかにしてみると、チラつきは軽減されてきた
気がします
- 371 :
- ちょっと改変して逆にチラツキをわかるようにしてみた
https://ideone.com/3X8oJh
WinFormプロジェクトを新規で作って元のソースを全部消したうえで、このソースを既存の項目として追加
上がPictureBoxで下がPanel
>>370
PictureBoxのダブルバッファがデフォルトで有効なのは知っているのを確認したので
その上でPanelはデフォルトでダブルバッファが有効だというのを念頭に入れてコードを実行してほしい
同じオブジェクトの動きだが、うちで確認する限りは下はあきらかにチラツキがあって上は目立たない
>>365
>何もない状態を表示しなければいい
というわけで先に描画して動いた部分だけを消すという動作を実現してみたつもり
だったんだけど、移動量を大きくするとカクツキがどうしても目立ってしまってうまくいかない。ギブアップw
>>370
もっとGDI+の動作を把握するとかゲームなどでの実装方法を探すかした方がいいと思う
残念ながら俺の知識ではここまで
- 372 :
- ごめん
>Panelはデフォルトでダブルバッファが有効だというのを念頭に入れて
Panelはデフォルトでダブルバッファが無効だというのを念頭に入れて
の間違い
- 373 :
- うーんw
>>361のコード自体がダブルバッファリングの実装なので、
少なくともGDI+を使う限り、これで本当にちらつくなら何をやってもちらつき回避は不可能。
何度も言うけど、少なくとも俺の環境では低フレームレート特有の不自然さはあっても
フリッカーは確認できない
しつこいようだけど、俺は質問者がちらつき(フリッカー)がどういう現象か
理解してないだけのように思う
- 374 :
- まあ、unity使ってもDirectX使ってもスクロールとかなめらかにならないしね
グラボも汚いってのも考慮に入れる
市販のゲームでもスクロールしてるときはカクカクグシャグシャはデフォ
- 375 :
- >>371
ありがとうございます
私が確認しても、確かに上下で明らかにチラつきが違い、下ははっきりとわかります
上はほとんどわからないレベルですね
PictureBoxもPanelも、どちらも出来上がったビットマップを貼り付けているのですから
同じ表示になりそうな気がしますが違いますね
これをちゃんと理解できれば解決できそうです
- 376 :
- >>371のコートだとたしかにフリッカーが確認できるねw
>>373は撤回します
- 377 :
- >>373
私が「チラツキ」と表現しているのは、>>371が上げてくれたプログラムの
下側、panelで発生している現象です
私の理解では、>>371でなぜ表示に違いが生じるのかがわかりません
どちらも、加工後のcanvasを貼り付けているはずなのに
>>371でやっていることは、ダブルバッファリングではないのでしょうか?
>>371のプログラムを実行してみて、違いはPictureBoxをウィンドウに直接
貼り付けているか、panelを置いてその上に貼り付けているか、です
私のテストプログラムでは、panelを置いてその上にpictureBox1を置いてます
これが影響するのでしょうか
- 378 :
- https://ideone.com/PNPIlj
蛇足だろうけどnew BitmapじゃなくPictureBox.Imageを直接描き変えるもの
>>377
370で何をしたかったかというと「ダブルバッファリングではこれ以上改善できない」事の証明
>panelを置いてその上にpictureBox1を置いてます
それは多分関係ない。panelに背景を設定すると話が変わると思うけど
実際に改善するには移動量を少なくして滑らかに見せるくらいしかおもいつかない
消える側の方でなく進行方向側でカクついているんだよなあ・・・
- 379 :
- >>378
試してみました
>>371と変わらない感じですね
これまで質問してきた趣旨とは変わってしまいますが、
Graphics g = Graphics.FromImage(pictureBox1.Image);
これでビットマップを書き換えた後に pictureBox1.Image を書き換えていないと
いうことは、いちいち canvas ビットマップを用意して細工しなくてもよかったと
いうことでしょうか
で、本質ですが、ご提供いただいたテストプログラムでは明らかにチラつきの
改善が見られるということはダブルバッファリングは機能している、これ以上
気になるのであれば、それは滑らかさの問題であってチラつきの問題ではない、
と認識するのが良さそうですね
- 380 :
- 下PanelはBackgroundImage使ってるのが悪いんじゃねえかなあ
canvasはPanelのPaintで描画するようにして
PanelのDoubleBufferedをtrueにするかOnPaintBackgroundの無効化でチラ付かなくなったよ
あとチラつきとは関係ないけどお行儀的には再描画はTickで
Invalidate(true)呼び出してPaintのタイミングはフレームワークに任せるべし
Tick毎に無駄にImage/BackgroundImageに突っ込んでるから結果的に自分で再描画してるけど
- 381 :
- ああ、やっぱり俺の認識で合ってるねw
何だかおかしいと思ったが
>>377
フリッカーを誤解してないのは分かったけど、>>361のコードでフリッカーなんか
発生しないってだから
- 382 :
- >>351
それは参照渡しになってたわけじゃない
C#の参照渡しはhoge(ref list)のようにrefがつく
あなたがハマったのは参照の値渡しでインスタンスは複製されないということ
ぺらぺらの入門書とかだとわからんが、ジェネリックやクラスをちゃんと学べる程度の本なら載ってるはず
- 383 :
- グラボの性能差だから、ちらつき。
- 384 :
- >>351
List固有の問題ではなく、classは全て参照型だからだ。
だから、=で代入しても同じオブジェクトを指すだけ。
ちなみにstructは値型。こっちなら=で代入したらオブジェクトが複製される。
- 385 :
- >>361をFPSと速度を変えられるようにしてみたけど
思ったより面白くもないし動作も滑らかじゃないなw
どっちにしろやっぱりフリッカーは発生しない
https://ideone.com/E3V57h
ところで、タイトルバーをドラッグしたりすると画面の更新が止まる問題を
回避する方法ってなかったっけ?
- 386 :
- ああ、今思ったけど、FPSは本当は実測した値を表示すべきだねw
>>385はタイマーのインターバルから計算した理論値で実測値じゃない
- 387 :
- グラボやドライバーの違いで発生する問題を自分のところじゃ発生しないからって頭ごなしに否定する奴はどうして生きてるんだろうな?
- 388 :
- >>387
それは君が勝手にそう思ってるだけw
そんな問題はWin9xの時代だって存在しなかったよ
っていうか、言っちゃわるいけどフリッカーが発生する原因を理解していればそんな間抜けな台詞は
出てこない
- 389 :
- なんか垂直同期(笑)とか書いてるのもいたけど、
頭の中80年代で止まってるんじゃなかろうかw
- 390 :
- DataGridViewで、複数のカラムを基準にソートするにはどうしたらいいでしょうか。
以下のようなイメージです。
元データ
------
4 2
1 4
2 1
5 4
6 7
1 3
1 6
これを、カラムのヘッダーセルのクリック操作だけで、以下のように出来るようにしたいです。
------
1 3
1 4
1 6
2 1
4 2
5 4
6 7
- 391 :
- プロパティだけでは無理
各列のSortModeはAutomatic以外にして
ColumnHeaderClickイベントで自分でソートする必要がある
実際にどうやってソートするかはDataGridViewに表示してるデータをどうやっているか次第
ところで下の状態で1番目の方のカラムヘッダをクリックしたらどうなるの?
とか色々場合があってUIというかUX?を決定するのが結構面倒
- 392 :
- さすがに垂直同期はネタだろ
釣られる奴がいるとは思わなかったけど w
- 393 :
- ググって事実を知ったんだな。そんなに悔しいのか?
- 394 :
- >>390-391
複数列でのソートは、Kotlin なら、
配列.sortedWith(compareBy({ 列1 }, { 列2 }))
C# は、よく知らないけど、こういう感じ?
配列.OrderBy(列1).ThenBy(列2)
- 395 :
- 教えてください
キャストが上手くできずに困っています
具体的には、VisualStudioでデバッグのウォッチウィンドウに
Enumerable.Empty<int>() is IEnumerable<object>
と入力するとtrueと表示されるので少なくとも条件が整えば
IEnumerable<int> は IEnumerable<object> に
キャストできるとおもうのですが、プログラム上で安直に
Console.WriteLine(Enumerable.Empty<int>() is IEnumerable<object>);
を実行すると画面にFalseと表示されてしまいます
ウォッチウィンドウ上とプログラム上で何か条件の違いがあって
このようなことが起こっているのだとは思いますが、理解が不十分で解決方法が分かりません
そもそもIEnumerable<T>のTは共変なのでintがobjectにアップキャストできる以上
IEnumerable<int>も無条件でIEnumerable<object>にキャストできると
思っていたのですが、この部分に何か誤解があるのでしょうか
VisualStudio15.6.7、コンソールアプリ、ターゲットフレームワーク4.7.1でテストしています
よろしくお願いします
- 396 :
- >>395
値型は不変だったような
http://ufcpp.net/study/csharp/sp4_variance.html#value
イミディエイトだとs演算子がtrueを返す理由は分かりませんw
何でしょうね
- 397 :
- >>396
レスどうもありがとうございます。その後色々と試してみると、プログラムで
Console.WriteLine((Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184);
を実行すると画面には184と表示され、教えていただいとことと辻褄が合うように思います
また、これまでの結果から考えてウォッチウィンドウで
(Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184
の値を調べれば4649と表示されるのかなと思いきや「メモリを読み取ることができません」と表示されたので、
こちらの挙動はおっしゃる通り分からない(バグ?)と考えるしかなさそうです
ジェネリックでないIEnumerableはLINQが使えないのでこれまで
if (x is IEnumerable<object> enumerableObject)
{
...
}
と書く場面があったのですが、これではIEnumerable<値型>が拾えなさそうなので
if (x is IEnumerable enumerable)
{
var enumerableObject = enumerable as IEnumerable<object> ?? enumerable.Cast<object>();
...
}
とでも書いておこうかと思います(今のプログラムではxがジェネリックでないIEnumerableになることはないのですが)
もっと良い方法があれば教えてもらえると嬉しいです
- 398 :
- 名前空間A と名前空間A.B がある場合に、A.B内からAのクラスを扱うにはどうすればいいのですか?
- 399 :
- >>322
Aをusingすればよい
- 400 :
- なんかすげーレス間違えたけど
>>398宛
- 401 :
- そもそも名前空間ってどうやって扱うのが正しいの?
- 402 :
- >>400
クラスとは違って、やはりそうやって使うものなのですか
- 403 :
- 完全表記しても良いんだよ?
- 404 :
- 嫌なら全部同じ名前空間内に入れ込んでしまえ
悩まなくて済むぞ
- 405 :
- 別に名前空間分ける意味ないよな。
- 406 :
- 分業の為の仕組み
- 407 :
- >>406
逆に無駄な混乱が起きない?
同じ名前のクラスとかあるとちょっと面倒じゃない?
- 408 :
- C#好きだけどnamespaceでネスト一つ深くなるのはあかんわ
- 409 :
- >>407
全て自分で書くコードならいいんだけどね。サードパーティのライブラリのクラスと衝突する可能性なんていくらでもあるから。
- 410 :
- >>407
書き分けのために命名が歪むのは良くない
NM1.Class/NM2.Class
NM1Class/NM2Class
単にプリフィクス付けるだけなら
名前空間があろうとなかろうとやってる事は同じ
- 411 :
- >>407
むしろ同じ名前でも被らないようにする仕組みなんだが...
- 412 :
- やたら長い名前付けて重複を避けるのさ。
ダイビングがかったるいって?
最初のusingに書くだけだから大丈夫。
- 413 :
- >>407
自分(同じチーム)で同じ名前の違うクラスが必要になるケースは
少ないが(ないことはない)他人が書いたライブラリで既に使われているのと
同じ名前が必要になるケースなんかいくらでもあるよw
例えばSystem.Drawing.Point以外のPointが使えなかったら困るでしょ
あと、名前空間の目的は名前のバッティングの回避だけじゃない。
むしろ一番の目的は分類と整理でしょ。
名前空間が使えないライブラリは全部のファイルをデスクトップに置くできない人と同じ
適切に命名され適切な階層構造をもった名前空間は索引の機能を持つし、
コードのコンテキストを明確にする。
System.Drawing.PointがPointだけで2Dグラフィックの座標だと分かるのは、
プログラマはそれがSystem.Drawing内の型だと知っているから
- 414 :
- using エイリアス ディレクティブ でggr
- 415 :
- >>413
普通にdrawingのcolorとmediaのcolorがバッティングしてるじゃん
それと自作のcolorとこれまた別の奴の作ったcolorがバッティングするだけでもう面倒臭くて死にそうになる
- 416 :
- もっというとwpfでも別のcolor作ってんじゃん
バッティングうぜぇんだよ
こんな簡単なクラスでもう再利用効かないんだから名前空間まで作って管理するなよバカっタレかよ
当のMSからもうまともなことやってねぇっていうかできないんだから
いい加減ファンタジー設計はやめるべき
いや、もうファンタジーじゃないな
メルヘンの領域まで入ってる
- 417 :
- >>415-416
何を言ってるのか意味がわからねいよ。
- 418 :
- この程度で死ぬほど面倒臭がってたら、プログラミング自体が向いてないな。
- 419 :
- C#8.0のpreviewきましたねえ
https://github.com/dotnet/csharplang/wiki/vNext-Preview
- 420 :
- >>417
バカじゃん
何でwinformにcolorあるのにwpfでも作ったの?
再利用できてないじゃん
役に立たないじゃん
名前空間分けてそれで?
新しいもの作ったら元気一杯に捨ててるじゃん
ってとこに集約する
- 421 :
- Color構造体とColorsクラスの事かな?
- 422 :
- こいついつものアレだろ
触るな
- 423 :
- >>422
反論できないならcolorクラスはもう作らせないぞ
- 424 :
- 全く話題になってないけどC#7.3も正式リリースされたぞ
念願の where T : Enum
- 425 :
- >>423
> それと自作のcolorとこれまた別の奴の作ったcolor
> バカじゃん
> 何でwinformにcolorあるのにwpfでも作ったの?
え、なんで自分でcolor作ったの?
- 426 :
- >>425
触るなって言ってんだろテメーマッチポンプか?
それとも別種の頭かわいそうな生ゴミか?
- 427 :
- つか、同じ名前で違う用途に割り当てる方が難儀だろ普通は名前変える。
- 428 :
- >>427
だから世の中にどんだけクラスが存在すると思ってんの?
- 429 :
- 普通の初心者だったらSystem.IOのPathとWPFのPathが競合することが気になると思う
- 430 :
- イギリスだったらつづりはcolour
- 431 :
- コロワァ
- 432 :
- >>428
自前クラスを組み込むクラスの組み合わせだけ考えりゃよかんべよ。
- 433 :
- >>432
日本語で
- 434 :
- >>425
WPF「WinFormなんて爺さんのクラスなんて使えるかよ」
- 435 :
- >>434
WinFormsが定年間近の爺さんだとしたらWPFは35歳無職童貞だな
- 436 :
- drawimageって自分でクリッピングしないとはみ出たら遅い?
- 437 :
- formとwpfで、似て非なる部品ってどうにかならんの?
ネットで使い方調べる時、紛らわしいんだよな。
- 438 :
- >>434
UWP「そろそろWPFさんにはご退場願おうか」
- 439 :
- >>438
メーカー「そろそろUWP用のコントロールつくっか?」
- 440 :
- 親フォームからnewした子フォームは親とは非同期ですか?それとも同期処理となりますか?
- 441 :
- 正しい言葉の使い方では非同期だけど、たぶん君が言ってるのは同期か非同期かではなくて同じスレッドかどうかだろう
それでいえば同じスレッド
- 442 :
- つか、聞きたいのは、モーダルかモードレスかじゃね?
- 443 :
- ここで質問するときは自分が何をやりたいかを書いてもらった方がいいな
>>440
>>442の意味なら
方法 : Windows フォームをモーダルおよびモードレスで表示する
https://msdn.microsoft.com/ja-jp/library/39wcs2dh(v=vs.110).aspx
- 444 :
- >>441
同じスレッドなら同期ではないのですか?
>>442
モーダルとはなんぞやレベルなので出直してきます
>>443
参考サイトありがとうございます
- 445 :
- ポータブルアプリの設定ファイルを扱うなら何がスタンダードですか?
XmlSerializer使ってxmlファイルにするか
Win32API経由でレガシーなiniファイルにするか。
やっぱ前者ですかね?
- 446 :
- >>445
今時はJSON
- 447 :
- >>445
セオリー通りappsettings.jsonやろ普通
- 448 :
- >>445
人の手で編集するかどうか
するならcsvファイルかxlsがええで
Excel使えるから
xmlもiniもjsonも編集ツールが無くてゴミ
- 449 :
- >>448
キチガイ
- 450 :
- >>449
ほう
じゃあ、編集ツール出して見ろよ
そんな誰も編集できないフォーマットで設定とか言ってたって全く説得力ないよ
はい、論破
- 451 :
- yamlとかtomlもまぁアリだな
jsonはtailing commaがちょっと煩い
- 452 :
- ごめんキチガイに触ってしまった
- 453 :
- >>451
C#ならappsettings.jsonで良くね?IOptionとの相性いいし
- 454 :
- >>453
JSONが標準だとは思うし, まぁJSONにする
が, リスト末尾のカンマは許して欲しい
- 455 :
- なるほど、今時はJSONですか。
ただ、少し調べて見たところweb系の構成ファイルとして使う?みたいで自分の思ってるのとは違うのかなと感じました。
後出しになってしまって申し訳ないんですが、自分のイメージしてるのはFormアプリで例えば「最前面に表示する/しない」だとか「昇順/降順で並べる」みたいな、チェックボックスやラジオボタンの選択内容を起動時に読み込み、終了時に書き込みする想定です。
appsettings.jsonは読み込みしかなさそうだったのですが、書き込みってありますか?自分でjson形式にコンバートしてベタに書き込みしろってことですかね?
- 456 :
- >>455
その用途ならアプリ外からエディタで編集させることなんて無いだろうから、正直なんでも良いと思う
- 457 :
- jsonならNewtonSoftがあるけどyamlシリアライザだとどれがデファクトなんだ?
- 458 :
- jsonならNewtonSoftがあるけどyamlシリアライザだとどれがデファクトなんだ?
- 459 :
- >>455
JSONで読んだり書いたりするなんてどうとでも出来る
まぁXML以外ならなんでもいいと思うけどね
- 460 :
- 前も書いたけど騙されたらダメwww
.NETには標準のシリアライザがいくつも存在するんだから、特に理由がないかぎり
あえて外様を使うとか頭の悪い中学生じみてる
- 461 :
- var exts = {".jpeg", ".jpg", ".png", ".gif"};
var f = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(c => exts.All(extension => !c.EndsWith(extension)))
.ToArray();
extsの拡張子以外のファイルを抽出したいんだけど
大文字小文字区別せずに拡張子だけを比較する方法ないですか?
もっと効率いい方法ある気が・・・
- 462 :
- !c.ToLower().EndsWith(extension)
で対応します
- 463 :
- >.NETには標準のシリアライザがいくつも存在するんだから、特に理由がないかぎり
>あえて外様を使うとか頭の悪い中学生じみてる
いくつもあるの? どんなのがあるのか三つくらい教えてください。
ビルドするごとに消えるのでは使いにくいというか何度もビルドするのは普通だとおもうので
それでは使い物にならないので、ビルドしても消えないものがいい。
- 464 :
- 過去スレで以下でアルファチャンネルつき32bitビットマップで保存できると書いてたけど
どのソフトで開いても黒くて透過してません。どうしたらいいでしょうか?開いたソフトが対応してないだけ??
Bitmap bmp = new Bitmap( 32, 32 );
using( var g = Graphics.FromImage( bmp ) )
{
using( var sb = new SolidBrush( Color.FromArgb( 128, Color.Red ) ) )
{
g.FillRectangle( sb, new Rectangle( 0, 0, 16, 16 ) );
}
}
bmp.Save( @"C:\Users\ハゲ\Desktop\test.bmp", ImageFormat.Bmp );
- 465 :
- >>460
今時その認識は正直ヤバい
今の.NETの標準のシリアライザはJSON.NET
Core系では完全に標準シリアライザとしてフレームワークで使われてるし、MSDNにもJSONならJSON.NET使えと書いてる
- 466 :
- >>463
https://msdn.microsoft.com/ja-jp/library/4abbf6k0(v=vs.120).aspx
- 467 :
- >>465
DataContractJsonSerializer でなくJson.net のソースは?
- 468 :
- 設定ファイルは、csv, yaml, json。
Java系のant, maven などは、XML。
Mac系は、property file
chef, vagrant では、Ruby。
Gradle では、Groovy
Haxe のserializer は、数個のプログラミング言語に渡って機能するし、
json, xml みたいに型情報が無くなったりしない
もちろん、Ruby, Groovy も、
プログラミング言語自体が設定ファイルだから、そのまま使える
- 469 :
- >>467
https://msdn.microsoft.com/ja-jp/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx
なんか勘違いしてるみたいだけど、DataContract系は通信に使うもので
ファイルの読み書きに使うことを想定されているもんじゃないよ
- 470 :
- DataContractSerializerは絶対にファイルに書いちゃダメってわけではないけど、データのスキーマがあらかじめ決まってる場合には使えない
あくまで書く側と読む側とで解釈が共通でありさえすれればよくて、その中身を人間は気にしないよ、ってときに使う
- 471 :
- 調べが足りずすみません。
NewtonsoftのJSON.NETというのを使えばいいみたいですね。
.NET標準のXmlSerializerと同じような感じの使い方ですね。
ちなみに、XMLはやめた方が良いと意見ありましたが、
どういった理由からでしょうか?
- 472 :
- XMLは全世界共通の汎用データ交換フォーマットであることが採用する唯一の理由であり、
JSONが主流になった時点で既に存在意義が失われているから
- 473 :
- XML は、JSON よりも可読性が高いから、人が見る・書く設定ファイル。
例えば、アプリのフォームのデザインの設定ファイルに使う
人が見ない、単にコンピューター間のデータの受け渡しには、JSON
XMLを使うと、ややこしい
- 474 :
- >>473
高くねーよ
タグの対応が外れたら素人に発見できんのか?
プログラマならともかくパンピーじゃ無理
- 475 :
- XMLは可読性がわるい。つまり直観が効かない。機械向きで非人間的だから設定ファイルには不向き。
たしかに寄ってたかってよく考えてあるのは解る。それには感心するが、寄ってたかって考えすぎると
たいていは失敗する。その代表的な例としてはXMLもっとも良い例のひとつだろう。つまり駄作だなとおもう。
- 476 :
- jsonはいい加減コメントの使用を本家が認めるべきだわな
- 477 :
- >>473
XMLが読みやすいってwサヴァン症候群なんおまえ?w
- 478 :
- コメントがあると独自スキーマを作り始めるからわざと外したと言っているけど病的だわ
これだから実務屋でない奴は
- 479 :
- そいつC#スレとPythonスレでよく見かけるが
サヴァンかどうかはともかく発達障害は煩ってるぞ
- 480 :
- >>461
EndsWithの第二引数は使えない?
- 481 :
- >>478
悪名高いJSONライセンス(Good, not Evil)も作ってるからなぁ
- 482 :
- >>469
THX
- 483 :
- だれか…
- 484 :
- すいませんでしたぁあ〜〜!
自分の作った別のC++のプログラムで読み込んだら普通に透過してましたぁ!!
やっぱフォトショやその他のソフトがアルファチャンネル無視してただけでしたあ〜
- 485 :
- >>455
その用途ならこれで十分かと
https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/application-settings-for-windows-forms
- 486 :
- XMLのタグの対応って言うけど
JSONも例えば}が数階層のどっかで一つ消えたら人間に対応できなくなるよね
- 487 :
- データの規模が大きくなったらXMLのほうが断然有利
JSONとXHTMLを等価変換するスクリプトを書いてJSONだけでウェブサイトを構築する実験を社内でやった事があるがJSONのスコアは酷いものだった
JSONはネストが深くなると使い物にならん
- 488 :
- >>487
どんな点で有利なのかすら書けないクズ
- 489 :
- 何のデータも示さずjsonは使い物にならないと言われてもねー
- 490 :
- データは自社の資産だから常識的に勝手には公表できない
実験方法は簡単にだけど示したのだからデータが欲しければ実験して検証すればいい
逆にJSONが優れていると言うなら
根拠無しではなくデータなり検証方法を示してほしいね
- 491 :
- >>490
だったら発言すんなよ
消えろクズ
- 492 :
- https://www.infoq.com/news/2013/08/xml-json-performance
同じくらいのパフォーマンスというならまぁ納得出来る
クソみたいなパーサ使わにゃネスト深さでパフォーマンスが悪化するわけねーだろ
- 493 :
- >>490
再現可能なサンプルぐらい作れ
今のままだと説得力ゼロで誰も納得しねーよ
- 494 :
- XHTMLって死んだ技術だと思うが
10年ぐらい前の世界かな?
xmlが見やすいって人は初めて見た
- 495 :
- >>493
2chに書き込むためだけに実験費用払いたくねえよ
こういう実験はサンプルとして人を雇わないとできないんだよ
思考停止ノータイムでボタン押さずに常識的に少し考えてからレスしてくれ頼むから
- 496 :
- 再現するJSONとXMLを一個ずつ用意すれば終わるのに自分以外の人間が必要か?
プログラミングやったことありますか?
- 497 :
- >>496
あんたは論外
パフォーマンスの話なんて誰もしてない
今はみんな生産性、可読性、保守性の話をしてるんだよ
それを測るためにJSONとXHTMLを等価変換するツールを作った
グループAの人達にはJSONでタグ打ちさせてそのJSONをツールでXHTMLに変換した
グループBの人達にはXHTMLで直接タグ打ちさせた
完成するまでの時間や完成したXHTMLのバグ密度など様々なメトリクスを計測したら直接タグ打ちしたグループBのほうがスコアが高かった
グループAとグループBのスコア差はネスト数が深いほど大きくなった
そういう話な
パフォーマンス比較なんてくだらん話は他所でやってくれ
- 498 :
- >>497
人間のやることじゃないことを人間にさせて比較する意味がよくわからない
- 499 :
- >>497
無駄な変数が多すぎて何を比較したいのか分からなくなってるな
仕事できなそう
- 500 :
- >>497
人間がやる意味が分からん
- 501 :
- 流石にこれは擁護できんわw
- 502 :
- テキストデータをバイナリエディタで書かせるような意味不明な実験を
やって悦にいる会社に勤めてかわいそうとしか思えない
上が暗愚だと下が苦労する
- 503 :
- 馬鹿しかいないのか
人間がやる意味がないとか言ってる連中は実験の趣旨を全く理解してない
だから思考停止してノータイムでボタン押すのやめろって言ってるんだよ
ほんと馬鹿の相手するの疲れるな
- 504 :
- こいつはなかなか面白いな, 素でこのコミュ力ならなかなかの逸材だし作っているならよく理解している
- 505 :
- >>493
上が暗愚たと下も思考停止で伝染するんだな
バイナリデータでutf8の入力しづらさも検証したか?
- 506 :
- いや面白いな
どこかの技術系のサイトでネタにしてくれないかな
- 507 :
- 結局、手動で設定するファイルであるなら
jsonもxmlもゴミだろ?
なんの話してんの?
- 508 :
- >>507
そうでもないよ
VScodeでjsonの各種設定ファイルを手で変えたりするけど
あれがXMLだととんでもないことになる
- 509 :
- 深くて3階層程度でそんなに行数多くないならJSONは苦痛は少ないかな
- 510 :
- >>508
そういう無意味な比較意味ないじゃん
xlsで設定できるアプリに使い勝手で勝てるの?
- 511 :
- >>510
それが無意味に思えるなんて幸せなやつだな
- 512 :
- >>511
だってjsonもxmlもいらねーもんよ
- 513 :
- >>510
xlsとかwwwバージョン管理システム使ったことすらなさそうだな
- 514 :
- 残念だけどXMLはクソオブクソだけどXLSとかCSVはそれをはるかに上回るクソなの
- 515 :
- >>513
csvでもいいよ
- 516 :
- >>512
C#やめた方がいいよ
- 517 :
- >>514
理由は?
- 518 :
- せめてxlsxにしてくれ
- 519 :
- >>515
反論する気すら起きんわ
- 520 :
- db(Sqlite)もあるぞ
- 521 :
- >>497の実験は「XHTMLのデータはJSONで記述するには適さない」ということを示しているだけだな
そりゃXHTMLのスキーマはXMLで表現しやすいように設計されてるんだから、
JSONだと属性とコンテンツの区別がなかったりして記述しづらいのは当たり前だ
JSONにはJSONに適したスキーマ設計がある
- 522 :
- やっぱGitすら使えなさそうだな
- 523 :
- >>522
gitでcsvの差分見れないの?
- 524 :
- >>523
Gitでsqliteの差分見るのかい?
- 525 :
- >>517
XLS: バイナリ, 標準化されてない(されてるかも知らんが概ねExcelないと読めん)
CSV: not well standarized
XLSX: zip圧縮されたXMLじゃん
- 526 :
- >>524
dbの比較は簡単
バージョン管理の機能にはないけど
- 527 :
- >>508
VSCodeのセッティングはネストが浅くて比較的読みやすいし、VSCodeによるコード生成がうまく機能してるからね
- 528 :
- >>526
もはや何を言っているのかわからん
- 529 :
- >>525
ビジネスでExcel入ってない環境とかあるの?
- 530 :
- エクセルからマスターや設定をインポートするようになってるシステムは壊しそうで怖いわ
うっかりレイアウトがズレてて正しくデータが取れなくなるとかよくある
バージョン管理の問題にも関連するけど、再現性が乏しいんだよエクセルは
- 531 :
- >>526
おれsqliteのバイナリをテキストエディタで書き換える能力ないのよ
- 532 :
- >>528
DB同士のデータの比較したことねーの?
- 533 :
- >>521
そこの会社の内部の抗争があるんだと思う
いまどきxhtmlを使ってる派閥がいて
そいつらが不利になったので意味不明なテストでxhtmlすげーをやって
何も考えないやつがそれに賛同したと
エジソンが高圧送電は危険だと言って動物をR実験をしたようなもの
- 534 :
- >>529
いくらでもあるよ
- 535 :
- >>529
開発は仮想のLinux上とか普通にあるから
- 536 :
- >>532
json vs xmlの比較とは全く異なる次元のものを持ち込んで比較しようとするクズ
- 537 :
- >>535
openoffice入れろよ
- 538 :
- >>537
こいつdotnet newすら打ったことなさそうだな
- 539 :
- >>536
そっちは完全に編集するツールがないじゃん
あってもゴミみたいなのしか
- 540 :
- >>537
開発用システムでXLS読むために入れるとか本末転倒
- 541 :
- >>540
お客さんに何で編集したいですか?
って聞いてみろよ
Excelでできるって言ったら大喜びするぜ
- 542 :
- >>539
専用ツールがないと編集できないものなんてイラネ
- 543 :
- >>510
Excelの場合はそもそもツリーデータ構造を表現するためのスタンダードなフォーマットが無いので比較する以前の段階
まずはツリー形式のデータ構造を表現するためのフォーマットのデファクトスタンダードを業界全体で決めてくれ
比較はその後に回していいんじゃないかな
- 544 :
- >>541
Linux使ったことないやろ
- 545 :
- vscodeのsettings.jsonとか見せたら発狂しそう
- 546 :
- >>541
客は会社のシステム部門なんで別にExcel喜ばれないですむしろ殴られそうです
- 547 :
- あとXLSXはともかくXLSをC#から弄ったことないんだけどExcelなしで読めるの?
COM使って読むとか言わないよね?
- 548 :
- >>521
やっとちゃんと読んでレスしてる人が来た
確かにもともとXMLをベースに考案されたデータ構造なのでXMLに有利と言えるかもしれない
しかしそれを認めると議論の発端である「jsonはxmlより優れている」という命題を「対象次第ではxmlのほうが有利である」という命題で最初から否定することになってしまう
本当に「jsonはxmlより優れている」なら対象がXHTMLだろうとなんであろうともjsonのスコアが高くなっていなければおかしい
- 549 :
- なんでもかんでもExcelでやりたいVBAer()さんはVBAスレにおかえりください
事務員さんの常識はプログラマには通用しません
- 550 :
- >>547
ExcelCreator使って、Excelのインストールされてない環境で読み書きしてた
昔々ね
- 551 :
- >>467
横から失礼。マイクロソフトの人もそう言ってるよ
- 552 :
- >>547
OLEDB使えばExcelインストール無しでも読めるで
- 553 :
- >>471
一言でいえば古い。
- 554 :
- この手の議論はUI入力とデータ保持を同一のものとして考えちゃうから平行線だわな
- 555 :
- >>548
キミが変なこと言ってるだけ
業務での作業性、操作性においてスマホよりPCがすぐれてるという人に対して
PCではタッチ入力できないとかそんな難癖つけてるだけ
- 556 :
- >>555
残念だけど君には話が通じないね
- 557 :
- >>480
EndsWithに第二引数とかあったのか
いけるわ!ありがとう
- 558 :
- デザインパターンのブログ(ヤフーブログ)・・・・なかなか良い。
https://blogs.yahoo.co.jp/kamyu_2010/35442561.html
- 559 :
- >>554
それ以前の話でしょw
設定データをユーザーが編集したいなんてかなり特殊な前提でありかつ質問者も
そんな要件を一言も上げてないのにアホかと、
.NET標準のシリアライザではなくあえて外様を使う理由はと聞いて、返って来た明確な答えは
結局「そっちの方が目新しいから」だけ。
中学生じみてるよと言ってるそばからこれだ。
プログラマ板みたいな話になっちゃうけど、本当今じゃプログラマって知能指数が低い奴が
やる仕事になってることを実感するよ
- 560 :
- json,.netを使うのは早くて使いやすいからだと思う
使いやすいと書くとまた難癖つけられそうだけどw
- 561 :
- >>560
どういう観点で見たときの使いやすいなのか説明が無いよね?
- 562 :
- >>559
Microsoftの基本的なライブラリもJSON.netに依存してる
https://www.nuget.org/packages/Microsoft.Extensions.DependencyModel/
- 563 :
- 自分が json を使うとしたら、
・周りが使ってるから
・xml と比較して見た目が好み
って程度の理由だなあ。
どっちが優れてるかの比較なんてそれ自体がズレてるような。
- 564 :
- 暇そうだな
同じヒマでも俺は運動してたけど
- 565 :
- シリアライズ出来れば何でもいいよ。
- 566 :
- 結局Windowsのフォームアプリの設定ファイルは何が適してるんだよ
jsonでもxmlでも大差ないよ好きな方どうぞって結論でいいの?
- 567 :
- >>566
そもそも今時フォームアプリなんか採用する時点で全力で時代に背を向けてるんだからどうでもいいよ
- 568 :
- >>566
Setting使え
終わり
- 569 :
- Settings使え+1
- 570 :
- >>566
configファイルにjson形式で書き込む
- 571 :
- >>568-569
質問者は「ポータブルアプリの設定ファイル」と言ってる。
ポータブルアプリがUSBメモリに入れて持ち歩くような物のことを言ってるなら、
Settingsは明らかに不適切
あと、個人的にあんまりアプリケーション設定使ったことないんで勘違いしてるかもしれんが、
これって結構制限も多いしいろいろ面倒だよね
- 572 :
- 質問者ですが、こんなに荒れてしまうとは、、、申し訳ない。
おっしゃるように通常のWindowsフォームアプリならSettingsがデザイナで設定できるし楽なんですが、
ファイルの格納先がローカル(Roamingだったかな?)になるのでUSBメモリなどに持ち運んで使うポータブルアプリとしては採用できないというところでの質問でした。
特に設定ファイルの可読性を求めないようであれば、
形式としては古いが追加ライブラリ不要のXMLか、
スタンダードな形式だが別途追加ライブラリ必要なJSONか、
好きな方を選べって感じですかね。。
- 573 :
- ユーザー定義リソースにしてexeに直接書き込むって方法もあるよ
- 574 :
- >>572
USBで運ぶポータブルアプリ程度ならApplicationSettings保存でもいいんじゃないの?
- 575 :
- exeの直下でいいよな
- 576 :
- アプリケーションスコープにするとアプリから書き込みできないよ
- 577 :
- >>575
でもアクセスの速度違うときあるからね。
- 578 :
- すいません。
初心者なのでこちらに移動してきました。
MVC的な設計で
初期設定値を入力するフォーム
↓
初期設定値を格納するクラス
というのを作りたいのですが、
A.
クラス側に各変数のプロパティを作成
フォームからプロパティを介してクラスの変数に値を代入
B.
クラス側にフォームの初期値を取りに行くメソッドを作成
クラスからメソッドを実行してフォームに値を取りに行く
のどちらが良いのでしょう?
自分ではAの方がよさそうな気がするのですが、一般的な設計としてこうするというのがあったら教えてください。
- 579 :
- ケツの穴から手をつっこんで奥歯をがたがたみたいなBよりA
- 580 :
- >>578
どっちでも動きゃいいだろ
さっさと完成させろよ
- 581 :
- >>578
// form
void btnSaveInitialSettings_Click(object sender, EventArgs e) {
try { this.SaveInitialSettings(); }
catch(...) { ... }
}
void SaveInitialSettings() {
var initialSettings = this.GetInitialSettings();
var reaction =
this.initialSettingsController.SaveInitialSettings(initialSettings);
reaction?.Invoke(this);
}
// controller
Action<IInitialSettingsView> SaveInitialSettings(InitialSettings initialSettings) {
this.initialSettingsService.SaveInitialSettings(initialSettings);
return view => view.Refresh();
}
- 582 :
- 初心者は出来上がってから検討すりゃいいんだよ。
つうか、プロ目指してるなら、先ずは完成させる癖を付けないとな。
万年アマチュアでいいのなら些末な問題で盛り上がればいいさ。
- 583 :
- まず終わらせろ、Facebookのにいちゃんも言ってたべな。
- 584 :
- Facebookにいちゃんが誰かわからんがそいつが言うまず終わらせろ、とお前が考えるまず終わらせろは別物だと思うぞ
ユニットテストとリファクタリング込みでまず終わらせろ、って言ってるならマトモだけど、将来のことなにも考えずまず終わらせろって言うならただの害悪
- 585 :
- >>584
リファクタリングなんか完成した後にバージョンアップする機会があったらやればいいんだよ。
- 586 :
- 将来が有るかどうかなんて、売れてから考えろw
タイムイズマネーだ。無駄なリソース費やしてる暇が会ったら次の案件片付けろ。
- 587 :
- >>585
そうだよね
エッチな絵が一枚も表示されないのにリピーターがいることを想定してる
なんてピンボケもいいとこだよね
割とマジで
- 588 :
- 仕様通りの動きだけど汚いコードと
仕様通りの動きじゃないけど綺麗なコード
を同じ時間で仕上げたとして、どっちが優れているかと言えば前者だよな
- 589 :
- >>588
そりゃ仕様満たしていないなら比較以前の問題だわな
仕様満たして完成までの期間で比較とかならともかく
- 590 :
- まあ、熟練者になれば、素早く仕様通りのコードを綺麗に仕上げて来るからな。
初心者は先ず動くコード、次に仕様通り、最後に綺麗なコードでいいよ。
時間掛かるのはこの際問題にしないw
- 591 :
- リピーターが多い汚いコードと
リピーターが少ない綺麗なコード
後者はゴミだよね
- 592 :
- 世の中の多くのバカが勘違いしてるんだけど
綺麗なコード==間違えやすい製造に時間がかかるコード
じゃないんだよね
綺麗なコードはバグが少ないし製造も早い
汚くても動くコードを早く書け!なんて言ってるやつは根本的に何かがズレてる
そんな方針でコーディングしたら汚くて動かないコードを時間をかけて作る羽目になる
- 593 :
- 洗練された華麗なコードとインデント揃っただけの綺麗なコードを混同してるばか発見
- 594 :
- >>578
UI(Form)がモデル(何か仕事をするクラス)の参照を持つのは問題ないが、
逆は良くない。理由は、
(1) 役割分担があいまいになる
厨房の人間が1分おきにウェイターに注文を確認するのは適切な役割分担と言えるか?
(2) つぶしがきかない
Formの参照を握ってFormのメンバーを操作するクラスは、UIをWPFやUWPに
変更しても使いまわしできるか?
- 595 :
- >>581
一読で理解できる知識がないのですが、勉強してみます。
ありがとうございます。
- 596 :
- >>594
UIがデータ格納用クラスのインスタンスを生成
UIがプロパティを介してデータ格納用クラスの変数に代入
UIがコントローラにデータ格納用クラスのインスタンスを渡す
みたいな感じでよろしいでしょうか?
- 597 :
- >>596
>UIがデータ格納用クラスのインスタンスを生成
誰がモデルのインスタンスを生成するかはケースバイケースだしどうでもよろしい
>UIがプロパティを介してデータ格納用クラスの変数に代入
重箱の隅をつつくようだが、オブジェクトのプロパティやメソッドを操作する時に
「データ格納用クラスの変数に代入 」なんていう内部の実装を意識する必要はない。
必要はない、というか意識しなくても使えるように作るのがカプセル化。
>UIがコントローラにデータ格納用クラスのインスタンスを渡す
俺がMVCを理解してないだけの可能性もあるが、少なくともWindows Formでは
VとCを分けたりしないのが普通と思う。コントローラなんてイラネ
- 598 :
- 話蒸し返して悪いんだが、xmlシリアライザーって今使ってるとやばいの?業務アプリの設定ファイルほぼこれで今までやってたんだが。。
とりあえず今やってる案件JSONで見直してみるか
一人で開発やってるとついついこういうのに遅れがちになるなぁ
- 599 :
- >>598
どんな用途で?
- 600 :
- csvとJSONなら圧倒的に後者のがメリットあるけど、
xmlとJSONなら規模がでかくない限りどっちでも良いや
- 601 :
- >>598
業務ドカタ系でJSONなんかほとんど無いから安心しろ
客サイドは情シスですらJSON何それとか平気で言いやがるしOSSのライブラリが必要なのもネック
- 602 :
- >>600
Excelで編集できるできないって違いもあるのに
どこが「圧倒的」なの?
根拠もない主張を強く推すなよ
願望だろ?お前の
- 603 :
- PCのiTunesって曲の情報管理全部XMLだよな
どうにかならんのか
https://i.imgur.com/zaooQAM.jpg
- 604 :
- Ant, Maven とか、Java系は、XML。
Android 画面の設定ファイルとか
Windows でも、XAML で画面設定する
プロジェクトの設定ファイルも
JSON を設定ファイルに使うのは、JavaScript を使ったもの。
例えば、Node.js を含んだ、VS Code
他には、プログラミング言語自体が設定ファイルになるもの。
Ruby, Groovy, Haxe
- 605 :
- >>598
え?全然やばくないよ
むしろ安定した手堅い選択肢と言っていい
JSONを設定に使う製品はむしろ少数派
- 606 :
- >>604
>JSON を設定ファイルに使うのは、JavaScript を使ったもの
最近のC#もそうですが
- 607 :
- >>598
ヤバイってどういう状況?
殺されるの?
- 608 :
- >>606
project構成は不評で結局xmlに戻ったね
ASP.NETのappsettingsはボイラープレートがjsonになってるけどxmlやiniもサポートされてる
- 609 :
- 素のJSONはコメントが使えないので設定ファイルには使い辛い。
- 610 :
- 川俣さんのことを馬鹿にする人が2chには多いけど、この記事の趣旨は正しいと思う
http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_18/extremecs_18_02.html
特定の技術への信仰と「俺スゲー」っていう間抜けな自己陶酔が結びついてる奴ってよくいるし、
このスレにも時々そんなのが出るけど、そういう奴のいうことは真に受けない方がいいですw
- 611 :
- >>608
まあ普通はjson使うがな
- 612 :
- つか業務で使うなら余程のことがない限り枯れた技術の方が安定する
- 613 :
- >>612
COBOLとか?
- 614 :
- COBOLは実際優れてるんだよなあ
低品質なPGでもほぼ完璧に見積工数通りに仕上がるし、バグもほとんど出ない
金持ちな客からきっちり工数見合いで金取れるならSIerにとってこれほど好都合な言語はない
- 615 :
- バグでないのはアカンやろw
- 616 :
- それはバグが摘出できていないだけでは
- 617 :
- 工数が低減できるかどうかよりも見積が精確にできることの方が管理者にとっては重要ってわけだね
- 618 :
- バグが出ないに総ツッコミでワロタ
- 619 :
- 大体この時間にABENDしますって
異常停止をルーチンワーク化して運用している所があったな
- 620 :
- 現場運用だと稀によくある
開発側がそれを織り込んじゃダメだけど
- 621 :
- >>598だけど
蒸し返した話にレスくれてありがとう
自分の用途にはxmlでも問題なさそうでとりあえず安心した
- 622 :
- SVGやMathMLのような外部の名前区間が出てくるとか、Xamlのようにかっちりしたものを書きたい場合はXMLが有利
文字列や数値しか出てこないような簡単な構造ならJSONの方が便利なことも多い。
Trueなのかtrueなのかとか考えなくても良くて、エディタがサポートしてくれるし、エスケープの仕様とかがシンプルで、ファイルも小さい。逆に言うとその程度なのでわざわざ切り替えるほどでもないとは思う
- 623 :
- >>597
VCわけないんですか。
うーん・・・。
いろいろな設計方法があるということですね。
インスタンスの生成順として
A→B
A→C
とAからCにBのインスタンスを渡す方法は分かるのですが、
C→A
A→B
とインスタンスを生成した時、CにBのインスタンスを返すことって可能なのでしょうか?
- 624 :
- デリゲート
- 625 :
- 【マンモグラフィー】おっぱい挟んで癌検査…必要?
http://egg.2ch.sc/test/read.cgi/bio/1517115639/l50
【ペットフード】Kしたら3人組に棍棒で襲われた
http://egg.2ch.sc/test/read.cgi/hosp/1517110484/l50
【アマルガム】水銀を歯に? 厚労省『暴動が怖い』
http://mao.2ch.sc/test/read.cgi/doctor/1517058870/l50
- 626 :
- >>623
「返す」ことにこだわりがあるのなら結構難しい
そこにこだわらず、単にCからbを扱えれば良いのならa.bでアクセス可能だろう
- 627 :
- >>623
何でわざわざ話を複雑にするの?
class C
{
A a;
B b;
public C()
{
a = new A(this);
b = new B(a);
}
}
例えばこれじゃダメなの?
- 628 :
- DIコンテナとか諸々のイディオムを知らない初心者だからまぁしゃあない
MVCでもMVVMでもいいからチュートリアル的なものをひとつやっとくとだいぶ違うとは思う
- 629 :
- >>626
まず「返す」の意味が分からないんだよな
>>623
何のためにその実装が必要なのか、まずはそっちから
普通は複数の派生インスタンス扱いたいのならどこかでまとめて管理する方が楽
横に伸ばしていくんじゃなく中心から引っ張っていく形
- 630 :
- 馬鹿なこと考えないでジャンケンゲームでも作ってろって
- 631 :
- >>623
今時のマルチレイヤな設計ってのは、「汚い場所」をどこかに決めて、そこが依存関係の解決を一手に引き受けるようにするんだよ
で、他の部分は「汚い場所」に直接依存しないようにするの
>>627の例でいうと、Cを「汚い場所」とするならAがCを直接参照するのは良くなくて、
AからCのメソッドをコールバックしたいんだったらインターフェイスを介して呼ぶようにしたりする
汚い場所をどこにするかだけど、フォームアプリならフォームだったり、Webアプリならコントローラだったり
処理の起点となり、かつ、どのみち単体テストが困難な場所を選ぶのが一般的だ
- 632 :
- なんだか要領を得ないからわからないけど
Bを操作するメソッドをAに用意してCがA経由でBを操作するのはだめなのか?
- 633 :
- MVC をわかってないような奴に、何も教えられない
まず、無料のRails チュートリアルで、MVC webアプリの設計から学べ
- 634 :
- Railsってモデルがフォームの構造に依存するからなあ
あんなのAccessのフォームなんかと同レベルだよ
変な癖がつくから初心者には適さない
- 635 :
- >>633
スレチ
- 636 :
- MVVMを理解するには何からはじめたらいいの?
- 637 :
- >>636
何から始めても理解できない
分離するどころかやればやるほど結合が強くなる現実に打ちのめされるだけ
- 638 :
- やってみたけど難し過ぎて手に負えなかったってことだね。
- 639 :
- >>636
Vue.jsあたりかな
XAMLはテンプレートやコマンドバインディングが複雑すぎて本質を掴みづらい
WebのMVVM系フレームワークのほうがずっと見通しが良くてMVVMの本質を素直に実装してる
- 640 :
- まずはUNDOなりマクロを実装するのに何が必要か
考えると、「C」の動きが見えて来るかと思うけどね
GOFの最初の章にも説明はあるよ
- 641 :
- >>627
アクセシビリティに一貫性がありませんってエラーが…
internalでインスタンス生成するとOKなんですが、フォームクラスはpublicで宣言してるんですけど。
- 642 :
- >>629
ご指摘を受けてメインのフォーム上でインスタンス管理しようとしているのですが、
アクセシビリティの一貫性というエラーが出てきています。
public partial class ExaminationForm : Form
{
public InitialSettingForm initialSettingForm;
public InitialValues initialValues;
で最後の行にアクセシビリティ一貫性のエラーが・・・。
3行目のpublicをinternalにするとエラー消えるのですがなんでだろう。
- 643 :
- そのビューの入出力項目と隠し項目とユースケースを抽出するだけだよ
ログイン画面だったら
入出力項目として
・ユーザーid
・パスワード
隠し項目は無し
ユースケースは
・ログインする
なので
class LoginViewModel {
public string UserId { get; set; }
public string Password { get; set; }
public void Login() {
// login impl
}
}
こうなる
あとはViewがVMを監視するために変更通知イベントなどを実装しましょう
それだけ
- 644 :
- >>636へのレスな↑
- 645 :
- >>642
InitialValuesクラスがinternalなんだろ
publicに変えれば意図通りになる
言っちゃ悪いけど正しい設計とか気にするレベルじゃないと思うよ
まずは汚くてもいいから一本何か形にできるようになってから考えればいい
- 646 :
- >>645
ああああああああ!
そこなのかあああ!
classってデフォルトでinternalになるんですね。
というかinternalって省略されるから気づきませんでした。
ここで半日費やしてたのでものすごく助かりました。
ありがとうございます。m(__)m
- 647 :
- >>645
一本ゲーム作ったんですが、form1(初期値)、form2(ゲーム)にほとんどぶっこんだオブジェクト指向ほぼ無視プログラムになってしまったので、
ゲーム内のデータ管理とform2だけでも分離しようとして悪戦苦闘しています。
はるか昔にBasicやったぐらいなので、インスタンスの参照渡しとかその辺がうまく実装できなくて・・・。
勉強用に買った本にもインスタンスの参照渡しなんて全く書いてないし・・・。(´・ω・`)
- 648 :
- あれでも
//インスタンス生成
InitialValues initialValues = new InitialValues();
//インスタンスの参照渡し
initialSettingForm.InitialValuesPointer = initialValues;
としているのに
フィールド”InitialValues"は割り当てらせません。常に規定値nullを返します。
となります。
実際にnull値が入ってるようで、initialSettingFormにインスタンスの参照は渡せていない模様・・・。
newしてるのになんで割り当てられませんと出るのでしょう??
- 649 :
- //インスタンス生成
×InitialValues initialValues = new InitialValues();
↓
this.initialValues = new InitialValues();
でした。すいません。
- 650 :
- >>648
すいません。ゴチャゴチャしてた変数名整理したらエラー消えました。。。
お騒がせしてもうしわけありません。
- 651 :
- >>647
C++ 以外のすべての言語で、インスタンスの参照渡しだろ
- 652 :
- >>651
初代MSX-Basicでゲーム作ってた頃以来のプログラミングなので(;^_^A
- 653 :
- アホな質問ですが、
Class InitialValue
に初期値を全部詰め込み、必要であればコントローラから参照しているのですが、
インスタンスの参照をinitialValueとすると
initialValue.StartPointX+hoge
などインスタンスの参照がくどくて読みづらい。
いっそiVとかしたいのですが、自分にしかわからない省略は良くないと聞いたもので・・・。
initialValue.StartPointX
initValue.StartPointX
iV.StartPointX
どれが読みやすいコードでしょうか?
- 654 :
- >>653
どれもダメ
initialValueをそのまま使わずに設定値を使うクラスにコピーして
- 655 :
- >>654
えええ!
データはデータクラスで一元管理じゃないんですか?
そうしないとフォームなどからデータクラスを変更した時に、
コントロールクラス側でその通知を受け取って
もう一度データクラスからコントロールクラスにコピーする仕組みが必要になってきますよね。
- 656 :
- 自分がアホだと分かってる割には自分の判断を信じてるのな
アホ草
- 657 :
- 勉強のためにプロが書いた大きなプログラムを見たんだが
変数が全部4桁英数字でランダムに発生させてるような文字列だった
僕ら初心者には「これ何の変数だっけ?」と分かりにくいだけなんだけど
大きなプログラムだと万が一、変数がダブったりするのを避けるためにそうするんですかね?
変数一覧表かなにか作るんですか?
- 658 :
- >>656
いや、最初はコピーする仕様だったんですが、
データクラスで一元管理をするアドバイスを受けて変えたところです。
コピーするんなら元の仕様のままでよかったのかということに。
- 659 :
- >>657
変な変数名は難読化されてるだけ
- 660 :
- >>657
当然だよ。変数使うには課長級の決済が必要。変数管理台帳ファイルに全部記録されている。
- 661 :
- >>659
そうか、公開用にリファクターしたのかな
いちいち一覧表見ないと何処につながってるか見えないなんて不便だもんね
- 662 :
- >>658
変数名が妥当かどうか聞いてるんじゃなかったの?w
そのInitialValueとやらのクラスを使う実装方法が妥当かどうかは実現すべき仕様を誰も知らないので
誰にも分からないと思うよw
ローカル変数の命名に関しては、型名InitialValueをそのまま変数名にしても
何をやってるのか理解できるような文脈なら変数名をivにしても同じことでしょう。
だったら短い方がいい。
ただしローカル変数でも説明的な名前の方が適切な場合もあるので馬鹿の一つ覚えはダメ。
情況に応じて柔軟に
- 663 :
- >>660
初心者が真に受けるからやめれ
- 664 :
- 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++;
}
}
}
閾値がプラスとマイナスで条件式を変えたいんだけど、
中の処理が一回で済む書き方ってあります?
- 665 :
- =を含まない条件式。
そして閾値というキーワード。
まとめない方がいいよ。
- 666 :
- >>664
せめてCountメソッドにしとけと思うぐらい。
- 667 :
- >>664
単に同じ処理を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))
{
....
}
- 668 :
- async/awaitって呼び出しのネストが深くなると、大元の呼び出しで波線が立ってすごくもどかしいんですが、気にしなくていいでしょうか?それとも呼び出しのやり方を見直したほうがいいのでしょうか
- 669 :
- >>668
ネスト関係なくね?
- 670 :
- >>664
カウントをCountメソッドにして引数に突っ込むラムダ式を閾値によって切り替える
- 671 :
- ごめん。Count以外の処理もあるんだね。おらの回答は無視してくれ。
- 672 :
- dataGridViewのデータソースをBindingListにしています。
この時にデータの絞込を実装する方法はあるのでしょうか。
- 673 :
- >>668
波線が立つのは単にasyncなメソッドをawai付けずに投げっぱなし呼び出しの警告出ているだけじゃないのか
>>669の言う通りネスト関係ない
- 674 :
- すいません。ちょっと教えてください。
//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に戻る方法を教えてください。
- 675 :
- >>674
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;
- 676 :
- >>674
目の前の問題を解決するよりまずインスタンスとは何かちゃんと理解した方がいいねw
- 677 :
- ありがとうございました。
大変助かりました。
- 678 :
- もっと簡単にこれでもできるよw
var f2 = new Form2();
f2.Shown += (s, ev) => Hide();
f2.ShowDialog(this);
Show();
- 679 :2018/05/19
- アプリ全体の設定について、設定変更画面を作ろうとして、まずは設定そのものを1つのクラスにまとめることを考えた
そんで各設定項目を public get, private set にしようと思ったら
設定画面クラスからは各設定項目プロパティの値を書き換えられなくって困ったんだが
これってどうしたらいいのかな
コンストラクタに引数渡して各設定項目を設定することも考えたけど、
設定項目が20こほどあるからそれはやりたくない
プロジェクト分けて設定画面を別アセンブリにしてpublic get, internal setにしないといけないんかな
Win32API質問箱 Build125
C#だとそんなに重くなるもんなの?
PowerShell -Part 3
Visual Studio Code / VSCode Part7
プログラム始めたいけどrubyかPythonどっちが良い
シェルスクリプト総合 その30
音声合成プログラムを作りる
文字コード総合スレ Part11
【C++】マイナーGUIツールキット
C/C++の宿題片付けます 170代目
--------------------
【コナミ】麻雀格闘倶楽部参 part2
【悲報】現金給付は中止 コロナなのに旅行と外食限定の商品券に ありがとう安倍さん★2 [632250434]
【中国】新型肺炎でCO2排出量が激減
日本第二次世界大戦敗戦
FA権を取得したら巨人入りしそうな選手2
薬学部に編入・薬剤師になりたいです
全国切手展、北朝鮮切手のコレクションに「賞」
好きなインテリアのテイスト
佐藤優樹です!牧野まりあです! 2人合わせてまりまーです! 90まりまー
ヤス 「五日性滅亡シンドローム」
【MHW】ライトボウガンスレ 69発目
【スタートゥインクル】ララルン【プリキュア】
【はばたけ】法務局スレpart2【全国へ】
キン肉マンマッスルショット Part308
新40代アニメ好きスレ
☆ CD-R 書き込みサービスについて ★
【MHW】モンスターハンター:ワールドHR1824
高麗屋 【白鸚・幸四郎・染五郎】
ガチな剣道部員にしか分らないこと
【金スマ殉愛】たかじん嫁さくら【百田尚樹】★460
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼