在同一功能中使用streamreader和streamwriter时出现作用域问题



这个问题包含了我在C#中遇到的两个问题(很可能是相互关联的)。我真的希望这个问题在其他地方没有得到明确的回答,因为我不确定该使用什么搜索词,而且到目前为止还没有找到任何能让我满意的解释。我在C#单词游戏中有一个名为isHighScore()的函数。基本上,无论我尝试以不同的方式格式化它,删除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的比较似乎并不正确。是因为我的变量超出了范围吗?如何在try-catch范围之外读取更改后的值,或者使用StreamReader读取using语句(我知道这是首选方法)。

我强烈建议您完全取消对Close手动调用。请改用using语句。事实上,如果您使用File:提供的方便方法,您根本不需要StreamReader

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的地方访问它?

这一切都与范围有关

Try-catch创建一个新的作用域。。

例如

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

但是,这将工作

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

因此,FinallyCatch块无法访问在Try块内声明的变量。

更多信息点击这里

更多一般信息点击这里

最新更新