C# 在同一函数中使用streamreader和streamwriter时出现范围问题
这个问题包含了我在C#中遇到的两个问题(很可能是相互关联的)。我真的希望其他地方没有清楚地回答这个问题,因为我不确定使用什么搜索词,到目前为止还没有找到任何能让我满意地解释它的东西。在我的C#文字游戏中,我有一个名为C# 在同一函数中使用streamreader和streamwriter时出现范围问题,c#,scope,streamreader,streamwriter,C#,Scope,Streamreader,Streamwriter,这个问题包含了我在C#中遇到的两个问题(很可能是相互关联的)。我真的希望其他地方没有清楚地回答这个问题,因为我不确定使用什么搜索词,到目前为止还没有找到任何能让我满意地解释它的东西。在我的C#文字游戏中,我有一个名为isHighScore()的函数。基本上,现在发生的事情是,无论我以不同的方式格式化它,删除using、try/catch,我似乎都无法将变量写入文件。对于第一次阅读本文的人来说,我已经对代码进行了显著的编辑,以说明(对我来说)更大的范围问题 private void isHighS
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
。使用而不是使用
语句。事实上,如果使用文件提供的方便方法,则根本不需要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
?我强烈建议你完全不要手动调用关闭
。使用而不是使用
语句。事实上,如果使用文件提供的方便方法,则根本不需要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..
因此,Finally
,Catch
块无法访问Try
块中声明的变量
更多信息
更一般的信息都是关于范围的
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
块中声明的变量
更多信息
更多一般信息您熟悉使用块吗?您应该同时拥有StreamReader和StreamWriter。这样做会使关闭的明确呼吁变得毫无必要。旁注:尽量只在必要时使用注释。我知道初学者被教导“总是注释你的代码”,但如果注释是无用的,那就没有效率<代码>writeHighScore.Close()//close streamwriter
是一个无用的注释-您知道什么是writeHighScore
,并且您知道close()
方法在做什么。为什么要写一条评论来说明显而易见的事情?是的,一开始我让我的streamreader和streamwriter使用block。你看到了我的“我在尝试新事物”功能。很抱歉评论过多,我通常不会对自己的代码进行评论,但出于某种原因,我担心如果我不这样做,我会在这里受到惩罚。想想……;)你熟悉使用积木吗?您应该同时拥有StreamReader和StreamWriter。这样做会使关闭的明确呼吁变得毫无必要。旁注:尽量只在必要时使用注释。我知道初学者被教导“总是注释你的代码”,但如果注释是无用的,那就没有效率<代码>writeHighScore.Close()//close streamwriter
是一个无用的注释-您知道什么是writeHighScore
,并且您知道close()
方法在做什么。为什么要写一条评论来说明显而易见的事情?是的,一开始我让我的streamreader和streamwriter使用block。你看到了我的“我在尝试新事物”功能。很抱歉评论过多,我通常不会对自己的代码进行评论,但出于某种原因,我担心如果我不这样做,我会在这里受到惩罚。想想……;)虽然您给出的后一个示例是有效的,但您无法读取该变量,因为它不会被明确赋值。@JonSkeet thxx指出:)…我目前进入c++
,远离c#
的严格检查!如果在内部为其赋值并尝试在外部读取,会发生什么情况?在第二个示例中,如果您只是在try/catch之后输出x,那么它不是未初始化的吗?例如,如果您的尝试不起作用,并且抛出了一个异常,那么x将永远不会得到一个值。虽然您给出的后一个示例是有效的,但您无法读取该变量,因为它不会被明确赋值。@JonSkeet thxx指出:)…我目前正处于c++
的状态,并且远离c
的严格检查!如果你