18/04/05 21:57:03.35 dUUr3xK4.net
>>981
いや、例だと
回答してもこれは違う実は書いてないけど
こういう問題があって駄目だの
小出しでどんどん出るから
ピンポイントでこの問題を解決したいってのを書いて
1004:デフォルトの名無しさん
18/04/05 21:58:19.97 M7HPB+1x.net
do while
int.TryParse
1005:デフォルトの名無しさん
18/04/05 21:59:25.26 IVUDpQN0.net
var i = 0;
while (true) {
Console.Write("enter a number = ");
var str = Console.ReadLine();
try {
i = Int32.Parse(str);
break;
}
catch (FormatException) {
Console.WriteLine("incorrect number.");
}
}
Console.WriteLine("your number is : " + i);
1006:デフォルトの名無しさん
18/04/05 22:04:19.96 IVUDpQN0.net
iを0で初期化するのもやめたほうが良かったな
1007:デフォルトの名無しさん
18/04/05 22:11:00.58 2ZtD67QF.net
>>982
すいません、ピンポイントで課題に直面しているのではなくて、勉強中で疑問に思ったので
質問しました
例えばファイルオープンで存在しないファイル名を掴まされたとか、テキストファイルを想定
しているところにバイナリを噛まされたとか、そういうケースのリトライをどうやって実装するのかと
疑問に感じたのです
1008:981
18/04/05 22:19:06.91 2ZtD67QF.net
>>984
このソースは理解できましたが、>>985はどういう意味でしょう?
私は921でもあるのですが、この時指摘いただいたとおり、iを初期化しておかないと
未割り当てとしてコンパイル通りませんが
1009:デフォルトの名無しさん
18/04/05 22:24:09.13 dUUr3xK4.net
>>986
ファイル読み込みに失敗しました。
Windowsを終了します。
1010:デフォルトの名無しさん
18/04/05 22:36:19.31 7xCMhR6w.net
気持ちは分からんでもないが、抽象的な質問しても抽象的な答しか返ってこないと思うw
static void Main(string[] args)
{
var number = 0;
Func<bool> tryAskNumber = () =>
{
Console.Write("enter a number = ");
return int.TryParse(Console.ReadLine(), out number);
};
while (!tryAskNumber())
Console.WriteLine("incorrect number.");
Console.WriteLine($"your number is : {number}");
}
1011:デフォルトの名無しさん
18/04/05 22:36:33.86 796HNo8s.net
>>986
そんなもん具体的に何をどうリトライしたいのかによる
それが明確になってるならそれをそのまま実装するだけだ
ネットワークエラーのようにそのまま自動的にリトライ可能なエラーならある程度決まったパターンがあるけど、
>>986のように条件を変えない限りリトライしても必ず失敗するケースでは個別に考えるしかない
1012:デフォルトの名無しさん
18/04/05 23:38:35.52 IVUDpQN0.net
>>987
この場合は while を抜けたときは必ず i に値が代入されているとコンパイラが判断できるので通る
URLリンク(ideone.com)
1013:981
18/04/06 06:10:19.26 e2Dy7HRM.net
>>989
私の学習では、まだ
Func<bool> tryAskNumber = () =>
この書き方が理解できていないのですが、これでやっているのは例外の処理ではなくて
boolでメソッドの戻り値を評価して処理を繰り返しているのですね?
抽象的な質問だと言われればそのとおりなのですが、エラーが発生したときに例外を
返してくるメソッドを使っているときに、正常処理ができるようになるまで同じ処理を繰り返す、
というケースの質問でした
条件を変えるとかは本質的な話ではなくて、「例外が発生しなくなるまで繰り返す」という
処理フローそのものの質問です
>>984で、break文でtryの中からwhileブロックを抜ければよい、と理解できたので十分です
(tryブロックから、その外側のwhileを抜けられると思ってなかったので躓いてました)
数字入力を取り上げたのは、例として単純で、言わんとすることがすぐに伝わるかと思った
だけです
>>991
>>984
の var i=0; を var i; にしただけだとエラーになりましたが、int i; なら通るんですね
1014:デフォルトの名無しさん
18/04/06 11:09:07.04 iz5pUoek.net
>>981
例外が出たらアプリケーションを止める
ファイルオープンだとしてもそれは変わらず、存在しなくてリトライしたいなら以下のような事前チェックをするべき
if(存在していない)continue;
ってのが理想だけどファイル系のエラーってたくさんあるし、確認しずらいのもあるからtry-catchを使わないのが現実的じゃないことも
メソッドが例外を出すのは使ってはいけない使い方をしているということなので、使っていい状態か確認してから呼び出すよう心がけるべきかな
1015:デフォルトの名無しさん
18/04/06 11:31:23.65 KffLTaJD.net
foreach(var a in XXX)
{
みたいなことを可能にするためには
XXX はどんなクラスを継承してないといけませんか?
(何が必要か)
たとえば、XXX がDataRowCollection 型だったら
foreach(DataRow a in XXX) とやらないと怒られてしまいます。
DataRow[] だったら、var が使えます。
この違いは一体なんだろう(なにが必要なのかと)、と
1016:デフォルトの名無しさん
18/04/06 11:39:53.65 QmpxvPzQ.net
ジェネリックインターフェイスを実装してるから
1017:デフォルトの名無しさん
18/04/06 11:44:13.58 19AXhYIg.net
IEnum~だっけ
1018:デフォルトの名無しさん
18/04/06 11:54:13.71 KffLTaJD.net
つまり、DataRowCollection は
IEnumerable を継承しているから、foreach の in に使えるけど
IEnumerable<T> は継承してないから foreach(var は許されない
ということですか
1019:デフォルトの名無しさん
18/04/06 12:11:24.19 78uF6QEL.net
>>992
ラムダ式を使わずに書くとこう
static void Main(string[] args)
{
var number = 0;
while (!TryAskNumber(out number))
Console.WriteLine("incorrect number.");
Console.WriteLine($"your number is : {number}");
}
static bool TryAskNumber(out int number)
{
Console.Write("enter a number = ");
return int.TryParse(Console.ReadLine(), out number);
}
プログラミングの基本は一気にすべてを解決しようとしないこと。
問題を小さな問題に分割すること。
「○○が成功するまで繰り返す」なら、○○の部分と成否を判定してリトライ
する部分は分けた方が基本的に分かりやすくなる
抽象的な質問に対して何か言えるのはこの程度だと思うけど....
1020:デフォルトの名無しさん
18/04/06 12:42:38.82 bxzO13cU.net
>>994
継承は関係ない
GetEnumeratorってメソッドがあればok
1021:デフォルトの名無しさん
18/04/06 15:01:40.67 Mgh91ASd.net
へー
1022:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 33日 23時間 52分 35秒
1023:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています