ふらっとVisual C#,C♯,C#(初心者用)
このスレッドは
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
関連スレ
ふらっとC#,C♯,C#(初心者用) Part91
http://toro.2ch.net/test/read.cgi/tech/1335089085/
C#, C♯, C#相談室 Part71
http://toro.2ch.net/test/read.cgi/tech/1332575004/
こんな感じでソフトウェア板に立てたらどうかな
ふらっとC#,C♯,C#(初心者用) Part92
■ このスレッドは過去ログ倉庫に格納されています
2012/04/26(木) 21:32:32.95ID:RzRn9VkL0
2名無しさん@お腹いっぱい。
2012/04/26(木) 21:41:40.86ID:O5VqGHkR0 ─ここは、プログラム板における同名スレにおいて、
IDが付与されないがため生じる定期的な荒れ進行を度々経験し、
疲れてしまった同スレの住人が、透明あぼーんの活用でまったりと
本来のスレの目的を果たし続けるために設けられた、
一種の避難所です。
IDが付与されないがため生じる定期的な荒れ進行を度々経験し、
疲れてしまった同スレの住人が、透明あぼーんの活用でまったりと
本来のスレの目的を果たし続けるために設けられた、
一種の避難所です。
2012/04/26(木) 21:48:33.25ID:k6WQuHfJ0
ム板開いたのかと思ったわ
避難所part1で良かったんじゃね?
避難所part1で良かったんじゃね?
4名無しさん@お腹いっぱい。
2012/04/26(木) 21:56:27.84ID:O5VqGHkR02012/04/26(木) 22:02:59.89ID:4B8P7eLr0
荒れ気味の板がIDなしだと大抵ろくな事にならないのは分かるが、この板でする話なのか
6名無しさん@お腹いっぱい。
2012/04/26(木) 22:08:52.32ID:O5VqGHkR0 ム板から逃れる先として、ソフトウェア板以外に何かあるかな?
2012/04/26(木) 22:45:50.27ID:ztuW7M4rO
ム板でやれ
8名無しさん@お腹いっぱい。
2012/04/26(木) 22:49:38.04ID:O5VqGHkR02012/04/26(木) 22:55:41.61ID:bO5QxnlI0
荒れてる時はこっちに誘導したらいいんじゃないかな
10名無しさん@お腹いっぱい。
2012/04/26(木) 22:57:29.91ID:O5VqGHkR0 まあ、あっちに来た質問を無理にこっちに誘導する気はあんまり無いんだ。
向こうでも書いたけど、あっちのスレが回答不能なレベルに達してるってわけじゃないし。
むしろ、「IDがあった方が議論しやすい」と感じた人間だけが、こっちで議論すれば良いと思ってる。
向こうでも書いたけど、あっちのスレが回答不能なレベルに達してるってわけじゃないし。
むしろ、「IDがあった方が議論しやすい」と感じた人間だけが、こっちで議論すれば良いと思ってる。
11名無しさん@お腹いっぱい。
2012/04/26(木) 23:07:50.71ID:O5VqGHkR0 こっちを擁護しておいてなんだが、これで本スレのテンプレに
こっちのスレを追加すべき/すべきでない議論とか巻き起こるのは嫌だなあ。
テンプレ周りの変更議論はもめるし。
もめるくらいなら追加したくない。
こっちのスレを追加すべき/すべきでない議論とか巻き起こるのは嫌だなあ。
テンプレ周りの変更議論はもめるし。
もめるくらいなら追加したくない。
2012/04/26(木) 23:10:39.92ID:8roaiKjI0
問題は回答者がここにくるかだな
2012/04/26(木) 23:11:12.03ID:bO5QxnlI0
俺が一番回答してるから俺がいれば大概大丈夫だろう
14名無しさん@お腹いっぱい。
2012/04/26(木) 23:17:43.49ID:O5VqGHkR0 >>12
俺も一応回答者。どんくらい回答したかまでは覚えてないけど。
俺も一応回答者。どんくらい回答したかまでは覚えてないけど。
2012/04/26(木) 23:34:02.35ID:8roaiKjI0
じゃあ、ちょっと質問
インターフェイス使うと改変に強いっていうけどプロパティとどう違うの?
プロパティも内部の構造変えても他のクラスに影響がない
影響が出るとしたら、プロパティの型を変更した場合
インターフェイスも引数の型変更したら結局使いものにならないし
改変に強いって説明の仕方おかしくない?
内部の違うクラスを同じようにアクセスできるのを明示するということならわかるけどね
インターフェイス使うと改変に強いっていうけどプロパティとどう違うの?
プロパティも内部の構造変えても他のクラスに影響がない
影響が出るとしたら、プロパティの型を変更した場合
インターフェイスも引数の型変更したら結局使いものにならないし
改変に強いって説明の仕方おかしくない?
内部の違うクラスを同じようにアクセスできるのを明示するということならわかるけどね
2012/04/26(木) 23:43:32.60ID:LlORaYbR0
クラスというのは、実体を作れる型。
インターフェースとしいうのは、実体を作れない型。
インターフェースとしいうのは、実体を作れない型。
17名無しさん@お腹いっぱい。
2012/04/26(木) 23:45:23.62ID:O5VqGHkR0 「改変に強い」のは、インターフェイス自体の改変ではないよ。
改変に強い、って説明自体確かに誤解を招く表現で、
実際は「内部実装を気にしなくて良い」が正解だと思う。
インターフェイスとはちと違うけど、Streamなんかその最たるものじゃない。
Stream自体が何をソースにどうやって実現されているかは気にしなくてよくて、
処理する側はStreamクラスのオブジェクトに対して必要な処理(メッセージ)を要求すればいい。
インターフェイスを定義する、ってのはそれだけのことでしかない。
「Hoge(FileStream stream)」って定義したメソッドより、「Hoge(Stream stream)」って定義されたメソッドの方が、
汎用的に使えるじゃない。
改変に強い、って説明自体確かに誤解を招く表現で、
実際は「内部実装を気にしなくて良い」が正解だと思う。
インターフェイスとはちと違うけど、Streamなんかその最たるものじゃない。
Stream自体が何をソースにどうやって実現されているかは気にしなくてよくて、
処理する側はStreamクラスのオブジェクトに対して必要な処理(メッセージ)を要求すればいい。
インターフェイスを定義する、ってのはそれだけのことでしかない。
「Hoge(FileStream stream)」って定義したメソッドより、「Hoge(Stream stream)」って定義されたメソッドの方が、
汎用的に使えるじゃない。
2012/04/26(木) 23:54:34.76ID:bO5QxnlI0
改変に強いっていうのはどうなんだろうな
個人的には別に強くないと思うが
interfaceごしだと実装クラスを入れ替えられるけど
改変前と改変後の2つの似たようなクラスを両方保持して
interface越しにどっちを使ってるか分からなくするなんて考えただけでゾッとする
一つの具体クラスをただ書き換えるほうがずっといい
だから改変に強いと言うよりは
ライブラリを作る側が使う側に処理を実装してもらう時に使うものだと思うよ
IComparableを実装してもらってSortメソッドで使う比較関数に利用したり
まあC#3.0からラムダ式が使えるからそういう用途はもうほとんどお役御免だけどね
interface自体ほとんどお役御免といっていいと思う
ライブラリに残ってれば使うけど自作する意味は殆ど無い
個人的には別に強くないと思うが
interfaceごしだと実装クラスを入れ替えられるけど
改変前と改変後の2つの似たようなクラスを両方保持して
interface越しにどっちを使ってるか分からなくするなんて考えただけでゾッとする
一つの具体クラスをただ書き換えるほうがずっといい
だから改変に強いと言うよりは
ライブラリを作る側が使う側に処理を実装してもらう時に使うものだと思うよ
IComparableを実装してもらってSortメソッドで使う比較関数に利用したり
まあC#3.0からラムダ式が使えるからそういう用途はもうほとんどお役御免だけどね
interface自体ほとんどお役御免といっていいと思う
ライブラリに残ってれば使うけど自作する意味は殆ど無い
2012/04/26(木) 23:57:08.75ID:65sWvc4W0
ム板って取扱いと人種的に宗教戦争余裕なのに未だにIDないのか
2012/04/26(木) 23:57:13.32ID:LlORaYbR0
インターフェースは、お役御免には、ならないと思うがな。
2012/04/27(金) 00:04:32.27ID:Op9+MQob0
interface I{ int Hoge(); string Hoge2(); }
こんなのを作るより
class C{ public Action Hoge; public Func<string> Hoge2; } こんなのを作って
new C{ Hoge = () =>{ ... }, Hoge2 = () => "hogehoge" }
こうしたほうが早いしわかりやすいし個別に設定できて汎用性も上だから
もうinterfaceを作る意味は無いはず
こんなのを作るより
class C{ public Action Hoge; public Func<string> Hoge2; } こんなのを作って
new C{ Hoge = () =>{ ... }, Hoge2 = () => "hogehoge" }
こうしたほうが早いしわかりやすいし個別に設定できて汎用性も上だから
もうinterfaceを作る意味は無いはず
2012/04/27(金) 00:04:33.82ID:M9E7Y8z10
例えば、UnityやXNAやDxLibなどを同じように扱えるようにするにはどうするべき?
ゲーム本体部分とライブラリとの丁度境界線上にあるクラスはどのように定義すべき?
ゲーム本体部分とライブラリとの丁度境界線上にあるクラスはどのように定義すべき?
23名無しさん@お腹いっぱい。
2012/04/27(金) 00:06:06.52ID:adJRSpDB0 お役ご免ってのは言い過ぎでしょう。後々機能追加が考えられる場合、
その機能追加に耐える様Interfaceを定義するコトなんて、(自分は)ザラにありますよ。
たとえば、画像ファイルに対して順次いろんな処理をするようなソフトを作ったとき、
最初はjpgとbmpしか対応しないでおいて、いずれpngとかtiffもやりたいなあ、と思った場合、
interface ImageProcessor { ... }
class JpegImageProcessor { ... }
class BmpImageProcessor { ... }
なんて。
処理自体が短ければ>>18の言うとおり、ラムダ式で十分なんだけど、
色んな段階を踏む処理の場合、処理自体をクラス化しちゃう方が後々追加し易い。
>2つの似たようなクラスを両方保持して〜一つの具体クラスをただ書き換えるほうがずっといい
っていうような懸念がある場合は、interfaceじゃなくて抽象クラスでやればいいし。
共通部分は抽象クラスで処理して、後々追加したい機能毎に変わりうる部分は具象クラスに任せて抽象メソッドを定義だけしておく、とか。
その機能追加に耐える様Interfaceを定義するコトなんて、(自分は)ザラにありますよ。
たとえば、画像ファイルに対して順次いろんな処理をするようなソフトを作ったとき、
最初はjpgとbmpしか対応しないでおいて、いずれpngとかtiffもやりたいなあ、と思った場合、
interface ImageProcessor { ... }
class JpegImageProcessor { ... }
class BmpImageProcessor { ... }
なんて。
処理自体が短ければ>>18の言うとおり、ラムダ式で十分なんだけど、
色んな段階を踏む処理の場合、処理自体をクラス化しちゃう方が後々追加し易い。
>2つの似たようなクラスを両方保持して〜一つの具体クラスをただ書き換えるほうがずっといい
っていうような懸念がある場合は、interfaceじゃなくて抽象クラスでやればいいし。
共通部分は抽象クラスで処理して、後々追加したい機能毎に変わりうる部分は具象クラスに任せて抽象メソッドを定義だけしておく、とか。
2012/04/27(金) 00:10:18.02ID:M9E7Y8z10
>>23
もっともですねぇ
もっともですねぇ
2012/04/27(金) 00:13:36.43ID:Op9+MQob0
>>23
これだと違いはファイル読み込んでビットマップ作る
ビットマップをファイルに書き出す
ところが違うだけじゃないの
具体的なクラス一個作って
public Image(Pixel[][] bitmap)
こんなコンストラクタにして
new Image(JpegLoader.Load(file))
new Image(BmpLoader.Load(file))
書きだす時は
JpegWriter.Write(image.Pixels);
BmpWriter.Write(image.Pixels);
こんなもんでよくね
これだと違いはファイル読み込んでビットマップ作る
ビットマップをファイルに書き出す
ところが違うだけじゃないの
具体的なクラス一個作って
public Image(Pixel[][] bitmap)
こんなコンストラクタにして
new Image(JpegLoader.Load(file))
new Image(BmpLoader.Load(file))
書きだす時は
JpegWriter.Write(image.Pixels);
BmpWriter.Write(image.Pixels);
こんなもんでよくね
26名無しさん@お腹いっぱい。
2012/04/27(金) 00:15:00.08ID:adJRSpDB0 まあ、オブジェクト指向を完全に理解して常に完璧な形で実現出来てる、
なんて境地には到底達せないと思うので、今の自分の実装が正しいとも言い切れないんですけど。
Rxとか見てると、ラムダ式で全部・・・なんてのも決して非現実的ではないと感じるし、
「一つ一つの処理は短く」という基礎的なことを突き詰めていけば、
そういうこともきっとできるんだろうなあ、とは思う。
ただ、それでもinterface自体が無くなる可能性は低いだろうな。
俺は逆に、Rxが駆逐しようとしているのは開発者がclassを定義する、
という行為じゃないかと感じる。
なんて境地には到底達せないと思うので、今の自分の実装が正しいとも言い切れないんですけど。
Rxとか見てると、ラムダ式で全部・・・なんてのも決して非現実的ではないと感じるし、
「一つ一つの処理は短く」という基礎的なことを突き詰めていけば、
そういうこともきっとできるんだろうなあ、とは思う。
ただ、それでもinterface自体が無くなる可能性は低いだろうな。
俺は逆に、Rxが駆逐しようとしているのは開発者がclassを定義する、
という行為じゃないかと感じる。
2012/04/27(金) 00:17:24.64ID:nbH+qoH50
変数名につける英単語がわからなくて悩みまくる
28名無しさん@お腹いっぱい。
2012/04/27(金) 00:17:43.59ID:adJRSpDB0 >>25
それだと、あっちこっちで処理対象がJpegなのかBmpなのか判定しなきゃいけなくなるでしょう。
処理が読み込みと保存だけでいいなら、2箇所ぽっきりだしそれもありだと思いますけど。
Classとインターフェース作っちゃえば、インターフェースを介して処理してる本体側は大きな変更することなく、
一番アタマで対象の判定だけやって、クラスの実態をnewした後は同じ処理を続けるだけ、で行ける。
それだと、あっちこっちで処理対象がJpegなのかBmpなのか判定しなきゃいけなくなるでしょう。
処理が読み込みと保存だけでいいなら、2箇所ぽっきりだしそれもありだと思いますけど。
Classとインターフェース作っちゃえば、インターフェースを介して処理してる本体側は大きな変更することなく、
一番アタマで対象の判定だけやって、クラスの実態をnewした後は同じ処理を続けるだけ、で行ける。
29名無しさん@お腹いっぱい。
2012/04/27(金) 00:35:15.50ID:adJRSpDB0 極端に汎化するなら、こういうインターフェースを作るかな
interface ImageProcessor {
/// <summary>指定されたファイルがサポートされているかどうかを判定します。</summary>
bool Supported(string fileName);
/// <summary>指定されたファイルを読み込んで、オブジェクトを初期化します。</summary>
void Load(string fileName);
〜
}
本体側は
AssemblyからImageProcessorを継承してるクラスを全部引っ張ってきておいて、
private static readonl List<T> processors;
private ImageProcessor processor=null;
private Load (string fileName){
foreach (var p in processors){
if (p.Supported(fileName)){
processor=p;
break;
}
}
if (processor==null) throw new NotSupportedException(string.Format("{0}は未対応のファイル形式です", fileName));
processor.Load(fileName);
}
みたいな。こうすれば、処理本体側は変更なしで対応形式の追加が出来るだろうし。
interface ImageProcessor {
/// <summary>指定されたファイルがサポートされているかどうかを判定します。</summary>
bool Supported(string fileName);
/// <summary>指定されたファイルを読み込んで、オブジェクトを初期化します。</summary>
void Load(string fileName);
〜
}
本体側は
AssemblyからImageProcessorを継承してるクラスを全部引っ張ってきておいて、
private static readonl List<T> processors;
private ImageProcessor processor=null;
private Load (string fileName){
foreach (var p in processors){
if (p.Supported(fileName)){
processor=p;
break;
}
}
if (processor==null) throw new NotSupportedException(string.Format("{0}は未対応のファイル形式です", fileName));
processor.Load(fileName);
}
みたいな。こうすれば、処理本体側は変更なしで対応形式の追加が出来るだろうし。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【さいたま市】女子中学生(14)を強盗致傷容疑で逮捕 顔面にスプレー噴射しひったくりか [煮卵★]
- 🦲「AIに戒名を作らせて何が問題か」月刊住職 [パンナ・コッタ★]
- 【アニメ】「妻にしたいアニメキャラ」ランキング発表! 『ドラゴンボール』ブルマ、『ONE PIECE』ナミ、『タッチ』浅倉南らが上位に [冬月記者★]
- 【⌚】なぜファミマの「1998円腕時計」は完売したのか “ちょうどいい一本”がササった理由 [ぐれ★]
- 【週刊現代】高市総理事務所が「サナエトークン」「誹謗中傷動画」首謀者と接触していた動かぬ証拠 [おっさん友の会★]
- 2~4月レアメタル対日輸出ゼロ 中国規制、代替で価格3倍 タングステン調達難 ★2 [ぐれ★]
- ちんちんブルブルブルーアーカイブ🏡
- 元宮内庁鹿内浩胤「一般人を養子にする自民党皇室典範改正案は皇室の伝統を根底から破壊するもの」と警鐘 [245325974]
- 現代ビジネス、高市事務所が「誹謗中傷動画制作」「サナエトークン」首謀者と接触していた「動かぬ証拠」を公開 [268718286]
- 【悲報】文春音声、決定的な矛盾が見つかる…高市「あたしを総理と呼んでるけどさ、総裁選のときはまだ総理じゃないけど?」 [982839561]
- ウエストランド井口「キャッシュレスを自慢して現金払いを見下す人は嫌なやつ」「年金は疑うのに、国が勧めるNISAは信用するの?」 [256556981]
- 14歳JC、顔面にスプレー噴射しひったくり、強盗致傷容疑で逮捕。終わりだよねこの国 [256556981]