为什么我的bool属性没有在c#中使用Get/Set接收值?
本文关键字:Get Set 属性 bool 我的 为什么 | 更新日期: 2023-09-27 18:13:26
出于某种原因,我似乎无法使用Get/Set
从manageWords
类中改变checkSpell
类中属性NoMoreWords
的值。
完整的代码在下面,但重要的位在这里。
在checkSpell
中有一个bool属性叫做NoMoreWords
。然后在manageWords
中创建checkSpell
对象的实例,并将属性NoMoreWords
更改为true。我的手表窗口证明了manageWords
的值已经改变,但是一旦我回到checkSpell
, NoMoreWords
仍然是假的。
这是checkSpell
class checkSpell
{
public bool finished = false;
public bool NoMoreWords { get; set; }
public void getWord()
{
manageWords mngit = new manageWords();
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(); // Open the file and gets the word
if (NoMoreWords == true)
{
Console.WriteLine("NoMoreWords is TRUE");
break;
}
//if (word == string.Empty) break;
Console.WriteLine();
Console.WriteLine("Write the word: {0}", word.ToUpper());
//spk.sayThis("Write the word: " + word);
Console.Write(">");
char[] a = word.ToCharArray(); //Converts string into chars
getLetter(a); // METHOD
// if (finished == true) break;
System.Threading.Thread.Sleep(30);
//spk.sayThis("Correct!");
Console.WriteLine("");
} while (!finished);
Console.WriteLine("XXXX Bye Bye");
spk.sayThis("Bye Bye");
}
/************************************************************************************************************************
* Goes through the word (as a char[]) and compare with the typed letters *
************************************************************************************************************************/
public void getLetter(char[] a)
{
int b = 0;
ConsoleKeyInfo k;
ConsoleColor orig = Console.ForegroundColor;
int CL = Console.CursorLeft;
int CT = Console.CursorTop;
string capOut = "";
for (int i = b; i < a.Length; i = +b)
{
k = Console.ReadKey(true);
if (k.Key == ConsoleKey.Escape)
{
finished = true;
break;
}
if (k.KeyChar == a[i])
{
Console.ForegroundColor = orig;
capOut = k.KeyChar.ToString().ToUpper();
Console.Write(k.KeyChar.ToString().ToUpper());
b++;
CL = Console.CursorLeft; //Get the cursor position of the last correct letter
CT = Console.CursorTop;
}
else if (k.Key == ConsoleKey.Backspace)
{
if (Console.CursorLeft > CL) Console.SetCursorPosition(Console.CursorLeft - 1, CT);
ConsoleColor bg = Console.BackgroundColor;
Console.ForegroundColor = bg;
Console.Write(" ");
Console.CursorLeft = Console.CursorLeft - 1;
}
else if (k.Key == ConsoleKey.Enter)
{
// i don't want to change line
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write(k.KeyChar.ToString().ToUpper());
Console.ForegroundColor = orig;
}
}
}
现在的manageWords
class manageWords // Check file, open and edit it
{
public int lineNumber;
//Check if file exists
public string readFile()
{
string CurrentLine = "";
int count = 0;
checkSpell ckt = new checkSpell();
try
{
START:
count = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt")).Count(); // Gets number of lines
var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "words.txt"));
if (lineNumber < count)
{
CurrentLine = lines.Skip(lineNumber).First();
lineNumber++;
}
else
{
ckt.NoMoreWords = true;
Console.WriteLine("");
Console.WriteLine("Do you want to play it again? Yes/No: ");
if (Console.ReadLine() == "yes")
{
lineNumber = 0;
goto START;
}
else ckt.NoMoreWords = true;
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
// Console.ReadLine();
}
return CurrentLine;
}
}
这里的原因是您有两个checkSpell
实例在发挥作用。
- getWord构造一个
manageWords
类型的新对象并调用readFile
-
manageWords.readFile
构造另一个checkSpell
实例,并且这个实例使NoMoreWords
成为true
checkSpell
的getWord方法是一个实例方法,所以它可以访问的NoMoreWords
属性,即 instance您调用getWord
的原始实例没有改变。
也许你应该将原始实例传递给readFile
方法,而不是让该方法构造一个新的checkSpell
对象实例?
基本上改变你的readFile方法如下:
public string readFile(checkSpell ckt)
然后在调用readFile:
时传入checkSpell实例string word = mngit.readFile(this);
还要记住删除readFile
中构造新的checkSpell
实例的行,因为您不能同时拥有ckt
参数和本地变量,因此您必须这样做。
因为manageWords。readFile在自己的本地checkSpell对象(ckt)中创建,对这个本地对象的任何更改都不会影响调用manageword .readFile的checkSpell对象。您应该将调用者传递给manageWords。readFile,例如,
public void getWord()
{
manageWords mngit = new manageWords();
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(this); // pass local checkSpell
// etc
class manageWords // Check file, open and edit it
{
public int lineNumber;
//Check if file exists
public string readFile(checkSpell ckt)
{
string CurrentLine = "";
int count = 0;
// etc
您还可以将checkSpell对象传递到manageWords构造函数中,并将其存储在manageWords:
中的字段中。public void getWord()
{
manageWords mngit = new manageWords(this); // pass local checkSpell
speakIt spk = new speakIt();
do
{
string word = mngit.readFile(); // pass local checkSpell
// etc
class manageWords // Check file, open and edit it
{
public int lineNumber;
private checkSpell ckt;
public manageWords(checkSpell)
{
ckt = checkSpell;
}
//Check if file exists
public string readFile()
{
// etc
你的设计有缺陷。
您有checkSpell
类创建manageWords
的实例并从checkSpell.getWord()
内部调用manageWords.readFile()
。问题是您的manageWords.readFile()
正在创建checkSpell
的新实例。
它永远不会与你正在查看或期望的实例交互。
您可以做以下的快速修改,可能对您的需要是可以的,但对于整个程序的结构可能无效。
更改manageWords.readFile()
以获取checkSpell
的实例,并使用它而不是创建一个新的。
public string readFile(checkSpell chkSpell)
{
string CurrentLine = "";
int count = 0;
try
{
....
if (lineNumber < count)
{
CurrentLine = lines.Skip(lineNumber).First();
lineNumber++;
}
else
{
chkSpell.NoMoreWords = true;
....
}
....
}
....
}
然后从你的checkSpell.getWord()
调用你的readFile()
像这样:mngit.readFile(this);