ふらっと C#,C♯,C#(初心者用) Part136

レス数が1000を超えています。これ以上書き込みはできません。
2018/03/03(土) 15:09:05.75ID:SBEkwl3H
「どんなにくだらない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#(初心者用) Part135
http://mevius.5ch.net/test/read.cgi/tech/1517749348/

■コードを貼る場合は↓を使いましょう。
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: default:vvvvv:1000:512:----: EXT was configured
2018/04/05(木) 10:13:54.51ID:c77DGTlb
コンソールとフォームしか作ったことないけどまだまだいけますか?
2018/04/05(木) 11:09:05.32ID:796HNo8s
趣味ならどうでもいい
職業ならWebできないと仕事ない
2018/04/05(木) 12:00:33.19ID:D2y+fK6k
てっきり今後はWPFが主流になると思って使ってみたけど、
情報がネットに少なすぎてまいったわ
2018/04/05(木) 14:16:56.73ID:+3oTwv9E
趣味で作ってるから問題ないわ
2018/04/05(木) 21:48:57.38ID:2ZtD67QF
例外処理について教えてください

簡単な例で、キーボードから数字を入力させて処理するとして、非数字が入力されたら
数字が入力されるまで、正しい入力をするよう促したいとします
(これだけなら例外を使わなくても簡単ですが、あくまで例として)

bool flag = false;
string str;
int i=0;

while(flag != true)
{
try
{
Console.Write("enter a number = ");
str = Console.ReadLine();
i = Int32.Parse(str);
flag = true;
} catch
{
Console.WriteLine("incorrect number.");
}
}
Console.WriteLine("your number is : " + i);

こんな感じで、try-catchの間をループで囲んで、脱出フラグを用意するのが正攻法
なのでしょうか?
なんかもっとスマートな方法がありそうなのですが
2018/04/05(木) 21:57:03.35ID:dUUr3xK4
>>981
いや、例だと
回答してもこれは違う実は書いてないけど
こういう問題があって駄目だの
小出しでどんどん出るから
ピンポイントでこの問題を解決したいってのを書いて
2018/04/05(木) 21:58:19.97ID:M7HPB+1x
do while

int.TryParse
2018/04/05(木) 21:59:25.26ID:IVUDpQN0
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);
2018/04/05(木) 22:04:19.96ID:IVUDpQN0
iを0で初期化するのもやめたほうが良かったな
2018/04/05(木) 22:11:00.58ID:2ZtD67QF
>>982
すいません、ピンポイントで課題に直面しているのではなくて、勉強中で疑問に思ったので
質問しました
例えばファイルオープンで存在しないファイル名を掴まされたとか、テキストファイルを想定
しているところにバイナリを噛まされたとか、そういうケースのリトライをどうやって実装するのかと
疑問に感じたのです
987981
垢版 |
2018/04/05(木) 22:19:06.91ID:2ZtD67QF
>>984
このソースは理解できましたが、>>985はどういう意味でしょう?
私は921でもあるのですが、この時指摘いただいたとおり、iを初期化しておかないと
未割り当てとしてコンパイル通りませんが
2018/04/05(木) 22:24:09.13ID:dUUr3xK4
>>986
ファイル読み込みに失敗しました。
Windowsを終了します。
2018/04/05(木) 22:36:19.31ID:7xCMhR6w
気持ちは分からんでもないが、抽象的な質問しても抽象的な答しか返ってこないと思う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}");
}
2018/04/05(木) 22:36:33.86ID:796HNo8s
>>986
そんなもん具体的に何をどうリトライしたいのかによる
それが明確になってるならそれをそのまま実装するだけだ
ネットワークエラーのようにそのまま自動的にリトライ可能なエラーならある程度決まったパターンがあるけど、
>>986のように条件を変えない限りリトライしても必ず失敗するケースでは個別に考えるしかない
2018/04/05(木) 23:38:35.52ID:IVUDpQN0
>>987
この場合は while を抜けたときは必ず i に値が代入されているとコンパイラが判断できるので通る
https://ideone.com/kUpXYh
992981
垢版 |
2018/04/06(金) 06:10:19.26ID:e2Dy7HRM
>>989
私の学習では、まだ

Func<bool> tryAskNumber = () =>

この書き方が理解できていないのですが、これでやっているのは例外の処理ではなくて
boolでメソッドの戻り値を評価して処理を繰り返しているのですね?

抽象的な質問だと言われればそのとおりなのですが、エラーが発生したときに例外を
返してくるメソッドを使っているときに、正常処理ができるようになるまで同じ処理を繰り返す、
というケースの質問でした
条件を変えるとかは本質的な話ではなくて、「例外が発生しなくなるまで繰り返す」という
処理フローそのものの質問です
>>984で、break文でtryの中からwhileブロックを抜ければよい、と理解できたので十分です
(tryブロックから、その外側のwhileを抜けられると思ってなかったので躓いてました)

数字入力を取り上げたのは、例として単純で、言わんとすることがすぐに伝わるかと思った
だけです

>>991
>>984
の var i=0; を var i; にしただけだとエラーになりましたが、int i; なら通るんですね
2018/04/06(金) 11:09:07.04ID:iz5pUoek
>>981
例外が出たらアプリケーションを止める
ファイルオープンだとしてもそれは変わらず、存在しなくてリトライしたいなら以下のような事前チェックをするべき
if(存在していない)continue;

ってのが理想だけどファイル系のエラーってたくさんあるし、確認しずらいのもあるからtry-catchを使わないのが現実的じゃないことも

メソッドが例外を出すのは使ってはいけない使い方をしているということなので、使っていい状態か確認してから呼び出すよう心がけるべきかな
2018/04/06(金) 11:31:23.65ID:KffLTaJD
foreach(var a in XXX)
{


みたいなことを可能にするためには
XXX はどんなクラスを継承してないといけませんか?
(何が必要か)

たとえば、XXX がDataRowCollection 型だったら
foreach(DataRow a in XXX) とやらないと怒られてしまいます。

DataRow[] だったら、var が使えます。

この違いは一体なんだろう(なにが必要なのかと)、と
2018/04/06(金) 11:39:53.65ID:QmpxvPzQ
ジェネリックインターフェイスを実装してるから
2018/04/06(金) 11:44:13.58ID:19AXhYIg
IEnum〜だっけ
2018/04/06(金) 11:54:13.71ID:KffLTaJD
つまり、DataRowCollection は
IEnumerable を継承しているから、foreach の in に使えるけど
IEnumerable<T> は継承してないから foreach(var は許されない

ということですか
2018/04/06(金) 12:11:24.19ID:78uF6QEL
>>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);
}

プログラミングの基本は一気にすべてを解決しようとしないこと。
問題を小さな問題に分割すること。

「○○が成功するまで繰り返す」なら、○○の部分と成否を判定してリトライ
する部分は分けた方が基本的に分かりやすくなる

抽象的な質問に対して何か言えるのはこの程度だと思うけど....
2018/04/06(金) 12:42:38.82ID:bxzO13cU
>>994
継承は関係ない
GetEnumeratorってメソッドがあればok
2018/04/06(金) 15:01:40.67ID:Mgh91ASd
へー
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 33日 23時間 52分 35秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況