1

この質問には、私が C# で抱えていた 2 つの問題 (相互に関連している可能性が非常に高い) が含まれています。どの検索用語を使用すればよいかわからず、これまでのところ、満足のいく説明をしてくれたものに出くわしていないため、これが他の場所で明確に回答されていないことを本当に願っています. isHighScore()C# ワード ゲームで呼び出される関数があります。基本的に何が起こっているかというと、さまざまな方法でこれをフォーマットしようとしても、using、try/catch を削除しても、変数をファイルに書き込むことができないようです。これを初めて読んだ人のために、コードを大幅に編集して、(私にとって)スコープに関する問題のように見えるものを説明しました。

private void isHighScore() //Having problems...
    {
        string strHighScore;

        try
        {
            StreamReader readHighScore = new StreamReader(strPath + "WAHS.txt")

            strHighScore = readHighScore.ReadLine(); 
        }
        catch (Exception e)
        {
                MessageBox.Show(Convert.ToString(e.Message));
        }
...

次に、StreamWriter を使用して同様のブロックを挿入しますが、userScore が strHighScore より大きいという比較は true と評価されないようです。私の変数が範囲外になったからですか?そのtry-catchの範囲外で変更された値を読み取る方法、またはStreamReaderを使用したusingステートメント(これが好ましい方法であることがわかっています)。

4

2 に答える 2

4

への手動呼び出しをClose完全に取り除くことを強くお勧めします。using代わりにステートメントを使用してください。StreamReader実際、 が提供する便利なメソッドを使用する場合、 はまったく必要ありませんFile

string fileName = Path.Combine(path, "WAHS.txt");
string highScoreLine = File.ReadLines(fileName).First();

string beforeSpace = highScoreLine.Split(" ")[0];
int highScore = int.Parse(beforeSpace);

int userScore = int.Parse(txtScore.Text);
if (userScore > highScore)
{
    MessageBox.Show("Congratulations! You set a new high score!", "High Score");
    File.WriteAllText(fileName, userScore.ToString());
}

上記のコードによってスローされた例外は、スタックの上位にある別の場所でキャッチして処理する必要があります。

(現在のコードは、新しいハイスコアではなく、既存のハイスコアをファイルに書き戻すだけであることに注意してください。)

ファイルにそのテキスト行のみが含まれていると確信している場合は、代わりに使用できますFile.ReadAllText

ただし、混乱の背後にある根本的な問題に対処することは、おそらくより重要です。閉じようとしている場所にアクセスできない理由がわかりましたか?readHighScore

于 2012-11-16T17:59:13.987 に答える
0

それはすべてスコープに関するものです

Try-catch新しいスコープを作成します..

例えば

try
{
int x=100;
}

catch
{
}
x=55;//you cant access x here

しかし、これはうまくいくでしょう

int x=0;
try
{
x=100;
}
catch
{
}
x=55;//valid..

したがって、Finallyブロックは、Catchブロック内で宣言されている変数にアクセスできませんTry

詳細はこちら

より一般的な情報はこちら

于 2012-11-16T18:04:18.393 に答える