为什么我的bool属性没有在c#中使用Get/Set接收值?

本文关键字:Get Set 属性 bool 我的 为什么 | 更新日期: 2023-09-27 18:13:26

出于某种原因,我似乎无法使用Get/SetmanageWords类中改变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;
    }
}

为什么我的bool属性没有在c#中使用Get/Set接收值?

这里的原因是您有两个checkSpell实例在发挥作用。

    checkSpell的getWord方法是一个实例方法,所以它可以访问NoMoreWords属性,即 instance
  • getWord构造一个manageWords类型的新对象并调用readFile
  • manageWords.readFile构造另一个checkSpell实例,并且这个实例使NoMoreWords成为true

您调用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);